a
    ߙfbS                     @   sd   d dl Z d dl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 G dd deZdS )	    N   )comparerecords)	_ValidHDU)fits)FitsTestCasec                       s   e Zd Z fddZ fddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Z  ZS )3TestChecksumFunctionsc                    sL   t    tjd d  | _tjddd tjddd tj| _dd t_d S )NerrorzChecksum verification failed)messagezDatasum verification failedc                 S   s   dS )Nz2013-12-20T13:36:10 selfr
   r
   Blib/python3.9/site-packages/astropy/io/fits/tests/test_checksum.py<lambda>        z-TestChecksumFunctions.setup.<locals>.<lambda>)	supersetupwarningsfilters_oldfiltersfilterwarningsr   _get_timestamp_old_get_timestampr   	__class__r
   r   r      s    
zTestChecksumFunctions.setupc                    s   t    | jt_| jt_d S )N)r   teardownr   r   r   r   r   r   r   r   r
   r   r   "   s    
zTestChecksumFunctions.teardownc                 C   s*   t j| ddd}|jsJ |  d S )Nchecksum.fitsTchecksum)r   opendataZ	_read_allcloser   hdulr
   r
   r   test_sample_file'   s    
z&TestChecksumFunctions.test_sample_filec                 C   s   t jdt jd}t|}|j| dddd tj| ddd}|j|d jk	 s^J d|d j
v spJ d	|d j
v sJ tjd
s|d j
d dksJ |d j
d	 dksJ W d    n1 s0    Y  d S )Nd   Zdtypetmp.fitsT	overwriter   r   r   CHECKSUMDATASUMwin32ZZHMkeGKjZGKjbGKjZ4950)nparangeZint64r   Z
PrimaryHDUwritetotempr   r   allheadersysplatform
startswithr   nhdur"   r
   r
   r   test_image_create,   s    
z'TestChecksumFunctions.test_image_createc              	   C   s  t | d}|d j }|d dd |j| dddd t j| dddv}|d j|k srJ d	|d jv sJ |d jd	 d
ksJ d|d jv sJ |d jd dksJ W d    n1 s0    Y  W d    n1 s0    Y  d S )N
scale.fitsr   int16oldr&   Tr'   r   r)   ZcUmaeUjZcUjacUjWr*   Z
1891563534)	r   r   r   copyZscaler.   r/   r0   r1   )r   r"   Z	orig_datahdul1r
   r
   r   test_scaled_data;   s    z&TestChecksumFunctions.test_scaled_datac              
   C   s$  t | d }|| d W d   n1 s60    Y  t | d&}|j| dddd W d   n1 s|0    Y  t | d$}|j| ddd W d   n1 s0    Y  t j| ddd	$}|j| d
dd W d   n1 s
0    Y  t | d}t | d}t | d
}|d j}|d j}|d j}|d |d ks~J |d |d ksJ |d |d ksJ |d |d ksJ W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  dS )a   
        Regression test for
        https://github.com/astropy/astropy/issues/3883#issuecomment-115122647

        Ensure that when scaled data is automatically rescaled on
        opening/writing a file that the checksum and datasum are computed for
        the rescaled array.
        r9   zrescaled.fitsNzrescaled2.fitsTr'   zrescaled3.fitsr   )Zdo_not_scale_image_datazscaled.fitsr   r*   r)   r   r   r   r.   r/   r1   )r   r"   r=   hdul2Zhdul3Zhdr1Zhdr2Zhdr3r
   r
   r   test_scaled_data_auto_rescaleG   s.    
.$24


z3TestChecksumFunctions.test_scaled_data_auto_rescalec              	   C   sH  g d}t j| ddd}|j| dddd t j| dddd}tt||D ]\}\}}|jd u s||jd u r|j|ju sJ n|j|jk sJ d|| jv sJ || jd || d	 ksJ d
|| jv sJ || jd
 || d ks\J q\W d    n1 s0    Y  W d    n1 s:0    Y  d S )N))ZaDcXaCcXaCcXaCcX0)ZoYiGqXi9oXiEoXi9Z
