
    HR-eE                         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e          Z G d de          Zd Zd Zd Zd Z dS )    N)fits)Column)FITSDiffHDUDiff
HeaderDiffImageDataDiffTableDataDiff)HDUListImageHDU
PrimaryHDU)NonstandardExtHDU)BinTableHDU)Header)_NOT_OVERWRITING_MSG_MATCH   )FitsTestCasec                   6     e Zd Zd fd	Zed             Z xZS )DummyNonstandardExtHDUNc                      t                      j        | g|R i | t          j        |                                          | _        d| _        d S )Nr   )super__init__npasarraytobytes_buffer_data_offset)selfdataargskwargs	__class__s       ?lib/python3.11/site-packages/astropy/io/fits/tests/test_diff.pyr   zDummyNonstandardExtHDU.__init__   sU    ///////z$''//11    c                 *    t          | j                  S N)lenr   )r   s    r"   sizezDummyNonstandardExtHDU.size   s    4<   r#   r%   )__name__
__module____qualname__r   propertyr'   __classcell__)r!   s   @r"   r   r      sX             
 ! ! X! ! ! ! !r#   r   c                   R   e 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eee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) Z0d* Z1d+ Z2d,S )-TestDiffc                 x   t          g d          }|                                }t          ||          j        sJ t          |                                |                                          j        sJ t          j        t                    5  t          dd           d d d            d S # 1 swxY w Y   d S )NAr   B   C   r   r5   )r   copyr   	identicaltostringpytestraises	TypeErrorr   hahbs      r"   test_identical_headerszTestDiff.test_identical_headers#   s    22233WWYY"b!!++++"++--77AAAA]9%% 	 	q!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B//B36B3c                     t          g d          }|                                }d|d<   t          ||          j        rJ d S )Nr0      r7   )r   r9   r   r:   r?   s      r"   test_slightly_different_headersz(TestDiff.test_slightly_different_headers,   sK    22233WWYY3b"%%//////r#   c                     t          g d          }|                                }d|d<   d|d<   t          ||          j        g dk    sJ d S )Nr0   rD   r7      CommentDr2   r4   r7   )r   r9   r   common_keywordsr?   s      r"   test_common_keywordszTestDiff.test_common_keywords2   s]    22233WWYY3 3"b!!1___DDDDDDr#   c                     t          g d          }|                                }|d= t          ||          }|j        rJ |j        dk    sJ |j        ddgk    sJ d S )Nr0   r4   )r8   r5   r2   r7   )r   r9   r   r:   diff_keyword_countrL   r   r@   rA   diffs       r"   test_different_keyword_countz%TestDiff.test_different_keyword_count9   s{    22233WWYYsG"b!!>!!!&&0000 #Sz111111r#   c                     t          g d          }|                                }d|d<   d|d<   d|d<   d|d	<   t          ||          }|j        rJ |j        dd	gdgfk    sJ d S )
