
    HR-e                        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 Zd Zd Zd Z G d de          Z G d de          Zd Z dS )    N)BytesIOStringIOfits)_pad)_pad_length)encode_ascii)VerifyErrorVerifyWarning)AstropyUserWarning)_NOT_OVERWRITING_MSG_MATCH   )FitsTestCasec                      t          j        ddg          } t          j        |           }d| d<   d|vsJ d|d<   | d         dk    sJ 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)original_headercopied_headers     Alib/python3.11/site-packages/astropy/io/fits/tests/test_header.pytest_shallow_copyr      sl     k8X"677OIo..M OCm#### M#31$$$$$$    c                      t          j        dg          } t          j        | d          }d| d<   |d         dk    sJ d|d<   | d         dk    sJ 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   
new_headers     r   test_init_with_headerr!   %   sm     k9+..O_4888JOCc?b    JsO32%%%%%%r   c                  p    dddddd} t          j        |           }| D ]}| |         ||         k    sJ d S )N               )r   r   r   der   )dict1h1is      r   test_init_with_dictr-   2   sY    2BRb99E	U		B ! !Qx2a5     ! !r   c                      d t          d          D             t          j                  } t          j        |           t          fdt                    D                       sJ d S )Nc                     g | ]	\  }}||f
S  r0   ).0jr,   s      r   
<listcomp>z.test_init_with_ordereddict.<locals>.<listcomp>;   s     HHH1aVHHHr   abcdefghijklmnopqrstuvwxyzc              3   N   K   | ]\  }}|         |         d          k    V   dS )r   Nr0   )r1   r,   valr+   list1s      r   	<genexpr>z-test_init_with_ordereddict.<locals>.<genexpr>@   s8      BB&!Sr#w%(1+%BBBBBBr   )	enumeratecollectionsOrderedDictr   r   all)r*   r+   r7   s    @@r   test_init_with_ordereddictr=   9   sw    HH	*F G GHHHE#E**E	U		BBBBBBIbMMBBBBBBBBBBr   c                      e Zd ZdZd Zej                            dddg          d             Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdC ZEdD ZFdE ZGdF ZHdG ZIdH ZJdI ZKdJ ZLdK ZMej                            dL eNjO                     eNjP                    g          dM             ZQdN ZRdO ZSdP ZTdQ ZUdR ZVdS ZWdT ZXdU ZYdV ZZdW Z[dX Z\dY Z]dZ Z^d[ Z_d\ Z`d] Zad^ Zbd_ Zcd` Zdda Zedb Zfdc Zgdd Zhde Zidf Zjdg Zkdh Zldi Zmdj Zndk Zodl Zpdm Zqdn Zrdo Zsdp Ztdq Zudr Zvds Zwdt Zxdu Zydv Zzdw Z{dx Z|dy Z}dz Z~d{ Zd| Zd} Zd~ Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )TestHeaderFunctionszTest Header and Card objects.c                     t          j        ddg          }|                    dd           d|vsJ d|v sJ |d         dk    sJ |d         dk    sJ |j        d         dk    sJ dS )z*Test renaming keyword with rename_keyword.ABCDEFrB   rC   r   rD   N)r   r   rename_keywordcommentsselfheaders     r   test_rename_keywordz'TestHeaderFunctions.test_rename_keywordF   s    o?@@c3'''&    f}}}}ayCc{c!!!!s#s******r   keyrB   r   c                 P   t          j        ddg          }||v sJ ||         dk    sJ |                    |          dk    sJ |                    |          dk    sJ |j        |         dk    sJ |                    |          dk    sJ |                    |d           d	S )
z'Check that indexing is case insensitiverA   rE   rC   r   rD   r   Fignore_missingN)r   r   getindexrJ   countremove)rL   rO   rM   s      r   test_indexing_casez&TestHeaderFunctions.test_indexing_caseP   s     o?@@f}}}}c{c!!!!zz##%%%%||C  A%%%%s#s****||C  A%%%%c%00000r   c                 F    t          j                    }|j        dk    sJ dS )z3Test Card constructor with default argument values. N)r   CardkeywordrL   r   s     r   "test_card_constructor_default_argsz6TestHeaderFunctions.test_card_constructor_default_args\   s"     IKKyBr   c                 x    t           j                            d          }|j        dk    sJ |j        dk    sJ dS )zX
        Test loading a Card from a `bytes` object (assuming latin-1 encoding).
        s   ABC     = 'abc'ABCabcN)r   rZ   
fromstringr[   valuer\   s     r   test_card_from_bytesz(TestHeaderFunctions.test_card_from_bytesb   sF    
 I  !344yE!!!!w%r   c                     t          j        dd          }t          |          t          d          k    sJ t          j        dd          }t          |          t          d          k    sJ dS )z'Test Card constructor with string valuer`   z<8 chzABC     = '<8 ch   'nullstrrY   zNULLSTR = ''Nr   rZ   strr   r\   s     r   test_string_value_cardz*TestHeaderFunctions.test_string_value_cardk   sk     IeW%%1vv4555555Ii$$1vvn--------r   c                     t          j        dd          }t          |          t          d          k    sJ t           j                            d          }|j        du sJ dS )z(Test Card constructor with boolean valuer`   TzABC     =                    TzABC     = FFN)r   rZ   rg   r   ra   rb   r\   s     r   test_boolean_value_cardz+TestHeaderFunctions.test_boolean_value_cards   sc     IeT""1vv>??????I  //w%r   c                 t    t          j        dd          }t          |          t          d          k    sJ dS )z-Test Card constructor with long integer valuelong_intl tNxwb	B z,LONG_INT= -467374636747637647347374734737437Nrf   r\   s     r   test_long_integer_value_cardz0TestHeaderFunctions.test_long_integer_value_card|   s<     Ij"DEE1vvLMMMMMMMMr   c                     t          j        dd          }t          |          t          d          k    rBt          |          t          d          k    r$t          |          t          d          k    sJ dS dS dS )z/Test Card constructor with floating point valuefloatnumgQzFLOATNUM= -4.6737463674763E+32zFLOATNUM= -4.6737463674763E+032Nrf   r\   s     r   test_floating_point_value_cardz2TestHeaderFunctions.test_floating_point_value_card   s     Ij"FGGq66T:;;;;A$-K
 K
 A
 A
 q66T"BCCCCCC <; A
 A
 DCr   c                    d}d}t          j        |d|          }| d| }t          |          dt          |                   |k    sJ t          j        |d|          }| d| }t          |          dt          |                   |k    sJ t          j        |d|          }| d	| }t          |          dt          |                   |k    sJ dS )
z
        Ensures Card formats float values with the correct precision, avoiding
        comment truncation

        Regression test for https://github.com/astropy/astropy/issues/14507
        zHIERARCH ABC DEF GH IJKLMNz$[m] abcdef ghijklm nopqrstu vw xyzabg㥛 ?z = 0.009125 / Ngfffff!@z
 = 8.95 / gXz = -99.9 / )r   rZ   rg   len)rL   kcomr   expected_strs        r   .test_floating_point_string_representation_cardzBTestHeaderFunctions.test_floating_point_string_representation_card   s    )4Ia3''003001vv)L)))*l::::Ias##,,s,,1vv)L)))*l::::Ia$$----1vv)L)))*l::::::r   c                    t          j        dd          }t          d          }t          d          }t          d          }t          |          |k    r(t          |          |k    rt          |          |k    sJ dS dS dS )z(Test Card constructor with complex valuer`   ym8R{<z6ABC     = (1.23453774378878E+88, 6.32476736476374E-15)z6ABC     = (1.2345377437887E+088, 6.3247673647637E-015)N)r   rZ   r   rg   )rL   r   f1f2f3s        r   test_complex_value_cardz+TestHeaderFunctions.test_complex_value_card   s     IeQSSJKKJKKJKKq66R<<CFFbLLq66R<<<< <LL<r   c                    t          j        ddd          }t          j        t           j        j                  5  t          |          dk    sJ 	 ddd           n# 1 swxY w Y   t          j        ddd          }t          j        t           j        j                  5  t          |          dd d	k    sJ 	 ddd           dS # 1 swxY w Y   dS )
z.Test that over-long cards truncate the commentr`   	   dabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdezPABC     =                    9 / abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabNDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcdefgzABC     = '')r   rZ   pytestwarnsverifyr   rg   r\   s     r   $test_card_image_constructed_too_longz8TestHeaderFunctions.test_card_image_constructed_too_long   sb   
 IeQ--\$+344 	 	A D D D D D D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 IeXy11\$+344 	7 	7q666866666666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s#   AA!$A!!C		CCc                     t          j        t          t          j        dddi           t          j        t          t          j        dg d           dS )z=Test that Card constructor raises exceptions on bad arguments)r`   rb   )      rO   commentN)r   raises
ValueErrorr   rZ   rL   s    r   /test_constructor_filter_illegal_data_structureszCTestHeaderFunctions.test_constructor_filter_illegal_data_structures   sA     	j$)X7HIIIj$)UB	BBBBBr   c                 R    t          j        t          t          j        dd           dS )z<Test that long Card keywords are allowed, but with a warning	abcdefghilongN)r   r   UserWarningr   rZ   r   s    r   test_keyword_too_longz)TestHeaderFunctions.test_keyword_too_long   s"     	[$)[&AAAAAr   c                     t          j        t                    5 }t          j        dd          }ddd           n# 1 swxY w Y   t          |          dk    sJ |j        t          d          k    sJ dS )z{
        Test that Card constructor allows illegal characters in the keyword,
        but creates a HIERARCH card.
        zabc+r}   Nr   z$HIERARCH abc+ =                    9)r   r   r   r   rZ   rr   imager   rL   wr   s      r   test_illegal_characters_in_keyz2TestHeaderFunctions.test_illegal_characters_in_key   s     \,-- 	%	&!$$A	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%1vv{{{{w$EFFFFFFFFs   <A A c                    t          j        g d          }|                    d           t          |          dk    sJ |j        d         j        dk    sJ |d         g dk    sJ t          |d                   dk    sJ |                    dd	           t          |          dk    sJ |j        d
         j        dk    sJ |d         g dk    sJ d S )N)rA   HISTORYr   r   r   )r   r   rY   rY   rY   r         r   )r   r   r   r   z1
2
3
4r   rB   afterr   )r   r   r   r   r   )r   r   add_historyrr   cardsrb   reprrK   s     r   test_add_historyz$TestHeaderFunctions.test_add_history   s     	
 	
 	16{{a|A$))))i LLL0000F9%&&,66661C(((6{{a|A$))))i OOO333333r   c                    t          j        g d          }|                    d           t          |          dk    sJ |j        d         j        dk    sJ |d         g dk    sJ t          |d                   dk    sJ |                    dd	
           t          |          dk    sJ |j        d         j        dk    sJ |d         g dk    sJ d|d<   d|d<   |d         g dk    sJ |d         g dk    sJ d S )N)rA   )rY   r   )rY   r   )rY   r   r   r   r      r   rY   )r   r   r   rY   rY   r   z	1
2
3


4r   rB   r      r   )r   r   r   r   rY   rY   r       )	r   r   r   r   rY   rY   r   r   r   )r   r   	add_blankrr   r   rb   r   rK   s     r   test_add_blankz"TestHeaderFunctions.test_add_blank   sU   TTT
 
 	
 6{{a|A$))))bz1111111F2J#33333#&&&6{{a|A$))))bz4444444r
sbz:::::::c{;;;;;;;;;r   c                     G d dt                     }t          j                    }|                    ddi           |                     |ddg                     t	          |                                          h dk    sJ |j        d         d	k    sJ t          j                    }d
|d<   |                    |           t	          |                                          h dk    sJ |j        d         dk    sJ |                    dd           t	          |                                          h dk    sJ t	          |                                          h dk    sJ d S )Nc                       e Zd Zd Zd ZdS )3TestHeaderFunctions.test_update.<locals>.FakeHeaderc                     d | D             S )Nc                     g | ]
}|d          S )r   r0   )r1   ls     r   r3   zLTestHeaderFunctions.test_update.<locals>.FakeHeader.keys.<locals>.<listcomp>  s    +++!+++r   r0   r   s    r   keysz8TestHeaderFunctions.test_update.<locals>.FakeHeader.keys  s    ++d++++r   c                 :    t          fd| D                       S )Nc              3   D   K   | ]}|d          k    |dd         V  dS )r   r   Nr0   )r1   r   rO   s     r   r8   zRTestHeaderFunctions.test_update.<locals>.FakeHeader.__getitem__.<locals>.<genexpr>	  s3      ??a1Q43;;AabbE;;;;??r   )next)rL   rO   s    `r   __getitem__z?TestHeaderFunctions.test_update.<locals>.FakeHeader.__getitem__  s&    ????4??????r   N)__name__
__module____qualname__r   r   r0   r   r   
FakeHeaderr     s7        , , ,@ @ @ @ @r   r   FOOBARBAZrB   r   )rC   r   r   >   rB   rC   r   rC   r   )r   this is a commentHELLO>   rB   rC   r   r   r   r   )NAXIS1NAXIS2>   rB   rC   r   r   r   r   >   r   r   r   r   )listr   r   updatesetr   rJ   values)rL   r   rM   tmphdrs       r   test_updatezTestHeaderFunctions.test_update  s   	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ un-...jj(,?!@AABBB6;;==!!%6%6%66666s#y0000 2wf6;;==!!%?%?%?????w'+>>>>>S---6;;==!!%S%S%SSSSS6==??##'>'>'>>>>>>>r   c                 8   t          j        |                     d                    }|d         j                            ddi           |d         j        d         dk    sJ |d         j        j        d         dk    sJ t          j        t                    5  |d         j                            ddi           d d d            n# 1 swxY w Y   |	                    | 
                    d	                     |                                 t          j        | 
                    d	          d
          }d|d         j        j        d<   |                                 t          j        | 
                    d	                    }|d         j        j        d         dk    sJ |d         j                            dd           t          |d         j        j        d                                                   dk    sJ |                                 d S )Narange.fitsr   r   r   r   r   FOO2)r   r   EXTRA	test.fitsr   modeQUXr   z	COMMENT 0)r   opendatarM   r   rJ   r   r   r   writetotempcloseadd_commentrg   r   striprL   hduls     r   test_update_commentz'TestHeaderFunctions.test_update_comment  s   y=1122Qun5666Aw~e$----Aw~&u-6666]:&& 	E 	EGN!!6+B"CDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	TYY{++,,,

y;//h???).Q&

y;//00Aw~&u-6666Q""1E"22247>'+,,2244CCCC

s   #C		CCc                     d}t          j        d|          }t          |          t          d|z             k    sJ d}t          j        d|d          }t          |          t          d|z             k    sJ d S )Nz2A commentary card's value has no quotes around it.r   HISTORY z!A commentary card has no comment.COMMENTr   zCOMMENT rf   )rL   r6   r   s      r   test_commentary_cardsz)TestHeaderFunctions.test_commentary_cards4  s~    BIi%%1vvj3.//////1Iii001vvj3.////////r   c                 x    t           j                            d          }|j        dk    sJ |j        dk    sJ 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.rY   )r   rZ   ra   rb   r   r\   s     r   *test_commentary_card_created_by_fromstringz>TestHeaderFunctions.test_commentary_card_created_by_fromstring=  sS    I  =
 

 G = = = = = yBr   c                     t           j                            d          }t          |          t	          d          k    sJ d S )NzHISTORY  (1, 2)r   rZ   ra   rg   r   r\   s     r   3test_commentary_card_will_not_parse_numerical_valuezGTestHeaderFunctions.test_commentary_card_will_not_parse_numerical_valueI  s>    I  !2331vv/00000000r   c                     t           j                            d          }t          |          t	          d          k    sJ d S )NzHISTORY =   (1, 2)r   r\   s     r   test_equal_sign_after_column8z1TestHeaderFunctions.test_equal_sign_after_column8N  s@     I  !5661vv233333333r   c                     t          j        dd          }t          |          t          d          k    sJ t           j                            t          |                    }|j        dk    sJ |j        dk    sJ d S )NrY   z       / EXPOSURE INFORMATIONz%               / EXPOSURE INFORMATION)r   rZ   rg   r   ra   r[   rb   r\   s     r   test_blank_keywordz&TestHeaderFunctions.test_blank_keywordT  sx    Ib9::1vvEFFFFFFI  Q((yBw9999999r   c                     t          j        dt           j        j                  }t	          |          t          d          k    sJ d S )Nundefz	UNDEF   =)r   rZ   card	UNDEFINEDrg   r   r\   s     r   test_specify_undefined_valuez0TestHeaderFunctions.test_specify_undefined_value[  s=    Igty2331vvk********r   c                     t           j                            d          }t          |          t	          d          k    sJ d S )NzABC     = (8, 9)r   r\   s     r   &test_complex_number_using_string_inputz:TestHeaderFunctions.test_complex_number_using_string_input`  s>    I  !3441vv011111111r   c                     t           j                            d          }|j        dk    sJ t	          j        t           j        j        d          5  t          |          t          d          k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nzabc     = +  2.1   e + 12g  ~BVerification reported errorsmatchzABC     =             +2.1E+12)