1746888714)ZVhqQWZoQVfoQVZoQrB   )Z4cPp5aOn4aOn4aOnrB   )Z8aCN8X9N8aAN8W9NZ
1756785133)ZUhqdUZnbUfnbUZnbrB   )Z4cQJ5aN94aNG4aN9rB   zo4sp040b0_raw.fitsT)uintr&   r'   )rC   r   r)   r   r*   r   )	r   r   r   r.   r/   	enumeratezipr0   r1   )r   Z	checksumsr"   r=   idxZhdu_aZhdu_br
   r
   r   test_uint16_datap   s    z&TestChecksumFunctions.test_uint16_datac                 C   s   t d}d|_t dd }d}tjjj|ddg||gdd	}t|}|j| 	d
ddd tj
| 	d
ddv}t|d j|jsJ d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ W d    n1 s0    Y  d S )Ng      Y@)
   r   r         rH   g?*   abcxyzi)ZparnamesZpardataZbitpixr&   Tr'   r   r   r)   Z3eDQAZDO4dDOAZDOr*   Z
2797758084)r,   r-   shaper   r7   groupsZ	GroupDataZ	GroupsHDUr.   r/   r   r   r   r1   )r   ZimdataZpdata1Zpdata2xr7   r"   r
   r
   r   test_groups_hdu_data   s    

z*TestChecksumFunctions.test_groups_hdu_datac                 C   sb  t g d}t g d}tjdd|d}tjdd|d}t||g}tj|}|j| dd	d	d
 tj	| dd	d}t
|j|d jsJ d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ d|d jv s&J |d jd dks>J W d    n1 sT0    Y  d S )N)ZNGC1001ZNGC1002ZNGC1003)g333333&@g(@gffffff.@targetZ20AnameformatarrayZV_magEr&   Tr'   r   r   r)   r   D8iBD6ZAD6fAD6ZAr*   rB   ZaD1Oa90MaC0Ma90MZ
1062205743)r,   rV   r   ColumnColDefsBinTableHDUfrom_columnsr.   r/   r   r   r   r1   )r   a1Za2Zcol1Zcol2Zcolstbhdur"   r
   r
   r   test_binary_table_data   s"    z,TestChecksumFunctions.test_binary_table_datac              
   C   sb  t jddtddgtg dgdd}t jdd	d
dgddggd}t j||g}|j| dddd t j| ddd}t	|j
|d j
sJ d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ d|d jv s&J |d jd dks>J W d    n1 sT0    Y  d S )NvarzPJ()g     F@8   )         OrS   rM   Z2Irb      rc      r&   Tr'   r   r   r)   r   rX   r*   rB   ZYIGoaIEmZIEmaIEmZ1507485)r   rY   r,   rV   r[   r\   r.   r/   r   r   r   r1   )r   c1c2r^   r"   r
   r
   r   test_variable_length_table_data   s$    z5TestChecksumFunctions.test_variable_length_table_datac           	      C   s  t ddg}t ddg}tjdd|d}tjdd|dd	d
}tjddg dd}t|||g}tj|}|j| dddd tj	| ddd}t
|j|d jsJ d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ tjdsjd|d jv s&J |d jd dks>J d|d jv sRJ |d jd dksjJ W d    n1 s0    Y  d S )NrL   defg      &@g      (@ZA3rS   Dgffffff@g333333?)rT   rU   rV   ZbscaleZbzerot1I)[   \   ]   r&   Tr'   r   r   r)   r   rX   r*   rB   r+   Z3rKFAoI94oICAoI9Z
1914653725)r,   rV   r   rY   rZ   ZTableHDUr\   r.   r/   r   r   r   r1   r2   r3   r4   )	r   r]   Zr1rh   ri   Zc3rP   r7   r"   r
   r
   r   test_ascii_table_data   s*    z+TestChecksumFunctions.test_ascii_table_datac              	   C   sB  t | d}|j| dddd t j| ddd}t|d j|d jks^J d|d jv spJ |d jd d	ksJ d
|d jv sJ |d jd
 dksJ d|d jv sJ |d jd dksJ d
|d jv sJ |d jd
 dksJ W d    n1 s0    Y  W d    n1 s40    Y  d S )Nz	comp.fitsr&   Tr'   r   r   r)   r   rX   r*   rB   ZZeAbdb8aZbAabb7aZ	113055149)r   r   r   r.   r/   r,   r0   r1   )r   Zh1Zh2r
   r
   r   test_compressed_image_data   s    z0TestChecksumFunctions.test_compressed_image_datac                 C   s~   t jddd}t|}|j| ddd tj| ddd*}t |d j|jks\J W d   n1 sp0    Y  dS )	zT
        Regression test for https://github.com/astropy/astropy/issues/4587
        )rH   rH   float32r%   r&   Tr   r   N)	r,   Zonesr   CompImageHDUr.   r/   r   r0   r   )r   r6   comp_hdur"   r
   r
   r   test_failing_compressed_datasum   s
    