Nr0   rD   r7   rG   rJ   )   rI   E)   rI   F)r   r9   r   r:   diff_keywordsrP   s       r"   test_different_keywordsz TestDiff.test_different_keywordsD   s    22233WWYY3 3 3 3"b!!>!!!!sCj3%%8888888r#   c                     t          g d          }|                                }d|d<   t          ||          }|j        rJ |j        ddgik    sJ d S )Nr0   rD   r7   )r8   rD   r   r9   r   r:   diff_keyword_valuesrP   s       r"   test_different_keyword_valuesz&TestDiff.test_different_keyword_valuesO   si    22233WWYY3"b!!>!!!'C&?::::::r#   c                     t          g d          }|                                }d|j        d<   t          ||          }|j        rJ |j        ddgik    sJ d S )N)r1   r3   )r7   r8   	comment 1	comment 2r7   )r_   r`   )r   r9   commentsr   r:   diff_keyword_commentsrP   s       r"   test_different_keyword_commentsz(TestDiff.test_different_keyword_commentsW   so    ???@@WWYY&C"b!!>!!!)c4N3O-PPPPPPPr#   c                     t          g d          }|                                }|                    d           |                    d           t          ||          }|j        rJ |j        dd dgik    sJ d S )Nr0   )r7   rD   )r7   rH   r7   )rD   rH   )r   r9   appendr   r:   r\   rP   s       r"   ,test_different_keyword_values_with_duplicatez5TestDiff.test_different_keyword_values_with_duplicate_   s    22233WWYY
		(
		("b!!>!!!'C$+@@@@@@@r#   c                    t          g d          }|                                }|                    d           |                    d           |                    d           |                    d           t          ||          }|j        rJ |j        i k    sJ |j        ddddk    sJ |                                }d	|v sJ d S )
Nr0   )r2   r5   r_   )r2   r8   r`   )r4   rD   z	comment 3)r7   rH   z	comment 4)r8   r   r   r5   rK   zTInconsistent duplicates of keyword 'A'     :
  Occurs 3 time(s) in a, 1 times in (b))r   r9   re   r   r:   r\   diff_duplicate_keywordsreportr   r@   rA   rQ   rj   s        r"   "test_asymmetric_duplicate_keywordsz+TestDiff.test_asymmetric_duplicate_keywordsh   s    22233WWYY
		'(((
		'(((
		'(((
		'((("b!!>!!!'2----+V&v/V/VVVVV69?@ @ @ @ @ @r#   c                 F   t          g d          }|                                }d|d<   d|d<   t          ||          }|j        rJ |j        dgdgdk    sJ t          ||d	
          }|j        rJ |j        ddgik    sJ t          ||d
          }|j        sJ d S )N)r1   )r4   9b->  @)r7   7  @rZ|
  @r4   zo @r7   )rn   rp   )ro   rq   r4   r7   ư>rtolh㈵>r[   rP   s       r"   test_floating_point_rtolz!TestDiff.test_floating_point_rtolz   s    ???@@WWYY33"b!!>!!!'$%&',
 ,
 
 
 
 
 "bt,,,>!!!'C2D1E+FFFFF"bt,,,~r#   c                 f   t          g d          }|                                }d|d<   d|d<   t          ||d          }|j        rJ |j        dgdgd	k    sJ t          ||d
          }|j        rJ |j        ddgik    sJ t          ||d          }|j        rJ |j        ddgik    sJ t          ||d
          }|j        rJ |j        ddgik    sJ t          ||d
d
          }|j        sJ t          ||d          }|j        sJ t          ||dd          }|j        rJ d S )N)r1   )r4         ?)r7           rZ|
 ?r4   rs   r7   rt   )ry   r{   )rz   rs   rr   rv   atolru   r}   g&|>r[   rP   s       r"   test_floating_point_atolz!TestDiff.test_floating_point_atol   s   66677WWYY33"bt,,,>!!!' !!",
 ,
 
 
 
 
 "bt,,,>!!!'C/1B+CCCCC"bt,,,>!!!'C.1A+BBBBB"bt,,,>!!!'C.1A+BBBBB"bt$777~"bv...~"bt$777>!!!!!r#   c                    t           j                            dd          5  t          g d          }|                                }d|d<   |d         |d         k    sJ t          ||          }|j        sJ |j        i k    sJ t          ||d          }|j        rJ |j        ddgik    sJ 	 d d d            d S # 1 swxY w Y   d S )Nstrip_header_whitespaceF)r1   r3   )r7   A       r2   r7   )ignore_blanks)r   r2   )r   confset_tempr   r9   r   r:   r\   rP   s       r"   test_ignore_blankszTestDiff.test_ignore_blanks   sK   Y 95AA 	J 	J???@@BBBsGc7bg%%%%b"%%D>!!!+r1111 b"E:::D~%%%+6G5H/IIIIII	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	Js   BB??CCdifferc                 V   t          g d          }t          g d          }|                                }|t          u r)|                                 |                                 n,|                    d           |                    d           |t
          t          fv rd |||fD             \  }}}|j        }|t          u r d |||fD             \  }}}|d         j        } |||          j        sJ  |||          j        sJ  |||          j        sJ  |||d	          j        rJ  |||d	          j        rJ  |||d	          j        sJ |t          u r|                                 n|                    d            |||d	          j        rJ d
S )z`Test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/152

        Ignore blank cards.
        r0   )r1    r   r3   r   r6   )afterc              3   Z   K   | ]&}t          t          j        d           |          V  'dS )
   N)r   r   arange.0hs     r"   	<genexpr>z3TestDiff.test_ignore_blank_cards.<locals>.<genexpr>   s4      MM1*RYr]]A66MMMMMMr#   c              3   6   K   | ]}t          |g          V  d S r%   )r
   r   s     r"   r   z3TestDiff.test_ignore_blank_cards.<locals>.<genexpr>   s*      ==1'1#,,======r#   r   F)ignore_blank_cardsN)	r   r9   r   re   	add_blankr   r   headerr:   )r   r   r@   rA   hc	hc_headers         r"   test_ignore_blank_cardsz TestDiff.test_ignore_blank_cards   s    22233FFFGGWWYYZIIKKKIIKKKKLLrL"""LLrL"""gx(((MMRMMMJBB	IX==R===JBB1I vb"~~''''vb"~~''''vb"~~''''6"bU;;;EEEE6"bU;;;EEEE
 vb"777AAAAZIIKKKKb))) 6"bU;;;EEEEEEr#   c                 t   t          j        d                              dd          }|                                }t	          g d          }t          j        ddgdt          fdt          fg          }t          j        d	d
gdt          fdt          fg          }t          |          }t          |d          }t          |d          }t          |d          }	t          |d          }
t          |||	g          }t          |||
g          }t          ||          }|j        rJ |j        d         d         dk    sJ t          ||dg          }|j        sJ |                                            t          ||dg          }|j        sJ |                                            |d         xj        dz  c_        t          ||dg          }|j        rJ t          ||ddg          }|j        sJ |                                            t          |dd          }|                    |           t          ||ddg          }t%          |j                  rJ |                                            t%          |j                  sJ |                                            d S )Nd   r   r0   )ry   r   )      @rD   xydtype)ry   r5   )r   rH   )r   SCIr   nameASDFr   r5   )ignore_hduszASD*r   r   r   ver)r   r   reshaper9   r   arrayfloatintr   r   r   r
   r   r:   	diff_hdusrj   r   re   anydiff_hdu_count)r   abr@   xaxbphduihduaihdubbhdu1bhdu2hdulahdulbrQ   ihducs                  r"   test_ignore_hduszTestDiff.test_ignore_hdus   s   IcNN""2r**FFHH22233Xx*C<#s2LMMMXx*C<#s2LMMM$$$ae,,,ae,,,&111&111ue,--ue,-- u%%>!!!~a #q(((( u6(;;;~,,t{{}},,,u6(;;;~,,t{{}},,, 	eQu6(;;;>!!! u5&/BBB~,,t{{}},,, ae333Uu5&/BBBt~&&555554&''6666666r#   c                    t          g d          }|                                }d|d<   d|d<   t          ||dg          }|j        sJ t          ||dg          }|j        rJ |j        ddgik    sJ |                                }d	|vsJ d