r   rZ   ra   rb   r   r   r   r   rg   r   rL   capsysr   s      r   #test_fixable_non_standard_fits_cardz7TestHeaderFunctions.test_fixable_non_standard_fits_carde  s    I  !<==w/))))\K%-L
 
 
 	D 	D q66T"BCCCCCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds   #BB
Bc                     t           j                            d          }t          j        t           j        j        d          5  t          |          dk    sJ 	 d d d            d S # 1 swxY w Y   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   rZ   ra   r   r   r   r   rg   r\   s     r   test_fixable_non_fscz(TestHeaderFunctions.test_fixable_non_fscn  s     I  U
 
 \K%-L
 
 
 	 	 A 6 6 6 6 6 6		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A))A-0A-c                     t           j                            d          }t          |          t	          d          k    sJ d S )NzABC     =    z	ABC     =r   r\   s     r   'test_undefined_value_using_string_inputz;TestHeaderFunctions.test_undefined_value_using_string_input}  s<    I  111vvk********r   c                     t          j                    }d|d<   d |d<   t          |                                          dd gk    sJ t          |                                          ddgk    sJ d S )Nr   r   UNDEF)r   r   )r   N)r   r   r   r   itemsrK   s     r   test_undefined_keys_valuesz.TestHeaderFunctions.test_undefined_keys_values  sp    uwFMMOO$$5555FLLNN##'HHHHHHHr   c                 :   t           j                            d          }|j        dk    sJ |j        dk    sJ t          j        t           j        j        d          5  t          |          t          d          k    sJ 	 d d d            d S # 1 swxY w Y   d S )NzXYZ= 100XYZr   r   r   zXYZ     =                  100)r   rZ   ra   r[   rb   r   r   r   r   rg   r   r   s      r   test_mislocated_equal_signz.TestHeaderFunctions.test_mislocated_equal_sign  s    I  ,,yE!!!!w#~~~~\K%-L
 
 
 	D 	D q66T"BCCCCCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds   #BBBc                    t           j                            d          }t          j        t
          d          5  t          |          t          d          k    sJ 	 d d d            n# 1 swxY w Y   t           j                            d          }t          j        t
          d          5  t          |          t          d          k    sJ 	 d d d            d S # 1 swxY w Y   d S )NzHISTO       =   (1, 2)zheader keyword is invalidr   z   HISTORY          (1, 2))r   rZ   ra   r   r   r   rg   r   r   s      r   test_equal_only_up_to_column_10z3TestHeaderFunctions.test_equal_only_up_to_column_10  ss    I  !9::\,4PQQQ 	< 	<q66T":;;;;;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<
 I  !=>>\,4PQQQ 	@ 	@q66T">???????	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s#   #A++A/2A/0#C!!C%(C%c                 x   t           j                            d          }t          j        t
                    5 }|                                 d d d            n# 1 swxY w Y   d}d}t          |          dk    sJ |t          |d         j	                  v sJ |t          |d         j	                  v sJ 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'r   r   r   )
r   rZ   ra   r   r   r   r   rr   rg   message)rL   r   r   	err_text1	err_text2s        r   test_verify_invalid_equal_signz2TestHeaderFunctions.test_verify_invalid_equal_sign  s    I  ++\,-- 	HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	R	Q	1vv{{{{C!------C!--------s   AA!Ac                 F   d}t           j                            d          }t          j        t
          |          5 }|                    d           d d d            n# 1 swxY w Y   t          |          dk    sJ t          |          t          d          k    sJ d S )Nz+Fixed 'ABC' card to meet the FITS standard.r  r   fixr   zABC     = 'a6      ')
r   rZ   ra   r   r   r   r   rr   rg   r   )rL   fix_textr   r   s       r   test_fix_invalid_equal_signz/TestHeaderFunctions.test_fix_invalid_equal_sign  s    @I  ++\,H=== 	HHUOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	1vv{{{{1vv455555555s   AA#&A#c                 \    t          j        ddd          }t          |          dk    sJ d S )Nr`   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   rZ   rg   r\   s     r   test_long_string_valuez*TestHeaderFunctions.test_long_string_value  sJ    Ie68LMMFF__ _ _ _ _ _r   c                 Z    t          j        dd          }t          |          dk    sJ dS )zU
        Regression test for https://github.com/astropy/astropy/issues/11298
        WHATEVERzSuperCalibrationParameters_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  r\   s     r   /test_long_string_value_with_multiple_long_wordszCTestHeaderFunctions.test_long_string_value_with_multiple_long_words  sR     I2
 
 FF__ _ _ _ _ _r   c                     t          j                    }d|d<   t          j                    }d|d<   t          |          t          |          k    sJ dS )zRegression 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.
        abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgTESTN)r   r   rg   )rL   r+   h2s      r   test_long_unicode_stringz,TestHeaderFunctions.test_long_unicode_string  sO     []]#6
