U
    e»{j‹Ï ã                   @   sè   d dl Z d dlZd dlZd dlmZmZ d dlZd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d
dlmZ dd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdd„ Z dS )é    N)ÚBytesIOÚStringIO©Úfits)Ú_pad)Ú_pad_length)Úencode_ascii)ÚVerifyErrorÚVerifyWarning)ÚAstropyUserWarning)Ú_NOT_OVERWRITING_MSG_MATCHé   )ÚFitsTestCasec                  C   sH   t  ddg¡} t | ¡}d| d< d|ks,t‚d|d< | d dksDt‚dS )	zQMake sure that operations on a shallow copy do not alter the original.
    #4990.)Úar   )Úbr   éd   Úcr   r   r   N)r   ÚHeaderÚcopyÚAssertionError)Úoriginal_headerZcopied_header© r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/fits/tests/test_header.pyÚtest_shallow_copy   s    
r   c                  C   sN   t  dg¡} t j| dd�}d| d< |d dks2t‚d|d< | d dksJt‚dS )	zVMake sure that creating a Header from another Header makes a copy if
    copy is True.)r   é
   T)r   é   r   r   r   N©r   r   r   )r   Ú
new_headerr   r   r   Útest_init_with_header%   s    r   c                  C   s<   ddddddœ} t  | ¡}| D ]}| | || kst‚qd S )Né   é   é   é   é   )r   r   r   ÚdÚer   )Údict1Úh1Úir   r   r   Útest_init_with_dict2   s    
r)   c                     sJ   dd„ t dƒD ƒ‰t ˆ¡} t | ¡‰ t‡ ‡fdd„t ˆ ƒD ƒƒsFt‚d S )Nc                 S   s   g | ]\}}||f‘qS r   r   )Ú.0Újr(   r   r   r   Ú
<listcomp>;   s     z.test_init_with_ordereddict.<locals>.<listcomp>Úabcdefghijklmnopqrstuvwxyzc                 3   s&   | ]\}}ˆ | ˆ| d  kV  qdS )r   Nr   )r*   r(   Úval©r'   Zlist1r   r   Ú	<genexpr>@   s     z-test_init_with_ordereddict.<locals>.<genexpr>)Ú	enumerateÚcollectionsÚOrderedDictr   r   Úallr   )r&   r   r/   r   Útest_init_with_ordereddict9   s    

r5   c                   @   sž  e Zd ZdZdd„ Zej dddg¡dd„ ƒZd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'dGdH„ Z(dIdJ„ Z)dKdL„ Z*dMdN„ Z+dOdP„ Z,dQdR„ Z-dSdT„ Z.dUdV„ Z/dWdX„ Z0dYdZ„ Z1d[d\„ Z2d]d^„ Z3d_d`„ Z4dadb„ Z5dcdd„ Z6dedf„ Z7dgdh„ Z8didj„ Z9dkdl„ Z:dmdn„ Z;dodp„ Z<dqdr„ Z=dsdt„ Z>dudv„ Z?dwdx„ Z@dydz„ ZAd{d|„ ZBd}d~„ ZCdd€„ ZDd�d‚„ ZEdƒd„„ ZFd…d†„ ZGd‡dˆ„ ZHd‰dŠ„ ZId‹dŒ„ ZJd�dŽ„ ZKej d�eL M¡ eL N¡ g¡d�d‘„ ƒZOd’d“„ ZPd”d•„ ZQd–d—„ ZRd˜d™„ ZSdšd›„ ZTdœd�„ ZUdždŸ„ ZVd d¡„ ZWd¢d£„ ZXd¤d¥„ ZYd¦d§„ ZZd¨d©„ Z[dªd«„ Z\d¬d­„ Z]d®d¯„ Z^d°d±„ Z_d²d³„ Z`d´dµ„ Zad¶d·„ Zbd¸d¹„ Zcdºd»„ Zdd¼d½„ Zed¾d¿„ ZfdÀdÁ„ ZgdÂdÃ„ ZhdÄdÅ„ ZidÆdÇ„ ZjdÈdÉ„ ZkdÊdË„ ZldÌdÍ„ ZmdÎdÏ„ ZndÐdÑ„ ZodÒdÓ„ ZpdÔdÕ„ ZqdÖd×„ ZrdØdÙ„ ZsdÚdÛ„ ZtdÜdÝ„ ZudÞdß„ Zvdàdá„ Zwdâdã„ Zxdädå„ Zydædç„ Zzdèdé„ Z{dêdë„ Z|dìdí„ Z}dîdï„ Z~dðdñ„ Zdòdó„ Z€dôdõ„ Z�död÷„ Z‚dødù„ Zƒdúdû„ Z„düdý„ Z…dþdÿ„ Z†�d �d„ Z‡�d�d„ Zˆ�d�d„ Z‰�d�d„ ZŠ�d�d	„ Z‹�d
�d„ ZŒ�d�d„ Z��d�d„ ZŽ�d�d„ Z��d�d„ Z��dS (  ÚTestHeaderFunctionszTest Header and Card objects.c                 C   sh   t  ddg¡}| dd¡ d|ks&t‚d|ks2t‚|d dksBt‚|d dksRt‚|jd dksdt‚dS )z*Test renaming keyword with rename_keyword.©ÚAÚBÚC©ÚDÚEÚFr8   r9   r   r:   N)r   r   Zrename_keywordr   Úcomments©ÚselfÚheaderr   r   r   Útest_rename_keywordF   s    z'TestHeaderFunctions.test_rename_keywordÚkeyr8   r   c                 C   s„   t  ddg¡}||kst‚|| dks*t‚| |¡dks<t‚| |¡dksNt‚|j| dks`t‚| |¡dksrt‚|j|dd� d	S )
z'Check that indexing is case insensitiver7   r;   r9   r   r:   r   F©Zignore_missingN)r   r   r   ÚgetÚindexr?   ÚcountÚremove)rA   rD   rB   r   r   r   Útest_indexing_caseP   s    z&TestHeaderFunctions.test_indexing_casec                 C   s   t  ¡ }d|jkst‚dS )z3Test Card constructor with default argument values.Ú N)r   ÚCardÚkeywordr   ©rA   r   r   r   r   Ú"test_card_constructor_default_args\   s    z6TestHeaderFunctions.test_card_constructor_default_argsc                 C   s,   t j d¡}|jdkst‚|jdks(t‚dS )zX
        Test loading a Card from a `bytes` object (assuming latin-1 encoding).
        s   ABC     = 'abc'ÚABCÚabcN)r   rL   Ú
fromstringrM   r   ÚvaluerN   r   r   r   Útest_card_from_bytesb   s    z(TestHeaderFunctions.test_card_from_bytesc                 C   sD   t  dd¡}t|ƒtdƒks t‚t  dd¡}t|ƒtdƒks@t‚dS )z'Test Card constructor with string valuerQ   z<8 chzABC     = '<8 ch   'ZnullstrrK   zNULLSTR = ''N©r   rL   Ústrr   r   rN   r   r   r   Útest_string_value_cardk   s    z*TestHeaderFunctions.test_string_value_cardc                 C   s>   t  dd¡}t|ƒtdƒks t‚t j d¡}|jdks:t‚dS )z(Test Card constructor with boolean valuerQ   TzABC     =                    TzABC     = FFN)r   rL   rV   r   r   rR   rS   rN   r   r   r   Útest_boolean_value_cards   s    z+TestHeaderFunctions.test_boolean_value_cardc                 C   s$   t  dd¡}t|ƒtdƒks t‚dS )z-Test Card constructor with long integer valueZlong_intløÿÿÿ tNxwb	ÊÆB z,LONG_INT= -467374636747637647347374734737437NrU   rN   r   r   r   Útest_long_integer_value_card|   s    z0TestHeaderFunctions.test_long_integer_value_cardc                 C   sD   t  dd¡}t|ƒtdƒkr@t|ƒtdƒkr@t|ƒtdƒks@t‚dS )z/Test Card constructor with floating point valueZfloatnumgœQæ·ÆzFLOATNUM= -4.6737463674763E+32zFLOATNUM= -4.6737463674763E+032NrU   rN   r   r   r   Útest_floating_point_value_card‚   s
    ÿz2TestHeaderFunctions.test_floating_point_value_cardc                 C   sP   t  dd¡}tdƒ}tdƒ}tdƒ}t|ƒ|krLt|ƒ|krLt|ƒ|ksLt‚dS )z(Test Card constructor with complex valuerQ   yÿÛm¨ÚÒ8R¥Öõ{ü<z6ABC     = (1.23453774378878E+88, 6.32476736476374E-15)z6ABC     = (1.2345377437887E+088, 6.3247673647637E-015)N)r   rL   r   rV   r   )rA   r   Úf1Úf2Zf3r   r   r   Útest_complex_value_cardŒ   s    z+TestHeaderFunctions.test_complex_value_cardc              	   C   s|   t  ddd¡}t t jj¡� t|ƒdks.t‚W 5 Q R X t  ddd¡}t t jj¡� t|ƒdd› d�ksnt‚W 5 Q R X d	S )
z.Test that over-long cards truncate the commentrQ   é	   ZdabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdezPABC     =                    9 / abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabZDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÚabcdefgzABC     = 'ú'N)r   rL   ÚpytestÚwarnsÚverifyr
   rV   r   rN   r   r   r   Ú$test_card_image_constructed_too_long–   s    
ÿz8TestHeaderFunctions.test_card_image_constructed_too_longc                 C   s.   t  ttjdddi¡ t  ttjdg d¡ dS )z=Test that Card constructor raises exceptions on bad arguments)rQ   rS   )é   é   rD   ÚcommentN)ra   ÚraisesÚ
ValueErrorr   rL   ©rA   r   r   r   Ú/test_constructor_filter_illegal_data_structures¥   s    zCTestHeaderFunctions.test_constructor_filter_illegal_data_structuresc                 C   s   t  ttjdd¡ dS )z<Test that long Card keywords are allowed, but with a warningÚ	abcdefghiÚlongN)ra   rb   ÚUserWarningr   rL   rj   r   r   r   Útest_keyword_too_long«   s    z)TestHeaderFunctions.test_keyword_too_longc              	   C   sH   t  t¡�}t dd¡}W 5 Q R X t|ƒdks2t‚|jtdƒksDt‚dS )z{
        Test that Card constructor allows illegal characters in the keyword,
        but creates a HIERARCH card.
        zabc+r^   r   z$HIERARCH abc+ =                    9N)	ra   rb   r   r   rL   Úlenr   Úimager   ©rA   Úwr   r   r   r   Útest_illegal_characters_in_key°   s    
z2TestHeaderFunctions.test_illegal_characters_in_keyc                 C   sÀ   t  ddddddg¡}| d¡ t|ƒdks0t‚|jd jdksDt‚|d d	d
ddgks\t‚t|d ƒdkspt‚|jddd� t|ƒdksŽt‚|jd	 jdks¢t‚|d dd	d
ddgks¼t‚d S )Nr7   ©ÚHISTORYr   ©rv   re   )rv   rf   ©rK   rK   rK   é   é   rv   r   re   rf   z1
2
3
4r   r8   ©Úafter)r   r   Úadd_historyrp   r   ÚcardsrS   Úreprr@   r   r   r   Útest_add_history¿   s$    úÿ

z$TestHeaderFunctions.test_add_historyc              
   C   s  t  ddddddg¡}| d¡ t|ƒdks0t‚|jd jdksDt‚|d	 d