|v sJ t          ||dg          }|j        rJ |j        ddgik    sJ d S )Nr0   rD   r4   rH   r7   *)ignore_keywords)r8   rH   z%Keyword B        has different valuesz%Keyword C        has different valuesr   )r   r9   r   r:   r\   rj   rk   s        r"   test_ignore_keyword_valuesz#TestDiff.test_ignore_keyword_values  s   22233WWYY33"b3%888~"b3%888>!!!'C&?::::6fDDDD6&@@@@ "b3%888>!!!'C&?::::::r#   c                    t          g d          }|                                }d|j        d<   d|j        d<   t          ||dg          }|j        sJ t          ||dg          }|j        rJ |j        ddgik    sJ |                                }d	|vsJ d
|v sJ t          ||dg          }|j        rJ |j        ddgik    sJ d S )N))r2   r   r2   )r4   r5   r4   )r7   r8   r7   rJ   r4   rU   r7   r   )ignore_comments)r7   rU   z'Keyword B        has different commentsz'Keyword C        has different commentsr   )r   r9   ra   r   r:   rb   rj   rk   s        r"   test_ignore_keyword_commentsz%TestDiff.test_ignore_keyword_comments#  s   AAABBWWYYCC"b3%888~"b3%888>!!!)cJ<-@@@@@8FFFF8FBBBB "b3%888>!!!)cJ<-@@@@@@@r#   c                     t          j        d                              dd          }t          j        d                              dd          }t          ||          }|j        sJ |j        dk    sJ d S )Nr   r   r   )r   r   r   r   r:   
diff_totalr   iaibrQ   s       r"   test_trivial_identical_imagesz&TestDiff.test_trivial_identical_images7  sr    Ys^^##B++Ys^^##B++R$$~!######r#   c                     t          j        d          dz
  }t          j        d          dz
  }t          ||d          }|j        sJ |j        dk    sJ d S )Nr   r   rv   h㈵>-C6?rt   r   )r   onesr   r:   r   r   s       r"   (test_identical_within_relative_tolerancez1TestDiff.test_identical_within_relative_tolerance>  se    WX(WX(R&111~!######r#   c                    t          j        d          dz
  }t          j        d          dz
  }t          ||d          }|j        rJ |j        dk    sJ t          ||d          }|j        sJ |j        dk    sJ d S )	Nr   rv   r   r   rt   r   r|   r   r   zerosr   r:   r   r   s       r"   (test_identical_within_absolute_tolerancez1TestDiff.test_identical_within_absolute_toleranceE  s    Xh')Xh')R&111>!!!#%%%%R&111~!######r#   c                     t          j        d          dz
  }t          j        d          dz
  }t          ||dd          }|j        sJ |j        dk    sJ d S )Nr   rv   r   r~   r   r   r   s       r"   #test_identical_within_rtol_and_atolz,TestDiff.test_identical_within_rtol_and_atolO  sg    Xh')Xh')R&v>>>~!######r#   c                     t          j        d          dz
  }t          j        d          dz
  }t          ||dd          }|j        rJ |j        dk    sJ d S )Nr   rv   r   rs   r~   r   r   r   s       r"   'test_not_identical_within_rtol_and_atolz0TestDiff.test_not_identical_within_rtol_and_atolV  sg    Xh')Xh')R&v>>>>!!!#%%%%%%r#   c                    t          j        d                              dd          }t          j        |          }|                    |                     d                     t          j        |                     d                    5 }t          j        |                     d                    5 }t          ||          }|j	        sJ 	 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 )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@r   r   z	test.fitsN)
r   r   r   r   CompImageHDUwritetotempopenr   r:   )r   r   hdur   r   rQ   s         r"   test_identical_comp_image_hdusz'TestDiff.test_identical_comp_image_hdus]  sd    y''B//T***DIIk**+++Ytyy--.. 	"%IIk"":
 :
 	"E5))D>!!!!		" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s6   (C45CC4C 	 C4#C 	$C44C8;C8c                 6   t          j        d                              dd          }t          j        d          dz
  }t          ||          }|j        rJ |j        dk    sJ |j        dk    sJ |                                }d|v sJ d|v sJ d|v sJ d S )	Nr   r   r   )r   )r   r   zData dimensions differz
