U
    e»{jEŠ  ã                   @   sØ   d dl Zd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZm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 G dd„ deƒZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ Z dS )é    N)Úfits)ÚColumn)ÚFITSDiffÚHDUDiffÚ
HeaderDiffÚImageDataDiffÚTableDataDiff)ÚHDUListÚImageHDUÚ
PrimaryHDU)ÚNonstandardExtHDU)ÚBinTableHDU)ÚHeader)Ú_NOT_OVERWRITING_MSG_MATCHé   )ÚFitsTestCasec                       s*   e Zd Zd‡ fdd„	Zedd„ ƒZ‡  ZS )ÚDummyNonstandardExtHDUNc                    s.   t ƒ j| f|ž|Ž t |¡ ¡ | _d| _d S )Nr   )ÚsuperÚ__init__ÚnpZasarrayÚtobytesÚ_bufferZ_data_offset)ÚselfÚdataÚargsÚkwargs©Ú	__class__© ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/fits/tests/test_diff.pyr      s    zDummyNonstandardExtHDU.__init__c                 C   s
   t | jƒS ©N)Úlenr   )r   r   r   r   Úsize   s    zDummyNonstandardExtHDU.size)N)Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr"   Ú__classcell__r   r   r   r   r      s   r   c                   @   sp  e Z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ej deeeg¡dd„ ƒZdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z d2d3„ Z!d4d5„ Z"d6d7„ Z#d8d9„ Z$d:d;„ Z%d<d=„ Z&d>d?„ Z'd@dA„ Z(dBdC„ Z)dDdE„ Z*dFdG„ Z+dHdI„ Z,dJdK„ Z-dLdM„ Z.dNdO„ Z/dPdQ„ Z0dRdS„ Z1dTdU„ Z2dVS )WÚTestDiffc              	   C   sb   t dddgƒ}| ¡ }t||ƒjs&t‚t| ¡ | ¡ ƒjs>t‚t t¡� tddƒ W 5 Q R X d S )N©ÚAr   ©ÚBé   ©ÚCé   r   r-   )	r   Úcopyr   Ú	identicalÚAssertionErrorÚtostringÚpytestÚraisesÚ	TypeError©r   ÚhaÚhbr   r   r   Útest_identical_headers#   s    zTestDiff.test_identical_headersc                 C   s2   t dddgƒ}| ¡ }d|d< t||ƒjr.t‚d S )Nr)   r+   r.   é   r/   )r   r1   r   r2   r3   r8   r   r   r   Útest_slightly_different_headers,   s    z(TestDiff.test_slightly_different_headersc                 C   sD   t dddgƒ}| ¡ }d|d< d|d< t||ƒjdd	dgks@t‚d S )
Nr)   r+   r.   r<   r/   ©é   ÚCommentÚDr*   r,   )r   r1   r   Úcommon_keywordsr3   r8   r   r   r   Útest_common_keywords2   s
    zTestDiff.test_common_keywordsc                 C   sT   t dddgƒ}| ¡ }|d= t||ƒ}|jr0t‚|jdks>t‚|jddgksPt‚d S )Nr)   r+   r.   r,   )r0   r-   r*   r/   )r   r1   r   r2   r3   Zdiff_keyword_countrB   ©r   r9   r:   Údiffr   r   r   Útest_different_keyword_count9   s    

z%TestDiff.test_different_keyword_countc                 C   sf   t dddgƒ}| ¡ }d|d< d|d< d|d	< d
|d< t||ƒ}|jrJt‚|jd	dgdgfksbt‚d S )Nr)   r+   r.   r<   r/   r>   rA   )é   r@   ÚE)é   r@   ÚF)r   r1   r   r2   r3   Zdiff_keywordsrD   r   r   r   Útest_different_keywordsD   s    

z TestDiff.test_different_keywordsc                 C   sJ   t dddgƒ}| ¡ }d|d< t||ƒ}|jr2t‚|jddgiksFt‚d S )Nr)   r+   r.   r<   r/   )r0   r<   ©r   r1   r   r2   r3   Údiff_keyword_valuesrD   r   r   r   Útest_different_keyword_valuesO   s    

z&TestDiff.test_different_keyword_valuesc                 C   sL   t dddgƒ}| ¡ }d|jd< t||ƒ}|jr4t‚|jddgiksHt‚d S )Nr)   r+   )r/   r0   ú	comment 1ú	comment 2r/   )rO   rP   )r   r1   Úcommentsr   r2   r3   Údiff_keyword_commentsrD   r   r   r   Útest_different_keyword_commentsW   s    


z(TestDiff.test_different_keyword_commentsc                 C   sX   t dddgƒ}| ¡ }| d¡ | d¡ t||ƒ}|jr>t‚|jdd dgiksTt‚d S )Nr)   r+   r.   )r/   r<   )r/   r?   r/   )r<   r?   )r   r1   Úappendr   r2   r3   rM   rD   r   r   r   Ú,test_different_keyword_values_with_duplicate_   s    