ddd	d	dgks`t‚t|d	 ƒdkstt‚|jddd� t|ƒdks’t‚|jd
 jdks¦t‚|d	 dd
ddd	d	dgksÄt‚d|d	< d|d< |d	 dd
ddd	d	dddg	ksöt‚|d dd
ddd	d	dddg	k�st‚d S )Nr7   )rK   r   )rK   re   )rK   rf   rx   ry   é   rz   rK   r   re   rf   z	1
2
3


4r   r8   r{   é   é   ú )r   r   Z	add_blankrp   r   r~   rS   r   r@   r   r   r   Útest_add_blankÖ   s     ÿ
"z"TestHeaderFunctions.test_add_blankc                 C   sü   G dd„ dt ƒ}t ¡ }| ddi¡ | |ddgƒ¡ t| ¡ ƒdddhksRt‚|jd d	ksdt‚t ¡ }d
|d< | |¡ t| ¡ ƒddddhksšt‚|jd dks¬t‚|jddd� t| ¡ ƒddddddhksÚt‚t| ¡ ƒdddddhksøt‚d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z3TestHeaderFunctions.test_update.<locals>.FakeHeaderc                 S   s   dd„ | D ƒS )Nc                 S   s   g | ]}|d  ‘qS )r   r   ©r*   Úlr   r   r   r,   ñ   s     zLTestHeaderFunctions.test_update.<locals>.FakeHeader.keys.<locals>.<listcomp>r   rj   r   r   r   Úkeysð   s    z8TestHeaderFunctions.test_update.<locals>.FakeHeader.keysc                    s   t ‡ fdd„| D ƒƒS )Nc                 3   s&   | ]}|d  ˆ kr|dd… V  qdS )r   r   Nr   r†   ©rD   r   r   r0   ô   s      zRTestHeaderFunctions.test_update.<locals>.FakeHeader.__getitem__.<locals>.<genexpr>)Únext)rA   rD   r   r‰   r   Ú__getitem__ó   s    z?TestHeaderFunctions.test_update.<locals>.FakeHeader.__getitem__N)Ú__name__Ú
__module__Ú__qualname__rˆ   r‹   r   r   r   r   Ú
FakeHeaderï   s   r�   ÚFOO©ÚBARÚBAZ©r8   r   )r9   re   rg   r8   r9   rg   )r   úthis is a commentÚHELLOr•   r   )ÚNAXIS1ÚNAXIS2r—   r˜   r’   r   re   )	Úlistr   r   ÚupdateÚsetrˆ   r   r?   Úvalues)rA   r�   rB   Ztmphdrr   r   r   Útest_updateî   s    
 zTestHeaderFunctions.test_updatec              	   C   s*  t  |  d¡¡}|d j ddi¡ |d jd dks:t‚|d jjd dksRt‚t t	¡� |d j ddi¡ W 5 Q R X | 
|  d	¡¡ | ¡  t j|  d	¡d
d�}d|d jjd< | ¡  t  |  d	¡¡}|d jjd dksèt‚|d jjddd� t|d jjd ƒ ¡ dk�st‚| ¡  d S )Núarange.fitsr   r�   r‘   r’   r“   ÚFOO2)r’   r“   ZEXTRAú	test.fitsrš   ©ÚmodeÚQUXr{   éÿÿÿÿz	COMMENT 0)r   ÚopenÚdatarB   rš   r   r?   ra   rh   ri   ÚwritetoÚtempÚcloseÚadd_commentrV   r~   Ústrip©rA   Úhdulr   r   r   Útest_update_comment  s     "z'TestHeaderFunctions.test_update_commentc                 C   sV   d}t  d|¡}t|ƒtd| ƒks(t‚d}t  d|d¡}t|ƒtd| ƒksRt‚d S )Nz2A commentary card's value has no quotes around it.rv   úHISTORY z!A commentary card has no comment.ÚCOMMENTrg   zCOMMENT rU   )rA   r.   r   r   r   r   Útest_commentary_cards  s    z)TestHeaderFunctions.test_commentary_cardsc                 C   s,   t j d¡}|jdkst‚|jdks(t‚d S )NzLCOMMENT card has no comments. / text after slash is still part of the value.zDcard has no comments. / text after slash is still part of the value.rK   )r   rL   rR   rS   r   rg   rN   r   r   r   Ú*test_commentary_card_created_by_fromstring(  s    ÿÿz>TestHeaderFunctions.test_commentary_card_created_by_fromstringc                 C   s$   t j d¡}t|ƒtdƒks t‚d S )NzHISTORY  (1, 2)©r   rL   rR   rV   r   r   rN   r   r   r   Ú3test_commentary_card_will_not_parse_numerical_value4  s    zGTestHeaderFunctions.test_commentary_card_will_not_parse_numerical_valuec                 C   s$   t j d¡}t|ƒtdƒks t‚d S )NzHISTORY =   (1, 2)r³   rN   r   r   r   Útest_equal_sign_after_column89  s    z1TestHeaderFunctions.test_equal_sign_after_column8c                 C   sP   t  dd¡}t|ƒtdƒks t‚t j t|ƒ¡}|jdks>t‚|jdksLt‚d S )NrK   z       / EXPOSURE INFORMATIONz%               / EXPOSURE INFORMATION)r   rL   rV   r   r   rR   rM   rS   rN   r   r   r   Útest_blank_keyword?  s
    z&TestHeaderFunctions.test_blank_keywordc                 C   s(   t  dt jj¡}t|ƒtdƒks$t‚d S )NZundefz	UNDEF   =)r   rL   ÚcardÚ	UNDEFINEDrV   r   r   rN   r   r   r   Útest_specify_undefined_valueF  s    z0TestHeaderFunctions.test_specify_undefined_valuec                 C   s$   t j d¡}t|ƒtdƒks t‚d S )NzABC     = (8, 9)r³   rN   r   r   r   Ú&test_complex_number_using_string_inputK  s    z:TestHeaderFunctions.test_complex_number_using_string_inputc              	   C   sP   t j d¡}|jdkst‚tjt jjdd�� t	|ƒt
dƒksBt‚W 5 Q R X d S )Nzabc     = +  2.1   e + 12g  €�~BúVerification reported errors©ÚmatchzABC     =             +2.1E+12)r   rL   rR   rS   r   ra   rb   rc   r
   rV   r   ©rA   Úcapsysr   r   r   r   Ú#test_fixable_non_standard_fits_cardP  s     ÿz7TestHeaderFunctions.test_fixable_non_standard_fits_cardc              	   C   s>   t j d¡}tjt jjdd�� t|ƒdks0t‚W 5 Q R X d S )NzGno_quote=  this card's value has no quotes / let's also try the commentr»   r¼   zPNO_QUOTE= 'this card''s value has no quotes' / let's also try the comment       )	r   rL   rR   ra   rb   rc   r
   rV   r   rN   r   r   r   Útest_fixable_non_fscY  s    ÿ ÿ
ÿz(TestHeaderFunctions.test_fixable_non_fscc                 C   s$   t j d¡}t|ƒtdƒks t‚d S )NzABC     =    z	ABC     =r³   rN   r   r   r   Ú'test_undefined_value_using_string_inputh  s    z;TestHeaderFunctions.test_undefined_value_using_string_inputc                 C   sL   t  ¡ }d|d< d |d< t| ¡ ƒdd gks0t‚t| ¡ ƒddgksHt‚d S )Nr’   r�   ÚUNDEF)r�   r’   )rÃ   N)r   r   r™   rœ   r   Úitemsr@   r   r   r   Útest_undefined_keys_valuesm  s
    z.TestHeaderFunctions.test_undefined_keys_valuesc              	   C   s^   t j d¡}|jdkst‚|jdks(t‚tjt jj	dd�� t
|ƒtdƒksPt‚W 5 Q R X d S )NzXYZ= 100ZXYZr   r»   r¼   zXYZ     =                  100)r   rL   rR   rM   r   rS   ra   rb   rc   r
   rV   r   r¾   r   r   r   Útest_mislocated_equal_signu  s     ÿz.TestHeaderFunctions.test_mislocated_equal_signc              	   C   sx   t j d¡}tjtdd�� t|ƒtdƒks0t‚W 5 Q R X t j d¡}tjtdd�� t|ƒtdƒksjt‚W 5 Q R X d S )NzHISTO       =   (1, 2)zheader keyword is invalidr¼   z   HISTORY          (1, 2))	r   rL   rR   ra   rb   r   rV   r   r   r¾   r   r   r   Útest_equal_only_up_to_column_10  s    z3TestHeaderFunctions.test_equal_only_up_to_column_10c              	   C   sr   t j d¡}t t¡�}| ¡  W 5 Q R X d}d}t|ƒdksBt‚|t	|d j
ƒksXt‚|t	|d j
ƒksnt‚d S )NúABC= a6z<Card 'ABC' is not FITS standard (equal sign not at column 8)z;Card 'ABC' is not FITS standard (invalid value string: 'a6'ry   r   re   )r   rL   rR   ra   rb   r   rc   rp   r   rV   Úmessage)rA   r   rs   Z	err_text1Z	err_text2r   r   r   Útest_verify_invalid_equal_sign�  s    z2TestHeaderFunctions.test_verify_invalid_equal_signc              	   C   s\   d}t j d¡}tjt|d��}| d¡ W 5 Q R X t|ƒdksDt‚t	|ƒt
dƒksXt‚d S )Nz+Fixed 'ABC' card to meet the FITS standard.rÈ   r¼   Úfixry   zABC     = 'a6      ')r   rL   rR   ra   rb   r   rc   rp   r   rV   r   )rA   Zfix_textr   rs   r   r   r   Útest_fix_invalid_equal_sign›  s    z/TestHeaderFunctions.test_fix_invalid_equal_signc                 C   s"   t  ddd¡}t|ƒdkst‚d S )NrQ   ú´long string value long string value long string value long string value long string value long string value long string value long string value long string value long string value ú‚long comment long comment long comment long comment long comment long comment long comment long comment long comment long comment áà  ABC     = 'long string value long string value long string value long string &' CONTINUE  'value long string value long string value long string value long &'  CONTINUE  'string value long string value long string value &'                  CONTINUE  '&' / long comment long comment long comment long comment long        CONTINUE  '&' / comment long comment long comment long comment long comment     CONTINUE  '' / long comment                                                     ©r   rL   rV   r   rN   r   r   r   Útest_long_string_value£  s
    ÿÿz*TestHeaderFunctions.test_long_string_valuec                 C   s    t  dd¡}t|ƒdkst‚dS )zU
        Regression test for https://github.com/astropy/astropy/issues/11298
        ZWHATEVERz�SuperCalibrationParameters_XXXX_YYYY_ZZZZZ_KK_01_02_03)-AAABBBCCC.n.h5 SuperNavigationParameters_XXXX_YYYY_ZZZZZ_KK_01_02_03)-AAABBBCCC.n.xmla@  WHATEVER= 'SuperCalibrationParameters_XXXX_YYYY_ZZZZZ_KK_01_02_03)-AAABBBCCC.n&'CONTINUE  '.h5 &'                                                               CONTINUE  'SuperNavigationParameters_XXXX_YYYY_ZZZZZ_KK_01_02_03)-AAABBBCCC.n.&'CONTINUE  'xml'                                                                 NrÐ   rN   r   r   r   Ú/test_long_string_value_with_multiple_long_words°  s    þÿÿzCTestHeaderFunctions.test_long_string_value_with_multiple_long_wordsc                 C   s8   t  ¡ }d|d< t  ¡ }d|d< t|ƒt|ƒks4t‚dS )zåRegression test for
        https://github.com/spacetelescope/PyFITS/issues/1

        So long as a unicode string can be converted to ASCII it should have no
        different behavior in this regard from a byte string.
        ZÒabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgÚTESTN)r   r   rV   r   )rA   r'   Zh2r   r   r   Útest_long_unicode_stringÂ  s
    z,TestHeaderFunctions.test_long_unicode_stringc                 C   sd   t  ¡ }d|d< d|d< d|d< t|ƒ ¡ tt  ddd¡ƒdd	d
dddtt  ddd¡ƒgks`t‚dS )zåRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/193

        Ensure that the __repr__() for cards represented with CONTINUE cards is
        split across multiple lines (broken at each *physical* card).
        )úRegular valueúRegular commentÚTEST1)rÍ   rÎ   ÚTEST2ZTEST3rÕ   rÖ   zPTEST2   = 'long string value long string value long string value long string &' zPCONTINUE  'value long string value long string value long string value long &'  zPCONTINUE  'string value long string value long string value &'                  zPCONTINUE  '&' / long comment long comment long comment long comment long        zPCONTINUE  '&' / comment long comment long comment long comment long comment     zPCONTINUE  '' / long comment                                                     N)r   r   r   Ú
splitlinesrV   rL   r   r@   r   r   r   Útest_long_string_reprÒ  s    
øz)TestHeaderFunctions.test_long_string_reprc                 C   sz   d}t  ¡ }||d< t|ƒdks$t‚d |d ¡| ¡ ks>t‚||d< ||d< |d |d ksbt‚|d |d ksvt‚dS )a	  Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/194

        Test that a blank keyword ('') can be assigned a too-long value that is
        continued across multiple cards with blank keywords, just like COMMENT
        and HISTORY cards.
        rÍ   rK   rf   r„   r°   rv   N)r   r   rp   r   ÚjoinÚrstrip)rA   rS   rB   r   r   r   Útest_blank_keyword_long_valueé  s    z1TestHeaderFunctions.test_blank_keyword_long_valuec                 C   sn   t  ddd¡}t  ¡ }|j |¡ | |  d¡¡ t  |  d¡¡}|d jjd }| 	¡  t
|ƒdksjt‚d S )NrQ   rÍ   rÎ   ztest_new.fitsr   rÏ   )r   rL   Ú
PrimaryHDUrB   Úappendr§   r¨   r¥   r~   r©   rV   r   )rA   r   Úhdur­   r   r   r   Útest_long_string_from_fileþ  s    ÿÿz.TestHeaderFunctions.test_long_string_from_filec                 C   s"   t  ddd¡}t|ƒdkst‚d S )NrQ   Z–longstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvalueZnlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommenta�  ABC     = 'longstringvaluelongstringvaluelongstringvaluelongstringvaluelongstr&'CONTINUE  'ingvaluelongstringvaluelongstringvaluelongstringvaluelongstringvalu&'CONTINUE  'elongstringvalue&'                                                   CONTINUE  '&' / longcommentlongcommentlongcommentlongcommentlongcommentlongcommeCONTINUE  '' / ntlongcommentlongcommentlongcommentlongcomment                   rÐ   rN   r   r   r   Ú!test_word_in_long_string_too_long  s
    ÿÿz5TestHeaderFunctions.test_word_in_long_string_too_longc              	   C   sR   t j tdƒtdƒ tdƒ ¡}tjt jjdd�� t|ƒdksDt	‚W 5 Q R X d S )Nz;abc     = 'longstring''s testing  &  ' / comments in line 1zLcontinue  'continue with long string but without the ampersand at the end' /zNcontinue  'continue must have string value (with quotes)' / comments with ''. r»   r¼   zðABC     = 'longstring''s testing  continue with long string but without the &'  CONTINUE  'ampersand at the endcontinue must have string value (with quotes)&'  CONTINUE  '' / comments in line 1 comments with ''.                             )
r   rL   rR   r   ra   rb   rc   r
   rV   r   r¾   r   r   r   Ú%test_long_string_value_via_fromstring  s&    ÿÿÿûÿ ÿÿÿz9TestHeaderFunctions.test_long_string_value_via_fromstringc                 C   sN   t j tdƒtdƒ tdƒ ¡}|jdks.t‚|jdks<t‚|jdksJt‚dS )zW
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/117
        zFEXPR    = '/grp/hst/cdbs//grid/pickles/dat_uvk/pickles_uk_10.fits * &'z)CONTINUE  '5.87359e-12 * MWAvg(Av=0.12)&'z CONTINUE  '&' / pysyn expressionZEXPRzU/grp/hst/cdbs//grid/pickles/dat_uvk/pickles_uk_10.fits * 5.87359e-12 * MWAvg(Av=0.12)zpysyn expressionN)r   rL   rR   r   rM   r   rS   rg   rN   r   r   r   Ú'test_continue_card_with_equals_in_value4  s    ÿýüÿÿz;TestHeaderFunctions.test_continue_card_with_equals_in_valuec                 C   s0   t  ¡ }d|d< t|ƒ ¡ d tdƒks,t‚dS )úT
        Regression test for https://github.com/astropy/astropy/issues/3282
        ZEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZSVALUEr¤   zCONTINUE  'AA'N)r   r   r   rÙ   r   r   ©rA   Úhr   r   r   Ú(test_final_continue_card_lacks_ampersandH  s    z<TestHeaderFunctions.test_final_continue_card_lacks_ampersandc                 C   s"   t  ddd¡}t|ƒdkst‚dS )rå   rÓ   zdlong valuelong valuelong valuelong valuelong valuelong valuelong valuelong valuelong valuelong valuezŒlong comment &long comment &long comment &long comment &long comment &long comment &long comment &long comment &long comment &long comment &a�  TEST    = 'long valuelong valuelong valuelong valuelong valuelong valuelong &'  CONTINUE  'valuelong valuelong valuelong value&'                                CONTINUE  '&' / long comment &long comment &long comment &long comment &long    CONTINUE  '&' / comment &long comment &long comment &long comment &long comment CONTINUE  '' / &long comment &                                                  NrÐ   rN   r   r   r   Ú;test_final_continue_card_ampersand_removal_on_long_commentsQ  s
    ÿÿzOTestHeaderFunctions.test_final_continue_card_ampersand_removal_on_long_commentsc              	   C   s†   t jtdd��}t dd¡}W 5 Q R X t|ƒdks6t‚t|ƒdksFt‚t dd¡}t|ƒtd	ƒksft‚t d
