U
    e»{j½R  ã                   @   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)Úfits)Ú	_ValidHDUé   )ÚFitsTestCase)Úcomparerecordsc                       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
   úb/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/fits/tests/test_checksum.pyÚ<lambda>   ó    z4TestChecksumFunctions.setup_method.<locals>.<lambda>)	ÚsuperÚsetup_methodÚwarningsÚfiltersÚ_oldfiltersÚfilterwarningsr   Ú_get_timestampÚ_old_get_timestampr   ©Ú	__class__r
   r   r      s    
z"TestChecksumFunctions.setup_methodc                    s   t ƒ  ¡  | jt_| jt_d S )N)r   Úteardown_methodr   r   r   r   r   r   r   r   r
   r   r      s    
z%TestChecksumFunctions.teardown_methodc                 C   s*   t j|  d¡dd�}|jst‚| ¡  d S )Núchecksum.fitsT©Úchecksum)r   ÚopenÚdataZ	_read_allÚAssertionErrorÚ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��z}|j|d jk 	¡ s^t
‚d|d jkspt
‚d	|d jks‚t
‚tj d
¡sº|d jd dks¤t
‚|d jd	 dksºt
‚W 5 Q R X d S )Néd   ©Zdtypeútmp.fitsT©Ú	overwriter   r   r   ÚCHECKSUMÚDATASUMÚwin32ZZHMkeGKjZGKjbGKjZ4950)ÚnpÚarangeZint64r   Z
PrimaryHDUÚwritetoÚtempr   r   Úallr    Ú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��l}|d j|k ¡ srt‚d	|d j	ks„t‚|d j	d	 d
ksšt‚d|d j	ks¬t‚|d j	d dksÂt‚W 5 Q R X W 5 Q R X d S )Nú
scale.fitsr   Úint16Úoldr'   Tr(   r   r*   ZcUmaeUjZcUjacUjWr+   Z
1891563534)
r   r   r   ÚcopyÚscaler/   r0   r1   r    r2   )r   r#   Z	orig_dataÚhdul1r
   r
   r   Útest_scaled_data6   s    z&TestChecksumFunctions.test_scaled_datac                 C   s�  t  |  d¡¡�}| |  d¡¡ W 5 Q R X t  |  d¡¡�}|j|  d¡ddd� W 5 Q R X t  |  d¡¡�}|j|  d¡dd� W 5 Q R X t j|  d¡dd��}|j|  d	¡dd� W 5 Q R X t  |  d¡¡�´}t  |  d¡¡�˜}t  |  d	¡¡�|}|d
 j}|d
 j}|d
 j}|d |d k�s,t‚|d |d k�sBt‚|d |d k�sXt‚|d |d k�snt‚W 5 Q R X W 5 Q R X W 5 Q R X 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.
        r:   zrescaled.fitszrescaled2.fitsTr(   zrescaled3.fitsr   )Zdo_not_scale_image_datazscaled.fitsr   r+   r*   N©r   r   r   r/   r0   r2   r    )r   r#   r?   Úhdul2Zhdul3Zhdr1Zhdr2Zhdr3r
   r
   r   Útest_scaled_data_auto_rescaleB   s$    
 


z3TestChecksumFunctions.test_scaled_data_auto_rescalec              
   C   s$  dddddddg}t j|  d¡d	d
��ô}|j|  d¡d	d	d� t j|  d¡d	d	d��¼}tt||ƒƒD ]¦\}\}}|jd ks„|jd kr–|j|jksªt‚n|j|jk ¡ sªt‚d|| j	ks¼t‚|| j	d || d ksÚt‚d|| j	ksìt‚|| j	d || d ksdt‚qdW 5 Q R X W 5 Q R X d S )N)ZaDcXaCcXaCcXaCcXÚ0)ZoYiGqXi9oXiEoXi9Z
1746888714)ZVhqQWZoQVfoQVZoQrD   )Z4cPp5aOn4aOn4aOnrD   )Z8aCN8X9N8aAN8W9NZ
1756785133)ZUhqdUZnbUfnbUZnbrD   )Z4cQJ5aN94aNG4aN9rD   zo4sp040b0_raw.fitsT)Úuintr'   r(   )rE   r   r*   r   r+   r   )
r   r   r   r/   r0   Ú	enumerateÚzipr    r1   r2   )r   Z	checksumsr#   r?   ÚidxZhdu_aZhdu_br
   r
   r   Útest_uint16_datai   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��l}t|d j|jƒsŒt‚d|d jksžt‚|d jd dks´t‚d|d jksÆt‚|d jd dksÜt‚W 5 Q R X d S )Ng      Y@)é
   r   r   é   é   rJ   gš™™™™™¹?é*   ÚabcÚxyziàÿÿÿ)ZparnamesZpardataZbitpixr'   Tr(   r   r   r*   Z3eDQAZDO4dDOAZDOr+   Z