a: 10 x 10zb: 100)r   r   r   r   r:   diff_dimensionsr   rj   )r   r   r   rQ   rj   s        r"   test_different_dimensionsz"TestDiff.test_different_dimensionsq  s    Ys^^##B++Ys^^a R$$>!!!#'99999!####'61111v%%%%6!!!!66r#   c                 X   t          j        d                              dd          }t          j        d                              dd          }d|d<   d|d<   t          ||          }|j        rJ |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        d	d
gk    sJ d S )Nr   r   r   r      rH   rH    r5   g{Gz?)r   )r   r   )r   )7   r   )	r   r   r   r   r:   r   r   
diff_ratiodiff_pixelsr   s       r"   test_different_pixelszTestDiff.test_different_pixels  s    Ys^^##B++Ys^^##B++44R$$>!!!#r))))!####$&&&&$57I#JJJJJJJr#   c                 B   t          ddddg          }t          dddgd	gg          }t          d
ddg dg dg          }t          ddddd	g          }t          ddddg          }t          dddddg          }t          dddddg          }t          d d
d!d"g          }t          d#d$d%d&g          }	t          dd'dd	gd(d)gg          }
t          d*d+dd	gd(d)gg          }|||||||||	|
|g}t          j        |          }t          j        d, |D                       }t          |j        |j                  }|j        sJ t          |j                  d-k    sJ |j        t          d.          k    sJ |j
        dk    sJ |j        dk    sJ d S )/Nr2   LTFformatr   r4   Xr   r   r7   4I(2, 2)r   r   r5   r8   rD   rH   rT   rV   r   dimr   rJ   J       @r   bscaler   rU   A3abcdefrW   mrz   ry   r   unitr   G皙r   bzeror   H              ?       @      @IM      @      @      @      @PI(2)r5   r8   KQJ(2)c                 6    g | ]}|                                 S r   )r9   )r   cs     r"   
<listcomp>z2TestDiff.test_identical_tables.<locals>.<listcomp>  s     &A&A&AAqvvxx&A&A&Ar#      abcdefghijk)r   r   from_columnsr	   r   r:   r&   common_columnscommon_column_namessetr   r   )r   c1c2c3c4c5c6c7c8c9c10c11columnstatbrQ   s                   r"   test_identical_tableszTestDiff.test_identical_tables  s   CD%=999CQC!:666C(<<<:VWWWCC1v>>>CUEN;;;C#c3Z@@@C4SzBBBCJ
+CDDDCJ
+CDDDS!Q!Q0@AAAS!Q!Q0@AAAr2r2r2r2sC@%g..%&A&A&A&A&ABBRWbg..~4&''2----'3}+=+=====!####!######r#   c                     t          dd          }t          dd          }t          j        ||gd          }t          j        |g          }t          j        |g          }t          ||          }|j        sJ 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.
        rJ   r   )r   rU   r   )nrowsN)r   r   r  r   r
   r   r:   )r   r  r  thdur   r   rQ   s          r"   test_diff_empty_tableszTestDiff.test_diff_empty_tables  s     C$$$C$$$'R:::dV$$dV$$u%%~r#   c                    t          ddddg          }t          dddgd	gg          }t          d
ddg dg dg          }t          ddd	gdgg          }t          d
ddg dg dg          }t          j        |||g          }t          j        |||g          }t          |j        |j        dd
g          }|j        sJ t          |j                  d	k    sJ |j        dhk    sJ |j	        dk    sJ |j
        dk    sJ d S )Nr2   r   TFr   r4   r   r   r   r7   r   r   r   r   r   )r   r5   r8   rD   rH   rT   rV      )ignore_fieldsr   )r   r   r  r	   r   r:   r&   r  r  r   r   )	r   r  r  r  r  r  r$  r%  rQ   s	            r"   test_ignore_table_fieldsz!TestDiff.test_ignore_table_fields  sN   CD%=999CQC!:666C(<<<:VWWWCQC!:666C(<<<:VWWW%r2rl33%r2rl33RWbgc3ZHHH~ 4&''1,,,,'C50000!####!######r#   c                    t          ddddg          }t          ddddg          }t          ddddg          }t          j        ||g          }t          j        ||g          }t          |j        |j                  }|j        rJ t          |j                  dk    sJ |j        d	hk    sJ |j	        dgdgfk    sJ |j
        d
k    sJ |j        d
k    sJ |                                }d|v sJ d|v sJ d S )Nr2   r   TFr   r4   r7   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   r:   r&   r  r  diff_column_namesr   r   rj   r   cacbccr$  r%  rQ   rj   s           r"    test_different_table_field_namesz)TestDiff.test_different_table_field_names  s<   CD%=999CD%=999CD%=999%r2h//%r2h//RWbg..>!!!4&''1,,,,'C50000%3%#7777!####!####0F::::0F::::::r#   c                    t          ddddg          }t          ddddg          }t          ddddg          }t          j        |g          }t          j        |||g          }t          |j        |j                  }|j        rJ |j        dk    sJ t          |j                  d	k    sJ |j	        d
hk    sJ |j
        g ddgfk    sJ |j        dk    sJ |j        dk    sJ |                                }d|v sJ d|v sJ dS )zh
        Test tables with some common columns, but different number of columns
        overall.
        r2   r   TFr   r4   r7   r   r8   r   r   r   z) Tables have different number of columns:z  a: 1
  b: 3N)r   r   r  r	   r   r:   diff_column_countr&   r  r  r1  r   r   rj   r2  s           r"   !test_different_table_field_countsz*TestDiff.test_different_table_field_counts  sS    CD%=999CD%=999CD%=999%rd++%r2rl33RWbg..>!!!%////4&''1,,,,'C50000%"sCj)99999!####!####:fDDDD6))))))r#   c                    t          ddddg          }t          ddddg          }t          ddg d          }t          ddg d          }t          j        ||g          }t          j        ||g          }t          |j        |j                  }|j        rJ |j        dk    sJ t          |j                  d	k    sJ |j	        d