[]]#6
2ww#b''!!!!!!r   c                 ,   t          j                    }d|d<   d|d<   d|d<   t          |                                          t	          t          j        ddd                    dd	d
dddt	          t          j        ddd                    gk    sJ dS )zRegression 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  TEST2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   
splitlinesrg   rZ   rK   s     r   test_long_string_reprz)TestHeaderFunctions.test_long_string_repr  s     >wKw>wF||&&((	'?4EFFGG^^^^^^	'?4EFFGG	-
 	
 	
 	
 	
 	
 	
r   c                 .   d}t          j                    }||d<   t          |          dk    sJ d                    |d                   |                                k    sJ ||d<   ||d<   |d         |d         k    sJ |d         |d         k    sJ 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  rY   r   r   r   r   N)r   r   rr   joinrstrip)rL   rb   rM   s      r   test_blank_keyword_long_valuez1TestHeaderFunctions.test_blank_keyword_long_value  s     *r
6{{axxr
##u||~~5555 "y!yi F9$55555i F2J......r   c                    t          j        ddd          }t          j                    }|j                            |           |                    |                     d                     t          j        |                     d                    }|d         j        j        d         }|	                                 t          |          dk    sJ d S )Nr`   r  r  ztest_new.fitsr   r  )r   rZ   
PrimaryHDUrM   appendr   r   r   r   r   rg   )rL   r   hdur   s       r   test_long_string_from_filez.TestHeaderFunctions.test_long_string_from_file  s    Ie68LMMo
!DIIo..///y?3344GN '

FF__ _ _ _ _ _r   c                 \    t          j        ddd          }t          |          dk    sJ d S )Nr`   ږlongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluelongstringvaluenlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommentlongcommenta  ABC     = 'longstringvaluelongstringvaluelongstringvaluelongstringvaluelongstr&'CONTINUE  'ingvaluelongstringvaluelongstringvaluelongstringvaluelongstringvalu&'CONTINUE  'elongstringvalue&'                                                   CONTINUE  '&' / longcommentlongcommentlongcommentlongcommentlongcommentlongcommeCONTINUE  '' / ntlongcommentlongcommentlongcommentlongcomment                   r  r\   s     r   !test_word_in_long_string_too_longz5TestHeaderFunctions.test_word_in_long_string_too_long&  sJ    Ie35GHHFF__ _ _ _ _ _r   c                 F   t           j                            t          d          t          d          z   t          d          z             }t	          j        t           j        j        d          5  t          |          dk    sJ 	 d d d            d S # 1 swxY w Y   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   zABC     = '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   rZ   ra   r   r   r   r   r   rg   r   s      r   %test_long_string_value_via_fromstringz9TestHeaderFunctions.test_long_string_value_via_fromstring2  s   I  NOO* 
 ' 

 

 \K%-L
 
 
 	 	 Acc c c c c		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   2BBBc                    d}t          j        d|          }t           j                            |j                  }|j        |k    sJ d}t          j        d|          }t           j                            |j                  }|j        |k    sJ d}t          j        d|          }t           j                            |j                  }|j        |k    sJ d S )Nzfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''r  zixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''xxxzjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'' xxx)r   rZ   ra   r   rb   )rL   testvalr   s      r   "test_long_string_value_with_quotesz6TestHeaderFunctions.test_long_string_value_with_quotesI  s    "Ifg&&I  ))w'!!!!%Ifg&&I  ))w'!!!!&Ifg&&I  ))w'!!!!!!r   c                     t           j                            t          d          t          d          z   t          d          z             }|j        dk    sJ |j        dk    sJ |j        dk    sJ 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 expressionEXPRzU/grp/hst/cdbs//grid/pickles/dat_uvk/pickles_uk_10.fits * 5.87359e-12 * MWAvg(Av=0.12)zpysyn expressionN)r   rZ   ra   r   r[   rb   r   r\   s     r   'test_continue_card_with_equals_in_valuez;TestHeaderFunctions.test_continue_card_with_equals_in_valueY  s    
 I  X  >??@ 566	7
 
 yF""""G - - - - - y.......r   c                     t          j                    }d|d<   t          |                                          d         t	          d          k    sJ dS )T
        Regression test for https://github.com/astropy/astropy/issues/3282
        EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASVALUEr   zCONTINUE  'AA'N)r   r   r   r#  r   rL   hs     r   (test_final_continue_card_lacks_ampersandz<TestHeaderFunctions.test_final_continue_card_lacks_ampersandm  sO    
 KMM(Aww!!##B'40@+A+AAAAAAAr   c                 \    t          j        ddd          }t          |          dk    sJ dS )r;  r  zdlong valuelong valuelong valuelong valuelong valuelong valuelong valuelong valuelong valuelong valuezlong 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  r\   s     r   ;test_final_continue_card_ampersand_removal_on_long_commentszOTestHeaderFunctions.test_final_continue_card_ampersand_removal_on_long_commentsv  sL    
 If/1FGGFF__ _ _ _ _ _r   c                    t          j        t          d          5 }t          j        dd          }d d d            n# 1 swxY w Y   t          |          dk    sJ t          |          dk    sJ t          j        dd          }t          |          t          d	          k    sJ t          j        d
d          }t          |          dk    sJ 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)r   r   r   r   rZ   rr   rg   r   r   s      r   test_hierarch_card_creationz/TestHeaderFunctions.test_hierarch_card_creation  sE   \&E
 
 
 		&A A	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 1vv{{{{FF @ @ @ @ @
 I*B//1vv7888888I+=
 

 FF @ @ @ @ @ @ @s   >AAc                     t           j                            d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ dS )zVRegression test for
        https://github.com/spacetelescope/PyFITS/issues/5
        z$HIERARCH key.META_4='calFileVersion'
key.META_4calFileVersionrY   Nr   rZ   ra   r[   rb   r   r\   s     r   )test_hierarch_with_abbrev_value_indicatorz=TestHeaderFunctions.test_hierarch_with_abbrev_value_indicator  sT    
 I  !GHHyL((((w*****yBr   c                    t           j                            d          }t          j        |          5 }|d         j        }ddd           n# 1 swxY w Y   t          j        d          5 }d|d<   ddd           n# 1 swxY w Y   t          |          dk    sJ |d	         dk    sJ |d         dk    sJ t          j	        t           j
        j        d
          5  d|d<   ddd           n# 1 swxY w Y   |d         dk    sJ dS )zCCheck that compressed image headers do not issue HIERARCH warnings.zcompressed_image.fitsr   NT)record*   zHIERARCH LONG KEYWORDr   zLONG KEYWORDgreater than 8 charactersr   zLONG KEYWORD2)r   utilget_testdata_filepathr   rM   warningscatch_warningsrr   r   r   r   r   )rL   filenamer   rM   warning_lists        r   test_hierarch_not_warnz*TestHeaderFunctions.test_hierarch_not_warn  s   9223JKKYx   	$D!W^F	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$$D111 	1\.0F*+	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1<  A%%%%n%++++-."4444 \K%-I
 
 
 	( 	( '(F?#	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( o&!++++++s5   AAA.B  BB!C33C7:C7c                 
   t           j                            d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ t          j        dd          }|j        dk    sJ |j        dk    sJ |j        dk    sJ 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'rG  rH  rY   zHIERARCH  key.META_4NrI  r\   s     r    test_hierarch_keyword_whitespacez4TestHeaderFunctions.test_hierarch_keyword_whitespace  s     I  !MNNyL((((w*****yB I,.>??yL((((w*****yBr   c                    t          j        ddd          }|                    d           |j        dk    sJ |j        dk    sJ |j        dk    sJ t          j        g d          }t          j        |          }|                    | 	                    d                     t          j
        | 	                    d                    5 }|d	         j        }t          |j        |                    d
                             t          |j        |                    d
                             k    sJ 	 ddd           dS # 1 swxY w Y   dS )zRegression 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_0detRowrM   r   r   z
key.META_0N)r   rZ   r   r[   rb   r   r   r*  r   r   r   rM   rg   r   rT   )rL   r   rM   r,  r   header2s         r   test_verify_mixed_case_hierarchz3TestHeaderFunctions.test_verify_mixed_case_hierarch  s    I4k;OO	y11111w+%%%%yK''''   
 
 oV,,,DIIk**+++Ytyy--.. 	$1gnGv|FLL$>$>?@@CgmmL99:E E     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A,EEEc                     t          j                    t          j        t          fdd           t          j        t          d          5  d          ddd           dS # 1 swxY w Y   dS )z=Test that accessing a non-existent keyword raises a KeyError.c                     |          S Nr0   )rs   rM   s    r   <lambda>z:TestHeaderFunctions.test_missing_keyword.<locals>.<lambda>  s    &) r   r]  zKeyword 'NAXIS' not found.r   N)r   r   r   r   KeyErrorrK   s    @r   test_missing_keywordz(TestHeaderFunctions.test_missing_keyword  s      	h 3 3 3 3W===]8+HIII 	 	7OO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   	A$$A(+A(c                 j    t          j                    }d|d<   d|v sJ |d         dk    sJ d|v sJ d S )Nr   rD  r   	ABCDEFGHIr   rK   s     r   test_hierarch_card_lookupz-TestHeaderFunctions.test_hierarch_card_lookup  sX    ')#$f$$$$k"b(((( f$$$$$$r   c                 <    t          j                    }d|d<   |d= d S )Nr   rD  r   rK   s     r   test_hierarch_card_deletez-TestHeaderFunctions.test_hierarch_card_delete  s'    ')#$'(((r   c                    t          j                    }t          j        t           j        j        d          5  d|d<   d d d            n# 1 swxY w Y   d|d<   d|d<   t          j        t           j        j        d          5  |                    dd           d d d            n# 1 swxY w Y   |d	= t          j        t           j        j        d          5  |                    dd           d d d            n# 1 swxY w Y   |d= t          |                                          d         d	                                k    sJ d S )
NrN  r   r   r   abcdefghr   r   )
abcdefghijr   rp  )
r   r   r   r   r   r   insertr   r   upperrK   s     r    test_hierarch_card_insert_deletez4TestHeaderFunctions.test_hierarch_card_insert_delete  s   \K%-I
 
 
 	% 	% #%F;	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%  zy\K%-I
 
 
 	1 	1 MM!/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 < \K%-I
 
 
 	1 	1 MM!/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 1IFKKMM""1%):):::::::s5   AAAB((B,/B,C>>DDc                    d}t          j                    }t          j        t                    5 }|                    ddi           t          |          dk    sJ d|v sJ |d         dk    sJ |                    ddi           t          |          dk    sJ |d         s
J d            |                    ddi           t          |          dk    sJ t          |          dk    sJ |d         s
J d            |                    d	d
i           t          |          dk    sJ t          |          dk    sJ |d         s
J d
            |                    ddi           t          |          dk    sJ t          |          dk    sJ |d         s
J d            |                    ddi           t          |          dk    sJ |t          |d         j                  v sJ |                    ddi           t          |          dk    sJ |d         s
J d            |                    ddi           t          |          dk    sJ |d         s
J d            |                    dd
i           t          |          dk    sJ |d         s
J d
            |                    ddi           t          |          dk    sJ |d         s
J d            	 ddd           dS # 1 swxY w Y   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TESTEr   zBLAH BLAH BLAHr   zHIERARCH BLAH BLAH BLAHr   zHIERARCH blah blah blahzblah blah blahr   N)	r   r   r   r   r   r   rr   rg   r  rL   msgrM   r   s       r   test_hierarch_create_and_updatez3TestHeaderFunctions.test_hierarch_create_and_update  s    0\-(( 1	5AMM/9:::q66Q;;;;&((((+&'1111MM/9:::q66Q;;;;+&///// MM;0111q66Q;;;;v;;!####+&///// MM/9:::q66Q;;;;v;;!####+&/////MM;0111q66Q;;;;v;;!####+&///// MM+W5666q66Q;;;;#adl++++++MM4g>???q66Q;;;;*+44W444 MM+W5666q66Q;;;;*+44W444 MM4g>???q66Q;;;;*+44W444MM+W5666q66Q;;;;*+44W4444c1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5 1	5s   J:K77K;>K;c                    d}t          j                    }t          j        t                    5 }|                    ddi           t          |          dk    sJ d|v sJ |d         dk    sJ |                    ddi           t          |          dk    sJ |d         s
J d            |                    ddi           t          |          dk    sJ |d         s
J d            |                    d	d
i           t          |          dk    sJ t          |          dk    sJ |d         s
J d
            |                    ddi           t          |          dk    sJ t          |          dk    sJ |d         s
J d            	 ddd           n# 1 swxY w Y   t          j                    }t          j        t                    5 }|                    ddi           t          d |D                        t          |          dk    sJ |t          |d         j	                  v sJ |                    ddi           t          |          dk    sJ |d         s
J d            |                    ddi           t          |          dk    sJ |d         s
J d            |                    d	d
i           t          |          dk    sJ t          |          dk    sJ |d         s
J d
            |                    ddi           t          |          dk    sJ t          |          dk    sJ |d         s
J d            	 ddd           dS # 1 swxY w Y   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.
        ru  zHIERARCH BLA BLArv  r   zBLA BLArw  rx  r   zHIERARCH bla blary  zbla blarz  r   Nc                     g | ]	}|j         
S r0   )category)r1   xs     r   r3   zMTestHeaderFunctions.test_short_hierarch_create_and_update.<locals>.<listcomp>  s    )))!1:)))r   r   )
r   r   r   r   r   r   rr   printrg   r  r{  s       r   %test_short_hierarch_create_and_updatez9TestHeaderFunctions.test_short_hierarch_create_and_update\  s4    0\-(( 	.AMM-w7888q66Q;;;;&&&&)$////MM-w7888q66Q;;;;)$--g--- MM9g.///q66Q;;;;)$--g--- MM-w7888q66Q;;;;v;;!####)$--g---MM9g.///q66Q;;;;v;;!####)$--g----1	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.4 \-(( 	.A MM9g.///))q)))***q66Q;;;;#adl++++++MM-w7888q66Q;;;;)$--g--- MM9g.///q66Q;;;;)$--g--- MM-w7888q66Q;;;;v;;!####)$--g---MM9g.///q66Q;;;;v;;!####)$--g----5	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s%   E#FF#&F#FM**M.1M.c                 l    t          j                    fd}t          j        t          |           d S )Nc                      d d<   d S )N)barbazquxr   r0   r`  s   r   testz=TestHeaderFunctions.test_header_setitem_invalid.<locals>.test  s    1F5MMMr   )r   r   r   r   r   )rL   r  rM   s     @r   test_header_setitem_invalidz/TestHeaderFunctions.test_header_setitem_invalid  sA    	2 	2 	2 	2 	2 	j$'''''r   c                     t          j                    }d|d<   d|d<   |d         dk    sJ |d         J |d         dk    sJ |j        d         dk    sJ |j        d         dk    sJ d S )N)r   r   re  r   r   r   rY   r   r   rJ   rK   s     r   test_header_setitem_1tuplez.TestHeaderFunctions.test_header_setitem_1tuple  s     u ve}%%%%f~%%%ayE!!!!q!R''''u%++++++r   c                     t          j                    }d|d<   d|d<   |d         dk    sJ |d         J |d         dk    sJ |j        d         dk    sJ |j        d         dk    sJ |j        d         dk    sJ d S )	Nr   r   )NNr   r   r   r   rY   r  rK   s     r   test_header_setitem_2tuplez.TestHeaderFunctions.test_header_setitem_2tuple  s    &u%ve}%%%%f~%%%ayE!!!!q!U****u%....v&",,,,,,r   c                    t          j                    }d|d<   |d         dk    sJ d|d<   |d         J d}t           j                            |d          }t          j        dt           j        j                  }|                    |g           t           j        j        |d<   |                    d	d
           |                    d           |d         dk    sJ |d         J |d         J |d         J |d         J |d         J d|d<   d|d<   |j        D ]}|j	        t           j        j        k    sJ 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