z5TestDiff.test_different_keyword_values_with_duplicatec                 C   sŽ   t dddgƒ}| ¡ }| d¡ | d¡ | d¡ | d¡ t||ƒ}|jrRt‚|ji ks`t‚|jdd	d	d
œksvt‚| ¡ }d|ksŠt‚d S )Nr)   r+   r.   )r*   r-   rO   )r*   r0   rP   )r,   r<   z	comment 3)r/   r?   z	comment 4)r0   r   ©r   r-   )r*   r,   r/   zTInconsistent duplicates of keyword 'A'     :
  Occurs 3 time(s) in a, 1 times in (b))	r   r1   rT   r   r2   r3   rM   Zdiff_duplicate_keywordsÚreport©r   r9   r:   rE   rW   r   r   r   Ú"test_asymmetric_duplicate_keywordsh   s    





ÿÿz+TestDiff.test_asymmetric_duplicate_keywordsc                 C   sš   t dddgƒ}| ¡ }d|d< d|d< t||ƒ}|jr:t‚|jdgd	gd
œksRt‚t||dd�}|jrjt‚|jddgiks~t‚t||dd�}|js–t‚d S )Nr)   )r,   ç9b->  @)r/   ç½7†  @çrÄZ|
  @r,   çzo @r/   )rZ   r\   )r[   r]   ©r,   r/   ç�íµ ÷Æ°>©Úrtolçñhãˆµøä>rL   rD   r   r   r   Útest_floating_point_rtolz   s    

þ
z!TestDiff.test_floating_point_rtolc                 C   s.  t dddgƒ}| ¡ }d|d< d|d< t||dd�}|jr>t‚|jd	gd
gdœksVt‚t||dd�}|jrnt‚|jdd
giks‚t‚t||dd�}|jršt‚|jdd	giks®t‚t||dd�}|jrÆt‚|jdd	giksÚt‚t||ddd�}|jsôt‚t||dd�}|j�st‚t||ddd�}|j�r*t‚d S )Nr)   )r,   ç      ð?)r/   ç        çrÄZ|
 ð?r,   r_   r/   r`   )rd   rf   )re   r_   r^   rb   ©Úatol©ra   rh   g¢&ú|”ç>rL   rD   r   r   r   Útest_floating_point_atol‹   s2    
þ



z!TestDiff.test_floating_point_atolc              	   C   sž   t j dd¡�† tdddgƒ}| ¡ }d|d< |d |d ksBt‚t||ƒ}|jsVt‚|ji ksdt‚t||dd�}|jr|t‚|jdd	giks�t‚W 5 Q R X d S )
NZstrip_header_whitespaceFr)   r+   )r/   úA       r*   r/   )Zignore_blanks)rk   r*   )	r   ZconfZset_tempr   r1   r3   r   r2   rM   rD   r   r   r   Útest_ignore_blanks¦   s    


zTestDiff.test_ignore_blanksÚdifferc                 C   s\  t dddgƒ}t dddddgƒ}| ¡ }|tkrB| ¡  | ¡  n|jdd� |jdd� |ttfkr†dd„ |||fD ƒ\}}}|j}|tkr²d	d„ |||fD ƒ\}}}|d
 j}|||ƒjsÂt	‚|||ƒjsÒt	‚|||ƒjsât	‚|||dd�jröt	‚|||dd�j�rt	‚|||dd�j�s"t	‚|tk�r6| ¡  n|jdd� |||dd�j�rXt	‚dS )z`Test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/152

        Ignore blank cards.
        r)   r+   r.   )Ú rn   éþÿÿÿ)Úafterc                 s   s   | ]}t t d ¡|ƒV  qdS )é
   N)r   r   Úarange©Ú.0Úhr   r   r   Ú	<genexpr>É   s     z3TestDiff.test_ignore_blank_cards.<locals>.<genexpr>c                 s   s   | ]}t |gƒV  qd S r    )r	   rs   r   r   r   rv   Ì   s     r   F)Zignore_blank_cardsN)
r   r1   r   rT   Z	add_blankr   r   Úheaderr2   r3   )r   rm   r9   r:   ZhcZ	hc_headerr   r   r   Útest_ignore_blank_cards·   s0    