k    sJ |j
        g k    sJ |                                }d|v sJ d|v sJ d|v sJ dS )zh
        Test tables that are otherwise identical but one has more rows than the
        other.
        r2   r   TFr   r4   )TFTr   r5   r5   r8   zTable rows differza: 2zb: 3%No further data comparison performed.N)r   r   r  r	   r   r:   r9  r&   r  	diff_rowsdiff_valuesrj   )	r   ca1cb1ca2cb2r$  r%  rQ   rj   s	            r"   test_different_table_rowsz"TestDiff.test_different_table_rows  sP    ST5M:::ST5M:::S,?,?,?@@@S,?,?,?@@@%sCj11%sCj11RWbg..>!!!%++++4&''1,,,,~''''2%%%%"f,,,,66r#   c                    t          ddddg          }t          dddgd	gg          }t          d
ddg dg dg          }t          dddddg          }t          ddddg          }t          dddddg          }t          dddddg          }t          d d
d!d"g          }t          d#d$d%d&g          }	t          dd'dd	gd(d)gg          }
t          d*d+dd	gd(d)gg          }t          ddddg          }t          dddgdgg          }t          d
ddg dg d,g          }t          dddddg          }t          dddd-g          }t          dddddg          }t          ddddd.g          }t          d d
d/d"g          }t          d#d$d0d&g          }t          dd'd	d(gd)d1gg          }t          d*d+d	d(gd)d1gg          }t          j        |||||||||	|
|g          }t          j        |||||||||||g          }t          |j        |j        d23          }|j        rJ |j        d4k    sJ |j        d         d5k    sJ |j        d	         d6d	gdgffk    sJ |j        d(         d         d7k    sJ |j        d(         d	         d         d1d8gd9d:ggk                                    sJ |j        d(         d	         d	         d8d9gd:d;ggk                                    sJ |j        d)         d<k    sJ |j        d1         d=k    sJ |j        d8         d>k    sJ |j        d9         d?k    sJ |j        d:         d@k    sJ |j        d;         dAk    sJ |j        dB         dCk    sJ |j        dD         dEk    sJ |j        dF         d         dGk    sJ |j        dF         d	         d         dd	gk                                    sJ |j        dF         d	         d	         d	d(gk                                    sJ |j        dH         d         dIk    sJ |j        dH         d	         d         d(d)gk                                    sJ |j        dH         d	         d	         d)d1gk                                    sJ |j        dJ         d         dKk    sJ |j        dJ         d	         d         dd	gk                                    sJ |j        dJ         d	         d	         d	d(gk                                    sJ |j        dL         d         dMk    sJ |j        dL         d	         d         d(d)gk                                    sJ |j        dL         d	         d	         d)d1gk                                    sJ |j	        dNk    sJ t          j        |j        dOdPdQ          sJ |                                }dR|v sJ dS|v sJ dT|v sJ |                    dU          d	k    sJ dVS )Wzn
        Test diffing table data on columns of several different data formats
        and dimensions.
        r2   r   TFr   r4   r   r   r   r7   r   r   r   r   r   rJ   r   r   rz   r   rU   r   r   r   rW   r   ry   r   r  r  r  r  r  r  r  r	  r
  r  r  r5   r8   r  r  r,  ghir         ?      ?      @      @rD   r   )numdiffsr   ))r2   r   )TF)r4   r   )r7   r   rH   rT   rV   r-  ))rJ   r   )r   r   ))rU   r   )r   rF  ))rW   r   )rz   ry   ))rW   r   ry   r   ))r  r   )rz   r   ))r  r   )ry   r   	   ))r  r   )r  rG  r   ))r  r   )r
  rH  r  )r   r      )r   r      )r  r      )r  r      gm?MbP?r}   ru   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   r:   diff_columnsr?  allr   r   iscloser   rj   count)r   r@  rB  ca3ca4ca5ca6ca7ca8ca9ca10ca11rA  rC  cb3cb4cb5cb6cb7cb8cb9cb10cb11r$  r%  rQ   rj   s                              r"   test_different_table_dataz"TestDiff.test_different_table_data  sK    ST5M:::SaS1#J777S8LLL,,,;WXXXSSc
CCCSeU^<<<S3sCjAAASDc
CCCSZ,DEEESZ,DEEEc'1a&1a&1ABBBc'1a&1a&1ABBBSUEN;;;SaS1#J777S8LLL,,,;WXXXSSc
CCCSeU^<<<S3sCjAAASDc
CCCSZ,DEEESZ,DEEEc'1a&1a&1ABBBc'1a&1a&1ABBB%#sCc3S$E
 
 %#sCc3S$E
 
 RWbg;;;>!!! B&&&&"&?????"x1#s&<<<<<"1%1111 #A&q)q!fq!f-==BBDDDDD #A&q)q!fq!f-==BBDDDDD"&:::::"&@@@@@"&<<<<<"&<<<<<"&<<<<<"&<<<<<"&JJJJJ#'KKKKK#A&(2222 $Q'*q!f499;;;;; $Q'*q!f499;;;;;#A&(2222 $Q'*q!f499;;;;; $Q'*q!f499;;;;;#A&(2222 $Q'*q!f499;;;;; $Q'*q!f499;;;;;#A&(2222 $Q'*q!f499;;;;; $Q'*q!f499;;;;;"$$$$z$/5t!DDDDDDKvUUUULPVVVVVLPVVVVV||N++q000000r#   c                    t          j        d                              dd          }t          |          }|                    |                     d                     |                    |                     d                     t          |                     d          |                     d                    }|j        sJ |                                }d|vsJ d|vsJ d|v sJ t          j        d          }t          |          }t          ||          }|j        sJ |                                }d|v sJ d	S )
z5Test identicality of two simple, extensionless files.r   r   r   z
testa.fitsz
testb.fitsPrimary HDUzExtension HDUNo differences found.N)r   r   r   r   r   r   r   r:   rj   r   r   )r   r   r   rQ   rj   ehdus         r"   test_identical_files_basicz#TestDiff.test_identical_files_basice  s@    IcNN""2r**a   DIIl++,,,DIIl++,,,		,//<1H1HII~F****f,,,,&&0000IbMMQtT""~&&000000r#   c                    t          j        d                              dd          }t          |          }t	          |          }t          ||g          }t          |||g          }t          ||          }|j        rJ |j        dk    sJ |j	        g k    sJ |
                                }d|v sJ d|v sJ d|v sJ dS )	zc
        Test files that have some identical HDUs but a different extension
        count.
        r   r   r   r<  z'Files contain different numbers of HDUsz
a: 2
 b: 3z(No differences found between common HDUsN)r   r   r   r   r   r
   r   r:   r   r   rj   )r   r   r   rl  r   r   rQ   rj   s           r"   test_partially_identical_files1z(TestDiff.test_partially_identical_files1|  s     IcNN""2r**q!!!Qt%%tT*++u%%>!!!"f,,,, ~####8FBBBB&&&&9VCCCCCCr#   c                    t          j        d                              dd          }t          |          }t	          |          }t	          |dz             }t          |||g          }t          |||g          }t          ||          }|j        rJ |j        dk    sJ t          |j
                  dk    sJ |j
        d         d         dk    sJ |j
        d         d         }|j        rJ |j        dk    sJ |j        dk    sJ |j        dk    sJ |j        j        sJ |j        J |j        }	t!          |	t"                    sJ |	j        rJ |	j        dk    sJ |	j        d t)          d          D             k    sJ |	j        d	k    sJ |	j        dk    sJ |                                }
d
|
vsJ d|
vsJ d|
v sJ d|
vsJ d|
v sJ t)          d          D ]}d|dz    d|
v sJ d|
v sJ dS )zQ
        Test files that have some identical HDUs but one different HDU.
        r   r   r   r   r   r   Nc                 $    g | ]}d |f||dz   ffS )r   r   r   )r   r   s     r"   r  z<TestDiff.test_partially_identical_files2.<locals>.<listcomp>  s)    'P'P'P!Q!QU(<'P'P'Pr#   ry   rj  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   r   r   r   r   r
   r   r:   r   r&   r   diff_extnamesdiff_extversdiff_extension_typesdiff_headers	diff_data
isinstancer   r   r   ranger   r   rj   )r   r   r   rl  ehdu2r   r   rQ   hdudiffdatadiffrj   r   s               r"   test_partially_identical_files2z(TestDiff.test_partially_identical_files2  s   
 IcNN""2r**q!!!Qq1u&&&tT*++ud+,,u%%>!!!"b((((4>""a''''~a #q((((.#A&$$$$$****#r))))+r1111#---- ,,,$(M22222%%%%'2----#'P'PeBii'P'P'PPPPP"c))))"c))))F**** .... F****,F::::*f4444r 	= 	=A2q1u222f<<<<<@FJJJJJJr#   c                 H   t                      }t          d          }t          ||g          }t          d          }d|j        d<   d|j        d<   t          ||g          }t          ||          }|j        rJ |j        d         d         d	k    sJ |j        d         d	         }|j        d