sepUNDEF2UNDEF3)UNDEF5NzUndefined valueTendUNDEF6DEFINEDrM  r   r  UNDEF4)
r   r   ra   rZ   r   r   extendr+  r   rb   )rL   rM   hstrr   s       r   test_header_set_value_to_nonez1TestHeaderFunctions.test_header_set_value_to_none  s    ue}%%%%ue}$$$ *''$'77 Ih	 344qc  9.x 	9tDDDhi B&&&&g&&&h'''h'''h'''h'''  x !y  	2 	2A7di111111	2 	2r   c                     t          j        dg          }|                    dd           |d         dk    sJ |j        d         dk    sJ d S )NrA   rB   rF   )r   rC   )r   r   r   rJ   rK   s     r   test_set_comment_onlyz)TestHeaderFunctions.test_set_comment_only  s]    o.//

3
$$$c{c!!!!s#s******r   c                 `    t          j        ddg          }t          |          ddgk    sJ d S )NrB   rC   rD   rF   rB   rD   )r   r   r   rK   s     r   test_header_iterz$TestHeaderFunctions.test_header_iter  s7    j*566F||Sz))))))r   c                    t          j        g d          }|dd          }t          |          dk    sJ d|vsJ d|v sJ d|v sJ |d d d         }t          |          dk    sJ |d	         d
k    sJ |d         dk    sJ |d         dk    sJ |d d d         }t          |          dk    sJ d|v sJ d|vsJ d|v sJ d S )Nr  r  rG   rH   r   r   rB   rD   rG   r   r   r   rH   rF   rC   r   r   rr   rL   rM   	newheaders      r   test_header_slicez%TestHeaderFunctions.test_header_slice  s3   AAABB122J	9~~"""")####ii44R4L	9~~""""|s""""|s""""|s""""33Q3K	9~~""""i)####ir   c                    t          j        g d          }d|dd<   |d         dk    sJ |d         dk    sJ d|dd<   |d         dk    sJ |d         dk    sJ ddg|dd<   |d         dk    sJ |d         dk    sJ dS )zp
        Assigning to a slice should just assign new values to the cards
        included in the slice.
        r  r   Nr   GHHIr   rK   s     r   test_header_slice_assignmentz0TestHeaderFunctions.test_header_slice_assignment  s     AAABB qrr
ayA~~~~ayA~~~~ qrr
ayD    ayD     3Zqrr
ayCayCr   c                     t          j        g d          }|dd= t          |          dk    sJ |d         dk    sJ |dd= t          |          dk    sJ dS )z/Test deleting a slice of cards from the header.r  r   Nr   rC   r  rK   s     r   test_header_slice_deletez,TestHeaderFunctions.test_header_slice_delete  sy     AAABB122J6{{aayC111I6{{ar   c                     t          j        g d          }|d         }t          |          dk    sJ |d         dk    sJ |d         dk    sJ dS )z>Test selecting a subsection of a header via wildcard matching.r_   r   )DEFr   )ABDr   AB*r   r   r   Nr  r  s      r   test_wildcard_slicez'TestHeaderFunctions.test_wildcard_slice)  sj     AAABB5M	9~~""""|q    |q      r   c                     t          j        g d          }t          |d                   dk    sJ t          |d                   dk    sJ t          |d                   dk    sJ dS )zp
        Regression test for issue where wildcards did not work on keywords
        containing hyphens.
        ))DATEr   )zDATE-OBSr   )zDATE-FOOr   zDATE*r   zDATE?*r   zDATE-*Nr  rK   s     r   test_wildcard_with_hyphenz-TestHeaderFunctions.test_wildcard_with_hyphen2  sy     LLLMM6'?##q((((6(#$$))))6(#$$))))))r   c                     t          j        g d          }d|d<   |d         dk    sJ |d         dk    sJ d|d<   |d         dk    sJ |d         dk    sJ ddg|d<   |d         dk    sJ |d         dk    sJ d	S )
z@Test assigning to a header slice selected via wildcard matching.r  r   r  r   r   r  r  r  Nr   rK   s     r   test_wildcard_slice_assignmentz2TestHeaderFunctions.test_wildcard_slice_assignment=  s     AAABB uayA~~~~ayA~~~~ uayD    ayD     c
uayCayCr   c                 ~    t          j        g d          }|d= t          |          dk    sJ |d         dk    sJ dS )z@Test deleting cards from a header that match a wildcard pattern.r  r  r   r   Nr  rK   s     r   test_wildcard_slice_deletionz0TestHeaderFunctions.test_wildcard_slice_deletionR  sM     AAABB5M6{{aayA~~~~~~r   c                 R    t          j        g d          }|d         g dk    sJ d S )N)r  r   r   )r  r   )r   r   )r   r   r   )r   r   r   r   r   rK   s     r   test_header_historyz'TestHeaderFunctions.test_header_historyZ  sD      	
 	
 i LLL000000r   c                     t          j        ddg          }|                                 d|vsJ d|vsJ t          |          dk    sJ d S )Nr  r  rB   rD   r   )r   r   clearrr   rK   s     r   test_header_clearz%TestHeaderFunctions.test_header_clearg  sb    j*566&    &    6{{ar   fitsextc                    t          j        t          j                    |g          }d|d         j        d<   |d         j                                         t          j        t                    5 }|                    | 	                    d          d           d d d            n# 1 swxY w Y   d}|t          |j                  v sJ d S )Nr   r   r   	temp.fitsT	overwritez'XTENSION' card does not exist.)r   HDUListr*  rM   r  r   r   r
   r   r   rg   rb   )rL   r  hdulisterrerr_msgs        r   test_header_clear_writez+TestHeaderFunctions.test_header_clear_writen  s    , 1 17;<<#(
% 
!!!];'' 	D3OODIIk22dOCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D3#ci..((((((s   0+B''B+.B+c                     t           j                            ddg          }d|v sJ |d         J |j        d         dk    sJ d|v sJ |d         J |j        d         dk    sJ d S )NrB   rC   rY   r   r   fromkeysrJ   rK   s     r   test_header_fromkeysz(TestHeaderFunctions.test_header_fromkeysx  s    %%sCj11f}}}}c{"""s#r))))f}}}}c{"""s#r))))))r   c                     t           j                            ddgd          }d|v sJ |d         dk    sJ |j        d         dk    sJ d|v sJ |d         dk    sJ |j        d         dk    sJ d S )NrB   rC   rD   rY   r  rK   s     r   test_header_fromkeys_with_valuez3TestHeaderFunctions.test_header_fromkeys_with_value  s    %%sCj#66f}}}}c{c!!!!s#r))))f}}}}c{c!!!!s#r))))))r   c                     t           j                            dgd          }d|v sJ |d         dk    sJ |j        d         dk    sJ d S )NrB   rC   rD   rC   rD   r  rK   s     r   +test_header_fromkeys_with_value_and_commentz?TestHeaderFunctions.test_header_fromkeys_with_value_and_comment  s[    %%seZ88f}}}}c{c!!!!s#s******r   c                    t           j                            g dd          }d|v sJ d|v sJ d|v sJ d|vsJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ d S )	N)rB   rC   rB   rD   rB   )rB   r   r   )rB   r   r   r   )r   r   r  rK   s     r   $test_header_fromkeys_with_duplicatesz8TestHeaderFunctions.test_header_fromkeys_with_duplicates  s    %%ooos;;f}}}}6!!!!6!!!!v%%%%ayCc{c!!!!h3&&&&ayCh3&&&&&&r   c                     t          j        ddg          }t          |                                          ddgk    sJ d S Nr  r  )r   r   r   r   rK   s     r   test_header_itemsz%TestHeaderFunctions.test_header_items  sB    j*566FLLNN##
J'???????r   c                     t          j        ddg          }t          |                                |          D ]\  }}||k    sJ d S r  )r   r   zipr   rL   rM   r   r   s       r   test_header_iterkeysz(TestHeaderFunctions.test_header_iterkeys  sT    j*566v.. 	 	DAq66666	 	r   c                     t          j        ddg          }t          |                                ddg          D ]\  }}||k    sJ d S )Nr  r  rC   rF   )r   r   r  r   r  s       r   test_header_itervaluesz*TestHeaderFunctions.test_header_itervalues  sX    j*566#s44 	 	DAq66666	 	r   c                     t          j        |                     d                    5 }t          |d         j                  g dk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r   )SIMPLEr\  r]  r   r   NAXIS3r^  )r   r   r   r   rM   r   s     r   test_header_keysz$TestHeaderFunctions.test_header_keys  s    Ytyy//00 		DQ'' , , ,     		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		s   #AA Ac                 $   t          j        g d          }|                                }|dk    sJ t          |          dk    sJ t	          |          g dk    sJ |                    d          }|dk    sJ t          |          dk    sJ t	          |          dd	gk    sJ |                    d
          }|dk    sJ t          |          dk    sJ t	          |          d	gk    sJ t          j        t          |j        d           d S )Nr  r  r  Gr  r  r   rB   rD   rG   r   rF   r   rB   rG   r   rC   rM  )r   r   poprr   r   r   r   
IndexError)rL   rM   lastmidfirsts        r   test_header_list_like_popz-TestHeaderFunctions.test_header_list_like_pop  s   MMMNNzz||s{{{{6{{aF||....jjmmczzzz6{{aF||Sz))))

1||||6{{aF||u$$$$j&*b11111r   c                    t          j        g d          }t          j        t          |j        ddd           |                    d          }|dk    sJ t          |          dk    sJ t          |          g dk    sJ |                    d          }|d	k    sJ t          |          d
k    sJ t          |          ddgk    sJ |                    d          }|dk    sJ t          |          dk    sJ t          |          dgk    sJ |                    dd          }|dk    sJ t          |          dk    sJ t          j        t          |j        d           d S )Nr  rB   rC   rD   r  r  r   r  rF   r   rG   r   XY)	r   r   r   r   	TypeErrorr  rr   r   rg  )rL   rM   r  r  r  defaults         r   test_header_dict_like_popz-TestHeaderFunctions.test_header_dict_like_pop  sm   MMMNNiS#s;;;zz#s{{{{6{{aF||....jjooczzzz6{{aF||Sz))))

3||||6{{aF||u$$$$**S#&&#~~~~6{{ah
C00000r   c                    t          j        g d          }|                                \  }}||vsJ t          |          dk    sJ |                                \  }}||vsJ t          |          dk    sJ |                                \  }}||vsJ t          |          dk    sJ t	          j        t          |j                   d S )Nr  r   r   r   )r   r   popitemrr   r   r   rg  )rL   rM   r[   rb   s       r   test_popitemz TestHeaderFunctions.test_popitem  s    AAABB))f$$$$6{{a))f$$$$6{{a))f$$$$6{{ah/////r   c                    t          j        g d          }|                    d          dk    sJ |                    d          dk    sJ |                    d          dk    sJ t          |          dk    sJ |                    d	d
          d
k    sJ t          |          dk    sJ d	|v sJ |                    d	d
          d
k    sJ t          |          dk    sJ d S )Nr  rB   rC   rD   rF   rG   rH   r   r  r  r   )r   r   
setdefaultrr   rK   s     r   test_setdefaultz#TestHeaderFunctions.test_setdefault  s   AAABB  %%,,,,  %%,,,,  %%,,,,6{{a  c**c11116{{af}}}}  c**c11116{{ar   c                    t          j        ddg          }|                    ddd           |d         dk    sJ |d         dk    sJ d|v sJ |d         dk    sJ |d	         dk    sJ t          j        ddg          }|                    dd           |d         dk    sJ |d         dk    sJ d|v sJ |d         dk    sJ |d	         dk    sJ d
S )zm
        Test adding new cards and updating existing cards from a dict using
        Header.update()
        r  r  rG   r  rB   rH   rB   r   rH   r   N)r   r   r   rK   s     r   test_update_from_dictz)TestHeaderFunctions.test_update_from_dict  s&    j*566Cc**+++c{c!!!!ayCf}}}}c{c!!!!bzS     j*566s###c{c!!!!ayCf}}}}c{c!!!!bzS      r   c                    t          j        ddg          }|                    dt          j        dd          g           |d         dk    sJ |d         dk    sJ d|v sJ |d         dk    sJ |d	         dk    sJ d
S )zv
        Test adding new cards and updating existing cards from an iterable of
        cards and card tuples.
        r  r  )rB   rG   rH   r  rB   rG   r   r   N)r   r   r   rZ   rK   s     r   test_update_from_iterablez-TestHeaderFunctions.test_update_from_iterable  s     j*566z49S##6#67888c{c!!!!ayCf}}}}c{c!!!!bzS      r   c                    t          j                    }t          j                    }d|j        d<   |xj        |j        z  c_        t	          |j                  dk    sJ |j        d         dk    sJ t          j                    }|j        |j        z   |_        t	          |j                  dk    sJ |j        d         dk    sJ |j                            |j        d           t	          |j                  dk    sJ t          |j                  d         d	k    sJ |j        d         dk    sJ d
|j        v sJ dS )zr
        Test extending a header both with and without stripping cards from the
        extension header.
        some valzsome commentMYKEYr   r   r  Fr   r#   XTENSIONr  r   N)r   r*  ImageHDUrM   rr   r  r   rL   r,  hdu2s      r   test_header_extendz&TestHeaderFunctions.test_header_extend!  sA    o};G

dk!

3:!####z"~++++ oZ$+-
3:!####z"~++++ 	
$+U3333:"$$$$CJ"j0000z"~++++sz))))))r   c                 H   t          j                    }t          j                    }d|j        d<   d|j        d<   |j                            |j                   t          |j                  dk    sJ |j        d         dk    sJ |j        d         dk    sJ t          j                    }t          j                    }d|j        d<   d|j        d<   |j                            |j        d	
           t          |j                  dk    sJ |j        d         dk    sJ dS )zI
        Test extending the header with and without unique=True.
        r  r  some other valzsome other commentr   r  r   r  Tuniquer   Nr   r*  r  rM   r  rr   r  s      r   test_header_extend_uniquez-TestHeaderFunctions.test_header_extend_unique<  s    o}:
7GG
$+&&&3:!####z"~++++z"~!11111o}:
7GG
$+d3333:!####z"~++++++r   c                 8   dD ]}dD ]}t          j                    }||j        vsJ t          j                    }d|j        |<   |j                            |j        |           t          |j                  dk    sJ |j        |         d         dk    sJ dS )z
        Test extending header with and without unique=True and commentary
        cards in the header being added. Issue astropy/astropy#3967
        rY   r   r   TFMy textr  r   r   Nr   r*  rM   r  r  rr   )rL   commentary_card	is_uniquer,  r  s        r   $test_header_extend_unique_commentaryz8TestHeaderFunctions.test_header_extend_unique_commentaryQ  s    
  : 		C 		CO* C C	o''&cj8888}/8O,
!!$+i!@@@3:!++++z/215BBBBBC		C 		Cr   c                 \   t          j                    }t          j                    }d|j        d<   d|j        d<   d|j        d<   d|j        d<   d|j        d<   |j                            |j                   t          |j                  dk    sJ d|j        v sJ d	|j        v sJ |j        d	         d
k    sJ t          |j        d                   dk    sJ |j        d         dk    sJ t          j                    }d|j        d<   d|j        d<   |j                            |j        d           t          |j                  dk    sJ d|j        v sJ d	|j        vsJ |j        d         d
k    sJ t          |j        d                   dk    sJ |j        d         dk    sJ dS )zI
        Test extending the header with and without update=True.
        r  r  z	history 1r   r  z	history 2r}   )r  r   r
  r  r   r   Tr   r   r   Nr  r  s      r   test_header_extend_updatez-TestHeaderFunctions.test_header_extend_updatea  s   
 o}:
7 +
9GG!,I!,I
$+&&&3:!####sz))))sz))))z,'+;;;;;3:i())Q....z"~,,,,o:
7 +
9
$+d3333:!####sz))))3:----z'"&666663:i())Q....z"~,,,,,,r   c                 8   dD ]}dD ]}t          j                    }||j        vsJ t          j                    }d|j        |<   |j                            |j        |           t          |j                  dk    sJ |j        |         d         dk    sJ 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  )rL   r  	is_updater,  r  s        r   $test_header_extend_update_commentaryz8TestHeaderFunctions.test_header_extend_update_commentary  s      : 		C 		CO* C C	o''&cj8888}/8O,
!!$+i!@@@3:!++++z/215BBBBBC		C 		Cr   c                     t          j        |                     d                    }t          j                    }|                    |dd           ||k    sJ 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  )rL   rM   ra  s      r   test_header_extend_exactz,TestHeaderFunctions.test_header_extend_exact  sY     		, 7 788+--vU555      r   c                 ^   t          j        g d          }|                    d          dk    sJ |                    d          dk    sJ |                    d          dk    sJ d|d<   d|d<   |                    d          d	k    sJ t          j        t
          |j        d
           d S )Nr  rB   r   rD   rG   r   r   r   r   r  )r   r   rU   r   r   rg  rK   s     r   test_header_countz%TestHeaderFunctions.test_header_count  s    AAABB||C  A%%%%||C  A%%%%||C  A%%%%yy||I&&!++++hc22222r   c                     t          j        ddg          }|                                 |                                 t          |          dk    sJ |d         dk    sJ |d         dk    sJ |                    d           t          |          dk    sJ |d         dk    sJ |d         dk    sJ |                    d	d
           t          |          dk    sJ |d         dk    sJ |d         dk    sJ 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  r   r   rY   r  r  rH   r  F	useblanksr   r  N)r   r   r+  rr   rK   s     r   test_header_append_use_blanksz1TestHeaderFunctions.test_header_append_use_blanks  s)    j*566 	6{{abzRbzR 	j!!!6{{abzS    bzR 	jE2226{{abzRbzS      r   c                    t          j        ddg          }|                    d           t          |          dk    sJ t	          |          d         dk    sJ |d         J |j        d         dk    sJ |                    d           t          |          dk    sJ t	          |          d         dk    sJ |d         dk    sJ |j        d         dk    sJ dS )	zi
        Test appending a new card with just the keyword, and no value or
        comment given.
        r  r  rG   r   r   NrY   r   )r   r   r+  rr   r   rJ   rK   s     r   test_header_append_keyword_onlyz3TestHeaderFunctions.test_header_append_keyword_only  s     j*566c6{{aF||B3&&&&bz!!!s#r))))
 	b6{{aF||B2%%%%bzRr"b((((((r   c                    t          j        ddg          }|                                 |                                 |                    dd           t	          |          dk    sJ |d         dk    sJ |d         dk    sJ |d	         d
k    sJ |                    ddd           t	          |          dk    sJ |d         dk    sJ |d         dk    sJ d S )Nr  r  r   r  r   rH   r   rY   r  rF   r  Fr,  r   r  )r   r   r+  rq  rr   rK   s     r   test_header_insert_use_blanksz1TestHeaderFunctions.test_header_insert_use_blanks  s    j*566 	 	a$$$6{{aayCbzRbzS     	au5556{{aayCbzRr   c                     t          j        g d          }|                    dd           t          |                                          d         dk    sJ |d         dk    sJ |j        d         dk    sJ |                    ddd	
           t          |                                          d         dk    sJ t          |                                          d         dk    sJ |d         dk    sJ |                    dd           |d         g dk    sJ |                    ddd	
           |d         g dk    sJ |                    dd           t          |                                          d         dk    sJ |                    ddd	
           t          |                                          d         dk    sJ t          |                                          d         dk    sJ 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]  r   Number of axesr   r]  r   r6  )r   r   Tr   r   r   r   )r   r   )r   	Comment 2r   )r4  r7  r5  )r   r   )r   	Comment 4)r4  r7  r5  r8  r   )r   Tr  r   )r!  Tr!  N)r   r   rq  r   r   rJ   rK   s     r   !test_header_insert_before_keywordz5TestHeaderFunctions.test_header_insert_before_keyword  s    PPP
 
 	h >???FKKMM""1%0000ayA~~~~q!%55555hd;;;FKKMM""1%1111FKKMM""1%1111ayBn&>???i $K$K$KKKKKn&>dKKKi $X$X$XXXXXb/***FKKMM""2&'1111b/666FKKMM""2&'1111FKKMM""2&'111111r   c                 z   t          j        ddg          }|                    d           t          |          dk    sJ t	          |          dgk    sJ d|vsJ t          j        t                    5  |                    d           d d d            n# 1 swxY w Y   |                    dd           t          |          dk    sJ t          j        g d	          }|                    dd
           d|vsJ t          |          dk    sJ t	          |          dgk    sJ |d         dk    sJ d S )Nr  r  rD   r   rB   rH   TrQ   )r  r  r   )
remove_allr   rF   )r   r   rV   rr   r   r   r   rg  rK   s     r   test_removezTestHeaderFunctions.test_remove  s   j*566 	c6{{aF||u$$$$&     ]8$$ 	 	MM#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 	c$///6{{a AAABBcd+++&    6{{aF||u$$$$ayCs   6BBBc                 f    t          j        ddg          }t          |j                  dk    sJ d S )NrA   )r  r  r  z       A  C
     DEF  H)r   r   r   rJ   rK   s     r   test_header_commentsz(TestHeaderFunctions.test_header_comments.  s9    o/@ABBFO$$(BBBBBBBr   c                    t          j        g d          }|j        dd          }t          |          ddgk    sJ |j        d d d         }t          |          g dk    sJ |j        d         }t          |          ddgk    sJ d S )	N)ABrD   rF   )EFr  r  )AIJKr   r  rF  r   )rF  r  rF   A*rF   )r   r   rJ   r   )rL   rM   ss      r   test_comment_slices_and_filtersz3TestHeaderFunctions.test_comment_slices_and_filters2  s    SSSTTOABBAww3*$$$$ODDbD!Aww///))))OD!Aww3*$$$$$$r   c                 @   t          j        g d          }d|j        dd <   t          |j                  g dk    sJ |j        |                    d                   j        dk    sJ |j        |                    d                   j        dk    sJ |j        |                    d                   j        dk    sJ |j        d d          |j        d d d	<   t          |j                  g d
k    sJ ddg|j        d<   t          |j                  g dk    sJ d S )NrA  Lr   )rF   rK  rK  rB  rF   rC  rD  r   )rK  rK  rF   MNrG  )rL  rK  rM  )r   r   rJ   r   r   rT   r   rK   s     r    test_comment_slice_filter_assignz4TestHeaderFunctions.test_comment_slice_filter_assign;  s-   SSSTT!FO$$7777|FLL../73>>>>|FLL../73>>>>|FLL../73>>>> & 2"FO$$7777!$c
FO$$777777r   c                    t          j                    }t          t          d                    }|D ]}||d<   |d         dd          |dd          k    sJ |d         d d         |d d         k    sJ |d         d d         |d d         k    sJ |d         d d         |d d         k    sJ |d         d d d         |d d d         k    sJ |d         dd d         |dd d         k    sJ |d         ddd         |ddd         k    sJ |                    d	d
           |                    dd           t          |d         dd                    |dd          k    sJ t          |d         d d                   |d d         k    sJ t          |d         d d                   |d d         k    sJ t          |d         d d                   |d d         k    sJ t          |d         d d d                   |d d d         k    sJ t          |d         dd d                   |dd d         k    sJ t          |d         ddd                   |ddd         k    sJ d S )Nr   r   r   r   r   r  r   r   r   rA   rE   Tr  )r   r   r   rangerq  r+  )rL   rM   indicesidxs       r   test_commentary_slicingz+TestHeaderFunctions.test_commentary_slicingI  s   uQxx.. 	$ 	$C #F9 i $3333i !$3333i !$3333i "%"5555i 2&'$$B$-7777i B'715b5>9999i 1Q'71Qq5>9999
 	a)))o4000F9%abb)**gabbk9999F9%bqb)**gbqbk9999F9%bqb)**gbqbk9999F9%crc*++wss|;;;;F9%ddd+,,"====F9%aee,--B????F9%a!e,--1Q??????r   c                 ,   t          j                    }d|d<   d|d<   d|d<   d|d<   d|d<   |d         g d	k    sJ d|d         d
<   |d         g dk    sJ d|d         dd <   |d         g dk    sJ ddg|d         d d <   |d         g dk    sJ d S )Nr   r   r_   r   BARNEYFREDr  GHI)r_   r  rW  r   )r   r  rW  r   )r   r   r   r   r   )r   r   r   r   rK   s     r   test_update_commentaryz*TestHeaderFunctions.test_update_commentaryh  s    u!y!v!y!yi $9$9$99999  %y!i $9$9$99999 !&y!""i $9$9$99999 !&u~y!!!i $9$9$9999999r   c                     t          j                    }d|d<   d|d<   d|d<   |d         |d         k    sJ d|d<   |d         |d         k    sJ 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 worldr   r   Nr   rK   s     r   test_commentary_comparisonz.TestHeaderFunctions.test_commentary_comparison~  ss     )y)y)yi F9$55555)yi F9$5555555r   c                 *   t          j                    }d|d<   d|d<   d}||d<   d|d<   ||d<   t          |          d	k    sJ t          |          d
         dk    sJ t	          |j        d                   d|d d         z   k    sJ t	          |j        d                                                   d|dd          z   k    sJ |                    d|d           t          |          dk    sJ t	          |j        d                   d|d d         z   k    sJ t	          |j        d
                                                   d|dd          z   k    sJ t          j                    }|                    ddi           |                    ddi           d}|	                    |           |                    ddi           |	                    |           t          |j                  d	k    sJ |j        d
         j
        dk    sJ t	          |j        d                   d|d d         z   k    sJ t	          |j        d                                                   d|dd          z   k    sJ |	                    |d           t          |j                  dk    sJ t	          |j        d                   d|d d         z   k    sJ t	          |j        d
                                                   d|dd          z   k    sJ d S )Nr   r   r   r   ZABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCr   rU  rV  r   r   r   r   H   r   r   r}   r   )r   r   rr   r   rg   r   r'  r   r   r   r[   )rL   rM   longvals      r   test_long_commentary_cardz-TestHeaderFunctions.test_long_commentary_card  s   uu#y!v#y6{{aF||A&((((6<?##zGCRCL'@@@@@6<?##**,,
WRSS\0IIIII

9gU
3336{{a6<?##zGCRCL'@@@@@6<?##**,,
WRSS\0IIIIIuen%%%uen%%%7###vx()))7###6<  A%%%%|A&&00006<?##zGCRCL'@@@@@6<?##**,,
WRSS\0IIIII7%0006<  A%%%%6<?##zGCRCL'@@@@@6<?##**,,
WRSS\0IIIIIIIr   c                    |                      d          }t          j        |                     d                    5 }|d         j                            |           t          j        t          t                    5  |d         j                            |d           d d d            n# 1 swxY w Y   |d         j                            |d           d d d            n# 1 swxY w Y   t          j
                    }|j                            dd	i           |j                            |j                            |          dd
           |                    |                      d          d           t          j        |                      d                    5 }t          |d         t          j                  sJ 	 d d d            n# 1 swxY w Y   t          j
                    }|j                            dd	i           |j                            |j                            |          ddd           d|j        v sJ d|j        vsJ d|j        v sJ |                    |                      d          dd           t          j        |                      d                    5 }t#          |          dk    sJ d|d         j        v sJ 	 d d d            d S # 1 swxY w Y   d S )Nz
header.txtr&  r   r   Fr  Tr  r   r   update_firstr   ignoreoutput_verifyr   rb  r   	EXTENSIONr  re  r  r   r   )r   r   r   r   rM   
totextfiler   r   OSErrorr   r  r   r  fromtextfiler   
isinstancer*  rr   rL   home_is_tempheader_filenamer   r,  hdul2s         r   test_totxtfilez"TestHeaderFunctions.test_totxtfile  s   ))L11Ytyy..// 	G4GN%%o666w.HIII L LQ))/U)KKKL L L L L L L L L L L L L L LGN%%o%FFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G moo
7E*+++
J##O44TPT 	 	
 	
 	
 	DIIk**(CCCYtyy--.. 	8$d1gt777777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 moo
7E*+++
J##O44	 	 	
 	
 	
 #*$$$$#*,,,,3:%%%%DIIk**(dSSSYtyy--.. 	.%u::????eAho-----	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.Z   AC&>#B-!C&-B1	1C&4B1	5%C&&C*-C*&#GGG9'K..K25K2c                    |                      d          }t          j        |                     d                    5 }|d         j                            |           t          j        t          t                    5  |d         j                            |d           ddd           n# 1 swxY w Y   |d         j                            |d           ddd           n# 1 swxY w Y   t          j
                    }|j                            d	d
i           |j                            |j                            |          dd           |                    |                      d          d           t          j        |                      d                    5 }t          |d         t          j                  sJ 	 ddd           n# 1 swxY w Y   t          j
                    }|j                            d	d
i           |j                            |j                            |          ddd           d	|j        v sJ d|j        vsJ d|j        v sJ |                    |                      d          dd           t          j        |                      d                    5 }t#          |          dk    sJ d	|d         j        v sJ 	 ddd           dS # 1 swxY w Y   dS )z:
        Repeat test_totxtfile, but with tofile()
        zheader.fitsr&  r   r   Fr  NTr  r   ra  r   rc  rd  rf  rg  r  rh  r   r   )r   r   r   r   rM   tofiler   r   rj  r   r  r   r  fromfiler   rl  r*  rr   rm  s         r   test_tofilezTestHeaderFunctions.test_tofile  s    ))M22Ytyy..// 	C4GN!!/222w.HIII H HQ%%o%GGGH H H H H H H H H H H H H H HGN!!/T!BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C moo
7E*+++
J00D 	 	
 	
 	
 	DIIk**(CCCYtyy--.. 	8$d1gt777777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 moo
7E*+++
J00	 	 	
 	
 	
 #*$$$$#*,,,,3:%%%%DIIk**(dSSSYtyy--.. 	.%u::????eAho-----	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.rr  c                     |                      d          }t          j                            |          }|d         dk    sJ dS )zBRegression test for https://github.com/astropy/astropy/issues/8711z
scale.fitsDATASET2MASSN)r   r   r   ru  )rL   rS  hdrs      r   test_fromfilez!TestHeaderFunctions.test_fromfile  sC    99\**k""8,,9~((((((r   c                    t          j                    }d|d<   d|d<   d|d<   t          |                     d          d          5 }|                    d	                    d
 |j        D                                  ddd           n# 1 swxY w Y   t           j                            |                     d                    }||k    sJ dS )zRegression 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.
        r  rB   r  rC   )rF   rG   rD   test.hdrr   r  c              3   X   K   | ]%}t          |                                          V  &d S re  rg   r   r1   r   s     r   r8   z?TestHeaderFunctions.test_header_fromtextfile.<locals>.<genexpr>  0      CCc!ffllnnCCCCCCr   Nr   r   r   r   writer&  r   rk  )rL   rM   fra  s       r   test_header_fromtextfilez,TestHeaderFunctions.test_header_fromtextfile  s     s s s$))J''-- 	EGGDIICCflCCCCCDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E +**499Z+@+@AA      s   8B

BBc                    t          j        ddg          }t          |                     d          d          5 }|                    d                    d |j        D                                  |                    d           ddd           n# 1 swxY w Y   t           j                            |                     d                    }d	|vsJ ||k    sJ dS )
zRegression 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.
        rA   rE   r}  r   r  c              3   X   K   | ]%}t          |                                          V  &d S re  r  r  s     r   r8   zMTestHeaderFunctions.test_header_fromtextfile_with_end_card.<locals>.<genexpr>,  r  r   z
ENDNENDr  )rL   rM   r  r    s       r   &test_header_fromtextfile_with_end_cardz:TestHeaderFunctions.test_header_fromtextfile_with_end_card  s    o?@@ $))J''-- 	GGDIICCflCCCCCDDDGGG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 [--dii
.C.CDD
J&&&&######s   ABBBc                    t          j        ddg          fd}t          j        t          |dd           t          j        t          j        d           t          j        t          j        dd           t          j        t          j        t                    d           t          j        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).
        rA   rE   c                     || <   d S re  r0   )rs   vrM   s     r   setitemz9TestHeaderFunctions.test_append_end_card.<locals>.setitem>  s    F1IIIr   r  rY   Tr  N)	r   r   r   r   r   r+  rq  rr   r   )rL   r  rM   s     @r   test_append_end_cardz(TestHeaderFunctions.test_append_end_card4  s     o?@@	 	 	 	 	 	j'5"555j&-777j&-DAAAAj&-VeDDDj&*e44444r   c                 N   t          j        t          j        d                    j        fd} |dd          }t          j        t          d          5 }t           j        	                    |          }|k    sJ 	 ddd           n# 1 swxY w Y   t          |          d	k    sJ  |d
d          }t          j        t          d          5 }t           j        	                    |          }|k    sJ 	 ddd           n# 1 swxY w Y   t          |          d	k    sJ  |dd          }t          j        t          d          5 }t           j        	                    |          }|k    sJ 	 ddd           n# 1 swxY w Y   t          |          d	k    sJ  |dd          }t          j        t          d          5 }t           j        	                    |d          }|k    sJ 	 ddd           n# 1 swxY w Y   t          |          d	k    sJ 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                                          ddd          }|| z  }|r"|dt          t          |                    z  z  }t          |t                    rt          |          S t          |          S )NrY   F)r  endcardpaddingr   )tostringr   rr   rl  bytesr   r   )r  padrH  horigs      r   invalid_headerzBTestHeaderFunctions.test_invalid_end_cards.<locals>.invalid_headerS  sv     2ueDDAHA /S;s1vv.... !U## #qzz!{{"r   zEND =Tz+Unexpected bytes trailing END keyword: ' ='r   Nr   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  )r   r*  nparangerM   r   r   r   r   ru  rr   )rL   r  rH  r   r?  r  s        @r   test_invalid_end_cardsz*TestHeaderFunctions.test_invalid_end_cardsG  s8    RYs^^444;	# 	# 	# 	# 	#& N7D))\&S
 
 
 	$$Q''A:::::		 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 1vv{{{{
 N<..\&W
 
 
 	$$Q''A:::::		 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 1vv{{{{ N=$//\J
 
 
 	 $$Q''A:::::	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 1vv{{{{
 N5%((\&P
 
 
 	 $$Q$66A:::::	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 1vv{{{{{{sH   (BBB(DDD(FFF*HH	H	c                    t          j                    }d|d<   d|d<   t          j        |t          j        d                    }|                    |                     d                     t          |                     d          d          5 }|                                }d	d	d	           n# 1 swxY w Y   |	                    d
d
                    d                    }|	                    dd
                    d                    }t          |                     d          d          5 }|                    |           d	d	d	           n# 1 swxY w Y   t          j        t          d          5 }t          j        |                     d                    }|d         dk    sJ |d         dk    sJ 	 d	d	d	           n# 1 swxY w Y   t!          |          dk    sJ d	S )z5
        Test header with invalid characters
        r   r   hellor   r   )rM   r   r   rbNs   hellou   héllolatin1s   BARu   BÀR
test2.fitswbz1non-ASCII characters are present in the FITS filer   zB?Rzh?llor   )r   r   r*  r  r  r   r   r   readreplaceencoder  r   r   r   r'  rr   )rL   r?  r   r  outry   r   s          r   test_invalid_charactersz+TestHeaderFunctions.test_invalid_characters  sf    KMM%)abill;;;TYY{++,,,$))K(($// 	1&&((C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	kk(HOOH$=$=>>kk&&--"9"9::$))L))400 	BHHSMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 \E
 
 
 	+ tyy6677AU8u$$$$Y<7*****	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 1vv{{{{{{s7   B22B69B62EEE:AGGGc                 4   t          j        g d          }|                    dd           t          |          g dk    sJ |j        rJ |                    dd           t          |          g dk    sJ |j        rJ |                    dd           t          |          g dk    sJ |j        rJ |                    dd	           t          |          g dk    sJ |j        rJ |                    dd           t          |          g dk    sJ |j        rJ |                    dd
           t          |          g dk    sJ |j        rJ |                    dd
           t          |          g dk    sJ |j        rJ 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  r  r  rC   r   beforerA   r   r   rD   rB   {   N)r   r   r   r   	_modifiedrK   s     r   test_unnecessary_movez)TestHeaderFunctions.test_unnecessary_move  s    AAABB

3q
!!!F||....####

3a
   F||....####

3s
###F||....####

3c
"""F||....####

3q
!!!F||....#### 	

3s
###F||....####

3c
"""F||....######r   c                    d}t           j                            |d          }|d         dk    sJ |d         dk    sJ t          j        t           j        j        d	          5  t          |j        d                   t          d
          k    sJ 	 ddd           n# 1 swxY w Y   |j        d         j
        sJ t          j        t           j        j        d	          5  t          |j        d                   t          d          k    sJ 	 ddd           n# 1 swxY w Y   |j        d         j
        sJ |j
        sJ t           j                            |d          }t          j        t           j        j        d	          5  t          |j        d                   t          d
          k    sJ 	 ddd           n# 1 swxY w Y   |j        d         j
        sJ t          j        t           j        j        d	          5  t          |j        d                   t          d          k    sJ 	 ddd           n# 1 swxY w Y   |j        d         j
        sJ |d         dk    sJ |d         dk    sJ |j
        sJ d|d<   d|d<   t          |j        d                   t          d
          k    sJ t          |j        d                   t          d          k    sJ dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/137z=FOCALLEN= +1.550000000000e+002
APERTURE= +0.000000000000e+000r  r  FOCALLENg     `c@APERTURE        r   r   zFOCALLEN= +1.550000000000E+002NAPERTURE= +0.000000000000E+000)r   r   ra   r   r   r   r   rg   r   r   r  )rL   r  r?  s      r   test_invalid_float_cardsz,TestHeaderFunctions.test_invalid_float_cards  sX   
 PK""4T"22 }%%%%}#### \K%-L
 
 
 	V 	V qwz*++t4T/U/UUUUUU	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V wz",,,,\K%-L
 
 
 	V 	V qwz*++t4T/U/UUUUUU	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V wz",,,,{
 K""4T"22\K%-L
 
 
 	V 	V qwz*++t4T/U/UUUUUU	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V wz",,,,\K%-L
 
 
 	V 	V qwz*++t4T/U/UUUUUU	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V wz",,,,}%%%%}####{ **17:&''40P+Q+QQQQQ17:&''40P+Q+QQQQQQQsH   %.B  B$'B$$.DD#&D#.GGG.IIIc                    t          j                    }d|j        d<   |                    |                     d                     t          |                     d          d          5 }|                    d           |                    t          d                     ddd           n# 1 swxY w Y   t          j        |                     d                    5 }t          j
        t                    5 }|                    |                     d          d	
           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          |          dk    sJ t          |d         j                  }d|v sJ dS )zW
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/140
        gEȠ>r  r   zrb+iZ  r)   Nr  warnrd  r   r   z'(invalid value string: '5.0022221e-07'))r   r*  rM   r   r   r   seekr  r	   r   r   r   rr   rg   r  )rL   r   r,  r  r   r   r|  s          r   test_invalid_float_cards2z-TestHeaderFunctions.test_invalid_float_cards2	  s.    o*
6DIIk**+++ $))K((%00 	'AFF3KKKGGL%%&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' Ytyy--.. 	G$9
 9
 	GLL;//vLFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 1vv{{{{
 !A$,8C??????sH   )8B--B14B1E9+D0$E0D4	4E7D4	8EEEc                    t           j                            d          }t          |          t	          d          k    sJ |j        dk    sJ t           j                            d          }t          |          t	          d          k    sJ |j        dk    sJ t           j                            d          }t          |          t	          d          k    sJ |j        dk    sJ 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   rZ   ra   rg   r   rb   r\   s     r   test_leading_zerosz&TestHeaderFunctions.test_leading_zeros&  s     I  !ABB1vv>??????w#~~~~I  !@AA1vv=>>>>>>w#~~~~I  111vvo......w"}}}}}}r   c                    t          d          }t          d          }t          j                    }d|d<   d|d<   |d         du sJ |d         du sJ t          |j        d                   |k    sJ t          |j        d                   |k    sJ t          j                    }t          j        d          |d<   t          j        d          |d<   |d         du sJ |d         du sJ t          |j        d                   |k    sJ t          |j        d                   |k    sJ t          j                    }|                    t          j        	                    |                     |                    t          j        	                    |                     |d         du sJ |d         du sJ t          |j        d                   |k    sJ t          |j        d                   |k    sJ 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   rg   r   r  bool_r+  rZ   ra   )rL   fooimgbarimgr?  s       r   test_assign_booleanz'TestHeaderFunctions.test_assign_boolean<  s    677677KMM%%x4x5    175>""f,,,,175>""f,,,,KMM8D>>%8E??%x4x5    175>""f,,,,175>""f,,,,KMM	%%f--...	%%f--...x4x5    175>""f,,,,175>""f,,,,,,r   c                 8   t          j        g d          }t          |          g dk    sJ d|v sJ d|v sJ |d         dk    sJ t          |d                   dk    sJ d	|d
<   |d         d	k    sJ t          |          dk    sJ |d= t          |          ddgk    sJ t          |          d	k    sJ |                    d          d	k    sJ |                    dd           |d         dk    sJ |                    ddd           t          |          g dk    sJ |                    d          dk    sJ t          |          d	k    sJ |                    dd          d	k    sJ t          |          d	k    sJ |                    d
d          dk    sJ t          |          dk    sJ t          |          g dk    sJ |                    ddd           t          |          dk    sJ t          |          g dk    sJ |d         dk    sJ |	                    d          dk    sJ |
                    d          dk    sJ |                    d           t          |          dk    sJ t          |          g dk    sJ 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   )Defr   )GeHr   )r_   r  GEHr`   dEfgehr   zg*r   r   aBcgEhr_   r  defAbcr  )r  r_   r  r  )r  r  r_   r   )r  iJk)r  r  r_   IJKr  ijkr  )r  r_   r  N)r   r   r   rr   rS   r   r  r  r   rU   rT   rV   r>  s     r   (test_header_method_keyword_normalizationz<TestHeaderFunctions.test_header_method_keyword_normalization]  s    K<<<==Aww///////zzzzzzzzx1}}}} 1T7||q    %x1}}}} 1vv{{{{eHAww5%.((((1vv{{{{uuU||q    	eQx1}}}}	eQu%%%Aww///////uuU||q    1vv{{{{||E1%%****1vv{{{{||E1%%****1vv{{{{Aww///////	1%%&&&1vv{{{{Aww6666666x1}}}}wwu~~""""wwu~~""""	1vv{{{{Aww/////////r   c                 B   t          j        d                              dd          }t          j        |          }d|j        d<   |j                                         |j                                         |                    |                     d                     t          j	        |                     d          d          5 }d|d	         j        v sJ |d	         j        |j        k    sJ |d	         j
        |k                                    sJ 	 d
d
d
           n# 1 swxY w Y   t          |j                  dk     r1|j                                         t          |j                  dk     1|                    |                     d          d           t          j	        |                     d                    5 }d|d	         j        v sJ |d	         j        |j        k    sJ |d	         j
        |k                                    sJ 	 d
d
d
           n# 1 swxY w Y   |j                            |                     d                     t          j                            |                     d                    }|j        |k    sJ 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 ENDTESTKWr   F)memmapr   N$   Tr  r}  )r  r  reshaper   r*  rM   r+  r   r   r   r   r<   rr   ri  r   rk  )rL   r   r,  r   ra  s        r   test_end_in_commentz'TestHeaderFunctions.test_end_in_comment  s    y~~%%b"--o4(((>
8

DIIk**+++Ytyy--e<<< 	0 tAw~----7>SZ////GLD(--//////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 #*oo""J #*oo""DIIk**d;;;Ytyy--.. 	0$tAw~----7>SZ////GLD(--//////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	
dii
33444+**499Z+@+@AAzW$$$$$$s&   AD''D+.D+AH((H,/H,c                    d}fd}t          j                    dd<   dv sJ d         dk    sJ t                    t          d          k    sJ t	          j        t          ||d           dd<   d         dk    sJ t                    t          d          k    sJ t	          j        t          |d|           dd<   d         dk    sJ j        d         dk    sJ t                    t          d	          k    sJ t	          j        t          |dd|f           t	          j        t          |d|df           t	          j        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                     || <   d S re  r0   )r[   r6   r?  s     r   assignz7TestHeaderFunctions.test_assign_unicode.<locals>.assign  s    AgJJJr   r   r   zFOO     = 'BAR     'r   zFOO     = 'BAZ     'r   z$FOO     = 'BAR     '           / BAZN)r   r   r   r   r   r   r   rJ   )rL   erikkur  r?  s      @r   test_assign_unicodez'TestHeaderFunctions.test_assign_unicode  s    ,	 	 	 	 	 KMM%zzzzx5    Aww$5666666j&&%888%x5    Aww$5666666j&%888!%x5    z% E))))Aww$EFFFFFFj&%%AAAj&%&%AAAj&%&&1ABBBBBr   c                     t          j                    }t          j        t          d          5  |                    dd           ddd           dS # 1 swxY w Y   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   r   r   r   r   r>  s     r   test_assign_non_asciiz)TestHeaderFunctions.test_assign_non_ascii  s     KMM]:-GHHH 	$ 	$EE&(###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   AAAc                    t          j                    }d|d<   |d         dk    sJ t           j                            d          }|                    |           |d         dk    sJ |j        d         j                                        dk    sJ |j        d         j                                        dk    sJ t           j        	                    dd          5  |d         dk    sJ |d         d	k    sJ |j        d         j                                        dk    sJ |j        d         j                                        dk    sJ 	 d
d
d
           n# 1 swxY w Y   |d         dk    sJ |d         dk    sJ |j        d         j                                        dk    sJ |j        d         j                                        dk    sJ 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   BarzQUX     = 'Bar        'r   zFOO     = 'Bar      'strip_header_whitespaceFzBar        N)
r   r   rZ   ra   r+  r   r   r'  confset_temprL   r?  r   s      r   test_header_strip_whitespacez0TestHeaderFunctions.test_header_strip_whitespace  s/    KMM%x5    I  !:;;	x5    wu~#**,,0GGGGGwu~#**,,0IIIIIY 95AA 	N 	NU8{****U8},,,,75>'..004KKKKK75>'..004MMMMMM		N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N x5    x5    wu~#**,,0GGGGGwu~#**,,0IIIIIIIs   A1EE"Ec                    g ddz  }t          j                    }|D ]}||j        d<   |                    |                     d                     t          j        |                     d                    5 }|d         j        d         |k    sJ 	 ddd           n# 1 swxY w Y   t          j        |j                  }|j        d         |j        d         k    sJ |                    |                     d                     t          j        |                     d                    5 }|d         j        d         |k    sJ 	 ddd           dS # 1 swxY w Y   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 framesr   r   r   r   Nr`  r  )r   r*  rM   r   r   r   )rL   historyr,  itemr   new_hdus         r   *test_keep_duplicate_history_in_orig_headerz>TestHeaderFunctions.test_keep_duplicate_history_in_orig_header	  s   
 
 

  o 	) 	)D$(CJy!!DIIk**+++Ytyy--.. 	8$7>),77777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 /444~i(CJy,AAAAA		,//000Ytyy..// 	847>),77777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s$   9B  B$'B$2EE!Ec                    t           j                            d          }t           j                            d          }t           j                            d          }t          j                    }t	          j        t                    5 }|j                            |           |j                            |           |j                            |           ddd           n# 1 swxY w Y   t          |          dk    sJ |
                    |                     d                     t	          j        t                    5 }t          j        |                     d                    5 }t          |          dk    sJ |d         j        }d|v sJ d	|v sJ d
|v sJ |d         dk    sJ |d	         dk    sJ |d
         dk    sJ t	          j        t          |j        dd           t	          j        t          |j        d	d           t	          j        t          |j        d
d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   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.PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANr   r   r   CLFIND2DzJust somAAAAAAAAz: contour = 0.30ze random text.HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfoo)r   rZ   ra   r*  r   r   r   rM   r+  rr   r   r   r   r   r   r   )rL   c1c2c3r,  r   r   rM   s           r   test_invalid_keyword_cardsz.TestHeaderFunctions.test_invalid_keyword_cards3	  s    Y!!"<==Y!!":;;Y!!(++o\,-- 	"Jb!!!Jb!!!Jb!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 1vv{{{{DIIk**+++\,-- 	I499[1122 Id 1vv{{{{a!V++++!V++++!V++++j)-?????j)-=====j)X5555 j&*j%HHHj&*j%HHHj&*j%HHH#I I I I I I I I I I I I I I I	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	I 	IsJ   
AC%%C),C)(I.CH<0I<I 	 II 	IIIc                 ,   t           j                            d          }t          j        t           j        j        d          5  |                    d           ddd           n# 1 swxY w Y   t          |          t          d          k    sJ 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  Nz#HIERARCH ESO DET CHIP PXSPACE = 5E6)	r   rZ   ra   r   r   r   r   rg   r   r   s      r   $test_fix_hierarch_with_invalid_valuez8TestHeaderFunctions.test_fix_hierarch_with_invalid_value]	  s     I  !FGG\K%-L
 
 
 	 	 HHUOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 1vvCDDDDDDDDs   A''A+.A+c                    t          j                    }t          j        t          |j        dt          d                     t          j        t          |j        dt          j                   t          j        t          |j        dt          j	        d                     t          j        t          |j        dt          d                     t          j        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   r   r   r   r   floatr  r  float32r  r>  s     r   test_assign_inf_nanz'TestHeaderFunctions.test_assign_inf_nank	  s     KMMj!%u>>>j!%888j!%E1B1BCCCj!%u>>>j!%88888r   c                    t          j        dg          }d|d<   |d         dusJ t          |d         t                    sJ |d         dk    sJ t	          j        d          |d<   |d         du sJ d|d<   |d         du sJ t	          j        d          |d<   |d         du sJ d|d<   |d         dusJ t          |d         t                    sJ |d         dk    sJ t	          j        d          |d<   |d         du sJ 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   rl  intr  r  r>  s     r   test_update_boolz$TestHeaderFunctions.test_update_bool{	  s>    K())&	y$$$$!F)S)))))yA~~~~HTNN&	yD    &	yE!!!!HUOO&	yE!!!!&	y%%%%!F)S)))))yA~~~~HUOO&	yE!!!!!!r   c                    t          j                    }d|d<   d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   d	|d<   t          |d         t                    sJ t	          |                              d
          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d	|d<   t          |d         t                    sJ t	          |                              d
          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ d|d<   t          |d         t                    sJ t	          |                              d          sJ 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   rl  r  rg   
startswithr  complexr>  s     r   test_update_numericz'TestHeaderFunctions.test_update_numeric	  sq    KMM&	 &	!F)U+++++1vv  !ABBBBB &	!F)S)))))1vv  !ABBBBB &	!F)W-----1vv  !ABBBBB &	!F)U+++++1vv  !ABBBBB &	!F)W-----1vv  !ABBBBB &	!F)S)))))1vv  !ABBBBB &	 &	!F)U+++++1vv  !ABBBBB &	!F)S)))))1vv  !ABBBBB &	!F)W-----1vv  !ABBBBB &	!F)U+++++1vv  !ABBBBB &	!F)W-----1vv  !ABBBBB &	!F)S)))))1vv  !ABBBBBBBr   c                     t          j                    }t          j        t          |j        dd           t          j        t          |j        dd           t          j        t          |j        dd           t          j        t          |j        dd           dg}|D ]`}t           j                            |          }d|v r&t          j        t           j        |j	        d           K|	                    d           ad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.
        r   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                                                           rZ  N)
r   r   r   r   r   r   rZ   ra   r
   r   )rL   r?  
test_cards
card_imager   s        r   test_newlines_in_commentaryz/TestHeaderFunctions.test_newlines_in_commentary	  s     KMMj!%D999j!%G<<<j!%G<<<j!%J???_

 % 	& 	&J	$$Z00Az!!d.+FFFF%%%%	& 	&r   c                 p   t          j                    }d}|                    d|f           t          |j                  dk    sJ |j        d                                         \  }}|dk    r||k    sJ t          j        |          }|                    |                     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
          abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcr  r   r   r   r`  r   Tr  N)	r   r   r+  rr   r   _splitr*  r   r   )rL   rM   rb   rO   r6   r,  s         r   ,test_long_commentary_card_appended_to_headerz@TestHeaderFunctions.test_long_commentary_card_appended_to_header	
  s      	y%()))6<  A%%%% <?))++SiC5LLLL oV,,,DIIk**d;;;;;r   c                    t          |                     d          d          5 }t          j                            |                                          }ddd           n# 1 swxY w Y   t          j        |                     d                    }|d         |d         k    sJ ||k    sJ |                                |                                k    sJ dS )zz
        Test reading a Header from a `bytes` string.

        See https://github.com/astropy/astropy/issues/8706
        r&  r  Nr]  )r   r   r   r   ra   r  r'  r  )rL   fobjpri_hdr_from_bytespri_hdrs       r   test_header_fromstring_bytesz0TestHeaderFunctions.test_header_fromstring_bytes!
  s    $))L))400 	ED!%!7!7		!D!D	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E .<!8!899w#5g#>>>>>,,,,,!!%7%@%@%B%BBBBBBBs   2A""A&)A&c                     t          j                    }d|d<   d|d<   t          |          dk    sJ |d         dk    sJ |d         dk    sJ dS )zU
        Regression test for https://github.com/astropy/astropy/issues/10479
        r   zKEY2 r   zKEY2  r   KEY2Nr  rL   rz  s     r   test_set_keyword_with_spacez/TestHeaderFunctions.test_set_keyword_with_space0
  sd     kmmGH3xx1}}}}6{a7|q      r   c                 n   t          j        |                     d          d          }d|d<   |                                 t	          |          ddhk    sJ t          j        |                     d          d          }d|d<   |                    d          }t	          |          ddhk    sJ d S )	Nztb.fitsr   )extr  r   r   Tr  )r   r'  r   r   r   r   r  s     r   
test_stripzTestHeaderFunctions.test_strip;
  s    nTYYy11q999E
		3xxIu-----nTYYy11q999E
hhTh""3xxIu-------r   c                 r   t           j                            d          }d|_        t	          |          dk    sJ |                    d           t	          |          dk    sJ t           j                            d          }t          j                    }d|_        |j        	                    |           |j        
                    |                     d                     t          j        |                     d                    5 }d|d	         j        d
<   |                    |                     d                     ddd           n# 1 swxY w Y   t          j        |                     d                    5 }|d	         j        d
         dk    sJ 	 ddd           dS # 1 swxY w Y   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   rZ   ra   rb   tupler   r*  	_verifiedrM   r+  rt  r   r   r   )rL   r   r,  r   s       r   test_update_invalid_cardz,TestHeaderFunctions.test_update_invalid_cardF
  s     y##$>??
T{{88888ET{{88888y##O44o
$
$))L11222Ytyy..// 	84#%DGN4 LL#566777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 Ytyy!34455 	.7>$'2-----	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s$   9EEEF,,F03F0c                 6   t          j        g d          }t          j        d          }||         dk    sJ d||<   ||         dk    sJ |                    |d           ||         dk    sJ |                    d           |                    d           |d	         t          j        d
                   dk    sJ |                    d           |dt          j        d          f         dk    sJ |dt          j	        d
          f         dk    sJ d S )N))rB   r   )rC   r   )rD   r   r   r   r   )rF   rM  rM  r   WORLDr   r   )rD   BAZBAZrD   r   r  )
r   r   r  int8rq  r   int64r+  int16uint32)rL   rM   rR  s      r   test_index_numpy_intz(TestHeaderFunctions.test_index_numpy_intf
  s*   CCCDDgajjc{e####sc{e####c9%%%c{b    7###7###i !-8888o&&&sBHQKK()U2222sBIaLL)*h666666r   c                     t          j                    }|j        }|j        dk    sJ d|d<   d|d<   d|d<   d|d<   |j        d	k    sJ |j        d
k    sJ dS )zK
        Tests data size calculation (w/o padding) given a Header.
        r       r\  r   r]  r   r   r   i@  i  N)r   r*  rM   	data_sizedata_size_padded)rL   r,  rM   s      r   test_header_data_sizez)TestHeaderFunctions.test_header_data_sizey
  s     o1$$$$xwxx5((((&%//////r   N)r   r   r   __doc__rN   r   markparametrizerW   r]   rc   rh   rj   rm   rp   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-  r1  r3  r6  r9  r@  rB  rE  rJ  rU  rW  rb  rh  rk  rm  rs  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  CompImageHDUr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r(  r*  r.  r0  r2  r:  r=  r?  rI  rN  rS  rX  rZ  r_  rq  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(  r0   r   r   r?   r?   C   s       ''+ + + [US#J//	1 	1 0/	1       . . .     N N ND D D; ; ;*     7 7 7C C CB B B
G G G4 4 4.< < <0? ? ?4  .0 0 0
 
 
1 1 1
4 4 4: : :+ + +
2 2 2
D D D  + + +
I I ID D D@ @ @"	. 	. 	.6 6 6
 
 

 
 
$" " " 
 
 
./ / /*
 
 
&

 

 

  ." " " / / /(B B B
 
 

 
 
6  , , ,$  (  B	 	 	% % %) ) )
; ; ;(;5 ;5 ;5zA. A. A.F( ( (, , ,	- 	- 	-+2 +2 +2Z+ + +* * *     (     0     ! ! !	* 	* 	*     *  1 1 1      [Y:K$:K:M:M(NOO) ) PO)* * ** * *+ + +
' 
' 
'@ @ @  
  

 
 
2 2 2(1 1 120 0 0
  
  
 ! ! !.! ! !* * *6, , ,*C C C - - ->C C C&
! 
! 
!3 3 3! ! !6) ) ).     ("2 "2 "2H     6C C C% % %8 8 8@ @ @>: : :,6 6 6 #J #J #JJ&. &. &.P). ). ).V) ) )! ! !$$ $ $,5 5 5&H H HT  8&$ &$ &$P2R 2R 2Rh@ @ @:  ,- - -B70 70 70r%% %% %%N#C #C #CJ$ $ $J J J>!8 !8 !8F(I (I (ITE E E9 9 9 " " "8IC IC ICV%& %& %&N< < <0C C C	! 	! 	!	. 	. 	.. . .@7 7 7&0 0 0 0 0r   r?   c                        e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zej                            dg d          d             Z  x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                 (   t                                                       t          j                    | _        | 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   )rL   	__class__s    r   r4  z)TestRecordValuedKeywordCards.setup_method
  s     KMMeZ000e[111e[111e[111e%7888e%7888e%CDDDe%899999r   c                    t           j                            d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ t           j                            d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ t           j                            d          }|j        d	k    sJ |j        d
k    sJ |j        J t          j        d	d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ t          j        d	d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ t          j        d	d
          }|j        d	k    sJ |j        d
k    sJ |j        J t          j        dd          }|j        dk    sJ |j        dk    sJ |j        dk    sJ t          j        dd          }|j        dk    sJ |j        dk    sJ |j        dk    sJ t          j        t           j	        j
                  5  t          j        dd          }ddd           n# 1 swxY w Y   |j        dk    sJ |j        dk    sJ |j        J 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'r0  zNAXIS: aNr1  zNAXIS:  2.0r   r   )r   rZ   ra   r[   rb   field_specifierr   r   r   r   r   r\   s     r   test_initialize_rvkcz1TestRecordValuedKeywordCards.test_initialize_rvkc
  s    I  !CDDyK''''w#~~~~ G++++yK''''I  !:;;yK''''w#~~~~ G++++I  !788yE!!!!w*$$$$ (((IeZ((yK''''w#~~~~ G++++Ie]++yK''''w#~~~~ G++++IeZ((yE!!!!w*$$$$ (((Ik1%%yK''''w#~~~~ G++++Ik3''yK''''w#~~~~ G++++\$+344 	, 	,	+s++A	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,yK''''w#~~~~ (((((s   'I		IIc                     t           j                            d          }|j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ dS )z
        Tests that the field_specifier can accessed from a card read from a
        string before any other attributes are accessed.
        r8  r]  r9  r:  r;  N)r   rZ   ra   r<  r[   rb   r   r\   s     r   test_parse_field_specifierz7TestRecordValuedKeywordCards.test_parse_field_specifier
  si     I  !CDD G++++yK''''w#~~~~yK''''''r   c                 "   t           j                            d          }|j        dk    sJ d|_        |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        dk    sJ t          |                                          dk    sJ dS )	zz
        Test setting the field_specifier attribute and updating the card image
        to reflect the new value.
        r8  r]  r   z
DP1.NAXIS1r:  r;  z!DP1     = 'NAXIS1: 2' / A commentN)	r   rZ   ra   r<  r[   rb   r   rg   r'  r\   s     r   test_update_field_specifierz8TestRecordValuedKeywordCards.test_update_field_specifier
  s     I  !CDD G++++$ H,,,,yL((((w#~~~~yK''''1vv}}"EEEEEEEr   c                     t          j                    }|                    dd           |                    dd           |d         dk    sJ |d         dk    sJ |d         dk    sJ |d         dk    sJ d|vsJ 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.DEFr   zABC.defzaBc.defzABC.DEFzABC.dEfN)r   r   r   rK   s     r   $test_field_specifier_case_senstivityzATestRecordValuedKeywordCards.test_field_specifier_case_senstivity
  s     