z TestDiff.test_ignore_blank_cardsc                 C   sÞ  t  d¡ dd¡}| ¡ }tdddgƒ}t jddgdtfd	tfgd
�}t jddgdtfd	tfgd
�}t|d�}t	|dd�}t	|dd�}t
|dd�}	t
|dd�}
t|||	gƒ}t|||
gƒ}t||ƒ}|jrÎt‚|jd d dksät‚t||dgd�}|j�st| ¡ ƒ‚t||dgd�}|j�s,t| ¡ ƒ‚|d  jd7  _t||dgd�}|j�rZt‚t||ddgd�}|j�s€t| ¡ ƒ‚t	|ddd�}| |¡ t||ddgd�}t|jƒ�rÂt| ¡ ƒ‚t|jƒ�sÚt| ¡ ƒ‚d S )Néd   rq   r)   r+   r.   )rd   r   )ç      @r<   ÚxÚy©Zdtype)rd   r-   )rz   r?   )rw   ÚSCI©r   ÚnameZASDFr   r-   )Zignore_hduszASD*r   ©r   r€   Úver)r   rr   Úreshaper1   r   ÚarrayÚfloatÚintr   r
   r   r	   r   r2   r3   Ú	diff_hdusrW   r   rT   ÚanyÚdiff_hdu_count)r   ÚaÚbr9   ZxaÚxbÚphduZihduaZihdubZbhdu1Zbhdu2ÚhdulaÚhdulbrE   Zihducr   r   r   Útest_ignore_hduså   s:    



zTestDiff.test_ignore_hdusc                 C   sÀ   t dddgƒ}| ¡ }d|d< d|d< t||dgd	�}|js@t‚t||dgd	�}|jrZt‚|jdd
giksnt‚| ¡ }d|ks‚t‚d|ksŽt‚t||dgd	�}|jr¨t‚|jdd
giks¼t‚d S )Nr)   r+   r.   r<   r,   r?   r/   Ú*)Zignore_keywords)r0   r?   z%Keyword B        has different valuesz%Keyword C        has different valuesr‹   )r   r1   r   r2   r3   rM   rW   rX   r   r   r   Útest_ignore_keyword_values  s    


z#TestDiff.test_ignore_keyword_valuesc                 C   sÄ   t dddgƒ}| ¡ }d|jd< d|jd< t||dgd	�}|jsDt‚t||dgd	�}|jr^t‚|jdd
giksrt‚| ¡ }d|ks†t‚d|ks’t‚t||dgd	�}|jr¬t‚|jdd
giksÀt‚d S )N)r*   r   r*   )r,   r-   r,   )r/   r0   r/   rA   r,   rH   r/   r‘   )Úignore_comments)r/   rH   z'Keyword B        has different commentsz'Keyword C        has different commentsr‹   )r   r1   rQ   r   r2   r3   rR   rW   rX   r   r   r   Útest_ignore_keyword_comments#  s    




z%TestDiff.test_ignore_keyword_commentsc                 C   sJ   t  d¡ dd¡}t  d¡ dd¡}t||ƒ}|js8t‚|jdksFt‚d S )Nry   rq   r   )r   rr   rƒ   r   r2   r3   Ú
diff_total©r   ÚiaÚibrE   r   r   r   Útest_trivial_identical_images7  s
    

z&TestDiff.test_trivial_identical_imagesc                 C   sF   t  d¡d }t  d¡d }t||dd�}|js4t‚|jdksBt‚d S )N©rq   rq   rb   çñhãˆµøô>ç-Cëâ6?r`   r   )r   Zonesr   r2   r3   r•   r–   r   r   r   Ú(test_identical_within_relative_tolerance>  s
    
z1TestDiff.test_identical_within_relative_tolerancec                 C   sl   t  d¡d }t  d¡d }t||dd�}|jr4t‚|jdksBt‚t||dd�}|jsZt‚|jdksht‚d S )	Nrš   rb   r›   rœ   r`   ry   rg   r   ©r   Úzerosr   r2   r3   r•   r–   r   r   r   Ú(test_identical_within_absolute_toleranceE  s    

z1TestDiff.test_identical_within_absolute_tolerancec                 C   sH   t  d¡d }t  d¡d }t||ddd�}|js6t‚|jdksDt‚d S )Nrš   rb   r›   ri   r   rž   r–   r   r   r   Ú#test_identical_within_rtol_and_atolO  s
    
z,TestDiff.test_identical_within_rtol_and_atolc                 C   sH   t  d¡d }t  d¡d }t||ddd�}|jr6t‚|jdksDt‚d S )Nrš   rb   r›   r_   ri   ry   rž   r–   r   r   r   Ú'test_not_identical_within_rtol_and_atolV  s
    
z0TestDiff.test_not_identical_within_rtol_and_atolc              
   C   s~   t  d¡ dd¡}tj|d�}| |  d¡¡ t |  d¡¡�6}t |  d¡¡�}t||ƒ}|j	sft