2797758084)r-   r.   Úshaper   r8   ÚgroupsZ	GroupDataZ	GroupsHDUr/   r0   r   r   r   r    r2   )r   ZimdataZpdata1Zpdata2Úxr8   r#   r
   r
   r   Útest_groups_hdu_data�   s$    
   ÿ
z*TestChecksumFunctions.test_groups_hdu_datac              	   C   sP  t  dddg¡}t  dddg¡}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ƒsœt‚d|d jks®t‚|d jd dksÄt‚d|d jksÖt‚|d jd dksìt‚d|d jksþt‚|d jd dk�st‚d|d jk�s*t‚|d jd dk�sBt‚W 5 Q R X d S )NZNGC1001ZNGC1002ZNGC1003g333333&@gš™™™™™(@gffffff.@ÚtargetZ20A©ÚnameÚformatÚarrayZV_magÚEr'   Tr(   r   r   r*   r   ÚD8iBD6ZAD6fAD6ZAr+   rD   ZaD1Oa90MaC0Ma90MZ
1062205743)r-   rX   r   ÚColumnÚColDefsÚBinTableHDUÚfrom_columnsr/   r0   r   r   r   r    r2   )r   Úa1Za2Zcol1Zcol2ÚcolsÚtbhdur#   r
   r
   r   Útest_binary_table_data’   s"    z,TestChecksumFunctions.test_binary_table_datac                 C   sN  t jddt ddgt dddg¡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
ƒsšt‚d|d jks¬t‚|d jd dksÂt‚d|d jksÔt‚|d jd dksêt‚d|d jksüt‚|d jd dk�st‚d|d jk�s(t‚|d jd dk�s@t‚W 5 Q R X d S )NÚvarzPJ()g     €F@é8   é   é   é   ÚOrU   rO   Z2Ié   é   r'   Tr(   r   r   r*   r   rZ   r+   rD   ZYIGoaIEmZIEmaIEmZ1507485)r   r[   r-   rX   r]   r^   r/   r0   r   r   r   r    r2   )r   Úc1Úc2ra   r#   r
   r
   r   Útest_variable_length_table_data¥   s$    ýz5TestChecksumFunctions.test_variable_length_table_datac           	   	   C   sz  t  ddg¡}t  ddg¡}tjdd|d�}tjdd|dd	d
�}tjdddddgd�}t |||g¡}tj |¡}|j|  d¡ddd� tj	|  d¡dd��Ô}t
|j|d jƒs´t‚d|d jksÆt‚|d jd dksÜt‚d|d jksît‚|d jd dk�st‚tj d¡�sld|d jk�s(t‚|d jd dk�s@t‚d|d jk�sTt‚|d jd dk�slt‚W 5 Q R X d S )NrN   Údefg      &@g      (@ZA3rU   ÚDgffffff@g333333ã?)rV   rW   rX   ZbscaleZbzeroÚt1ÚIé[   é\   é]   r'   Tr(   r   r   r*   r   rZ   r+   rD   r,   Z3rKFAoI94oICAoI9Z
1914653725)r-   rX   r   r[   r\   ZTableHDUr^   r/   r0   r   r   r   r    r2   r3   r4   r5   )	r   r_   Úr1rk   rl   Úc3rR   r8   r#   r
   r
   r   Útest_ascii_table_data¹   s&    z+TestChecksumFunctions.test_ascii_table_datac              
   C   s  t  |  d¡¡�ú}|j|  d¡ddd� t j|  d¡dd��Ä}t |d j|d jk¡s\t‚d|d jksnt‚|d jd d	ks„t‚d