9a   

9a   i A%%%%i A%%%%i A%%%%i A%%%%&&&&&&r   c                     | j         d         dk    sJ t          | j         d         t                    sJ | j         d         dk    sJ t          | j         d         t                    sJ dS )zt
        Returning a RVKC from a header via index lookup should return the
        float value of the card.
        r   r:  r   r  Nr5  rl  r  r   s    r   test_get_rvkc_by_indexz3TestRecordValuedKeywordCards.test_get_rvkc_by_index   sx      #s****$+A.66666 #s****$+A.6666666r   c                 ,    | j         d         dk    sJ 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.
        r0  r1  Nr5  r   s    r   test_get_rvkc_by_keywordz5TestRecordValuedKeywordCards.test_get_rvkc_by_keyword  s#      ':555555r   c                     | j         d         dk    sJ t          | j         d         t                    sJ | j         d         dk    sJ dS )z
        Returning a RVKC via the full keyword/field-specifier combination
        should return the floating point value associated with the RVKC.
        r9  r:  zDP1.AUX.1.COEFF.1g      @?NrE  r   s    r   ,test_get_rvkc_by_keyword_and_field_specifierzITestRecordValuedKeywordCards.test_get_rvkc_by_keyword_and_field_specifier  s[      -4444$+K8%@@@@@ !45FFFFFFr   c                      t          j        t           fdd           t          j        t          d          5   j        d          ddd           dS # 1 swxY w Y   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                     j         |          S re  rH  )r  rL   s    r   rf  zKTestRecordValuedKeywordCards.test_access_nonexistent_rvkc.<locals>.<lambda>(  s    D,=a,@ r   r   z!Keyword 'DP1\.AXIS\.3' not found.r   
DP1.AXIS.3N)r   r   r  rg  r5  r   s   `r   test_access_nonexistent_rvkcz9TestRecordValuedKeywordCards.test_access_nonexistent_rvkc!  s     	j"@"@"@"@!DDD]8+OPPP 	, 	,l++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   AAAc                     d| j         d<   | j         d         dk    sJ t          | j         d         t                    sJ d| j         d<   | j         d         dk    sJ dS )z9A RVKC can be updated either via index or keyword access.r   r   r9        @g?
DP1.AXIS.1NrE  r   s    r   test_update_rvkcz-TestRecordValuedKeywordCards.test_update_rvkc-  st      !! -4444$+K8%@@@@@*-,' .#555555r   c                 x    t          j                    }d|d<   |d         dk    sJ d|d<   |d         dk    sJ dS )z;Regression test for an issue that appeared after SVN r2412.r   zD2IM1.EXTVERr  r   r:  Nr   r>  s     r   test_update_rvkc_2z/TestRecordValuedKeywordCards.test_update_rvkc_27  sU     KMM. C''''. C''''''r   c                 4   t           j                            d          }|j        dk    sJ |j        dk    sJ t          j        dd          }|j        dk    sJ |j        dk    sJ t          j        dd          }|j        dk    sJ |j        dk    sJ d S )Nr8  r0  r1  r9  r   z
NAXIS: 2.0r:  )r   rZ   ra   
rawkeywordrawvaluer\   s     r   test_raw_keyword_valuez3TestRecordValuedKeywordCards.test_raw_keyword_value@  s    I  !CDD|u$$$$zZ''''Ik1%%|u$$$$z\))))Ik3''|u$$$$z\))))))r   c                     | j                             dddd           | j         d         dk    sJ | j         d         dk    sJ d	S )
z
        It should be possible to insert a new RVKC after an existing one
        specified by the full keyword/field-specifier combination.r0  z	AXIS.3: 1rY  
DP1.AXIS.2r   r   r   rN  N)r5  r   r   s    r   test_rvkc_insert_afterz3TestRecordValuedKeywordCards.test_rvkc_insert_afterM  s\    
 	e[+\RRR #q(((( .!333333r   c                     | j         d= t          | j                   dk    sJ t          | j                   d         dk    sJ | j         d         dk    sJ t          | j                   d         dk    sJ | j         d= t          | j                   dk    sJ t          | j                   d         dk    sJ | j         d         dk    sJ t          | j                   d         d	k    sJ | j         d         dk    sJ d
S )z
        Deleting a RVKC should work as with a normal card by using the full
        keyword/field-spcifier combination.
        rR  r   r   r9  r   r   r[  r   DP1.NAUXNr5  rr   r   r   s    r   test_rvkc_deletez-TestRecordValuedKeywordCards.test_rvkc_deleteV  s)    l+4$%%****D%&&q)[8888 #q((((D%&&q)\9999 l+4$%%****D%&&q)[8888 #q((((D%&&q)Z7777 #q((((((r   c                    | j         d         }t          |t          j                  sJ d |j        D             ddgk    sJ | j         d         }d |j        D             ddgk    sJ | j         d	         }d
 |j        D             g dk    sJ | j         d         }d |j        D             dgk    sJ | j         d         }d |j        D             ddgk    sJ dS )z+Test the keyword filter strings with RVKCs.
DP1.AXIS.*c                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zKTestRecordValuedKeywordCards.test_pattern_matching_keys.<locals>.<listcomp>p  &    1111A111r   DP1     = 'AXIS.1: 1'DP1     = 'AXIS.2: 2'zDP1.N*c                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zKTestRecordValuedKeywordCards.test_pattern_matching_keys.<locals>.<listcomp>v  rd  r   zDP1     = 'NAXIS: 2'zDP1     = 'NAUX: 2'z
DP1.AUX...c                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zKTestRecordValuedKeywordCards.test_pattern_matching_keys.<locals>.<listcomp>|  rd  r   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                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zKTestRecordValuedKeywordCards.test_pattern_matching_keys.<locals>.<listcomp>  rd  r   z	DP1.A*S.*c                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zKTestRecordValuedKeywordCards.test_pattern_matching_keys.<locals>.<listcomp>  rd  r   N)r5  rl  r   r   r   rL   cls     r   test_pattern_matching_keysz7TestRecordValuedKeywordCards.test_pattern_matching_keysk  s^    |,"dk*****11111##6
 
 
 
 

 x(11111"!6
 
 
 
 

 |,11111 6
 6
 6
 
 
 
 
 {+111116L5MMMMM{+11111##6
 
 
 
 
 
 
r   c                    | j         d= t          | j                   dk    sJ t          | j                   d         dk    sJ | j         d         dk    sJ t          | j                   d         dk    sJ | j         d         dk    sJ dS )z'Deletion by filter strings should work.	DP1.A*...r   r   r9  r   r^  Nr_  r   s    r   "test_pattern_matching_key_deletionz?TestRecordValuedKeywordCards.test_pattern_matching_key_deletion  s     k*4$%%****D%&&q)[8888 #q((((D%&&q)Z7777 #q((((((r   c                     | j         d         }d |j        D             g dk    sJ |d         }d |j        D             g dk    sJ dS )zX
        A card list returned via a filter string should be further filterable.
        rt  c                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zQTestRecordValuedKeywordCards.test_successive_pattern_matching.<locals>.<listcomp>  rd  r   )re  rf  rj  rk  rl  rm  z	*.*AUX...c                 P    g | ]#}t          |                                          $S r0   r  r  s     r   r3   zQTestRecordValuedKeywordCards.test_successive_pattern_matching.<locals>.<listcomp>  s&    2221A222r   ri  N)r5  r   )rL   rq  cl2s      r    test_successive_pattern_matchingz=TestRecordValuedKeywordCards.test_successive_pattern_matching  s    
 {+11111 6
 6
 6
 
 
 
 
 o22	222 7
 7
 7
 
 
 
 
 
 
r   c                 N    | j         d         }t          |          ddgk    sJ dS )zl
        The CardList.keys() method should return full keyword/field-spec values
        for RVKCs.
        rb  rR  r[  N)r5  r   rp  s     r   test_rvkc_in_cardlist_keysz7TestRecordValuedKeywordCards.test_rvkc_in_cardlist_keys  s3     |,BxxL,7777777r   c                 r    | j         d         }t          |                                          ddgk    sJ dS )zv
        The CardList.values() method should return the values of all RVKCs as
        floating point values.
        rb  r  r:  N)r5  r   r   rp  s     r   test_rvkc_in_cardlist_valuesz9TestRecordValuedKeywordCards.test_rvkc_in_cardlist_values  s<     |,BIIKK  S#J......r   c                     | j         d         }|j        d         j        dk    sJ t          |j        d         j        t                    sJ dS )z|
        Individual card values should be accessible by the .value attribute
        (which should return a float).
        rb  r   r  N)r5  r   rb   rl  r  rp  s     r   test_rvkc_value_attributez6TestRecordValuedKeywordCards.test_rvkc_value_attribute  sP     |,x{ C''''"(1++U3333333r   c                 4   t          j                    }d|d<   d|d<   d|vsJ d|vsJ d|vsJ |d         ddgk    sJ t          j                    }d|d<   d|vsJ t          |j        d	                   t	          d
          k    sJ t           j                            d          }|j        dk    sJ |j        dk    sJ |j	        J t          j                    }d|d<   d|vsJ t          |j        d	                   t	          d          k    sJ 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: 2r   r2  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'rY   z"'Date: 2012-09-19T13:58:53.756061'Nr   zFOO.Datez,FOO     = 'Date: 2012-09-19T13:58:53.756061')
r   r   rg   r   r   rZ   ra   r[   rb   r<  r  s      r   test_overly_permissive_parsingz;TestRecordValuedKeywordCards.test_overly_permissive_parsing  sT    KMM")")Q&&&&q((((q((((|[99999
 KMM9)Q&&&&171:$'Q"R"RRRRRI  !MNNyBw>>>>> (((KMM5%""""171:$'U"V"VVVVVVVr   c                    t           j                            d          }t           j                            d          }t          j        ||g          d         dk    sJ d         dk    sJ d         dk    sJ d	         d
k    sJ dvsJ dvsJ dvsJ t	          j        t          fd           t	          j        t          fd           t	          j        t          f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.1r:  z
FOO.AXIS.2      @FOO.AXIS	FOO.AXIS.FOO.c                       d         S )Nr  r0   r?  s   r   rf  zQTestRecordValuedKeywordCards.test_overly_aggressive_rvkc_lookup.<locals>.<lambda>  s    * r   c                       d         S )Nr  r0   r  s   r   rf  zQTestRecordValuedKeywordCards.test_overly_aggressive_rvkc_lookup.<locals>.<lambda>  s    + r   c                       d         S )Nr  r0   r  s   r   rf  zQTestRecordValuedKeywordCards.test_overly_aggressive_rvkc_lookup.<locals>.<lambda>  s    &	 r   N)r   rZ   ra   r   r   r   rg  )rL   r  r  r?  s      @r   "test_overly_aggressive_rvkc_lookupz?TestRecordValuedKeywordCards.test_overly_aggressive_rvkc_lookup  s!    Y!!"9::Y!!"9::KR!!x;&&&&}++++#%%%%#%%%%""""!####Qh 5 5 5 5666h 6 6 6 6777h 1 1 1 122222r   c                    ddl m} |                    |                     d                    }|                    dg          }d|v sJ d|v sJ |                    dgdg	          }d|v sJ d
|vsJ t          |                    d                    dk    sJ |                    dgddg	          }d|v sJ d
|v sJ t          |                    d                    dk    sJ |                    dgdg	          }d|v sJ d|v sJ d|v sJ |                                 |                    |                     d                    }d|                    dg          v sJ |                                 |                    |                     d                    }d|                    dgd          v sJ d|                    dgd          v sJ |                                 dS )z9Tests the basic functionality of the `fitsheader` script.r   
fitsheaderzerowidth.fitsAIPS FQ
extensionszEXTNAME = 'AIPS FQr\  EXTNAMEr  keywordsz	BITPIX  =r  r   r   z	EXTNAME =r   zNAXIS*z	NAXIS   =z	NAXIS1  =z	NAXIS2  =r&  zEXTNAME = 'SCIzSCI,2z	comp.fitszXTENSION= 'IMAGEF)r  
compressedzXTENSION= 'BINTABLETN)astropy.io.fits.scriptsr  HeaderFormatterr   parserr   splitr   )rL   r  hfoutputs       r   test_fitsheader_scriptz3TestRecordValuedKeywordCards.test_fitsheader_script  sV   666666 ''		2B(C(CDDi[11#v----6!!!! i[I;GG#v----&((((6<<%%&&!++++ aSIx3HIIf$$$$f$$$$6<<%%&&!++++ aSH:>>f$$$$f$$$$f$$$$



 ''		,(?(?@@288y8#A#AAAAA



 ''		+(>(>??!RXX!X%O%OOOOO$QCD(Q(QQQQQ





r   c                    t          j        dt           j                                      d          }t	          j        |          }t	          j        |j        |j                  }|	                    | 
                    d          d           t	          j        | 
                    d                    5 }d	|d
         j        vsJ d|d
         j        vsJ d|d
         j        vsJ 	 ddd           dS # 1 swxY w Y   dS )zHRegression test for issue https://github.com/astropy/astropy/issues/7312r   )dtype)r   r   r  )r   rM   z	tmp2.fitsTr  r	  r   PCOUNTGCOUNTN)r  r  r  r  r   r*  r,  r   rM   r   r   r   )rL   r   phduchdur   s        r   1test_fitsheader_compressed_from_primary_image_extzNTestRecordValuedKeywordCards.test_fitsheader_compressed_from_primary_image_ext-  s8   ybg...66v>>D))) diDDDTYY{++t<<<Ytyy--.. 	2$T!W^333347>111147>11111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   :4C<<D D c                    ddl m} ddlm} |                     d          }|                    |          } |j        |          5 }|                    dg          }t          |          t          |d         j	                  k    sJ |                    g d          }t          |          t          |d         j	                  t          |d         j	                  z   t          |d	         j	                  z   k    sJ 	 d
d
d
           n# 1 swxY w Y   |                    dg          }t          j        |d         |k              sJ t          j        |d         dk              sJ |d         |d         dk             dk    sJ |                    dgdg          }t          |          dk    sJ |d         d         dk    sJ |d         d         dk    sJ |d         d         dk    sJ |                    dg          }|J |                    dgdg          }|J |                                 d
S )z7Tests the `--table` feature of the `fitsheader` script.r   r   r  r  )r  r   4r  r  r   r   NrS  r,  rb   r[   r  r  r   DOES_NOT_EXIST)
astropy.ior   r  r  r   TableHeaderFormatterr   r  rr   rM   r  r<   r   )rL   r   r  test_filename	formatterfitsobjmytables          r   test_fitsheader_table_featurez:TestRecordValuedKeywordCards.test_fitsheader_table_feature8  s   ######666666		"23333MBB	TY}%% 
	ooqc**Gw<<3wqz'8#9#99999oo1D1D1DoEEGw<<GI&-..gaj'(()gaj'(()    
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 //i[/99vgj)]:;;;;;vgen	122222w	 2i ?@IMMMM //i[I;/OO7||q    u~a I----y!!$	1111w"i//// //.>-?/@@//i[DTCU/VVs   B?DDDr   )r  zwb+abzab+c                     t          |                     d          |          5 }t          j        t	          j        d                    }|                    |           d d d            d S # 1 swxY w Y   d S )Nz	mode.fitsr   r   r  )r   r   r   r  r  onesr   )rL   r   ffr,  s       r   test_hdu_writeto_modez2TestRecordValuedKeywordCards.test_hdu_writeto_modeb  s    $))K((t444 	-RWQZZ000CKKOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   =A//A36A3)"r   r   r   r)  r4  r=  r?  rA  rC  rF  rI  rK  rO  rS  rU  rY  r\  r`  rr  ru  rz  r|  r~  r  r  r  r  r  r  r   r*  r+  r  __classcell__r6  s   @r   r.  r.  
  s       	 	