‚W 5 Q R X W 5 Q R X dS )a¸  Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/189

        For this test we mostly just care that comparing to compressed images
        does not crash, and returns the correct results.  Two compressed images
        will be considered identical if the decompressed data is the same.
        Obviously we test whether or not the same compression was used by
        looking for (or ignoring) header differences.
        g      Y@rq   ©r   z	test.fitsN)r   rr   rƒ   r   ZCompImageHDUÚwritetoÚtempÚopenr   r2   r3   )r   r   ÚhdurŽ   r�   rE   r   r   r   Útest_identical_comp_image_hdus]  s    
ÿ
z'TestDiff.test_identical_comp_image_hdusc                 C   sˆ   t  d¡ dd¡}t  d¡d }t||ƒ}|jr4t‚|jdksBt‚|jdksPt‚| ¡ }d|ksdt‚d|kspt‚d|ks|t‚d	s„t‚d S )
Nry   rq   r   )rš   )ry   r   zData dimensions differz
a: 10 x 10zb: 100ú%No further data comparison performed.)	r   rr   rƒ   r   r2   r3   Údiff_dimensionsr•   rW   )r   r—   r˜   rE   rW   r   r   r   Útest_different_dimensionsq  s    

z"TestDiff.test_different_dimensionsc                 C   sˆ   t  d¡ dd¡}t  d¡ dd¡}d|d< d|d< t||ƒ}|jrHt‚|jdksVt‚|jdksdt‚|jdksrt‚|j	d	d
gks„t‚d S )Nry   rq   ©r   r   é   ©r?   r?   r   r-   g{®Gáz”?)r¬   )r   rq   )r®   )é7   r­   )
r   rr   rƒ   r   r2   r3   rª   r•   Ú
diff_ratioÚdiff_pixelsr–   r   r   r   Útest_different_pixels‚  s    

zTestDiff.test_different_pixelsc                 C   s�  t ddddgd�}t dddgd	ggd�}t d
dddd	ddgddddggd�}t ddddd	gd�}t ddddgd�}t dddddgd �}t d!dd"ddgd#�}t d$d
d%d&gd�}t d'd(d)d*gd�}	t dd+dd	gddggd�}
t d,d-dd	gddggd�}|||||||||	|
|g}t |¡}t d.d/„ |D ƒ¡}t|j|jƒ}|j�sDt‚t|jƒd0k�sXt‚|j	t
d1ƒk�slt‚|jdk�s|t‚|jdk�sŒt‚d S )2Nr*   ÚLTF©Úformatr„   r,   ÚXr   r   r/   Ú4Iú(2, 2)r-   r0   r<   r?   rG   rI   ©rµ   Údimr„   rA   ÚJç       @©rµ   Zbscaler„   rH   ÚA3ÚabcÚdefrJ   Úmre   rd   ©rµ   Úunitr„   ÚGçš™™™™™¹¿©rµ   Zbzeror„   ÚHù              ð?ù       @      @ÚIÚMù      @      @ù      @      @úPI(2)ÚKúQJ(2)c                 S   s   g | ]}|  ¡ ‘qS r   )r1   )rt   Úcr   r   r   Ú
<listcomp>ž  s     z2TestDiff.test_identical_tables.<locals>.<listcomp>é   Zabcdefghijk)r   r   Úfrom_columnsr   r   r2   r3   r!   Úcommon_columnsÚcommon_column_namesÚsetr°   r•   )r   Úc1Úc2Úc3Úc4Úc5Zc6Zc7Zc8Zc9Zc10Zc11ÚcolumnsÚtaÚtbrE   r   r   r   Útest_identical_tablesŽ  s(    $
zTestDiff.test_identical_tablesc                 C   sZ   t ddd�}t ddd�}tj||gdd�}t |g¡}t |g¡}t||ƒ}|jsVt‚dS )z 
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/178

        Ensure that diffing tables containing empty data doesn't crash.
        rA   r»   )rµ   rH   r   )ZnrowsN)r   r   rÔ   r   r	   r   r2   r3   )r   rØ   rÙ   ZthdurŽ   r�   rE   r   r   r   Útest_diff_empty_tables§  s    
zTestDiff.test_diff_empty_tablesc           	   	   C   s
  t ddddgd�}t dddgd	ggd�}t d