k    sJ |j	        dk    sJ |j
        dk    sJ |j        dk    sJ |                                }d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ dS )zb
        Test files that have some identical HDUs but a different extension
        name.
        FOO)r   BARr5   EXTVERr8   EXTLEVELr   r   )IMAGEBINTABLE)r~  r  rh   r8  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   r   r   r:   r   rt  rr  rs  diff_extlevelsrj   )r   r   rl  r   r   rQ   hdu_diffrj   s           r"   test_partially_identical_files3z(TestDiff.test_partially_identical_files3  s    ||U###t%%&&& !H"#Jt%%u%%>!!!~a #q((((>!$Q',0EEEEE%7777$....&&0000'61111*f4444'61111#v----*f44446))))(F22226))))))r#   c                    t          j        dt           j                  }d|dd<   t           j        |dd<   |                                }t           j                            ddt           j        ft           j        t           j        fgdd	g
                              t          j	                  }|                                }t          ||          j        sJ t          ||          j        sJ d|d         d<   d|d         d<   d|d         d<   d|d         d<   t          ||          }|j        rJ |j        d         dk    sJ |j        d         d         dk    sJ t          j        |j        d         d         d                   sJ |j        d         d         d         dk    sJ t          ||          }|j        rJ |j        d         dk    sJ |j        d         d         dk    sJ t          j        |j        d         d         d                   sJ |j        d         d         d         dk    sJ dS )zW
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/204
        r   r   ry   NrH   rJ  r   colacolb)namesr   r   r   )r   rJ  )rH   r   ))r  r   rJ  )r  r   )r   emptyfloat64nanr9   recr   viewr   FITS_recr   r:   r	   r   isnanr?  )r   arrarr2tabletable2rQ   s         r"   test_diff_nanszTestDiff.test_diff_nans  sL    hxrz222BQB&ABBxxzz#rv(89&&AQ  
 