d¡}t|ƒdks‚t‚d S )NzHIERARCH card will be createdr¼   zESO INS SLIT2 Y1FRMLz/ENC=OFFSET+RESOL*acos((WID-(MAX+MIN))/(MAX-MIN)r   zPHIERARCH ESO INS SLIT2 Y1FRML= 'ENC=OFFSET+RESOL*acos((WID-(MAX+MIN))/(MAX-MIN)'úhierarch abcdefghir   zHIERARCH abcdefghi = 10zHIERARCH ESO INS SLIT2 Y1FRML)	ra   rb   r   r   rL   rp   r   rV   r   rr   r   r   r   Útest_hierarch_card_creation`  s(     ÿþ
ÿþ
ÿz/TestHeaderFunctions.test_hierarch_card_creationc                 C   s:   t j d¡}|jdkst‚|jdks(t‚|jdks6t‚dS )zVRegression test for
        https://github.com/spacetelescope/PyFITS/issues/5
        z$HIERARCH key.META_4='calFileVersion'ú
key.META_4ÚcalFileVersionrK   N©r   rL   rR   rM   r   rS   rg   rN   r   r   r   Ú)test_hierarch_with_abbrev_value_indicator{  s    z=TestHeaderFunctions.test_hierarch_with_abbrev_value_indicatorc              	   C   s¶   t j d¡}t  |¡�}|d j}W 5 Q R X tjdd��}d|d< W 5 Q R X t|ƒdks\t‚|d dkslt‚|d dks|t‚t	j
t jjd	d
�� d|d< W 5 Q R X |d dks²t‚dS )zCCheck that compressed image headers do not issue HIERARCH warnings.zcompressed_image.fitsr   T)Úrecordé*   zHIERARCH LONG KEYWORDr   zLONG KEYWORDúgreater than 8 charactersr¼   zLONG KEYWORD2N)r   ÚutilZget_testdata_filepathr¥   rB   ÚwarningsÚcatch_warningsrp   r   ra   rb   rc   r
   )rA   Úfilenamer­   rB   Zwarning_listr   r   r   Útest_hierarch_not_warn…  s     ÿz*TestHeaderFunctions.test_hierarch_not_warnc                 C   sp   t j d¡}|jdkst‚|jdks(t‚|jdks6t‚t  dd¡}|jdksPt‚|jdks^t‚|jdkslt‚dS )zá
        Regression test for
        https://github.com/spacetelescope/PyFITS/issues/6

        Make sure any leading or trailing whitespace around HIERARCH
        keywords is stripped from the actual keyword value.
        z*HIERARCH  key.META_4    = 'calFileVersion'rì   rí   rK   zHIERARCH  key.META_4Nrî   rN   r   r   r   Ú test_hierarch_keyword_whitespace—  s    	z4TestHeaderFunctions.test_hierarch_keyword_whitespacec              	   C   sÈ   t  ddd¡}| d¡ |jdks&t‚|jdks4t‚|jdksBt‚t  dddd	d
g¡}t j|d�}| 	|  
d¡¡ t  |  
d¡¡�<}|d j}t|j| d¡ ƒt|j| d¡ ƒksºt‚W 5 Q R X dS )zëRegression test for
        https://github.com/spacetelescope/PyFITS/issues/7

        Assures that HIERARCH keywords with lower-case characters and other
        normally invalid keyword characters are not considered invalid.
        zHIERARCH WeirdCard.~!@#_^$%&z	The valueú	a commentÚ	exceptionzWeirdCard.~!@#_^$%&)ÚsimpleT)ÚBITPIXr‚   )ÚNAXISr   )ÚEXTENDTzMay contain datasets)zHIERARCH key.META_0ZdetRow©rB   r    r   z
key.META_0N)r   rL   rc   rM   r   rS   rg   r   rÞ   r§   r¨   r¥   rB   rV   r~   rG   )rA   r   rB   rà   r­   Úheader2r   r   r   Útest_verify_mixed_case_hierarch«  s(    
ûÿ	
ÿz3TestHeaderFunctions.test_verify_mixed_case_hierarchc              	      sD   t  ¡ ‰ t t‡ fdd„d¡ tjtdd�� ˆ d  W 5 Q R X dS )z=Test that accessing a non-existent keyword raises a KeyError.c                    s   ˆ |  S ©Nr   )Úkrÿ   r   r   Ú<lambda>Ò  ó    z:TestHeaderFunctions.test_missing_keyword.<locals>.<lambda>rý   zKeyword 'NAXIS' not found.r¼   N)r   r   ra   rh   ÚKeyErrorrj   r   rÿ   r   Útest_missing_keywordÌ  s    z(TestHeaderFunctions.test_missing_keywordc                 C   s<   t  ¡ }d|d< d|kst‚|d dks,t‚d|ks8t‚d S )Nr   rê   rl   Z	ABCDEFGHIr   r@   r   r   r   Útest_hierarch_card_lookup×  s
    z-TestHeaderFunctions.test_hierarch_card_lookupc                 C   s   t  ¡ }d|d< |d= d S )Nr   rê   )r   r   r@   r   r   r   Útest_hierarch_card_deleteá  s    z-TestHeaderFunctions.test_hierarch_card_deletec              	   C   s¾   t  ¡ }tjt jjdd�� d|d< W 5 Q R X d|d< d|d< tjt jjdd�� | dd¡ W 5 Q R X |d	= tjt jjdd�� | dd¡ W 5 Q R X |d= t| ¡ ƒd d 	¡ ksºt
‚d S )
Nrò   r¼   r   rl   Zabcdefghr_   re   )Ú
abcdefghijr   r
  )r   r   ra   rb   rc   r
   Úinsertr™   rˆ   Úupperr   r@   r   r   r   Ú test_hierarch_card_insert_deleteæ  s*     ÿ ÿ ÿz4TestHeaderFunctions.test_hierarch_card_insert_deletec              	   C   sP  d}t  ¡ }t t¡��.}| ddi¡ t|ƒdks8t‚d|ksDt‚|d dksTt‚| ddi¡ t|ƒdksrt‚|d s‚tdƒ‚| ddi¡ t|ƒdks t‚t|ƒdks°t‚|d sÀtdƒ‚| d	d
i¡ t|ƒdksÞt‚t|ƒdksît‚|d sþtd
ƒ‚| ddi¡ t|ƒdk�st‚t|ƒdk�s0t‚|d �sBtdƒ‚| ddi¡ t|ƒdk�sbt‚|t|d j	ƒk�szt‚| ddi¡ t|ƒdk�sšt‚|d �s¬tdƒ‚| ddi¡ t|ƒdk�sÌt‚|d �sÞtdƒ‚| dd
i¡ t|ƒdk�sþt‚|d �std
ƒ‚| ddi¡ t|ƒdk�s0t‚|d �sBtdƒ‚W 5 Q R X dS )z¤
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/158

        Tests several additional use cases for working with HIERARCH cards.
        úa HIERARCH card will be createdzHIERARCH BLAH BLAHÚTESTAr   z	BLAH BLAHÚTESTBÚTESTCr   zHIERARCH blah blahÚTESTDz	blah blahÚTESTEre   zBLAH BLAH BLAHrf   zHIERARCH BLAH BLAH BLAHry   zHIERARCH blah blah blahzblah blah blahrƒ   N)
r   r   ra   rb   r
   rš   rp   r   rV   rÉ   ©rA   ÚmsgrB   rs   r   r   r   Útest_hierarch_create_and_updateú  sJ    z3TestHeaderFunctions.test_hierarch_create_and_updatec              	   C   s–  d}t  ¡ }t t¡��}| ddi¡ t|ƒdks8t‚d|ksDt‚|d dksTt‚| ddi¡ t|ƒdksrt‚|d s‚tdƒ‚| ddi¡ t|ƒdks t‚|d s°tdƒ‚| d	d
i¡ t|ƒdksÎt‚t|ƒdksÞt‚|d sîtd
ƒ‚| ddi¡ t|ƒdk�st‚t|ƒdk�s t‚|d �s2tdƒ‚W 5 Q R X t  ¡ }t t¡��<}| ddi¡ tdd„ |D ƒƒ t|ƒdk�s„t‚|t	|d j
ƒk�sœt‚| ddi¡ t|ƒdk�s¼t‚|d �sÎtdƒ‚| ddi¡ t|ƒdk�sît‚|d �s tdƒ‚| d	d
i¡ t|ƒdk�s t‚t|ƒdk�s2t‚|d �sDtd
ƒ‚| ddi¡ t|ƒdk�sdt‚t|ƒdk�svt‚|d �sˆtdƒ‚W 5 Q R X dS )aD  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/158

        Tests several additional use cases for working with HIERARCH cards,
        specifically where the keyword is fewer than 8 characters, but contains
        invalid characters such that it can only be created as a HIERARCH card.
        r  zHIERARCH BLA BLAr  r   zBLA BLAr  r  r   zHIERARCH bla blar  zbla blar  re   c                 S   s   g | ]
}|j ‘qS r   )Úcategory)r*   Úxr   r   r   r,   b  s     zMTestHeaderFunctions.test_short_hierarch_create_and_update.<locals>.<listcomp>rf   N)r   r   ra   rb   r
   rš   rp   r   ÚprintrV   rÉ   r  r   r   r   Ú%test_short_hierarch_create_and_update7  sR    	z9TestHeaderFunctions.test_short_hierarch_create_and_updatec                    s$   t  ¡ ‰ ‡ fdd„}t t|¡ d S )Nc                      s   dˆ d< d S )N)ÚbarZbazZquxr�   r   r   rÿ   r   r   Útest}  s    z=TestHeaderFunctions.test_header_setitem_invalid.<locals>.test)r   r   ra   rh   ri   )rA   r  r   rÿ   r   Útest_header_setitem_invalidz  s    z/TestHeaderFunctions.test_header_setitem_invalidc                 C   sp   t  ¡ }d|d< d|d< |d dks(t‚|d d ks8t‚|d dksHt‚|jd dksZt‚|jd dkslt‚d S )N)r’   r�   r  rŸ   r’   r   rK   ©r   r   r   r?   r@   r   r   r   Útest_header_setitem_1tuple‚  s    z.TestHeaderFunctions.test_header_setitem_1tuplec                 C   s‚   t  ¡ }d|d< d|d< |d dks(t‚|d d ks8t‚|d dksHt‚|jd dksZt‚|jd dkslt‚|jd dks~t‚d S )	Nr‘   r�   )NNrŸ   r’   r   r“   rK   r  r@   r   r   r   Útest_header_setitem_2tupleŒ  s    z.TestHeaderFunctions.test_header_setitem_2tuplec                 C   s"  t  ¡ }d|d< |d dks t‚d|d< |d dks8t‚d}t jj|dd�}t  dt jj¡}| |g¡ t jj|d< |jd	d
d� | d¡ |d dksœt‚|d dks¬t‚|d dks¼t‚|d dksÌt‚|d dksÜt‚|d dksìt‚d|d< d|d< |j	D ]}|j
t jjk�st‚�qdS )z“
        Setting the value of a card to None should simply give that card an
        undefined value.  Undefined value should map to None.
        r’   r�   NzUNDEF   = 
DEFINED = 42Ú
©ÚsepZUNDEF2ZUNDEF3)ÚUNDEF5NzUndefined valueT©ÚendZUNDEF6ZDEFINEDrñ   rÃ   r$  ZUNDEF4)r   r   r   rR   rL   r·   r¸   Úextendrß   r~   rS   )rA   rB   Úhstrr   r   r   r   Útest_header_set_value_to_none—  s,    

z1TestHeaderFunctions.test_header_set_value_to_nonec                 C   s@   t  dg¡}|jddd� |d dks*t‚|jd dks<t‚d S )Nr7   r8   r<   )rg   r9   )r   r   r›   r   r?   r@   r   r   r   Útest_set_comment_onlyÄ  s    z)TestHeaderFunctions.test_set_comment_onlyc                 C   s&   t  ddg¡}t|ƒddgks"t‚d S )N©r8   r9   ©r:   r<   r8   r:   )r   r   r™   r   r@   r   r   r   Útest_header_iterÊ  s    z$TestHeaderFunctions.test_header_iterc                 C   sä   t  dddg¡}|dd … }t|ƒdks,t‚d|ks8t‚d|ksDt‚d|ksPt‚|d d d	… }t|ƒd
ksnt‚|d dks~t‚|d dksŽt‚|d dksžt‚|d d d… }t|ƒdks¼t‚d|ksÈt‚d|ksÔt‚d|ksàt‚d S )Nr+  r,  ©r=   r>   r   re   r8   r:   r=   r¤   rf   r   r>   r<   r9   ©r   r   rp   r   ©rA   rB   Z	newheaderr   r   r   Útest_header_sliceÎ  s     z%TestHeaderFunctions.test_header_slicec                 C   sœ   t  dddg¡}d|dd…< |d dks,t‚|d dks<t‚d|dd…< |d dksXt‚|d dksht‚dd	g|dd…< |d dksˆt‚|d d	ks˜t‚dS )
zp
        Assigning to a slice should just assign new values to the cards
        included in the slice.
        r+  r,  r.  r   Nre   ÚGHÚHÚIr   r@   r   r   r   Útest_header_slice_assignmentâ  s    z0TestHeaderFunctions.test_header_slice_assignmentc                 C   sX   t  dddg¡}|dd…= t|ƒdks*t‚|d dks:t‚|dd…= t|ƒdksTt‚dS )z/Test deleting a slice of cards from the header.r+  r,  r.  r   Nr   r9   r/  r@   r   r   r   Útest_header_slice_deleteú  s    

z,TestHeaderFunctions.test_header_slice_deletec                 C   sL   t  dddg¡}|d }t|ƒdks(t‚|d dks8t‚|d dksHt‚dS )	z>Test selecting a subsection of a header via wildcard matching.©rP   r   ©ÚDEFr   ©ZABDre   úAB*re   r   r   Nr/  r0  r   r   r   Útest_wildcard_slice  s
    z'TestHeaderFunctions.test_wildcard_slicec                 C   sP   t  dddg¡}t|d ƒdks$t‚t|d ƒdks8t‚t|d ƒdksLt‚d	S )
zp
        Regression test for issue where wildcards did not work on keywords
        containing hyphens.
        )ZDATEr   )zDATE-OBSre   )zDATE-FOOrf   zDATE*rf   zDATE?*re   zDATE-*Nr/  r@   r   r   r   Útest_wildcard_with_hyphen  s    z-TestHeaderFunctions.test_wildcard_with_hyphenc                 C   s�   t  dddg¡}d|d< |d dks(t‚|d dks8t‚d|d< |d dksPt‚|d dks`t‚d	d