dddd	ddgddddggd�}t ddd	gdggd�}t d
ddd	dddgddddggd�}t |||g¡}t |||g¡}t|j|jdd
gd�}|jsÆt‚t|jƒd	ksØt‚|j	dhksèt‚|j
dksöt‚|jdk�st‚d S )Nr*   r³   TFr´   r,   r¶   r   r   r/   r·   r¸   r-   r0   r<   r?   rG   rI   r¹   é   )Zignore_fieldsrŠ   )r   r   rÔ   r   r   r2   r3   r!   rÕ   rÖ   r°   r•   )	r   rØ   rÙ   rÚ   rÛ   rÜ   rÞ   rß   rE   r   r   r   Útest_ignore_table_fields¸  s    $$
z!TestDiff.test_ignore_table_fieldsc                 C   sâ   t ddddgd�}t ddddgd�}t ddddgd�}t ||g¡}t ||g¡}t|j|jƒ}|jrjt‚t|jƒdks|t‚|j	d	hksŒt‚|j
dgdgfks¢t‚|jd
ks°t‚|jd
ks¾t‚| ¡ }d|ksÒt‚d|ksÞt‚d S )Nr*   r³   TFr´   r,   r/   r   rŠ   r   zExtra column B of format L in azExtra column C of format L in b)r   r   rÔ   r   r   r2   r3   r!   rÕ   rÖ   Údiff_column_namesr°   r•   rW   ©r   ÚcaÚcbÚccrÞ   rß   rE   rW   r   r   r   Ú test_different_table_field_namesÌ  s    
z)TestDiff.test_different_table_field_namesc                 C   sð   t ddddgd�}t ddddgd�}t ddddgd�}t |g¡}t |||g¡}t|j|jƒ}|jrjt‚|jdksxt‚t|j	ƒd	ksŠt‚|j
d
hksšt‚|jg ddgfks°t‚|jdks¾t‚|jdksÌt‚| ¡ }d|ksàt‚d|ksìt‚dS )zh
        Test tables with some common columns, but different number of columns
        overall.
        r*   r³   TFr´   r,   r/   ©r   r0   r   r‹   r   z) Tables have different number of columns:z  a: 1
  b: 3N)r   r   rÔ   r   r   r2   r3   Údiff_column_countr!   rÕ   rÖ   rä   r°   r•   rW   rå   r   r   r   Ú!test_different_table_field_countsá  s     
z*TestDiff.test_different_table_field_countsc           	      C   sô   t ddddgd�}t ddddgd�}t dddddgd�}t dddddgd�}t ||g¡}t ||g¡}t|j|jƒ}|jr€t‚|jdksŽt‚t|j	ƒdks t‚|j
d	ks®t‚|jg ks¼t‚| ¡ }d
|ksÐt‚d|ksÜt‚d|ksèt‚dsðt‚dS )zh
        Test tables that are otherwise identical but one has more rows than the
        other.
        r*   r³   TFr´   r,   r   r-   ©r-   r0   zTable rows differza: 2zb: 3r©   N)r   r   rÔ   r   r   r2   r3   rë   r!   rÕ   Z	diff_rowsÚdiff_valuesrW   )	r   Úca1Úcb1Úca2Úcb2rÞ   rß   rE   rW   r   r   r   Útest_different_table_rowsü  s"    
z"TestDiff.test_different_table_rowsc                 C   sŠ  t ddddgd�}t dddgd	ggd�}t d
dddd	ddgddddggd�}t dddddgd�}t ddddgd�}t dddddgd �}t d!dd"ddgd#�}t d$d
d%d&gd�}t d'd(d)d*gd�}	t dd+dd	gddggd�}
t d,d-dd	gddggd�}t ddddgd�}t dddgdggd�}t d
dddd	ddgdddd.ggd�}t dddddgd�}t dddd/gd�}t dddddgd �}t d!dd"dd0gd#�}t d$d
d1d&gd�}t d'd(d2d*gd�}t dd+d	dgddggd�}t d,d-d	dgddggd�}t |||||||||	|
|g¡}t |||||||||||g¡}t|j|jd3d4�}|j�rBt‚|jd5k�sRt‚|jd d6k�sft‚|jd	 d7d	gdgffk�s†t‚|jd d d8k�sžt‚|jd d	 d ddgddggk 	¡ �sÊt‚|jd d	 d	 ddgdd.ggk 	¡ �söt‚|jd d9k�s
t‚|jd d:k�st‚|jd d;k�s2t‚|jd d<k�sFt‚|jd d=k�sZt‚|jd. d>k�snt‚|jd? d@k�s‚t‚|jdA dBk�s–t‚|jdC d dDk�s®t‚|jdC d	 d dd	gk 	¡ �sÒt‚|jdC d	 d	 d	dgk 	¡ �söt‚|jdE d dFk�st‚|jdE d	 d ddgk 	¡ �s2t‚|jdE d	 d	 ddgk 	¡ �sVt‚|jdG d dHk�snt‚|jdG d	 d dd	gk 	¡ �s’t‚|jdG d	 d	 d	dgk 	¡ �s¶t‚|jdI d dJk�sÎt‚|jdI d	 d ddgk 	¡ �sòt‚|jdI d	 d	 ddgk 	¡ �st‚|j
dKk�s&t‚tj|jdLdMddN��s@t‚| ¡ }dO|k�sVt‚dP|k�sdt‚dQ|k�srt‚| dR¡d	k�s†t‚dSS )Tzn
        Test diffing table data on columns of several different data formats
        and dimensions.
        r*   r³   TFr´   r,   r¶   r   r   r/   r·   r¸   r-   r0   r<   r?   rG   rI   r¹   rA   r»   r¼   re   r½   rH   r¾   r¿   rÀ   rJ   rÁ   rd   rÂ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÐ   râ   Úghirz   ù      ð?      ð?ù      @      @r­   )Znumdiffsr   ))r*   r   )TF)r,   r   )r/   r   ))rA   r   )r   r¼   ))rH   r   )rÀ   rô   ))rJ   r   )re   rd   ))rJ   r   ©rd   r¼   ))rÄ   r   )re   r¼   ))rÄ   r   )rd   rz   é	   ))rÇ   r   )rÈ   rõ   rq   ))rÊ   r   )rÌ   rö   rÓ   )r»   r   é   )r»   r   é   )rÏ   r   é   )rÏ   r   é   gmçû©ñÒå?çü©ñÒMbP?©rh   ra   z8Column A data differs in row 0:
    a> True
    b> Falsez:...and at 1 more indices.
 Column D data differs in row 0:z;15 different table data element(s) found (68.18% different)zmore indicesN)r   r   rÔ   r   r   r2   r3   Zdiff_columnsrî   Úallr•   r   Úiscloser°   rW   Úcount)r   rï   rñ   Zca3Zca4Zca5Zca6Zca7Zca8Zca9Zca10Zca11rð   rò   Zcb3Zcb4Zcb5Zcb6Zcb7Zcb8Zcb9Zcb10Zcb11rÞ   rß   rE   rW   r   r   r   Útest_different_table_data  s~    $$ÿÿ ,,$$$$$$$$z"TestDiff.test_different_table_datac                 C   sÈ   t  d¡ dd¡}t|d�}| |  d¡¡ | |  d¡¡ t|  d¡|  d¡ƒ}|js\t‚| 	¡ }d|kspt‚d|ks|t‚d|ksˆt‚t  d¡}t