: 
: 
: 
: 
:3) 3) 3)j
( 
( 
(F F F' ' '	7 	7 	7
6 
6 
6G G G
, 
, 
,6 6 6( ( (* * *4 4 4) ) )*
 
 
B) ) )
 
 
.8 8 8/ / /4 4 4!W !W !WF3 3 32& & &P	2 	2 	2( ( (T [V%?%?%?@@  A@    r   r.  c                      G d dt           j                  }  | d          }|j        d         dk    sJ |j        d         dk    sJ |j        d         d	k    sJ |d
d         }t          |          | u sJ |j        d         dk    sJ |j        d         d	k    sJ |d         }t          |          | u sJ |j        d         d	k    sJ |                                }t          |          | u sJ |j        d         dk    sJ |j        d         d	k    sJ |                    d           |j        d         d	k    sJ dS )z?Check that subclasses don't get ignored on slicing and copying.c                        e Zd Z fdZ xZS )test_subclass.<locals>.MyHeaderc                     t          |t                    rt          |          dk    r|dz  } t                      j        |g|R i |S )Nr   )
no comment)rl  r  rr   r3  r+  )rL   r   argskwargsr6  s       r   r+  z&test_subclass.<locals>.MyHeader.appendm  sS    $&& (3t99>>'!577>$8888888r   )r   r   r   r+  r  r  s   @r   MyHeaderr  l  s8        	9 	9 	9 	9 	9 	9 	9 	9 	9r   r  ))r   r  r  )r   r:  second)r   rQ  r   r  r   r  r   r  r   Nzc*))r(   r  r(   )r   r   rJ   typer   r  )r  	my_headerslice_	selectioncopy_s        r   test_subclassr  i  s   9 9 9 9 94; 9 9 9 	
	 	I c"g----c"h....c"l2222qrr]F<<8####?38++++?3<////$I	??h&&&&c"l2222NNE;;("""">#(****>#,....]###c"l222222r   )!r:   r   rQ  ior   r   numpyr  r   r  r   astropy.io.fits.cardr   astropy.io.fits.headerr   astropy.io.fits.utilr	   astropy.io.fits.verifyr
   r   astropy.utils.exceptionsr   astropy.utils.miscr   conftestr   r   r!   r-   r=   r?   r.  r  r0   r   r   <module>r     s                                    % % % % % % . . . . . . - - - - - - = = = = = = = = 7 7 7 7 7 7 9 9 9 9 9 9 " " " " " "% % %
& 
& 
&! ! !C C CC)0 C)0 C)0 C)0 C)0, C)0 C)0 C)0LR] ] ] ] ]< ] ] ]@&3 &3 &3 &3 &3r   