g|d< |d d	ks|t‚|d d
ksŒt‚dS )z@Test assigning to a header slice selected via wildcard matching.r7  r8  r:  r   r;  r   re   r2  r3  r4  Nr   r@   r   r   r   Útest_wildcard_slice_assignment  s    z2TestHeaderFunctions.test_wildcard_slice_assignmentc                 C   s:   t  dddg¡}|d= t|ƒdks&t‚|d dks6t‚dS )z@Test deleting cards from a header that match a wildcard pattern.r7  r8  r:  r;  r   r   Nr/  r@   r   r   r   Útest_wildcard_slice_deletion-  s    z0TestHeaderFunctions.test_wildcard_slice_deletionc                 C   s2   t  ddddddg¡}|d dd	d
dgks.t‚d S )Nr7  ru   rw   )r9  rf   )rv   ry   )rv   rƒ   rv   r   re   ry   rƒ   r   r@   r   r   r   Útest_header_history5  s    úÿ
z'TestHeaderFunctions.test_header_historyc                 C   sB   t  ddg¡}| ¡  d|ks"t‚d|ks.t‚t|ƒdks>t‚d S )Nr+  r,  r8   r:   r   )r   r   Úclearr   rp   r@   r   r   r   Útest_header_clearB  s
    z%TestHeaderFunctions.test_header_clearÚfitsextc              	   C   sr   t  t  ¡ |g¡}d|d jd< |d j ¡  t t¡�}|j|  	d¡dd� W 5 Q R X d}|t
|jƒksnt‚d S )Nr’   r   r�   ú	temp.fitsT©Ú	overwritez'XTENSION' card does not exist.)r   ZHDUListrÞ   rB   rA  ra   rh   r	   r§   r¨   rV   rS   r   )rA   rC  ZhdulistÚerrÚerr_msgr   r   r   Útest_header_clear_writeI  s    z+TestHeaderFunctions.test_header_clear_writec                 C   sp   t j ddg¡}d|kst‚|d d ks,t‚|jd dks>t‚d|ksJt‚|d d ksZt‚|jd dkslt‚d S )Nr8   r9   rK   ©r   r   Úfromkeysr   r?   r@   r   r   r   Útest_header_fromkeysS  s    z(TestHeaderFunctions.test_header_fromkeysc                 C   sr   t j ddgd¡}d|kst‚|d dks.t‚|jd dks@t‚d|ksLt‚|d dks\t‚|jd dksnt‚d S )Nr8   r9   r:   rK   rJ  r@   r   r   r   Útest_header_fromkeys_with_value\  s    z3TestHeaderFunctions.test_header_fromkeys_with_valuec                 C   sB   t j dgd¡}d|kst‚|d dks,t‚|jd dks>t‚d S )Nr8   ©r9   r:   r9   r:   rJ  r@   r   r   r   Ú+test_header_fromkeys_with_value_and_commente  s    z?TestHeaderFunctions.test_header_fromkeys_with_value_and_commentc                 C   s˜   t j dddgd¡}d|ks t‚d|ks,t‚d|ks8t‚d|ksDt‚|d dksTt‚|d dksdt‚|d dkstt‚|d dks„t‚|d dks”t‚d S )	Nr8   r9   r:   )r8   r   r”   )r8   re   r   re   )r   r   rK  r   r@   r   r   r   Ú$test_header_fromkeys_with_duplicatesk  s    z8TestHeaderFunctions.test_header_fromkeys_with_duplicatesc                 C   s*   t  ddg¡}t| ¡ ƒddgks&t‚d S ©Nr+  r,  )r   r   r™   rÄ   r   r@   r   r   r   Útest_header_itemsw  s    z%TestHeaderFunctions.test_header_itemsc                 C   s6   t  ddg¡}t| ¡ |ƒD ]\}}||kst‚qd S rQ  )r   r   Úziprˆ   r   ©rA   rB   r   r   r   r   r   Útest_header_iterkeys{  s    z(TestHeaderFunctions.test_header_iterkeysc                 C   s:   t  ddg¡}t| ¡ ddgƒD ]\}}||ks t‚q d S )Nr+  r,  r9   r<   )r   r   rS  rœ   r   rT  r   r   r   Útest_header_itervalues€  s    z*TestHeaderFunctions.test_header_itervaluesc              	   C   sD   t  |  d¡¡�*}t|d jƒddddddd	gks6t‚W 5 Q R X d S )
Nrž   r   ÚSIMPLErü   rý   r—   r˜   ZNAXIS3rþ   )r   r¥   r¦   r™   rB   r   r¬   r   r   r   Útest_header_keys…  s    ùz$TestHeaderFunctions.test_header_keysc                 C   sÒ   t  ddddg¡}| ¡ }|dks&t‚t|ƒdks6t‚t|ƒddd	gksLt‚| d
¡}|dksbt‚t|ƒdksrt‚t|ƒdd	gks†t‚| d¡}|dksœt‚t|ƒd
ks¬t‚t|ƒd	gks¾t‚t t|jd¡ d S )Nr+  r,  r.  ©ÚGr3  r3  rf   r8   r:   r=   r   r<   re   r   r9   rñ   )	r   r   Úpopr   rp   r™   ra   rh   Ú
IndexError)rA   rB   ÚlastÚmidÚfirstr   r   r   Útest_header_list_like_pop‘  s    

z-TestHeaderFunctions.test_header_list_like_popc                 C   s  t  ddddg¡}t t|jddd¡ | d¡}|d	ks<t‚t|ƒd
ksLt‚t|ƒdddgksbt‚| d¡}|dksxt‚t|ƒdksˆt‚t|ƒddgksœt‚| d¡}|dks²t‚t|ƒdksÂt‚t|ƒdgksÔt‚| dd¡}|dksìt‚t|ƒdksüt‚t t	|jd¡ d S )Nr+  r,  r.  rY  r8   r9   r:   rZ  r3  rf   r=   r<   re   r   ÚXÚY)
r   r   ra   rh   Ú	TypeErrorr[  r   rp   r™   r  )rA   rB   r]  r^  r_  Údefaultr   r   r   Útest_header_dict_like_pop¥  s$    


z-TestHeaderFunctions.test_header_dict_like_popc                 C   sš   t  dddg¡}| ¡ \}}||ks(t‚t|ƒdks8t‚| ¡ \}}||ksPt‚t|ƒdks`t‚| ¡ \}}||ksxt‚t|ƒdksˆt‚t t|j¡ d S )Nr+  r,  r.  re   r   r   )r   r   Úpopitemr   rp   ra   rh   r  )rA   rB   rM   rS   r   r   r   Útest_popitem¾  s    z TestHeaderFunctions.test_popitemc                 C   s®   t  dddg¡}| d¡dks"t‚| d¡dks4t‚| d¡d	ksFt‚t|ƒd
ksVt‚| dd¡dksjt‚t|ƒdkszt‚d|ks†t‚| dd¡dksšt‚t|ƒdksªt‚d S )Nr+  r,  r.  r8   r9   r:   r<   r=   r>   rf   rZ  r3  ry   )r   r   Ú
setdefaultr   rp   r@   r   r   r   Útest_setdefaultË  s    z#TestHeaderFunctions.test_setdefaultc                 C   sÖ   t  ddg¡}| dddœ¡ |d dks.t‚|d dks>t‚d|ksJt‚|d dksZt‚|d	 dksjt‚t  ddg¡}|jddd� |d dks–t‚|d dks¦t‚d|ks²t‚|d dksÂt‚|d	 dksÒt‚d
S )zm
        Test adding new cards and updating existing cards from a dict using
        Header.update()
        r+  r,  r=   rZ  ©r8   r>   r8   r   r>   r¤   N)r   r   rš   r   r@   r   r   r   Útest_update_from_dict×  s    z)TestHeaderFunctions.test_update_from_dictc                 C   st   t  ddg¡}| dt  dd¡g¡ |d dks4t‚|d dksDt‚d|ksPt‚|d dks`t‚|d	 dkspt‚d
S )zv
        Test adding new cards and updating existing cards from an iterable of
        cards and card tuples.
        r+  r,  )r8   r=   r>   rZ  r8   r=   r   r¤   N)r   r   rš   rL   r   r@   r   r   r   Útest_update_from_iterableî  s    z-TestHeaderFunctions.test_update_from_iterablec                 C   sæ   t  ¡ }t  ¡ }d|jd< | j|j7  _t|jƒdks<t‚|jd dksNt‚t  ¡ }|j|j |_t|jƒdksvt‚|jd dksˆt‚|jj|jdd� t|jƒdks¬t‚t|jƒd d	ksÂt‚|jd dksÔt‚d
|jksât‚dS )zr
        Test extending a header both with and without stripping cards from the
        extension header.
        ©úsome valzsome commentÚMYKEYrƒ   r¤   rn  F©r«   r   ÚXTENSION©ro  r   N)r   rÞ   ÚImageHDUrB   rp   r   r'  r™   ©rA   rà   Úhdu2r   r   r   Útest_header_extendü  s    
z&TestHeaderFunctions.test_header_extendc                 C   sÆ   t  ¡ }t  ¡ }d|jd< d|jd< |j |j¡ t|jƒdksDt‚|jd dksVt‚|jd dksht‚t  ¡ }t  ¡ }d|jd< d|jd< |jj|jd	d
� t|jƒdks°t‚|jd dksÂt‚dS )zI
        Test extending the header with and without unique=True.
        rm  ro  ©úsome other valzsome other commentrz   éþÿÿÿrn  r¤   rx  T©Úuniquerƒ   N©r   rÞ   rs  rB   r'  rp   r   rt  r   r   r   Útest_header_extend_unique  s    



z-TestHeaderFunctions.test_header_extend_uniquec                 C   sz   dD ]p}dD ]f}t  ¡ }||jks&t‚t  ¡ }d|j|< |jj|j|d� t|jƒdks\t‚|j| d dkst‚qqdS )z—
        Test extending header with and without unique=True and commentary
        cards in the header being added. Issue astropy/astropy#3967
        ©rK   r°   rv   ©TFúMy textrz  rƒ   r   N©r   rÞ   rB   r   rs  r'  rp   )rA   Úcommentary_cardZ	is_uniquerà   ru  r   r   r   Ú$test_header_extend_unique_commentary,  s    
z8TestHeaderFunctions.test_header_extend_unique_commentaryc                 C   s\  t  ¡ }t  ¡ }d|jd< d|jd< d|jd< d|jd< d|jd< |j |j¡ t|jƒdksbt‚d|jkspt‚d	|jks~t‚|jd	 d
ks�t‚t|jd ƒdks¦t‚|jd dks¸t‚t  ¡ }d|jd< d|jd< |jj|jdd� t|jƒdksøt‚d|jk�st‚d	|jk�st‚|jd d
k�s,t‚t|jd ƒdk�sDt‚|jd dk�sXt‚dS )zI
        Test extending the header with and without update=True.
        rm  ro  z	history 1rv   rw  z	history 2r^   )ro  r   rr  rx  rf   r¤   T©rš   r�   re   Nr|  rt  r   r   r   Útest_header_extend_update<  s0    






z-TestHeaderFunctions.test_header_extend_updatec                 C   sz   dD ]p}dD ]f}t  ¡ }||jks&t‚t  ¡ }d|j|< |jj|j|d� t|jƒdks\t‚|j| d dkst‚qqdS )zö
        Test extending header with and without unique=True and commentary
        cards in the header being added.

        Though not quite the same as astropy/astropy#3967, update=True hits
        the same if statement as that issue.
        r~  r  r€  r„  rƒ   r   Nr�  )rA   r‚  Z	is_updaterà   ru  r   r   r   Ú$test_header_extend_update_commentary[  s    
z8TestHeaderFunctions.test_header_extend_update_commentaryc                 C   s8   t  |  d¡¡}t  ¡ }|j|ddd� ||ks4t‚dS )z°
        Test that extending an empty header with the contents of an existing
        header can exactly duplicate that header, given strip=False and
        end=True.
        ú
test0.fitsFT)r«   r&  N)r   Ú	getheaderr¦   r   r'  r   )rA   rB   r   r   r   r   Útest_header_extend_exactn  s    z,TestHeaderFunctions.test_header_extend_exactc                 C   s|   t  dddg¡}| d¡dks"t‚| d¡dks4t‚| d¡dksFt‚d|d	< d
|d	< | d	¡dksht‚t t|jd¡ d S )Nr+  r,  r.  r8   r   r:   r=   r   rv   r   re   rZ  )r   r   rH   r   ra   rh   r  r@   r   r   r   Útest_header_countz  s    z%TestHeaderFunctions.test_header_countc                 C   sÊ   t  ddg¡}| ¡  | ¡  t|ƒdks.t‚|d dks>t‚|d dksNt‚| d¡ t|ƒdksht‚|d dksxt‚|d dksˆt‚|jd	d
d� t|ƒdks¦t‚|d dks¶t‚|d dksÆt‚dS )z–
        Tests that blank cards can be appended, and that future appends will
        use blank cards when available (unless useblanks=False)
        r+  r,  ry   r¤   rK   ry  r.  r>   rY  F©Z	useblanksrƒ   r3  N)r   r   rß   rp   r   r@   r   r   r   Útest_header_append_use_blanks„  s    
z1TestHeaderFunctions.test_header_append_use_blanksc                 C   s²   t  ddg¡}| d¡ t|ƒdks(t‚t|ƒd dks<t‚|d dksLt‚|jd dks^t‚| d¡ t|ƒdksxt‚t|ƒd dksŒt‚|d dksœt‚|jd dks®t‚dS )	zi
        Test appending a new card with just the keyword, and no value or
        comment given.
        r+  r,  r=   rf   r¤   NrK   ry   )r   r   rß   rp   r   r™   r?   r@   r   r   r   Útest_header_append_keyword_onlyŸ  s    

z3TestHeaderFunctions.test_header_append_keyword_onlyc                 C   s®   t  ddg¡}| ¡  | ¡  | dd¡ t|ƒdks:t‚|d dksJt‚|d dksZt‚|d	 d
ksjt‚|jdddd� t|ƒdksŠt‚|d dksšt‚|d dksªt‚d S )Nr+  r,  r   r.  ry   r>   r¤   rK   ry  r<   rY  Fr‹  rƒ   r3  )r   r   rß   r  rp   r   r@   r   r   r   Útest_header_insert_use_blanks¶  s    z1TestHeaderFunctions.test_header_insert_use_blanksc                 C   s^  t  dddg¡}| dd¡ t| ¡ ƒd dks4t‚|d dksDt‚|jd d	ksVt‚|jdd
dd� t| ¡ ƒd dks~t‚t| ¡ ƒd dks–t‚|d dks¦t‚| dd¡ |d dddgksÈt‚|jdddd� |d ddddgksðt‚| dd¡ t| ¡ ƒd dk�st‚|jdddd� t| ¡ ƒd dk�s@t‚t| ¡ ƒd dk�sZt‚d S )!zÛ
        Test that a keyword name or tuple can be used to insert new keywords.

        Also tests the ``after`` keyword argument.

        Regression test for https://github.com/spacetelescope/PyFITS/issues/12
        )r—   r   )r°   ú	Comment 1)r°   ú	Comment 3r—   )rý   re   úNumber of axesr   rý   re   r‘  )r˜   r   Tr{   r   r˜   r   )r°   r   )r°   ú	Comment 2r°   r�  r’  r�  )r°   re   )r°   ú	Comment 4r“  r¤   )r×   Try  r×   )rØ   TrØ   éýÿÿÿN)r   r   r  r™   rˆ   r   r?   r@   r   r   r   Ú!test_header_insert_before_keywordÊ  s(    	ÿz5TestHeaderFunctions.test_header_insert_before_keywordc              	   C   sä   t  ddg¡}| d¡ t|ƒdks(t‚t|ƒdgks:t‚d|ksFt‚t t¡� | d¡ W 5 Q R X |jddd� t|ƒdks„t‚t  ddd	g¡}|jddd