$t}

 	 S$''1111UF++5555 Q
Q
q	!q	!S$''>!!!"&:::::"1%////x(+A.q122222"1%a(C////UF++>!!!"&?????"1%4444x(+A.q122222"1%a(C//////r#   c                 ~   |                      d          }t          g d          }|                                }d|d<   t          ||          }|                    |           |                                }t          |          5 }|                                |k    sJ 	 d d d            d S # 1 swxY w Y   d S )Ndiff_output.txtr0   rD   r7   fileobjr   r   r9   r   rj   r   readr   outpathr@   rA   diffobjreport_as_stringfouts          r"   !test_file_output_from_path_stringz*TestDiff.test_file_output_from_path_string  s    ))-..22233WWYY3R$$w'''">>++']] 	3d99;;"222222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   	B22B69B6c                 n   |                      d          }t          g d          }|                                }d|d<   t          ||          }|                    |           t          j        t          t                    5  |                    |           d d d            d S # 1 swxY w Y   d S )Nr  r0   rD   r7   r  )match)	r   r   r9   r   rj   r<   r=   OSErrorr   )r   r  r@   rA   r  s        r"   !test_file_output_overwrite_safetyz*TestDiff.test_file_output_overwrite_safety  s    ))-..22233WWYY3R$$w''']7*DEEE 	, 	,NN7N+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   B**B.1B.c                    |                      d          }t          g d          }|                                }d|d<   t          ||          }|                    |           |                                }|                    |d           t          |          5 }|                                |k    s
J d            	 d d d            d S # 1 swxY w Y   d S )	Nr  r0   rD   r7   r  T)r  	overwritez9overwritten output file is not identical to report stringr  r  s          r"   "test_file_output_overwrite_successz+TestDiff.test_file_output_overwrite_success"  s/   ))-..22233WWYY3R$$w'''">>++w$777']] 	Kd		////J 0///	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	Ks    #CCCc                 (   t          j        dd                              dd          }|                                }t	          |          }t	          |          }t          ||          }|j        sJ |                                }d|v sJ d S )Nr   uint8r   r   r   rk  )r   r   r   r9   r   r   r:   rj   r   r   r   hdu_ahdu_brQ   rj   s          r"   test_rawdatadiff_nodiffz TestDiff.test_rawdatadiff_nodiff0  s    Ic)))11"b99FFHH&A...&A...ue$$~&&000000r#   c                 :   t          j        dd          dz   }|d d                                         }t          |          }t          |          }t	          ||          }|j        rJ |                                }d|v sJ d|v sJ d	|v sJ d
|v sJ d S )Nr   r  r   r   P   r   zData sizes differ:za: 100 byteszb: 80 bytesr=  )r   r   r9   r   r   r:   rj   r  s          r"   test_rawdatadiff_dimsdiffz"TestDiff.test_rawdatadiff_dimsdiff:  s    Ic)))B.crcFKKMM&A...&A...ue$$>!!!#v----''''&&&&6&@@@@@@r#   c                    t          j        dd          dz   }|                                }ddg}|D ]
\  }}|||<   t          |          }t          |          }t	          ||          }|j        rJ |j        j        }	t          |          t          |	          k    sJ t          |          D ]\  }
\  }}|	|
         ||dz   |ffk    sJ |
                                }d|v sJ |D ]\  }}d	| d