z5TestChecksumFunctions.test_failing_compressed_datasumc              	   C   sL  t jddd}t|}t|j|j}|j| ddd |j| ddd tj	| ddd}t 
|d j|jksJ t 
|d j|jksJ d	|d
 jv sJ |d
 jd	 dksJ d|d
 jv sJ |d
 jd dksJ d	|d jv sJ |d jd	 dksJ d|d jv s*J |d jd dksBJ d	|d jv sVJ tj	| ddd}|d j}|d j}d|v sJ d	|v sJ |d	 dksJ |d |d	 ksJ d|v sJ d|v sJ |d dksJ |d |d ksJ W d    n1 s0    Y  W d    n1 s>0    Y  d S )Nr$   r:   r%   r&   Tr   uncomp.fitsr   r)   r   rX   r*   rB   ZJ5cCJ5c9J5cAJ5c9Z
2453673070ZHECKSUMZZE94eE91ZE91bE91ZDATASUMZ	160565700r,   r-   r   ImageHDUru   r   r1   r.   r/   r   r0   Z_headerr   r6   r7   rv   r"   r@   Zheader_compZheader_uncompr
   r
   r    test_compressed_image_data_int16   s8    


z6TestChecksumFunctions.test_compressed_image_data_int16c              	   C   s  t jddd}t|}t|j|j}|j| ddd |j| ddd tj	| ddd}t 
|d j|jksJ t 
|d j|jksJ d	|d
 jv sJ |d
 jd	 dksJ d|d
 jv sJ |d
 jd dksJ d	|d jv sJ d|d jv sJ tj	| ddd}|d j}|d j}d|v sJJ d	|v sXJ |d	 dksjJ |d |d	 ksJ d|v sJ d|v sJ |d dksJ |d |d ksJ W d    n1 s0    Y  W d    n1 s0    Y  d S )Nr$   rt   r%   r&   Tr   rx   r   r)   r   rX   r*   rB   ry   ZCgr5FZo2Cdo2CZo2rz   Z
2393636889r{   r}   r
   r
   r   "test_compressed_image_data_float32  s2    


z8TestChecksumFunctions.test_compressed_image_data_float32c                 C   s    t j| ddd}|  d S )Nzarange.fitsTr   )r   r   r   r    r!   r
   r
   r   test_open_with_no_keywords1  s    z0TestChecksumFunctions.test_open_with_no_keywordsc                 C   s~   t | d}|j| ddd td}t j| d|dd |  t j| ddd}|d j	d u srJ |  d S )Ntb.fitsr&   T)r(   r$   r   r   )
r   r   r   r.   r/   r,   r-   appendr    	_checksum)r   r"   r6   r
   r
   r   test_append5  s    
z!TestChecksumFunctions.test_appendc                 C   sP   t d}tj| d|ddd tj| ddd}| |d  |  d S )Nr$   r&   Tr'   r   r   )r,   r-   r   r.   r/   r   _check_checksumsr    )r   r6   r"   r
   r
   r   test_writeto_convenience?  s
    
z.TestChecksumFunctions.test_writeto_conveniencec                 C   sZ   t jddd}t|}|j| ddd tj| ddd}| |d  |  d S )Nr$   r:   r%   r&   Tr   r   )	r,   r-   r   r|   r.   r/   r   r   r    r5   r
   r
   r   test_hdu_writetoF  s    
z&TestChecksumFunctions.test_hdu_writetoc                 C   s  t | d$}|j| ddd W d   n1 s:0    Y  t | d}d|d jv shJ |d jd dks~J d	|d jv sJ |d jd	 d
ksJ d|d jv sJ |d jd dksJ d	|d jv sJ |d jd	 dksJ W d   n1 s0    Y  dS )z
        Tests that when using writeto with checksum=True, a checksum and
        datasum are added to HDUs that did not previously have one.

        Regression test for https://github.com/spacetelescope/PyFITS/issues/8
        r   	test.fitsTr   Nr)   r   Z7UgqATfo7TfoATfor*   rB   r   Z99daD8bX98baA8bUZ