� d|ks®t‚t|ƒdks¾t‚t|ƒdgksÐt‚|d dksàt‚d S )Nr+  r,  r:   r   r8   r>   TrE   rj  )Z
remove_allr   r<   )	r   r   rI   rp   r   r™   ra   rh   r  r@   r   r   r   Útest_removeî  s    
zTestHeaderFunctions.test_removec                 C   s$   t  ddg¡}t|jƒdks t‚d S )Nr7   )r9  rZ  r3  z       A  C
     DEF  H)r   r   r   r?   r   r@   r   r   r   Útest_header_comments	  s    z(TestHeaderFunctions.test_header_commentsc                 C   sz   t  dddg¡}|jdd … }t|ƒddgks2t‚|jd d d… }t|ƒdddgksXt‚|jd	 }t|ƒddgksvt‚d S )
N©ÚABr:   r<   ©ÚEFrZ  r3  ©ÚAIÚJÚKr   r3  rŸ  r¤   r<   úA*)r   r   r?   r™   r   )rA   rB   Úsr   r   r   Útest_comment_slices_and_filters  s    
z3TestHeaderFunctions.test_comment_slices_and_filtersc                 C   sà   t  dddg¡}d|jdd …< t|jƒdddgks6t‚|j| d¡ jdksPt‚|j| d¡ jdksjt‚|j| d	¡ jdks„t‚|jd d … |jd d d
…< t|jƒdddgks¶t‚ddg|jd< t|jƒdddgksÜt‚d S )Nr˜  rš  rœ  ÚLr   r<   r™  r›  r�  r¤   ÚMÚNr   )r   r   r?   r™   r   r~   rG   rg   r@   r   r   r   Ú test_comment_slice_filter_assign  s    z4TestHeaderFunctions.test_comment_slice_filter_assignc                 C   sH  t  ¡ }ttdƒƒ}|D ]}||d< q|d dd … |dd … ksFt‚|d d d… |d d… ksft‚|d d d… |d d… ks†t‚|d d d… |d d… ks¦t‚|d d d d… |d d d… ksÊt‚|d dd d… |dd d… ksît‚|d ddd… |ddd… k�st‚| d	d
¡ |jddd� t|d dd … ƒ|dd … k�sTt‚t|d d d… ƒ|d d… k�szt‚t|d d d… ƒ|d d… k�s t‚t|d d d… ƒ|d d… k�sÆt‚t|d d d d… ƒ|d d d… k�sðt‚t|d dd d… ƒ|dd d… k�st‚t|d ddd… ƒ|ddd… k�sDt‚d S )Nrƒ   rv   r   rf   rz   ry  r¤   re   r   r7   r;   Tr%  )r   r   r™   Úranger   r  rß   )rA   rB   ÚindicesÚidxr   r   r   Útest_commentary_slicing$  s(    
    $$&&&&&**z+TestHeaderFunctions.test_commentary_slicingc                 C   s¼   t  ¡ }d|d< d|d< d|d< d|d< d|d< |d dddgksFt‚d|d d	< |d dddgksht‚d|d d
d …< |d dddgksŽt‚ddg|d d d …< |d dddgks¸t‚d S )Nr’   r�   rP   rv   ÚBARNEYÚFREDr9  ZGHIr   r   r“   r£   r   r@   r   r   r   Útest_update_commentaryC  s    z*TestHeaderFunctions.test_update_commentaryc                 C   sT   t  ¡ }d|d< d|d< d|d< |d |d ks4t‚d|d< |d |d ksPt‚dS )a  
        Regression test for an issue found in *writing* the regression test for
        https://github.com/astropy/astropy/issues/2363, where comparison of
        the list of values for a commentary keyword did not always compare
        correctly with other iterables.
        zhello worldrv   r°   Nr   r@   r   r   r   Útest_commentary_comparisonY  s    z.TestHeaderFunctions.test_commentary_comparisonc                 C   s<  t  ¡ }d|d< d|d< d}||d< d|d< ||d< t|ƒd	ksDt‚t|ƒd
 dksXt‚t|jd ƒd|d d…  kszt‚t|jd ƒ ¡ d|dd …  ks t‚|jd|dd� t|ƒdksÀt‚t|jd ƒd|d d…  ksât‚t|jd
 ƒ ¡ d|dd …  k�s
t‚t  ¡ }| 	ddi¡ | 	ddi¡ d}| 
|¡ | 	ddi¡ | 
|¡ t|jƒd	k�sht‚|jd
 jdk�s~t‚t|jd ƒd|d d…  k�s¢t‚t|jd ƒ ¡ d|dd …  k�sÊt‚|j
|dd� t|jƒdk�sìt‚t|jd ƒd|d d…  k�st‚t|jd
 ƒ ¡ d|dd …  k�s8t‚d S )Nr’   r�   r£   r“   ZZABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCrv   r«  r¬  r�   re   rf   r¯   éH   ry   r{   r^   r   )r   r   rp   r   r™   rV   r~   rÜ   r›   rš   r}   rM   )rA   rB   Zlongvalr   r   r   Útest_long_commentary_cardi  s<    "&"(

$($z-TestHeaderFunctions.test_long_commentary_cardc              
   C   s®  |   d¡}t |  d¡¡�X}|d j |¡ tjtt	d�� |d jj|dd� W 5 Q R X |d jj|dd� W 5 Q R X t 
¡ }|j dd	i¡ |jj|j |¡ddd
� |j|   d¡dd� t |   d¡¡�}t|d tjƒsät‚W 5 Q R X t 
¡ }|j dd	i¡ |jj|j |¡dddd� d|jk�s2t‚d|jk�sBt‚d|jk�sRt‚|j|   d¡ddd� t |   d¡¡�,}t|ƒdk�sŒt‚d|d jk�s t‚W 5 Q R X d S )Nz
header.txtr‡  r   r¼   FrE  Tro  r�   ©rš   Úupdate_firstr    Úignore©Úoutput_verify©rš   r²  r«   Ú	EXTENSIONrW  ©rµ  rF  re   r   )r¨   r   r¥   r¦   rB   Ú
totextfilera   rh   ÚOSErrorr   rs  rš   r'  Úfromtextfiler§   Ú
isinstancerÞ   r   rp   ©rA   Zhome_is_tempZheader_filenamer­   rà   Zhdul2r   r   r   Útest_totxtfileŽ  s>    

  ÿ
üz"TestHeaderFunctions.test_totxtfilec              
   C   s®  |   d¡}t |  d¡¡�X}|d j |¡ tjtt	d�� |d jj|dd� W 5 Q R X |d jj|dd� W 5 Q R X t 
¡ }|j dd	i¡ |jj|j |¡ddd
� |j|   d¡dd� t |   d¡¡�}t|d tjƒsät‚W 5 Q R X t 
¡ }|j dd	i¡ |jj|j |¡dddd� d|jk�s2t‚d|jk�sBt‚d|jk�sRt‚|j|   d¡ddd� t |   d¡¡�,}t|ƒdk�sŒt‚d|d jk�s t‚W 5 Q R X dS )z:
        Repeat test_totxtfile, but with tofile()
        zheader.fitsr‡  r   r¼   FrE  Tro  r�   r±  r    r³  r´  r¶  r·  rW  r¸  re   r   N)r¨   r   r¥   r¦   rB   Útofilera   rh   rº  r   rs  rš   r'  Úfromfiler§   r¼  rÞ   r   rp   r½  r   r   r   Útest_tofile¶  s>    

  ÿ
üzTestHeaderFunctions.test_tofilec                 C   s*   |   d¡}tj |¡}|d dks&t‚dS )zBRegression test for https://github.com/astropy/astropy/issues/8711z
scale.fitsZDATASETZ2MASSN)r¦   r   r   rÀ  r   )rA   rö   Úhdrr   r   r   Útest_fromfileá  s    
z!TestHeaderFunctions.test_fromfilec              	   C   sz   t  ¡ }d|d< d|d< d|d< t|  d¡dƒ�"}| d	 d
d„ |jD ƒ¡¡ W 5 Q R X t j |  d¡¡}||ksvt‚dS )zàRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/122

        Manually write a text file containing some header cards ending with
        newlines and ensure that fromtextfile can read them back in.
        rN  r8   r,  r9   )r<   r=   r:   útest.hdrrs   r!  c                 s   s   | ]}t |ƒ ¡ V  qd S r  ©rV   r«   ©r*   r   r   r   r   r0   ô  s     z?TestHeaderFunctions.test_header_fromtextfile.<locals>.<genexpr>N©	r   r   r¥   r¨   ÚwriterÛ   r~   r»  r   )rA   rB   Úfr   r   r   r   Útest_header_fromtextfileç  s    &z,TestHeaderFunctions.test_header_fromtextfilec              	   C   s~   t  ddg¡}t|  d¡dƒ�,}| d dd„ |jD ƒ¡¡ | d¡ W 5 Q R X t j |  d¡¡}d	|ksnt‚||kszt‚d
S )z³Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/154

        Make sure that when a Header is read from a text file that the END card
        is ignored.
        r7   r;   rÄ  rs   r!  c                 s   s   | ]}t |ƒ ¡ V  qd S r  rÅ  rÆ  r   r   r   r0     s     zMTestHeaderFunctions.test_header_fromtextfile_with_end_card.<locals>.<genexpr>z
ENDÚENDNrÇ  )rA   rB   rÉ  r   r   r   r   Ú&test_header_fromtextfile_with_end_cardù  s    z:TestHeaderFunctions.test_header_fromtextfile_with_end_cardc                    sx   t  ddg¡‰ ‡ fdd„}t t|dd¡ t tˆ jd¡ tjtˆ jddd� t tˆ jtˆ ƒd¡ t tˆ jd¡ d	S )
zä
        Regression test 2 for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/154

        Manually adding an END card to a header should simply result in a
        ValueError (as was the case in PyFITS 3.0 and earlier).
        r7   r;   c                    s   |ˆ | < d S r  r   )r  Úvrÿ   r   r   Úsetitem  s    z9TestHeaderFunctions.test_append_end_card.<locals>.setitemrË  rK   Tr%  N)	r   r   ra   rh   ri   rß   r  rp   r›   )rA   rÎ  r   rÿ   r   Útest_append_end_card  s    z(TestHeaderFunctions.test_append_end_cardc              	      s^  t jt d¡d�j‰ ‡ fdd„}|ddƒ}tjtdd��}t j 	|¡}|ˆ ksRt
‚W 5 Q R X t|ƒd	kslt
‚|d
dƒ}tjtdd��}t j 	|¡}|ˆ ksžt
‚W 5 Q R X t|ƒd	ks¸t
‚|ddƒ}tjtdd��}t j 	|¡}|ˆ ksêt
‚W 5 Q R X t|ƒd	k�st
‚|ddƒ}tjtdd��$}t jj	|dd�}|ˆ k�s>t
‚W 5 Q R X t|ƒd	k�sZt
‚dS )aX  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/217

        This tests the case where the END card looks like a normal card like
        'END = ' and other similar oddities.  As long as a card starts with END
        and looks like it was intended to be the END card we allow it, but with
        a warning.
        r   ©r¦   c                    sN   ˆ j dddd�}|| 7 }|r0|dtt|ƒƒ 7 }t|tƒrBt|ƒS t|ƒS d S )NrK   F)r#  ZendcardÚpaddingr„   )Útostringr   rp   r¼  Úbytesr   r   )r&  Úpadr¡  ©Zhorigr   r   Úinvalid_header.  s    
zBTestHeaderFunctions.test_invalid_end_cards.<locals>.invalid_headerzEND =Tz+Unexpected bytes trailing END keyword: ' ='r¼   r   z
END     = z/Unexpected bytes trailing END keyword: '     ='zEND$%&%^*%*z5Unexpected bytes trailing END keyword: '\$%&%\^\*%\*'rË  Fz(Missing padding to end of the FITS block)rÑ  N)r   rÞ   ÚnpÚarangerB   ra   rb   r   r   rÀ  r   rp   )rA   rÖ  r¡  rs   rç   r   rÕ  r   Útest_invalid_end_cards"  sL    

 ÿ
 ÿ
þ
 ÿz*TestHeaderFunctions.test_invalid_end_cardsc              	   C   s
  t  ¡ }d|d< d|d< t j|t d¡d�}| |  d¡¡ t|  d¡dƒ�}| ¡ }W 5 Q R X | 	d	d
 
d¡¡}| 	dd 
d¡¡}t|  d¡dƒ�}| |¡ W 5 Q R X tjtdd��6}t  |  d¡¡}|d dksÚt‚|d dksêt‚W 5 Q R X t|ƒdk�st‚dS )z5
        Test header with invalid characters
        r’   r�   Zhellor°   rƒ   )rB   r¦   r    Úrbs   hellou   hÃ©lloÚlatin1s   BARu   BÃ€Rú