|v sJ d|v sJ d S )Nr   r  r   r   )      )Y      r   zData contains differences:zData differs at byte :z*2 different bytes found (2.00% different).)r   r   r9   r   r   r:   rv  
diff_bytesr&   	enumeraterj   )r   r   r   changesivr  r  rQ   r  jrj   _s                r"   test_rawdatadiff_bytesdiffz#TestDiff.test_rawdatadiff_bytesdiffG  s_   Ic)))B.FFHHi( 	 	DAqAaDD&A...&A...ue$$>!!!^.
7||s:...."7++ 	5 	5IAv1a=QR$444444+v5555 	: 	:DAq/1///699999;vEEEEEEr#   N)3r(   r)   r*   rB   rE   rM   rR   rY   r]   rc   rf   rl   rw   r   r   r<   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&  r*  r/  r6  r:  rD  rh  rm  ro  r|  r  r  r  r  r  r  r  r  r   r#   r"   r.   r.   "   s         0 0 0E E E	2 	2 	2	9 	9 	9; ; ;Q Q QA A A
 
 
$  "" " "6J J J" [X
GX'FGG+F +F HG+FZ(7 (7 (7T; ; ;(A A A($ $ $$ $ $$ $ $$ $ $& & &" " "(7 7 7"
K 
K 
K$ $ $2  "$ $ $(; ; ;** * *67 7 7:J1 J1 J1X1 1 1.D D D0,K ,K ,K\ *  *  *D&0 &0 &0P	3 	3 	3	, 	, 	,K K K1 1 1A A AF F F F Fr#   r.   c                 Z   | dz  }| dz  }t          t                      t          t          j        d          d          g          }|                    |           d|d         j        d<   |                    |           t          ||          }d|                                v sJ d	S )
z?Make sure diff report reports HDU name and ver if same in files
test1.fits
test2.fitsrH   r   r   r   r   zExtension HDU 1 (SCI, 1):N	r
   r   r   r   r   r   r   r   rj   tmp_pathpath1path2hdulistrQ   s        r"   test_fitsdiff_hdu_namer  `  s    |#E|#Ez||X28A;;U%K%K%KLMMGOOEGAJOAOOEE5!!D&$++--777777r#   c                 X   | dz  }| dz  }t          t                      t          t          j        d                    g          }|                    |           d|d         j        d<   |                    |           t          ||          }d|                                v sJ dS )	z=Make sure diff report doesn't report HDU name if not in filesr  r  rH   r   r   r   Extension HDU 1:Nr  r  s        r"   test_fitsdiff_no_hdu_namer  n  s    |#E|#Ez||X28A;;%?%?%?@AAGOOEGAJOAOOEE5!!D......r#   c                 V   | dz  }| dz  }t          t                      t          t          j        d          dd          g          }|                    |           d|d         _        |                    |           t          ||          }d|                                v sJ d	S )
zBMake sure diff report doesn't report HDU name if not same in filesr  r  rH   r   r   r   ERRr  N)	r
   r   r   r   r   r   r   r   rj   r  s        r"   test_fitsdiff_with_namesr  |  s    |#E|#Ez||X28A;;UPQ%R%R%RSTTGOOEGAJOOOEE5!!D......r#   c                    | dz  }| dz  }t          j        dd          }t          j        dd          dz   |dddf<   t          j        dd          d	z   |ddd
f<   |                                }ddg}|D ]\  }}}|||df<   |||d
f<   t	          dd|g          }	t	          dd|g          }
t          j        |	g          }|                    |d           t          j        |
g          }|                    |d           t          j	        |          5 }t          j	        |          5 }t          ||dd          }|                    dd          }t          ||dd          }|                    dd          }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   d|v sJ d|vsJ dS )zCRegression test for https://github.com/astropy/astropy/issues/13330r  r  )r   r5   float32r   r   Nr   r   r   )r8   g333333*@g7@)r-  g     4@g     >@r2   20Er   T)r  rP  rQ  )r  indentg{Gz?z...and at 1 more indices.)r   r   r   r9   r   r   r  r   r   r   r   rj   )r  r  r  r   r   r  r  r  wr3  r4  r  r  fits1fits2rQ   str1str2s                     r"   test_rawdatadiff_diff_with_rtolr    s|   |#E|#E
	***Ai),,,r1AaaadGi),,,r1AaaadG	A0G  1a!Q$!Q$	E!	-	-	-B	E!	-	-	-B$bT**E	MM%4M((($bT**E	MM%4M(((	5		 7UYu 	7E5qu===D;;tA;66DE5qt<<<D;;tA;66D	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	77 7 7 7 7 7 7 7 7 7 7 7 7 7 7 '$....&d222222s7   "F/7AFF/F	F/F	 F//F36F3)!numpyr   r<   
astropy.ior   astropy.io.fits.columnr   astropy.io.fits.diffr   r   r   r   r	   astropy.io.fits.hdur
   r   r   astropy.io.fits.hdu.baser   astropy.io.fits.hdu.tabler   astropy.io.fits.headerr   astropy.utils.miscr   conftestr   r   r.   r  r  r  r  r   r#   r"   <module>r     s              ) ) ) ) ) )              > = = = = = = = = = 6 6 6 6 6 6 1 1 1 1 1 1 ) ) ) ) ) ) 9 9 9 9 9 9 " " " " " "! ! ! ! !. ! ! !{F {F {F {F {F| {F {F {F|8 8 8/ / // / /3 3 3 3 3r#   