|d jks–t‚|d jd
 dks¬t‚d|d jks¾t‚|d jd dksÔt‚d
|d jksæt‚|d jd
 dksüt‚W 5 Q R X W 5 Q R X d S )Nz	comp.fitsr'   Tr(   r   r   r*   r   rZ   r+   rD   ZZeAbdb8aZbAabb7aZ	113055149)	r   r   r   r/   r0   r-   r1   r    r2   )r   Zh1Zh2r
   r
   r   Útest_compressed_image_dataÓ   s    z0TestChecksumFunctions.test_compressed_image_datac              	   C   sj   t jddd�}t |¡}|j|  d¡dd� tj|  d¡dd�� }t  |d j|jk¡s\t	‚W 5 Q R X dS )	zT
        Regression test for https://github.com/astropy/astropy/issues/4587
        )rJ   rJ   Úfloat32r&   r'   Tr   r   N)
r-   Zonesr   ÚCompImageHDUr/   r0   r   r1   r   r    )r   r7   Úcomp_hdur#   r
   r
   r   Útest_failing_compressed_datasumá   s
    
z5TestChecksumFunctions.test_failing_compressed_datasumc              
   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¡s‚t‚t  
|d j|jk¡sœt‚d	|d
 jks®t‚|d
 jd	 dksÄt‚d|d
 jksÖt‚|d
 jd dksìt‚d	|d jksþt‚|d jd	 dk�st‚d|d jk�s*t‚|d jd dk�sBt‚d	|d jk�sVt‚tj	|  d¡dd��¢}|d j}|d j}d|k�sŽt‚d	|k�sœt‚|d	 dk�s®t‚|d |d	 k�sÄt‚d|k�sÒt‚d|k�sàt‚|d dk�sòt‚|d |d k�st‚W 5 Q R X W 5 Q R X d S )Nr%   r;   r&   r'   Tr   úuncomp.fitsr   r*   r   rZ   r+   rD   ZJ5cCJ5c9J5cAJ5c9Z
2453673070ÚZHECKSUMZZE94eE91ZE91bE91ÚZDATASUMZ	160565700©r-   r.   r   ÚImageHDUrz   r   r2   r/   r0   r   r1   r    Z_header©r   r7   r8   r{   r#   rB   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���l}t  
|d j|jk¡s‚t‚t  
|d j|jk¡sœt‚d	|d
 jks®t‚|d
 jd	 dksÄt‚d|d
 jksÖt‚|d
 jd dksìt‚d	|d jksþt‚d|d jk�st‚tj	|  d¡dd��¢}|d j}|d j}d|k�sJt‚d	|k�sXt‚|d	 dk�sjt‚|d |d	 k�s€t‚d|k�sŽt‚d|k�sœt‚|d dk�s®t‚|d |d k�sÄt‚W 5 Q R X W 5 Q R X d S )Nr%   ry   r&   r'   Tr   r}   r   r*   r   rZ   r+   rD   r~   ZCgr5FZo2Cdo2CZo2r   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_keywords/  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 ksrt
‚| ¡  d S )Nútb.fitsr'   T)r)   r%   r   r   )r   r   r   r/   r0   r-   r.   Úappendr!   Ú	_checksumr    )r   r#   r7   r
   r
   r   Útest_append3  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/   r0   r   Ú_check_checksumsr!   )r   r7   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/   r0   r   rŠ   r!   r6   r
   r
   r   Útest_hdu_writetoD  s    
z&TestChecksumFunctions.test_hdu_writetoc              	   C   sð   t  |  d¡¡�}|j|  d¡dd� W 5 Q R X t  |  d¡¡�¦}d|d jksTt‚|d jd dksjt‚d|d jks|t‚|d jd d	ks’t‚d|d
 jks¤t‚|d
 jd dksºt‚d|d
 jksÌt‚|d
 jd dksât‚W 5 Q R X 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   r*   r   Z7UgqATfo7TfoATfor+   rD   r   Z99daD8bX98baA8bUZ