test2.fitsÚwbz1non-ASCII characters are present in the FITS filer¼   zB?Rzh?llor   N)r   r   rÞ   r×  rØ  r§   r¨   r¥   ÚreadÚreplaceÚencoderÈ  ra   rb   r   rˆ  r   rp   )rA   rç   r­   rÉ  Úoutr\   rs   r   r   r   Útest_invalid_charactersl  s(    þz+TestHeaderFunctions.test_invalid_charactersc                 C   s^  t  dddg¡}|jddd� t|ƒdddgks4t‚|jr>t‚|jdd	d
� t|ƒdddgksbt‚|jrlt‚|jddd� t|ƒdddgks�t‚|jršt‚|jddd
� t|ƒdddgks¾t‚|jrÈt‚|jddd� t|ƒdddgksìt‚|jröt‚|jddd� t|ƒdddgk�st‚|j�r(t‚|jddd
� t|ƒdddgk�sNt‚|j�rZt‚dS )zÝ
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/125

        Ensures that a header is not modified when setting the position of a
        keyword that's already in its correct position.
        r+  rN  r,  r9   re   ©Úbeforer8   r:   r   r{   é{   N)r   r   r›   r™   r   Ú	_modifiedr@   r   r   r   Útest_unnecessary_moveˆ  s,    




z)TestHeaderFunctions.test_unnecessary_movec              	   C   sò  d}t jj|dd�}|d dks$t‚|d dks4t‚tjt jjdd	��  t|j	d ƒt
d
ƒksbt‚W 5 Q R X |j	d js|t‚tjt jjdd	��  t|j	d ƒt
dƒksªt‚W 5 Q R X |j	d jsÄt‚|jsÎt‚t jj|dd�}tjt jjdd	��" t|j	d ƒt
d
ƒk�st‚W 5 Q R X |j	d j�s*t‚tjt jjdd	��" t|j	d ƒt
dƒk�sZt‚W 5 Q R X |j	d j�svt‚|d dk�sˆt‚|d dk�sšt‚|j�s¦t‚d|d< d|d< t|j	d ƒt
d
ƒk�sÒt‚t|j	d ƒt
dƒk�sît‚dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/137z=FOCALLEN= +1.550000000000e+002
APERTURE= +0.000000000000e+000r!  r"  ZFOCALLENg     `c@ZAPERTUREç        r»   r¼   zFOCALLEN= +1.550000000000E+002úAPERTURE= +0.000000000000E+000N)r   r   rR   r   ra   rb   rc   r
   rV   r~   r   ræ  )rA   r(  rç   r   r   r   Útest_invalid_float_cards°  sJ     ÿ$ ÿ$
 ÿ& ÿ&z,TestHeaderFunctions.test_invalid_float_cardsc              
   C   sÊ   t  ¡ }d|jd< | |  d¡¡ t|  d¡dƒ�}| d¡ | tdƒ¡ W 5 Q R X t  |  d¡¡�0}t	 
t¡�}|j|  d¡dd	� W 5 Q R X W 5 Q R X t|ƒd
ks¬t‚t|d jƒ}d|ksÆt‚dS )zW
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/140
        gÊÞÑEàÈ >rÓ   r    zrb+iZ  r%   rD  Úwarnr´  rƒ   rf   z'(invalid value string: '5.0022221e-07')N)r   rÞ   rB   r§   r¨   r¥   ÚseekrÈ  r   ra   rb   r   rp   r   rV   rÉ   )rA   r¿   rà   rÉ  r­   rs   r  r   r   r   Útest_invalid_float_cards2ä  s    

ÿ(z-TestHeaderFunctions.test_invalid_float_cards2c                 C   sŽ   t j d¡}t|ƒtdƒks t‚|jdks.t‚t j d¡}t|ƒtdƒksNt‚|jdks\t‚t j d¡}t|ƒtdƒks|t‚|jdksŠt‚dS )a8  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/137, part 2

        Ticket https://aeon.stsci.edu/ssb/trac/pyfits/ticket/137 also showed that in
        float values like 0.001 the leading zero was unnecessarily being
        stripped off when rewriting the header.  Though leading zeros should be
        removed from integer values to prevent misinterpretation as octal by
        python (for now Astropy will still maintain the leading zeros if now
        changes are made to the value, but will drop them if changes are made).
        ré  rè  zAPERTURE= 0.000000000000E+000zAPERTURE= 017é   N)r   rL   rR   rV   r   r   rS   rN   r   r   r   Útest_leading_zeros  s    z&TestHeaderFunctions.test_leading_zerosc                 C   sh  t dƒ}t dƒ}t ¡ }d|d< d|d< |d dks8t‚|d dksHt‚t|jd ƒ|ks^t‚t|jd ƒ|kstt‚t ¡ }t d¡|d< t d¡|d< |d dks¨t‚|d dks¸t‚t|jd ƒ|ksÎt‚t|jd ƒ|ksät‚t ¡ }| tj	 
|¡¡ | tj	 
|¡¡ |d dk�s"t‚|d dk�s4t‚t|jd ƒ|k�sLt‚t|jd ƒ|k�sdt‚dS )z£
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/123

        Tests assigning Python and Numpy boolean values to keyword values.
        zFOO     =                    TzBAR     =                    FTr�   Fr’   N)r   r   r   r   rV   r~   r×  Úbool_rß   rL   rR   )rA   ZfooimgZbarimgrç   r   r   r   Útest_assign_boolean  s.    z'TestHeaderFunctions.test_assign_booleanc                 C   sF  t  dddg¡}t|ƒdddgks&t‚d|ks2t‚d|ks>t‚|d	 d
ksNt‚t|d ƒdksbt‚d|d< |d dkszt‚t|ƒd
ksŠt‚|d= t|ƒddgks¤t‚t|ƒdks´t‚| d¡dksÆt‚| dd
¡ |d d
ksât‚|jdd
dd� t|ƒdddgk�s
t‚| d¡d
k�st‚t|ƒdk�s0t‚| dd
¡dk�sFt‚t|ƒdk�sXt‚| dd¡dk�snt‚t|ƒd
k�s€t‚t|ƒdddgk�s˜t‚| 	dddœ¡ t|ƒdk�sºt‚t|ƒddddgk�sÔt‚|d dk�sæt‚| 
d¡dk�sút‚| d¡d
k�st‚| d¡ t|ƒd
k�s*t‚t|ƒdddgk�sBt‚dS )a  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/149

        Basically ensures that all public Header methods are case-insensitive
        w.r.t. keywords.

        Provides a reasonably comprehensive test of several methods at once.
        )ÚabCr   )ÚDefre   )ÚGeHrf   rP   r9  ZGEHrQ   ZdEfZgehrf   zg*r   re   ZaBcZgEhÚdefZAbcrã  rò  ry   )rô  ZiJkZIJKZijkró  N)r   r   r™   r   rp   rF   r›   r[  rh  rš   rH   rG   rI   ræ   r   r   r   Ú(test_header_method_keyword_normalization8  sB    

z<TestHeaderFunctions.test_header_method_keyword_normalizationc              	   C   sj  t  d¡ dd¡}tj|d�}d|jd< |j ¡  |j ¡  | |  d¡¡ tj	|  d¡dd��B}d|d	 jkstt
‚|d	 j|jksˆt
‚|d	 j|k ¡ sžt
‚W 5 Q R X t|jƒd
k rÂ|j ¡  q¨|j|  d¡dd� t 	|  d¡¡�F}d|d	 jksút
‚|d	 j|jk�st
‚|d	 j|k ¡ �s(t
‚W 5 Q R X |j |  d¡¡ tj |  d¡¡}|j|k�sft
‚dS )zÈ
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/142

        Tests a case where the comment of a card ends with END, and is followed
        by several blank cards.
        r   r   rÐ  )zTest valzThis is the ENDZTESTKWr    F)Zmemmapr   é$   TrE  rÄ  N)r×  rØ  Úreshaper   rÞ   rB   rß   r§   r¨   r¥   r   r¦   r4   rp   r¹  r   r»  )rA   r¦   rà   r­   r   r   r   r   Útest_end_in_commentq  s(    


 "z'TestHeaderFunctions.test_end_in_commentc                    s  d}‡ fdd„}t  ¡ ‰ dˆ d< dˆ ks,t‚ˆ d dks<t‚tˆ ƒtdƒksPt‚t t||d¡ dˆ d< ˆ d dksxt‚tˆ ƒtdƒksŒt‚t t|d|¡ d	ˆ d< ˆ d dks´t‚ˆ jd dksÆt‚tˆ ƒtd
ƒksÚt‚t t|dd|f¡ t t|d|df¡ t t|d||f¡ dS )aj  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/134

        Assigning a unicode literal as a header value should not fail silently.
        If the value can be converted to ASCII then it should just work.
        Otherwise it should fail with an appropriate value error.

        Also tests unicode for keywords and comments.
        u   ã‚¨ãƒªãƒƒã‚¯c                    s   |ˆ | < d S r  r   )rM   r.   ©rç   r   r   Úassign¥  s    z7TestHeaderFunctions.test_assign_unicode.<locals>.assignr’   r�   zFOO     = 'BAR     'r“   zFOO     = 'BAZ     'r‘   z$FOO     = 'BAR     '           / BAZN)	r   r   r   r   r   ra   rh   ri   r?   )rA   Zerikkurû  r   rú  r   Útest_assign_unicode˜  s&    z'TestHeaderFunctions.test_assign_unicodec              	   C   s2   t  ¡ }tjtdd�� | dd¡ W 5 Q R X dS )a5  
        First regression test for
        https://github.com/spacetelescope/PyFITS/issues/37

        Although test_assign_unicode ensures that `str` objects containing
        non-ASCII characters cannot be assigned to headers.

        It should not be possible to assign bytes to a header at all.
        zIllegal value: b'Hello'.r¼   rÓ   s   HelloN)r   r   ra   rh   ri   r›   ræ   r   r   r   Útest_assign_non_ascii½  s    z)TestHeaderFunctions.test_assign_non_asciic              	   C   s:  t  ¡ }d|d< |d dks t‚t j d¡}| |¡ |d dksFt‚|jd j ¡ dks^t‚|jd j ¡ dksvt‚t j	 
dd¡�V |d dks–t‚|d d	ks¦t‚|jd j ¡ dks¾t‚|jd j ¡ dksÖt‚W 5 Q R X |d dksðt‚|d dk�st‚|jd j ¡ dk�st‚|jd j ¡ dk�s6t‚d
S )aZ  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/146, and
        for the solution that is optional stripping of whitespace from the end
        of a header value.

        By default extra whitespace is stripped off, but if
        `fits.conf.strip_header_whitespace` = False it should not be
        stripped.
        z	Bar      r�   ZBarzQUX     = 'Bar        'r£   zFOO     = 'Bar      'Zstrip_header_whitespaceFzBar        N)r   r   r   rL   rR   rß   r~   rq   rÜ   ZconfZset_temp©rA   rç   r   r   r   r   Útest_header_strip_whitespaceÌ  s"    
"z0TestHeaderFunctions.test_header_strip_whitespacec              	   C   sÚ   ddddgd }t  ¡ }|D ]}||jd< q| |  d¡¡ t  |  d¡¡�}|d jd |ksdt‚W 5 Q R X t j|jd	�}|jd |jd ks”t‚| |  d
¡¡ t  |  d
¡¡�}|d jd |ksÌt‚W 5 Q R X dS )a{  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/156

        When creating a new HDU from an existing Header read from an existing
        FITS file, if the original header contains duplicate HISTORY values
        those duplicates should be preserved just as in the original header.

        This bug occurred due to naivete in Header.extend.
        zCCD parameters table ...z*   reference table oref$n951041ko_ccd.fitsz#     INFLIGHT 12/07/2001 25/02/2002z     all bias framesrf   rv   r    r   rÿ   rÜ  N)r   rÞ   rB   r§   r¨   r¥   r   )rA   Úhistoryrà   Úitemr­   Znew_hdur   r   r   Ú*test_keep_duplicate_history_in_orig_headerë  s$    üû z>TestHeaderFunctions.test_keep_duplicate_history_in_orig_headerc              
   C   sd  t j d¡}t j d¡}t j d¡}t  ¡ }t t¡�*}|j |¡ |j |¡ |j |¡ W 5 Q R X t	|ƒdksvt
‚| |  d¡¡ t t¡�Ê}t  |  d¡¡�®}t	|ƒdks´t
‚|d j}d|ksÊt
‚d|ksÖt
‚d	|ksât
‚|d d
ksòt
‚|d dk�st
‚|d	 dk�st
‚t t|jdd¡ t t|jdd¡ t t|jd	d¡ W 5 Q R X W 5 Q R X dS )z“
        Test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/109

        Allow opening files with headers containing invalid keywords.
        zCLFIND2D: contour = 0.30zJust some random text.ZPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArf   r    r   ZCLFIND2DzJust somZAAAAAAAAz: contour = 0.30ze random text.ZHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZfooN)r   rL   rR   rÞ   ra   rb   r   rB   rß   rp   r   r§   r¨   r¥   rh   ri   r›   )rA   Úc1Úc2Úc3rà   rs   r­   rB   r   r   r   Útest_invalid_keyword_cards	  s.    
z.TestHeaderFunctions.test_invalid_keyword_cardsc              	   C   sL   t j d¡}tjt jjdd�� | d¡ W 5 Q R X t|ƒtdƒksHt	‚dS )z¥
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/172

        Ensures that when fixing a hierarch card it remains a hierarch card.
        z#HIERARCH ESO DET CHIP PXSPACE = 5e6r»   r¼   rË   z#HIERARCH ESO DET CHIP PXSPACE = 5E6N)
r   rL   rR   ra   rb   rc   r
   rV   r   r   r¾   r   r   r   Ú$test_fix_hierarch_with_invalid_value8	  s     ÿz8TestHeaderFunctions.test_fix_hierarch_with_invalid_valuec                 C   sx   t  ¡ }t t|jdtdƒ¡ t t|jdtj¡ t t|jdt 	d¡¡ t t|jdtdƒ¡ t t|jdtj
¡ dS )a  
        Regression test for https://github.com/spacetelescope/PyFITS/issues/11

        For the time being it should not be possible to assign the floating
        point values inf or nan to a header value, since this is not defined by
        the FITS standard.
        rÓ   ÚnanÚinfN)r   r   ra   rh   ri   r›   Úfloatr×  r  Zfloat32r	  ræ   r   r   r   Útest_assign_inf_nanF	  s    	z'TestHeaderFunctions.test_assign_inf_nanc                 C   sö   t  dg¡}d|d< |d dk	s$t‚t|d tƒs6t‚|d dksFt‚t d¡|d< |d dksdt‚d|d< |d dks|t‚t d¡|d< |d dksšt‚d|d< |d dk	s²t‚t|d tƒsÄt‚|d dksÔt‚t d¡|d< |d dksòt‚dS )z•
        Regression test for an issue where a value of True in a header
        cannot be updated to a value of 1, and likewise for False/0.
        )rÓ   Tr   rÓ   TFr   N)r   r   r   r¼  Úintr×  rð  ræ   r   r   r   Útest_update_boolV	  s"    z$TestHeaderFunctions.test_update_boolc                 C   sH  t  ¡ }d|d< d|d< t|d tƒs*t‚t|ƒ d¡s<t‚d|d< t|d tƒsVt‚t|ƒ d¡sht‚d|d< t|d tƒs‚t‚t|ƒ d¡s”t‚d|d< t|d tƒs®t‚t|ƒ d¡sÀt‚d|d< t|d tƒsÚt‚t|ƒ d¡sìt‚d|d< t|d tƒ�st‚t|ƒ d¡�st‚d|d< d	|d< t|d tƒ�s@t‚t|ƒ d