1829680925r?   r!   r
   r
   r   test_hdu_writeto_existingN  s    2z/TestChecksumFunctions.test_hdu_writeto_existingc                 C   s   t jddd}t|}|j| dddd tj| dddX}t|d	 d
r\|d	 jsht	j
dd t|d	 dr|d	 jrt	j
dd W d    n1 s0    Y  d S )Nr$   r:   r%   r&   TZdatasumr'   r   r   _datasumMissing DATASUM keywordmsgr   zNon-empty CHECKSUM keyword)r,   r-   r   r|   r.   r/   r   hasattrr   pytestfailr   r5   r
   r
   r   test_datasum_onlyd  s    
z'TestChecksumFunctions.test_datasum_onlyc                 C   s   |  d t| d}|d j }W d   n1 s>0    Y  tj| ddd}|  t| dH}d|d jv sJ d|d jv sJ t||d jsJ W d   n1 s0    Y  dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/148 where
        checksums are being removed from headers when a file is opened in
        update mode, even though no changes were made to the file.
        r   r   Nupdatemoder)   r*   )		copy_filer   r   r/   r   r<   r    r1   r   )r   r"   r   r
   r
   r   'test_open_update_mode_preserve_checksumo  s    
,z=TestChecksumFunctions.test_open_update_mode_preserve_checksumc                 C   s  |  d t| d,}|d j }|d j }W d   n1 sL0    Y  tj| ddd0}d|d jd< d|d jd	 d
< W d   n1 s0    Y  t| d}|d j}|d j}|dd |dd ksJ d|v sJ d|v sJ |d dksJ |d
 dd |d
 dd k sBJ |d
 d	 dksXJ W d   n1 sn0    Y  tj| dddd}W d   n1 s0    Y  t| d}|d j}|d j}|dd |dd ksJ d|vsJ d|vsJ |d dks"J |d
 dd |d
 dd k sLJ |d
 d	 dksbJ W d   n1 sx0    Y  dS )a  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/148, part
        2.  This ensures that if a file contains a checksum, the checksum is
        updated when changes are saved to the file, even if the file was opened
        with the default of checksum=False.

        An existing checksum and/or datasum are only stripped if the file is
        opened with checksum='remove'.
        r   r   Nr   r   ZBARZFOOrK   r   ZTIMEr)   r*   remove)r   r   )r   r   r   r/   r1   r<   r   r0   )r   r"   r1   r   Zheader2Zdata2r
   r
   r   %test_open_update_mode_update_checksum  s<    
,0

*6 

*z;TestChecksumFunctions.test_open_update_mode_update_checksumc              	   C   s4  |  d}t| d}|j|dd W d   n1 s>0    Y  |  d}t| dR}d|d jd	< d
|d jd< d|d jd	< d|d jd< || W d   n1 s0    Y  t|$}|j|  ddd W d   n1 s0    Y  t|  d
}t|}d|d jv s6J |d jd |d jd ksXJ d	|d jv slJ |d jd	 dksJ d|d jv sJ |d jd |d jd ksJ d	|d jv sJ |d jd	 |d jd	 ksJ W d   n1 s0    Y  W d   n1 s&0    Y  dS )zh
        Tests that invalid checksum or datasum are overwritten when the file is
        saved.
        zref.fitsr   Tr   Nr   z1       r   r*   Z8UgqATfo7TfoATfor)   Z
2349680925r   Z11daD8bX98baA8bUz
test2.fitsrB   )r/   r   r   r   r.   r1   )r   Zreffiler"   Ztestfilerefr
   r
   r   test_overwrite_invalid  s,    
,
(2""z,TestChecksumFunctions.test_overwrite_invalidc                 C   s<   t |dr|jstjdd t |dr,|js8tjdd d S )Nr   r   r   r   zMissing CHECKSUM keyword)r   r   r   r   r   )r   r7   r
   r
   r   r     s    z&TestChecksumFunctions._check_checksums)__name__
__module____qualname__r   r   r#   r8   r>   rA   rG   rQ   r_   rj   rr   rs   rw   r~   r   r   r   r   r   r   r   r   r   r   r   __classcell__r
   r
   r   r   r      s2   ) #
,!r   )r2   r   r   Znumpyr,   Z
test_tabler   Zastropy.io.fits.hdu.baser   Z
astropy.ior    r   r   r
   r
   r
   r   <module>   s   