|d�}t||ƒ}|js°t‚| 	¡ }d|ksÄt‚d	S )
z5Test identicality of two simple, extensionless files.ry   rq   r£   z
testa.fitsz
testb.fitsúPrimary HDUzExtension HDUúNo differences found.N)r   rr   rƒ   r   r¤   r¥   r   r2   r3   rW   r
   r   )r   rŠ   r§   rE   rW   Úehdur   r   r   Útest_identical_files_basice  s     





z#TestDiff.test_identical_files_basicc                 C   s    t  d¡ dd¡}t|d�}t|d�}t||gƒ}t|||gƒ}t||ƒ}|jrTt‚|j	dksbt‚|j
g kspt‚| ¡ }d|ks„t‚d|ks�t‚d|ksœt‚dS )	zc
        Test files that have some identical HDUs but a different extension
        count.
        ry   rq   r£   rí   z'Files contain different numbers of HDUsz
a: 2
 b: 3z(No differences found between common HDUsN)r   rr   rƒ   r   r
   r	   r   r2   r3   r‰   r‡   rW   )r   rŠ   r�   r  rŽ   r�   rE   rW   r   r   r   Útest_partially_identical_files1|  s    



z(TestDiff.test_partially_identical_files1c                 C   sð  t  d¡ dd¡}t|d�}t|d�}t|d d�}t|||gƒ}t|||gƒ}t||ƒ}|jrdt‚|j	dksrt‚t
|jƒdks„t‚|jd d dksšt‚|jd d }|jr²t‚|jdksÀt‚|jdksÎt‚|jdksÜt‚|jjsèt‚|jdk	söt‚|j}	t|	tƒ�st‚|	j�rt‚|	jdk�s(t‚|	jdd	„ tdƒD ƒk�sFt‚|	jd
k�sVt‚|	jdk�sft‚| ¡ }
d|
k�s|t‚d|
k�sŠt‚d|
k�s˜t‚d|
k�s¦t‚d|
k�s´t‚tdƒD ] }d|d › d�|
k�s¼t‚�q¼d|
k�sìt‚dS )zQ
        Test files that have some identical HDUs but one different HDU.
        ry   rq   r£   r   r   r   Nc                 S   s    g | ]}d |f||d ff‘qS )r   r   r   )rt   r|   r   r   r   rÒ   ²  s     z<TestDiff.test_partially_identical_files2.<locals>.<listcomp>rd   r  zExtension HDU 2zExtension HDU 1zHeaders contain differenceszData contains differenceszData differs at [z, 1]z/100 different pixels found (100.00% different).)r   rr   rƒ   r   r
   r	   r   r2   r3   r‰   r!   r‡   Údiff_extnamesÚdiff_extversÚdiff_extension_typesZdiff_headersÚ	diff_dataÚ
isinstancer   rª   r±   Úranger°   r•   rW   )r   rŠ   r�   r  Zehdu2rŽ   r�   rE   ZhdudiffZdatadiffrW   r|   r   r   r   Útest_partially_identical_files2”  sD    