¡�sTt‚d|d< t|d tƒ�spt‚t|ƒ d¡�s„t‚d|d< t|d tƒ�s t‚t|ƒ d¡�s´t‚d	|d< t|d tƒ�sÐt‚t|ƒ d
¡�sät‚d|d< t|d tƒ�s t‚t|ƒ d¡�st‚d|d< t|d tƒ�s0t‚t|ƒ d¡�sDt‚dS )a  
        Regression test for https://github.com/spacetelescope/PyFITS/issues/49

        Ensure that numeric values can be upcast/downcast between int, float,
        and complex by assigning values that compare equal to the existing
        value but are a different type.
        r   rÓ   ç      ð?zTEST    =                  1.0zTEST    =                    1y      ð?        zTEST    =           (1.0, 0.0)r   rè  zTEST    =                  0.0zTEST    =                    0y                zTEST    =           (0.0, 0.0)N)	r   r   r¼  r
  r   rV   Ú
startswithr  Úcomplexræ   r   r   r   Útest_update_numericr	  sN    	z'TestHeaderFunctions.test_update_numericc                 C   s–   t  ¡ }t t|jdd¡ t t|jdd¡ t t|jdd¡ t t|jdd¡ dg}|D ]6}t j |¡}d|kr†t t j|j	d¡ qZ| 	d¡ qZdS )	zç
        Regression test for https://github.com/spacetelescope/PyFITS/issues/51

        Test data extracted from a header in an actual FITS file found in the
        wild.  Names have been changed to protect the innocent.
        rv   r!  z
abczabc
zabc
defaÀ  HISTORY File modified by user 'wilma' with fv  on 2013-04-22T21:42:18           HISTORY File modified by user ' fred' with fv  on 2013-04-23T11:16:29           HISTORY File modified by user ' fred' with fv  on 2013-11-04T16:59:14           HISTORY File modified by user 'wilma' with fv  on 2013-04-22T21:42:18
File modifHISTORY ied by user 'wilma' with fv  on 2013-04-23T11:16:29
File modified by useHISTORY r ' fred' with fv  on 2013-11-04T16:59:14                               HISTORY File modified by user 'wilma' with fv  on 2013-04-22T21:42:18
File modifHISTORY ied by user 'wilma' with fv  on 2013-04-23T11:16:29
File modified by useHISTORY r ' fred' with fv  on 2013-11-04T16:59:14
File modified by user 'wilma' HISTORY with fv  on 2013-04-22T21:42:18
File modif
ied by user 'wilma' with fv  HISTORY on 2013-04-23T11:16:29
File modified by use
r ' fred' with fv  on 2013-1HISTORY 1-04T16:59:14                                                           rú   N)
r   r   ra   rh   ri   r›   rL   rR   r	   rc   )rA   rç   Z
test_cardsZ
card_imager   r   r   r   Útest_newlines_in_commentary½	  s    
ÿz/TestHeaderFunctions.test_newlines_in_commentaryc                 C   sv   t  ¡ }d}| d|f¡ t|jƒdks,t‚|jd  ¡ \}}|dkrN||ksRt‚t j|d�}|j|  	d¡dd	� d
S )a  
        If a HISTORY or COMMENT card with a too-long value is appended to a
        header with Header.append (as opposed to assigning to hdr['HISTORY']
        it fails verification.

        Regression test for https://github.com/astropy/astropy/issues/11486
        A  abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcr   r   r   rv   rÿ   r    TrE  N)
r   r   rß   rp   r~   r   Ú_splitrÞ   r§   r¨   )rA   rB   rS   rD   r.   rà   r   r   r   Ú,test_long_commentary_card_appended_to_headerä	  s    	z@TestHeaderFunctions.test_long_commentary_card_appended_to_headerc              	   C   st   t |  d¡dƒ�}tj | ¡ ¡}W 5 Q R X t |  d¡¡}|d |d ksPt‚||ks\t‚| ¡ | ¡ kspt‚dS )zz
        Test reading a Header from a `bytes` string.

        See https://github.com/astropy/astropy/issues/8706
        r‡  rÚ  rý   N)	r¥   r¦   r   r   rR   rÞ  rˆ  r   rÒ  )rA   ZfobjZpri_hdr_from_bytesZpri_hdrr   r   r   Útest_header_fromstring_bytesü	  s    z0TestHeaderFunctions.test_header_fromstring_bytesc                 C   sL   t  ¡ }d|d< d|d< t|ƒdks(t‚|d dks8t‚|d dksHt‚dS )zU
        Regression test for https://github.com/astropy/astropy/issues/10479
        re   zKEY2 ry   zKEY2  r   ZKEY2Nr/  ©rA   rÂ  r   r   r   Útest_set_keyword_with_space
  s    z/TestHeaderFunctions.test_set_keyword_with_spacec                 C   sx   t j|  d¡dd�}d|d< | ¡  t|ƒddhks8t‚t j|  d¡dd�}d|d< |jdd�}t|ƒddhkstt‚d S )	Nztb.fitsr   )Úextr  r�   rv   Trp  )r   rˆ  r¦   r«   r›   r   r   r  r   r   r   Ú
test_strip
  s    zTestHeaderFunctions.test_stripc              	   C   sä   t j d¡}d|_t|ƒdks"t‚| d¡ t|ƒdks<t‚t j d¡}t  ¡ }d|_|j	 
|¡ |j	 |  d¡¡ t  |  d¡¡�$}d|d	 j	d
< | |  d¡¡ W 5 Q R X t  |  d¡¡�}|d	 j	d
 dksÖt‚W 5 Q R X dS )aw  
        Regression test for https://github.com/astropy/astropy/issues/5408

        Tests updating the value of a card that is malformatted (with an
        invalid value literal).

        This tests two ways of reproducing the problem, one working with a
        Card object directly, and one when reading/writing a header containing
        such an invalid card.
        zKW      = INF  / CommentÚFIXED)ÚKWr  ÚCommentrË   zKW      = INFTz
bogus.fitsr¤   r   r  zbogus_fixed.fitsN)r   rL   rR   rS   Útupler   rc   rÞ   Z	_verifiedrB   rß   r¿  r¨   r¥   r§   )rA   r·   rà   r­   r   r   r   Útest_update_invalid_card!
  s    
z,TestHeaderFunctions.test_update_invalid_cardc                 C   sÎ   t  dddg¡}t d¡}|| dks*t‚d||< || dksBt‚| |d¡ || dks^t‚| d	¡ | d
¡ |d t d¡ d
ksŒt‚| d¡ |dt 	d¡f dks°t‚|dt 
d¡f dksÊt‚d S )N)r8   r�   )r9   re   )r:   r’   re   r’   r“   )r<   rñ   rñ   r–   ZWORLDr°   r   )r:   ÚBAZBAZr:   r   r  )r   r   r×  Úint8r   r  rª   Zint64rß   Zint16Zuint32)rA   rB   r©  r   r   r   Útest_index_numpy_intA
  s    



z(TestHeaderFunctions.test_index_numpy_intc                 C   s\   t  ¡ }|j}|jdkst‚d|d< d|d< d|d< d|d< |jd	ksJt‚|jd
ksXt‚dS )zK
        Tests data size calculation (w/o padding) given a Header.
        r   é    rü   re   rý   r   r—   r˜   i@œ  i€�  N)r   rÞ   rB   Ú	data_sizer   Zdata_size_padded)rA   rà   rB   r   r   r   Útest_header_data_sizeT
  s    z)TestHeaderFunctions.test_header_data_sizeN)‘rŒ   r�   rŽ   Ú__doc__rC   ra   ÚmarkÚparametrizerJ   rO   rT   rW   rX   rY   rZ   r]   rd   rk   ro   rt   r€   r…   r�   r®   r±   r²   r´   rµ   r¶   r¹   rº   rÀ   rÁ   rÂ   rÅ   rÆ   rÇ   rÊ   rÌ   rÑ   rÒ   rÔ   rÚ   rÝ   rá   râ   rã   rä   rè   ré   rë   rï   r÷   rø   r  r  r  r	  r  r  r  r  r  r   r)  r*  r-  r1  r5  r6  r<  r=  r>  r?  r@  rB  r   rs  ÚCompImageHDUrI  rL  rM  rO  rP  rR  rU  rV  rX  r`  re  rg  ri  rk  rl  rv  r}  rƒ  r…  r†  r‰  rŠ  rŒ  r�  rŽ  r•  r–  r—  r¢  r¦  rª  r­  r®  r°  r¾  rÁ  rÃ  rÊ  rÌ  rÏ  rÙ  râ  rç  rê  rí  rï  rñ  rö  rù  rü  rý  rÿ  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r   r   r   r   r6   C   s  

		

		
	
!
=C
-
	
			
$	%(+J(4!9'%#*K' r6   c                       sþ   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zej d4d5d6d7d8g¡d9d:„ ƒZ ‡  Z!S );ÚTestRecordValuedKeywordCardsa«  
    Tests for handling of record-valued keyword cards as used by the
    `FITS WCS distortion paper
    <https://www.atnf.csiro.au/people/mcalabre/WCS/dcs_20040422.pdf>`__.

    These tests are derived primarily from the release notes for PyFITS 1.4 (in
    which this feature was first introduced.
    Note that extra leading spaces in the `value` fields should be parsed on input,
    but will be stripped in the cards.
    c                    sˆ   t ƒ  ¡  t ¡ | _| j dd¡ | j dd¡ | j dd¡ | j dd¡ | j dd¡ | j dd¡ | j dd¡ | j dd	¡ d S )
NÚDP1úNAXIS: 2z	AXIS.1: 1ú	AXIS.2: 2z	NAUX:   2zAUX.1.COEFF.0: 0zAUX.1.POWER.0: 1zAUX.1.COEFF.1: 0.00048828125zAUX.1.POWER.1:  1)ÚsuperÚsetup_methodr   r   Ú_test_headerr›   rj   ©Ú	__class__r   r   r.  p
  s    

z)TestRecordValuedKeywordCards.setup_methodc              	   C   s0  t j d¡}|jdkst‚|jdks(t‚|jdks6t‚|jdksDt‚t j d¡}|jdks^t‚|jdkslt‚|jdkszt‚t j d¡}|jd	ks”t‚|jd
ks¢t‚|jdks°t‚t  d	d¡}|jdksÊt‚|jdksØt‚|jdksæt‚t  d	d¡}|jdk�st‚|jdk�st‚|jdk�s"t‚t  d	d
¡}|jd	k�s>t‚|jd
k�sNt‚|jdk�s^t‚t  dd¡}|jdk�szt‚|jdk�sŠt‚|jdk�sšt‚t  dd¡}|jdk�s¶t‚|jdk�sÆt‚|jdk�sÖt‚t 	t j
j¡� t  dd¡}W 5 Q R X |jdk�st‚|jdk�st‚|jdk�s,t‚dS )zl
        Test different methods for initializing a card that should be
        recognized as a RVKC
        ú DP1     = 'NAXIS: 2' / A commentú	DP1.NAXISç       @rý   ú	A commentzDP1     = 'NAXIS:  2.1'gÍÌÌÌÌÌ @zDP1     = 'NAXIS: a'r*  zNAXIS: aNr+  zNAXIS:  2.0re   r   )r   rL   rR   rM   r   rS   Úfield_specifierrg   ra   rb   rc   r
   rN   r   r   r   Útest_initialize_rvkc|
  sL    z1TestRecordValuedKeywordCards.test_initialize_rvkcc                 C   sH   t j d¡}|jdkst‚|jdks(t‚|jdks6t‚|jdksDt‚dS )zŽ
        Tests that the field_specifier can accessed from a card read from a
        string before any other attributes are accessed.
        r2  rý   r3  r4  r5  N)r   rL   rR   r6  r   rM   rS   rg   rN   r   r   r   Útest_parse_field_specifier±
  s
    z7TestRecordValuedKeywordCards.test_parse_field_specifierc                 C   sp   t j d¡}|jdkst‚d|_|jdks.t‚|jdks<t‚|jdksJt‚|jdksXt‚t|ƒ 	¡ dkslt‚dS )	zz
        Test setting the field_specifier attribute and updating the card image
        to reflect the new value.
        r2  rý   r—   z