1829680925NrA   r"   r
   r
   r   Útest_hdu_writeto_existingL  s    z/TestChecksumFunctions.test_hdu_writeto_existingc              	   C   sš   t jddd�}t |¡}|j|  d¡ddd� tj|  d¡dd��N}t|d	 d
ƒr\|d	 jsht	j
dd� t|d	 dƒr€|d	 jrŒt	j
dd� W 5 Q R X 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/   r0   r   Úhasattrr�   ÚpytestÚfailrˆ   r6   r
   r
   r   Útest_datasum_onlyb  s    
z'TestChecksumFunctions.test_datasum_onlyc              	   C   s¨   |   d¡ t |  d¡¡�}|d j ¡ }W 5 Q R X tj|  d¡dd�}| ¡  t |  d¡¡�>}d|d jkstt‚d|d jks†t‚t	||d jƒsšt‚W 5 Q R X 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   Úupdate©Úmoder*   r+   N)
Ú	copy_filer   r   r0   r   r=   r!   r2   r    r   )r   r#   r   r
   r
   r   Ú'test_open_update_mode_preserve_checksumm  s    
z=TestChecksumFunctions.test_open_update_mode_preserve_checksumc              	   C   s  |   d¡ t |  d¡¡�"}|d j ¡ }|d j ¡ }W 5 Q R X tj|  d¡dd��&}d|d jd< d|d jd d	< W 5 Q R X t |  d¡¡�ž}|d j}|d j}|d
d… |d
d… ksÄt‚d|ksÐt‚d|ksÜt‚|d dksìt‚|d	 dd
… |d	 dd
… k ¡ �st‚|d	 d dk�s,t‚W 5 Q R X tj|  d¡ddd��}W 5 Q R X t |  d¡¡�¦}|d j}|d j}|d
d… |d
d… k�sœt‚d|k�sªt‚d|k�s¸t‚|d dk�sÊt‚|d	 dd
… |d	 dd
… k ¡ �sôt‚|d	 d dk�s
t‚W 5 Q R X 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   r—   r˜   ZBARZFOOrM   r   ZTIMENéýÿÿÿéþÿÿÿr*   r+   Úremove)r™   r   éÿÿÿÿ)	rš   r   r   r0   r2   r=   r   r    r1   )r   r#   r2   r   Zheader2Zdata2r
   r
   r   Ú%test_open_update_mode_update_checksum�  s@    


*   ÿ


*z;TestChecksumFunctions.test_open_update_mode_update_checksumc              
   C   sÈ  |   d¡}t |  d¡¡�}|j|dd� W 5 Q R X |   d¡}t |  d¡¡�H}d|d jd< d	|d jd
< d|d jd< d|d jd
< | |¡ W 5 Q R X t |¡�}|j|   d¡dd� W 5 Q R X t |   d¡¡�è}t |¡�Ò}d
|d jksöt‚|d jd
 |d jd
 k�st‚d|d jk�s,t‚|d jd dk�sDt‚d
|d jk�sXt‚|d jd
 |d jd
 k�szt‚d|d jk�sŽt‚|d jd |d jd k�s°t‚W 5 Q R X W 5 Q R X dS )zh
        Tests that invalid checksum or datasum are overwritten when the file is
        saved.
        zref.fitsr†   Tr   r�   z1       r   r+   Z8UgqATfo7TfoATfor*   Z
2349680925r   Z11daD8bX98baA8bUz
test2.fitsrD   N)r0   r   r   r   r/   r2   r    )r   Zreffiler#   ZtestfileÚrefr
   r
   r   Útest_overwrite_invalid®  s,    

""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   r8   r
   r
   r   rŠ   Ï  s    z&TestChecksumFunctions._check_checksums)Ú__name__Ú
__module__Ú__qualname__r   r   r$   r9   r@   rC   rI   rS   rb   rm   rw   rx   r|   rƒ   r„   r…   r‰   r‹   rŒ   rŽ   r–   r›   r    r¢   rŠ   Ú__classcell__r
   r
   r   r   r      s2   ' #
-!r   )r3   r   Únumpyr-   r”   Z
astropy.ior   Zastropy.io.fits.hdu.baser   Zconftestr   Z
test_tabler   r   r
   r
   r
   r   Ú<module>   s   