z(TestDiff.test_partially_identical_files2c                 C   s(  t ƒ }tdd�}t||gƒ}tdd�}d|jd< d|jd< t||gƒ}t||ƒ}|jrZt‚|jd d d	kspt‚|jd d	 }|j	d
ksŒt‚|j
dksšt‚|jdks¨t‚|jdks¶t‚| ¡ }d|ksÊt‚d|ksÖt‚d|ksât‚d|ksît‚d|ksút‚d|k�st‚d|k�st‚d|k�s$t‚dS )zb
        Test files that have some identical HDUs but a different extension
        name.
        ÚFOO)r€   ÚBARr-   ZEXTVERr0   ZEXTLEVELr   r   )ZIMAGEZBINTABLE)r  r  rV   rê   zExtension types differza: IMAGE
    b: BINTABLEzExtension names differza: FOO
    b: BARzExtension versions differza: 1
    b: 2zExtension levels differN)r   r
   r	   r   rw   r   r2   r3   r‡   r
  r  r	  Zdiff_extlevelsrW   )r   r�   r  rŽ   r�   rE   Zhdu_diffrW   r   r   r   Útest_partially_identical_files3Â  s0    





z(TestDiff.test_partially_identical_files3c                 C   s°  t jdt jd�}d|dd…< t j|dd…< | ¡ }t jjddt jft jt jfgdd	gd
� tj	¡}| ¡ }t
||ƒjszt‚t||ƒjsŠt‚d|d d< d|d d< d|d d< d|d d< t
||ƒ}|jrÎt‚|jd dksàt‚|jd d dksöt‚t  |jd d d ¡�st‚|jd d d dk�s0t‚t||ƒ}|j�rFt‚|jd dk�sZt‚|jd d dk�srt‚t  |jd d d ¡�s�t‚|jd d d dk�s¬t‚dS )zW
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/204
        rš   r}   rd   Nr?   r÷   rz   ÚcolaÚcolb)Únamesr¼   r   r   )r¬   r÷   )r?   r   ))r  r   r÷   )r  r   )r   ÚemptyZfloat64Únanr1   Zrecr„   Úviewr   ZFITS_recr   r2   r3   r   r±   Úisnanrî   )r   ZarrZarr2ÚtableZtable2rE   r   r   r   Útest_diff_nansä  s:     ÿþ


zTestDiff.test_diff_nansc              	   C   sn   |   d¡}tdddgƒ}| ¡ }d|d< t||ƒ}|j|d� | ¡ }t|ƒ�}| ¡ |ks`t‚W 5 Q R X d S )Núdiff_output.txtr)   r+   r.   r<   r/   ©Úfileobj©r¥   r   r1   r   rW   r¦   Úreadr3   ©r   Úoutpathr9   r:   ÚdiffobjZreport_as_stringZfoutr   r   r   Ú!test_file_output_from_path_string  s    


z*TestDiff.test_file_output_from_path_stringc              	   C   sh   |   d¡}tdddgƒ}| ¡ }d|d< t||ƒ}|j|d� tjttd�� |j|d� W 5 Q R X d S )	Nr  r)   r+   r.   r<   r/   r  )Úmatch)	r¥   r   r1   r   rW   r5   r6   ÚOSErrorr   )r   r!  r9   r:   r"  r   r   r   Ú!test_file_output_overwrite_safety  s    

z*TestDiff.test_file_output_overwrite_safetyc              	   C   s€   |   d¡}tdddgƒ}| ¡ }d|d< t||ƒ}|j|d� | ¡ }|j|dd	� t|ƒ�}| ¡ |ksrtd
ƒ‚W 5 Q R X d S )Nr  r)   r+   r.   r<   r/   r  T)r  Ú	overwritez9overwritten output file is not identical to report stringr  r   r   r   r   Ú"test_file_output_overwrite_success"  s    



ÿþz+TestDiff.test_file_output_overwrite_successc                 C   s^   t jddd� dd¡}| ¡ }t|d�}t|d�}t||ƒ}|jsFt‚| ¡ }d|ksZt‚d S )Nry   Úuint8r}   rq   r£   r  )	r   rr   rƒ   r1   r   r   r2   r3   rW   ©r   rŠ   r‹   Úhdu_aÚhdu_brE   rW   r   r   r   Útest_rawdatadiff_nodiff0  s    



z TestDiff.test_rawdatadiff_nodiffc                 C   s†   t jddd�d }|d d…  ¡ }t|d�}t|d�}t||ƒ}|jrJt‚| ¡ }d|ks^t‚d|ksjt‚d	|ksvt‚d
|ks‚t‚d S )Nry   r)  r}   rq   éP   r£   zData sizes differ:za: 100 byteszb: 80 bytesr©   )r   rr   r1   r   r   r2   r3   rW   r*  r   r   r   Útest_rawdatadiff_dimsdiff:  s    



z"TestDiff.test_rawdatadiff_dimsdiffc                 C   sô   t jddd�d }| ¡ }ddg}|D ]\}}|||< q&t|d�}t|d�}t||ƒ}|jr`t‚|jj}	t	|ƒt	|	ƒks|t‚t
|ƒD ](\}
\}}|	|
 ||d |ffks„t‚q„| ¡ }d|ksÂt‚|D ]\}}d	|› d