DP1.NAXIS1r4  r5  z!DP1     = 'NAXIS1: 2' / A commentN)
r   rL   rR   r6  r   rM   rS   rg   rV   rÜ   rN   r   r   r   Útest_update_field_specifier½
  s    z8TestRecordValuedKeywordCards.test_update_field_specifierc                 C   sp   t  ¡ }| dd¡ | dd¡ |d dks0t‚|d dks@t‚|d dksPt‚|d dks`t‚d|kslt‚d	S )
z”
        The keyword portion of an RVKC should still be case-insensitive, but
        the field-specifier portion should be case-sensitive.
        zabc.defr   zabc.DEFre   zABC.defzaBc.defzABC.DEFzABC.dEfN)r   r   r›   r   r@   r   r   r   Ú$test_field_specifier_case_senstivityÌ
  s    zATestRecordValuedKeywordCards.test_field_specifier_case_senstivityc                 C   sP   | j d dkst‚t| j d tƒs&t‚| j d dks8t‚t| j d tƒsLt‚dS )zt
        Returning a RVKC from a header via index lookup should return the
        float value of the card.
        r   r4  r   r  N©r/  r   r¼  r
  rj   r   r   r   Útest_get_rvkc_by_indexÛ
  s    z3TestRecordValuedKeywordCards.test_get_rvkc_by_indexc                 C   s   | j d dkst‚dS )aa  
        Returning a RVKC just via the keyword name should return the full value
        string of the first card with that keyword.

        This test was changed to reflect the requirement in ticket
        https://aeon.stsci.edu/ssb/trac/pyfits/ticket/184--previously it required
        _test_header['DP1'] to return the parsed float value.
        r*  r+  N)r/  r   rj   r   r   r   Útest_get_rvkc_by_keywordæ
  s    
z5TestRecordValuedKeywordCards.test_get_rvkc_by_keywordc                 C   s<   | j d dkst‚t| j d tƒs&t‚| j d dks8t‚dS )zœ
        Returning a RVKC via the full keyword/field-specifier combination
        should return the floating point value associated with the RVKC.
        r3  r4  zDP1.AUX.1.COEFF.1g      @?Nr;  rj   r   r   r   Ú,test_get_rvkc_by_keyword_and_field_specifierò
  s    zITestRecordValuedKeywordCards.test_get_rvkc_by_keyword_and_field_specifierc              	      s>   t  t‡ fdd„d¡ t jtdd�� ˆ jd  W 5 Q R X dS )z¨
        Accessing a nonexistent RVKC should raise an IndexError for
        index-based lookup, or a KeyError for keyword lookup (like a normal
        card).
        c                    s
   ˆ j |  S r  )r/  )r  rj   r   r   r    r  zKTestRecordValuedKeywordCards.test_access_nonexistent_rvkc.<locals>.<lambda>r‚   z!Keyword 'DP1\.AXIS\.3' not found.r¼   ú
DP1.AXIS.3N)ra   rh   r\  r  r/  rj   r   rj   r   Útest_access_nonexistent_rvkcü
  s    z9TestRecordValuedKeywordCards.test_access_nonexistent_rvkcc                 C   sP   d| j d< | j d dkst‚t| j d tƒs0t‚d| j d< | j d dksLt‚dS )z9A RVKC can be updated either via index or keyword access.rf   r   r3  ç      @gš™™™™™ñ?ú
DP1.AXIS.1Nr;  rj   r   r   r   Útest_update_rvkc  s
    

z-TestRecordValuedKeywordCards.test_update_rvkcc                 C   s<   t  ¡ }d|d< |d dks t‚d|d< |d dks8t‚dS )z;Regression test for an issue that appeared after SVN r2412.r   zD2IM1.EXTVERr  re   r4  Nr   ræ   r   r   r   Útest_update_rvkc_2  s
    z/TestRecordValuedKeywordCards.test_update_rvkc_2c                 C   s|   t j d¡}|jdkst‚|jdks(t‚t  dd¡}|jdksBt‚|jdksPt‚t  dd¡}|jdksjt‚|jdksxt‚d S )Nr2  r*  r+  r3  re   z
NAXIS: 2.0r4  )r   rL   rR   Z
rawkeywordr   ZrawvaluerN   r   r   r   Útest_raw_keyword_value  s    z3TestRecordValuedKeywordCards.test_raw_keyword_valuec                 C   s<   | j jddddd� | j d dks&t‚| j d dks8t‚d	S )
zŒ
        It should be possible to insert a new RVKC after an existing one
        specified by the full keyword/field-specifier combination.r*  z	AXIS.3: 1rù   ú
DP1.AXIS.2r{   rf   r   r?  N)r/  r›   r   rj   r   r   r   Útest_rvkc_insert_after(  s    z3TestRecordValuedKeywordCards.test_rvkc_insert_afterc                 C   sÆ   | j d= t| j ƒdkst‚t| j ƒd dks0t‚| j d dksBt‚t| j ƒd dksXt‚| j d= t| j ƒdksrt‚t| j ƒd dksˆt‚| j d dksšt‚t| j ƒd d	ks°t‚| j d dksÂt‚d
S )z�
        Deleting a RVKC should work as with a normal card by using the full
        keyword/field-spcifier combination.
        rB  r�   r   r3  re   r   rF  rz   úDP1.NAUXN©r/  rp   r   r™   rj   r   r   r   Útest_rvkc_delete1  s    z-TestRecordValuedKeywordCards.test_rvkc_deletec                 C   sÔ   | j d }t|tjƒst‚dd„ |jD ƒddgks6t‚| j d }dd„ |jD ƒdd	gks\t‚| j d
 }dd„ |jD ƒddddgks†t‚| j d }dd„ |jD ƒdgksªt‚| j d }dd„ |jD ƒddgksÐt‚dS )z+Test the keyword filter strings with RVKCs.ú
DP1.AXIS.*c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   K  s     zKTestRecordValuedKeywordCards.test_pattern_matching_keys.<locals>.<listcomp>úDP1     = 'AXIS.1: 1'úDP1     = 'AXIS.2: 2'zDP1.N*c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   Q  s     zDP1     = 'NAXIS: 2'zDP1     = 'NAUX: 2'z
DP1.AUX...c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   W  s     úDP1     = 'AUX.1.COEFF.0: 0'úDP1     = 'AUX.1.POWER.0: 1'ú(DP1     = 'AUX.1.COEFF.1: 0.00048828125'úDP1     = 'AUX.1.POWER.1: 1'z	DP?.NAXISc                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   _  s     z	DP1.A*S.*c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   b  s     N)r/  r¼  r   r   r   r~   ©rA   Úclr   r   r   Útest_pattern_matching_keysF  s2    
þ

þ

ü


þz7TestRecordValuedKeywordCards.test_pattern_matching_keysc                 C   sn   | j d= t| j ƒdkst‚t| j ƒd dks0t‚| j d dksBt‚t| j ƒd dksXt‚| j d dksjt‚dS )z'Deletion by filter strings should work.ú	DP1.A*...re   r   r3  r   rH  NrI  rj   r   r   r   Ú"test_pattern_matching_key_deletiong  s    z?TestRecordValuedKeywordCards.test_pattern_matching_key_deletionc                 C   sZ   | j d }dd„ |jD ƒdddddd	gks.t‚|d
 }dd„ |jD ƒdddd	gksVt‚dS )zX
        A card list returned via a filter string should be further filterable.
        rU  c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   w  s     zQTestRecordValuedKeywordCards.test_successive_pattern_matching.<locals>.<listcomp>rL  rM  rN  rO  rP  rQ  z	*.*AUX...c                 S   s   g | ]}t |ƒ ¡ ‘qS r   rÅ  rÆ  r   r   r   r,   �  s     N)r/  r~   r   )rA   rS  Zcl2r   r   r   Ú test_successive_pattern_matchingq  s     
ú
	üz=TestRecordValuedKeywordCards.test_successive_pattern_matchingc                 C   s"   | j d }t|ƒddgkst‚dS )zl
        The CardList.keys() method should return full keyword/field-spec values
        for RVKCs.
        rK  rB  rF  N)r/  r™   r   rR  r   r   r   Útest_rvkc_in_cardlist_keysˆ  s    
z7TestRecordValuedKeywordCards.test_rvkc_in_cardlist_keysc                 C   s&   | j d }t| ¡ ƒddgks"t‚dS )zv
        The CardList.values() method should return the values of all RVKCs as
        floating point values.
        rK  r  r4  N)r/  r™   rœ   r   rR  r   r   r   Útest_rvkc_in_cardlist_values‘  s    
z9TestRecordValuedKeywordCards.test_rvkc_in_cardlist_valuesc                 C   s8   | j d }|jd jdkst‚t|jd jtƒs4t‚dS )z|
        Individual card values should be accessible by the .value attribute
        (which should return a float).
        rK  r   r  N)r/  r~   rS   r   r¼  r
  rR  r   r   r   Útest_rvkc_value_attributeš  s    
z6TestRecordValuedKeywordCards.test_rvkc_value_attributec                 C   sö   t  ¡ }d|d< d|d< d|ks$t‚d|ks0t‚d|ks<t‚|d ddgksPt‚t  ¡ }d|d< d|kslt‚t|jd	 ƒtd
ƒks†t‚t j d¡}|jdks t‚|j	dks®t‚|j
dks¼t‚t  ¡ }d|d< d|ksØt‚t|jd	 ƒtdƒksòt‚dS )a  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/183

        Ensures that cards with standard commentary keywords are never treated
        as RVKCs.  Also ensures that cards not strictly matching the RVKC
        pattern are not treated as such.
        ú	AXIS.1: 2rv   r,  zHISTORY.AXISzHISTORY.AXIS.1zHISTORY.AXIS.2z Date: 2012-09-19T13:58:53.756061zHISTORY.Dater   z(HISTORY Date: 2012-09-19T13:58:53.756061z*        'Date: 2012-09-19T13:58:53.756061'rK   z"'Date: 2012-09-19T13:58:53.756061'Nr�   zFOO.Datez,FOO     = 'Date: 2012-09-19T13:58:53.756061')r   r   r   rV   r~   r   rL   rR   rM   rS   r6  rþ  r   r   r   Útest_overly_permissive_parsing¤  s&    	z;TestRecordValuedKeywordCards.test_overly_permissive_parsingc                    sÊ   t j d¡}t j d¡}t  ||g¡‰ ˆ d dks6t‚ˆ d dksFt‚ˆ d dksVt‚ˆ d	 d
ksft‚dˆ ksrt‚dˆ ks~t‚dˆ ksŠt‚t t‡ fdd„¡ t t‡ fdd„¡ t t‡ fdd„¡ dS )aØ  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/184

        Ensures that looking up a RVKC by keyword only (without the
        field-specifier) in a header returns the full string value of that card
        without parsing it as a RVKC.  Also ensures that a full field-specifier
        is required to match a RVKC--a partial field-specifier that doesn't
        explicitly match any record-valued keyword should result in a KeyError.
        zFOO     = 'AXIS.1: 2'zFOO     = 'AXIS.2: 4'r�   r[  )r�   r   z	AXIS.2: 4z
FOO.AXIS.1r4  z
FOO.AXIS.2ç      @úFOO.AXISú	FOO.AXIS.úFOO.c                      s   ˆ d S )Nr^  r   r   rú  r   r   r  Ü  r  zQTestRecordValuedKeywordCards.test_overly_aggressive_rvkc_lookup.<locals>.<lambda>c                      s   ˆ d S )Nr_  r   r   rú  r   r   r  Ý  r  c                      s   ˆ d S )Nr`  r   r   rú  r   r   r  Þ  r  N)r   rL   rR   r   r   ra   rh   r  )rA   r  r  r   rú  r   Ú"test_overly_aggressive_rvkc_lookupÇ  s    z?TestRecordValuedKeywordCards.test_overly_aggressive_rvkc_lookupc                 C   s‚  ddl m} | |  d¡¡}|jdgd�}d|ks6t‚d|ksBt‚|jdgdgd	�}d|ks`t‚d
|kslt‚t| d¡ƒdks‚t‚|jdgddgd	�}d|ks¢t‚d
|ks®t‚t| d¡ƒdksÄt‚|jdgdgd	�}d|ksât‚d|ksît‚d|ksút‚| ¡  | |  d¡¡}d|jdgd�k�s*t‚| ¡  | |  d¡¡}d|jdgdd�k�s\t‚d|jdgdd�k�svt‚| ¡  dS )z9Tests the basic functionality of the `fitsheader` script.r   ©Ú
fitsheaderúzerowidth.fitsúAIPS FQ©Ú
extensionszEXTNAME = 'AIPS FQrü   ÚEXTNAME©rg  Úkeywordsz	BITPIX  =r!  rf   r   z	EXTNAME =ry   zNAXIS*z	NAXIS   =z	NAXIS1  =z	NAXIS2  =r‡  zEXTNAME = 'SCIzSCI,2z	comp.fitszXTENSION= 'IMAGEF)rg  Ú
compressedzXTENSION= 'BINTABLETN)	Úastropy.io.fits.scriptsrc  ZHeaderFormatterr¦   Úparser   rp   Úsplitr©   )rA   rc  ZhfÚoutputr   r   r   Útest_fitsheader_scriptà  s2    z3TestRecordValuedKeywordCards.test_fitsheader_scriptc              	   C   sž   t jdt jd� d¡}tj|d�}tj|j|jd�}|j	|  
d¡dd� t |  
d¡¡�<}d	|d
 jkslt‚d|d
 jks~t‚d|d
 jks�t‚W 5 Q R X dS )zHRegression test for issue https://github.com/astropy/astropy/issues/7312ry   )Zdtype)re   re   rÐ  )r¦   rB   z	tmp2.fitsTrE  rq  r   ZPCOUNTZGCOUNTN)r×  rØ  r   rø  r   rÞ   r(  r¦   rB   r§   r¨   r¥   r   )rA   r¦   ZphduZchdur­   r   r   r   Ú1test_fitsheader_compressed_from_primary_image_ext  s    zNTestRecordValuedKeywordCards.test_fitsheader_compressed_from_primary_image_extc              	   C   s¶  ddl m} ddlm} |  d¡}| |¡}| |¡�t}| dg¡}t|ƒt|d j	ƒks^t
‚|jdddgd�}t|ƒt|d j	ƒt|d j	ƒ t|d	 j	ƒ ks¦t
‚W 5 Q R X |jdgd�}t |d
 |k¡sÔt
‚t |d dk¡sêt
‚|d |d dk dk�st
‚|jdgdgd�}t|ƒdk�s,t
‚|d d dk�sBt
‚|d d dk�sXt
‚|d d dk�snt
‚|jdgd�}|dk�sŠt
‚|jdgdgd�}|dk�sªt
‚| ¡  dS )z7Tests the `--table` feature of the `fitsheader` script.r   r   rb  rd  re  re   Ú4rf  ry   rö   rà   rS   rM   rh  ri  r   ZDOES_NOT_EXISTN)Ú
astropy.ior   rl  rc  r¦   ZTableHeaderFormatterr¥   rm  rp   rB   r   r×  r4   r©   )rA   r   rc  Ztest_filenameÚ	formatterZfitsobjZmytabler   r   r   Útest_fitsheader_table_feature  s:    

ÿþÿz:TestRecordValuedKeywordCards.test_fitsheader_table_featurer¢   rÝ  zwb+Úabzab+c              	   C   s>   t |  d¡|d��"}tjt d¡d�}| |¡ W 5 Q R X d S )Nz	mode.fitsr¡   rƒ   rÐ  )r¥   r¨   r   rs  r×  Zonesr§   )rA   r¢   Úffrà   r   r   r   Útest_hdu_writeto_mode=  s    z2TestRecordValuedKeywordCards.test_hdu_writeto_mode)"rŒ   r�   rŽ   r%  r.  r7  r8  r9  r:  r<  r=  r>  r@  rC  rD  rE  rG  rJ  rT  rV  rW  rX  rY  rZ  r\  ra  rp  rq  ru  ra   r&  r'  rx  Ú__classcell__r   r   r0  r   r)  d
  s8   5

		!
		
#(*r)  c                  C   s  G dd„ dt jƒ} | dƒ}|jd dks,t‚|jd dks>t‚|jd d	ksPt‚|d
d… }t|ƒ| kslt‚|jd dks~t‚|jd d	ks�t‚|d }t|ƒ| ks¨t‚|jd d	ksºt‚| ¡ }t|ƒ| ksÒt‚|jd dksät‚|jd d	ksöt‚| d¡ |jd d	k�st‚dS )z?Check that subclasses don't get ignored on slicing and copying.c                       s   e Zd Z‡ fdd„Z‡  ZS )ztest_subclass.<locals>.MyHeaderc                    s2   t |tƒrt|ƒdkr|d7 }tƒ j|f|ž|ŽS )Nre   )ú
no comment)r¼  r  rp   r-  rß   )rA   r·   ÚargsÚkwargsr0  r   r   rß   I  s    z&test_subclass.<locals>.MyHeader.append)rŒ   r�   rŽ   rß   ry  r   r   r0  r   ÚMyHeaderH  s   r}  ))r   r  r_  )r   r4  Úsecond)r   rA  r   r_  r   r~  r   rz  r   Nzc*))r$   r]  r$   )r   r   r?   r   Útyper   r'  )r}  Z	my_headerZslice_Z	selectionZcopy_r   r   r   Útest_subclassE  s(    ÿ
r€  )!r2   r   rô   Úior   r   Únumpyr×  ra   rs  r   Zastropy.io.fits.cardr   Zastropy.io.fits.headerr   Zastropy.io.fits.utilr   Zastropy.io.fits.verifyr	   r
   Zastropy.utils.exceptionsr   Zastropy.utils.miscr   Zconftestr   r   r   r)   r5   r6   r)  r€  r   r   r   r   Ú<module>   sV   
                    5   d