�|ksÆt‚qÆd|ksðt‚d S )Nry   r)  r}   rq   )é   éÈ   )éY   éª   r£   zData contains differences:zData differs at byte ú:z*2 different bytes found (2.00% different).)r   rr   r1   r   r   r2   r3   r  Ú
diff_bytesr!   Ú	enumeraterW   )r   rŠ   r‹   ÚchangesÚiÚvr+  r,  rE   r5  ÚjrW   Ú_r   r   r   Útest_rawdatadiff_bytesdiffG  s$    




z#TestDiff.test_rawdatadiff_bytesdiffN)3r#   r$   r%   r;   r=   rC   rF   rK   rN   rS   rU   rY   rc   rj   rl   r5   ÚmarkZparametrizer   r   r   rx   r�   r’   r”   r™   r�   r    r¡   r¢   r¨   r«   r²   rà   rá   rã   ré   rì   ró   r  r  r  r  r  r  r#  r&  r(  r-  r/  r<  r   r   r   r   r(   "   sV   		
-*
L."(
r(   c                 C   sl   | d }| d }t tƒ tt d¡dd�gƒ}| |¡ d|d jd< | |¡ t||ƒ}d| ¡ ksht	‚d	S )
z?Make sure diff report reports HDU name and ver if same in filesú
test1.fitsú
test2.fitsr?   r~   r   r   r   zExtension HDU 1 (SCI, 1):N©
r	   r   r
   r   rŸ   r¤   r   r   rW   r3   ©Útmp_pathÚpath1Úpath2ZhdulistrE   r   r   r   Útest_fitsdiff_hdu_name`  s    


rE  c                 C   sj   | d }| d }t tƒ tt d¡d�gƒ}| |¡ d|d jd< | |¡ t||ƒ}d| ¡ ksft	‚dS )	z=Make sure diff report doesn't report HDU name if not in filesr>  r?  r?   r£   r   r   úExtension HDU 1:Nr@  rA  r   r   r   Útest_fitsdiff_no_hdu_namen  s    


rG  c                 C   sj   | d }| d }t tƒ tt d¡ddd�gƒ}| |¡ d|d _| |¡ t||ƒ}d| ¡ ksft	‚d	S )
zBMake sure diff report doesn't report HDU name if not same in filesr>  r?  r?   r~   r   r�   ZERRrF  N)
r	   r   r
   r   rŸ   r¤   r€   r   rW   r3   rA  r   r   r   Útest_fitsdiff_with_names|  s    



rH  c              
   C   sn  | d }| d }t jddd�}t jddd�d |dd…df< t jddd�d	 |dd…d
f< | ¡ }ddg}|D ]"\}}}|||df< |||d
f< qntdd|gd�}	tdd|gd�}
t |	g¡}|j|dd� t |
g¡}|j|dd� t 	|¡�X}t 	|¡�B}t
||ddd�}|jddd�}t
||ddd�}|jddd�}W 5 Q R X W 5 Q R X d|k�s\t‚d|k�sjt‚dS )zCRegression test for https://github.com/astropy/astropy/issues/13330r>  r?  )rq   r-   Zfloat32r}   rq   Nr   r­   r   )r0   g333333*@gš™™™™7@)râ   g     €4@g     €>@r*   Z20Er´   T)r'  rý   rþ   )r  Úindentg{®Gáz„?z...and at 1 more indices.)r   rŸ   rr   r1   r   r   rÔ   r¤   r   r¦   r   rW   r3   )rB  rC  rD  rŠ   r‹   r7  r8  r9  Úwræ   rç   r+  r,  Zfits1Zfits2rE   Zstr1Zstr2r   r   r   Útest_rawdatadiff_diff_with_rtolŠ  s0    "rK  )!Únumpyr   r5   Z
astropy.ior   Zastropy.io.fits.columnr   Zastropy.io.fits.diffr   r   r   r   r   Zastropy.io.fits.hdur	   r
   r   Zastropy.io.fits.hdu.baser   Zastropy.io.fits.hdu.tabler   Zastropy.io.fits.headerr   Zastropy.utils.miscr   Zconftestr   r   r(   rE  rG  rH  rK  r   r   r   r   Ú<module>   s,         D