a
    ߙfbC:                    @   s   d dl Z d dlZ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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d Zdd ZdS )    N)assert_equal)fits)SUBTRACTIVE_DITHER_1DITHER_SEED_CHECKSUM)AstropyUserWarning)get_pkg_data_filename)	HAS_SCIPY   )comparerecords)FitsTestCasec                   @   sd  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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-d.ejd/d0d1d2 Zd3d4 Zd5d6 Zejd7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 Z,dRS )STestImageFunctionsc                 C   s   t  }|jdksJ d|jvs$J d|_|jdks8J |jd dksJJ t jdd}|jdksdJ |jd dksvJ t  }d|d< t j|dd}|jdksJ |jd dksJ dS )z/Like the test of the same name in test_table.py EXTNAMEFOO)nameZEVENTS)headerr   N)r   ImageHDUr   r   Header)selfhduhdr r   ?lib/python3.9/site-packages/astropy/io/fits/tests/test_image.pytest_constructor_name_arg   s    z,TestImageFunctions.test_constructor_name_argc                 C   s   dd }t  }|jdksJ d|jvs,J d|_||d t jdd}||d t  }d|d< t j|dd	}||d t  }d
|d< t j|d d	}||d
 t j|d}||d
 d S )Nc                 S   s$   | j |ksJ | jd |ks J d S )NEXTVER)verr   )r   Zreference_verr   r   r   assert_ver_is.   s    zBTestImageFunctions.test_constructor_ver_arg.<locals>.assert_ver_isr	   r      )r         )r   r      r   )r   r   r   r   r   )r   r   r   r   r   r   r   test_constructor_ver_arg-   s$    



z+TestImageFunctions.test_constructor_ver_argc                 C   sX   t t  }|d j}d|d< t j|d}t |}d|d jd< |d dksTJ dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/153

        Ensure that a header from one HDU is copied when used to initialize new
        HDU.
        r   zlabq01i3q_rawtag.fitsZFILENAMEr!   zlabq01i3q_flt.fitsN)r   HDUList
PrimaryHDUr   )r   ZifdZphdrprimary_hduofdr   r   r   test_constructor_copies_headerK   s    

z1TestImageFunctions.test_constructor_copies_headerc                 C   sr   t | d}|  tt*}|d jd dd df  W d    n1 sR0    Y  t|jdksnJ d S )N
test0.fitsr	   r   sHDU not found, possibly because the index is out of range, or because the file was closed before all HDUs were read)	r   opendataclosepytestraises
IndexErrorstrvaluer   rexc_infor   r   r   	test_open^   s
    8zTestImageFunctions.test_openc                 C   sZ   t | d}dgdd tddD  }z |jdd|ks@J W |  n
|  0 d S )	Nr(   )r   PRIMARYr	   r$      r   r   r   c              
   S   s    g | ]}|d |dddddfqS )SCIr   =   )(   r:   int16r   r   .0xr   r   r   
<listcomp>x   s   z2TestImageFunctions.test_open_2.<locals>.<listcomp>r	   r    Foutput)r   r*   r+   rangeinfor,   )r   r3   rC   r   r   r   test_open_2t   s    zTestImageFunctions.test_open_2c                 C   sP  t | d}|  tt}|d  W d    n1 s@0    Y  t|jdks\J t j| ddd}|  t	|d t j
sJ t|dksJ tt}|d  W d    n1 s0    Y  t|jdksJ t jjsJ dt j_zLt | d}|  t	|d t j
s$J t|dks6J W d	t j_n
d	t j_0 d S )
Nr(   r	   r)   F)lazy_load_hdusr       zlist index out of rangeT)r   r*   r+   r,   r-   r.   r/   r0   r1   
isinstancer   lenZconfrE   r2   r   r   r   test_open_3   s(    &&zTestImageFunctions.test_open_3c                 C   s:  t ddd}t |}| d}| d}tj|d| tj|d| t j	t
|| t j	t
|| | d}| d}t|d	d
"}tj|d| W d    n1 s0    Y  t|d	d
"}tj|d| W d    n1 s0    Y  t j	t
|| t j	t
|| d S )N   r      z
a_str.fitsz
b_str.fitsr+   za_fileobj.fitszb_fileobj.fitswbmodenparangereshapeZasfortranarraytempr   r$   writetotestingassert_array_equalgetdatar*   r   abZafitsZbfitsZaafitsZbbfitsfdr   r   r   test_fortran_array   s     




02z%TestImageFunctions.test_fortran_arrayc                 C   s  t dddd}t |}| d}| d}tj|d d dd d df d| tj|d d dd d df d| t j	t
||d d dd d df  t j	t
||d d dd d df  | d	}| d
}t|dd6}tj|d d dd d df d| W d    n1 s,0    Y  t|dd6}tj|d d dd d df d| W d    n1 s0    Y  t j	t
||d d dd d df  t j	t
||d d dd d df  d S )Ni   r   r    rK   za_str_slice.fitszb_str_slice.fitsr   rL   za_fileobj_slice.fitszb_fileobj_slice.fitsrM   rN   rP   rY   r   r   r   !test_fortran_array_non_contiguous   s     


&&((

FF(z4TestImageFunctions.test_fortran_array_non_contiguousc                 C   s  t ddg}t t j|dg}d|d jv s4J |d jdksFJ |d j|d jd ksbJ dg}|jdd	|ks|J |d
 |d u sJ |d
 |d u sJ d|d _|d jd dksJ || d t 	| d"}|d jdksJ W d   n1 s0    Y  dS )aX  Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/151

        Tests that the EXTNAME keyword works with Primary HDUs as well, and
        interacts properly with the .name attribute.  For convenience
        hdulist['PRIMARY'] will still refer to the first HDU even if it has an
        EXTNAME not equal to 'PRIMARY'.
        )r   XPRIMARY)r   r	   r!   r   r   r`   )r   r`   r	   r$   r    r   r   r   Fr@   r6   )r`   r	   Z	XPRIMARY2	test.fitsN)
r   r   r#   r$   r   r   rC   rU   rT   r*   )r   ZprihdrhdulrC   r   r   r   test_primary_with_extname   s    	
z,TestImageFunctions.test_primary_with_extnamec              	   C   s  t | d}|d jd dks*J |d jd dks@J |d jd dksVJ d|d jd	< d
dd |d jjdd  D dksJ |d jdd tt	|d jjdd tt	|d jjdd |d jdd t
|d jd dd df t
jg dg dg dgt
jds*J t j| dddZ}||d  ||d  |  |d jd dks|J d|d jd< W d    n1 s0    Y  ~t| d| d t j| ddd6}|d jd dksJ ||d  W d    n1 s0    Y  ~t| d| d  t j| d d!d}|d jd" d#kshJ d$|d jd"< |d jd dksJ d|d jd< |  |d= |  ||d  || d W d    n1 s0    Y  ~W d    n1 s0    Y  t | d0}|  |d jd d%ksDJ W d    n1 sZ0    Y  t
jd&t
jd}t j|d'd(}t
|jt
jg d)g d)g d)gt
jdsJ t j|d jt
jddgd*dd+}d
d,d |jjdd- D d.ks J d S )/Nr(   primaryZnaxisr   )Zscir	   Zdetectorr	   gZ0l!KZxxx
c                 s   s   | ]}t |V  qd S Nr0   r<   r   r   r   	<genexpr>       z:TestImageFunctions.test_io_manipulation.<locals>.<genexpr>zEXPFLAG = 'NORMAL            ' / Exposure interruption indicator                
FILENAME= 'vtest3.fits'        / File name                                      
XXX     =            1.234E+56                                                  filenamefnamehistorysimpler   r   )]  ro   i\  )ro   ro   [  )rp   i^  ro   dtypetest_new.fitsappendrN   r	   r	   ro   c   ztest_append.fitsztest_update.fitsupdateZrootnameZ	U2EQ0201Tabci;  )r   r    r8   r+   r   )      ?rz   rz   rz   rz   int32)r   r+   c                 s   s   | ]}t |V  qd S rf   rg   r<   r   r   r   rh   o  ri   r    aC  BITPIX  =                   32 / array data type                                
NAXIS   =                    1 / number of array dimensions                     
NAXIS1  =                    2                                                  
PCOUNT  =                    0 / number of parameters                           )r   r*   r+   r   joinZcardsZrename_keywordr-   r.   
ValueErrorrQ   array_equalarrayr;   rT   rt   flushosrenamerU   readallZonesfloat32r   )r   r3   nrZ   ur+   r   hdu2r   r   r   test_io_manipulation   s    "

..0"8

	
z'TestImageFunctions.test_io_manipulationc                 C   s    t j| ddd}|  d S )Nr(   r	   )Zmemmap)r   r*   r+   r,   )r   f1r   r   r   test_memory_mappingu  s    z&TestImageFunctions.test_memory_mappingc                 C   s   t  }t |}tjtdd}|  W d    n1 s>0    Y  t|dksXJ tjtdd"}|| 	dd W d    n1 s0    Y  t|dksJ d S )Nz,HDUList's 0th element is not a primary HDU\.matchr   zQHDUList's 0th element is not a primary HDU\.  Fixed by inserting one as 0th HDU\.ztest_new2.fitsZfix)
r   r   r#   r-   warnsr   verifyrH   rU   rT   )r   r>   r   wr   r   r   test_verification_on_outputz  s    
&0z.TestImageFunctions.test_verification_on_outputc                 C   s`  t | d}t|d jd ds*J t|d jddd d f tg dsXJ t|d jdddd f tg d	sJ t|d jddd d
f tg dsJ t|d jdddd
f tg dsJ t|d jdddd d f tg dg dg dgs$J t|d jdd d d d f d dd df tg dg dg dgsvJ |d j}t|d jdddd d
f |dddd d
f sJ t|d jddddf |ddddf sJ t|d jddd d d d f d dd dd df tg dg dg dgg dg dg dgg dg dg dggsvJ t|d jd d d d d d f d dd dd df tddgddggddgd d!ggd"d#gd$d%gggsJ t|d jd d dd d f |d d dd d f s&J t|d jd d ddd d f |d d ddd d f sjJ t|d jdddd d f |dddd d f sJ t|d jdddd&d d f |dddd&d d f sJ t|d jd d d d df |d d d d df s&J t|d jd d g d'df |d d g d'df sbJ tg d(}t|d jd d |d d f |d d |d d f sJ t|d jdddd d d)f |dddd d d)f sJ t|d jd)d d df |d)d d df s J t|d jd)g d'df |d)g d'df sTJ |  d S )*Nzarange.fitsr   )r   r   r    e  r   r   )`  a  b  c  d  r   f  g  h  i  j  r   )r   r   r   r   r   r   r      )r   r   r   r   r   r   r   r   i)r   r   r   r   r   r    )ik  il  im  in  io  ip  iq  ir  is  it  iu  )iv  iw  ix  iy  iz  i{  i|  i}  i~  i  i  )iJ  iK  iL  )iU  iV  iW  )r   r   r   rF   )i  i  i  )i  i  i  )i  i  i  )i&  i'  i(  )i1  i2  i3  )i<  i=  i>  r	         n   o   y   z               rK   )r	   r   r   )
TFTTFFTTFT.)r   r*   r+   rQ   r~   sectionr   r,   )r   ZfsdatZ
bool_indexr   r   r   test_section  s    

.


<48

8

<D<D<

2
4
zTestImageFunctions.test_sectionc                 C   s   t dg}t|}|| d t| d}|d j}|d j}t 	|d |d sbJ t 	|d |d szJ t 	|d |d sJ t 	|d |d sJ |
  d S )Nr	   rs   r   .).r   )r   .)rQ   r   r   r$   rU   rT   r*   r   r+   r~   r,   )r   rZ   r   rb   Zsecr   r   r   r   test_section_data_single  s    


z+TestImageFunctions.test_section_data_singlec                 C   sv  t ddd}t|}|| d t| d}|d }|d j}|j	d d d d f |d d d d f k
 sJ |j	dd d f |dd d f k
 sJ |j	dd d f |dd d f k
 sJ |j	d d df |d d df k
 sJ |j	d d df |d d df k
 s*J |j	d |d k
 sFJ |j	d |d k
 sbJ |j	d |d k
 s~J |j	d	 |d	 k
 sJ |j	ddddf |ddddf k
 sJ |j	ddddf |ddddf k
 sJ |j	ddddf |ddddf k
 s6J |j	ddddf |ddddf k
 sjJ |  d S )
Nr   r   rs   r   r	   r   r   r   r	   r	   r   ru   rQ   rR   rS   r   r$   rU   rT   r*   r+   r   allr,   r   rZ   r   rb   dr   r   r   r   test_section_data_square  s(    

2***,4444z+TestImageFunctions.test_section_data_squarec           
   
   C   s0  t dddd}t|}|| d t| d}|d }|d j}|j	d d  |d d  k
 srJ |j	d d d d f |d d d d f k
 sJ td ddfD ]T}td dddfD ]>}td dddfD ](}|||f}	|j	|	 ||	 k
 sJ qqqtddtddtddtddtddtddfD ]4}td td |f}	|j	|	 ||	 k
 s<J q<tddtddfD ]}tddtddtddtddtddfD ]h}tddtddtddtddtddtddfD ],}|||f}	|j	|	 ||	 k
 sJ qqq|  d S )N   r   r   rs   r   r	   )rQ   rR   rS   r   r$   rU   rT   r*   r+   r   r   slicer,   )
r   rZ   r   rb   r   r   Zidx1Zidx2Zidx3Znd_idxr   r   r   test_section_data_cube  s8    

"2
  
(z)TestImageFunctions.test_section_data_cubec                 C   s  t ddddd}t|}|| d t| d}|d }|d j}|j	d d d d d d d d f |d d d d d d d d f k
 sJ |j	d d d d d d f |d d d d d d f k
 sJ |j	d d d d f |d d d d f k
 sJ |j	d d  |d d  k
 s2J |j	dd d d d d d f |dd d d d d d f k
 svJ |j	dd d dd d f |dd d dd d f k
 sJ |j	d d d d dd d f |d d d d dd d f k
 sJ |j	d d ddd d f |d d ddd d f k
 s2J |j	d d d d d d df |d d d d d d df k
 svJ |  d S )N   r   rs   r   r	   r   r   r   r   r   test_section_data_four  s     

J>4$D<D<Dz)TestImageFunctions.test_section_data_fourc                 C   s  t | d}|d }|d j}|jddddf |ddddf k sTJ |jdddf |dddf k s~J |jdddf |dddf k sJ |jdddf |dddf k sJ |jdddf |dddf k sJ |jd |d k sJ |jd |d k s4J |jd |d k sPJ |jd |d k slJ |jddddf |ddddf k sJ |jdd	ddf |dd	ddf k sJ |jdddd	f |dddd	f k sJ |jdd	dd	f |dd	dd	f k s<J |  t | d}|d }|jddddf |ddddf k sJ |jdddf |dddf k sJ |jdddf |dddf k sJ |jdddf |dddf k sJ |jdddf |dddf k s@J |jd |d k s\J |jd |d k sxJ |jd |d k sJ |jd |d k sJ |jddddf |ddddf k sJ |jdd	ddf |dd	ddf k sJ |jdddd	f |dddd	f k sLJ |jdd	dd	f |dd	dd	f k sJ |jrJ |  dS )
z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/143

        This is like test_section_data_square but uses a file containing scaled
        image data, to test that sections can work correctly with scaled data.
        
scale.fitsr   Nr	   r   r   r   ru   r   )r   r*   r+   r   r   r,   Z_data_loaded)r   rb   r   r   r   r   r   test_section_data_scaled)  sD    
2****44444,,,,4444z+TestImageFunctions.test_section_data_scaledc                 C   s   t j| ddd*}|d jjtdks0J W d    n1 sD0    Y  t | d*}|d jjtdkszJ W d    n1 s0    Y  d S )Nr   TZdo_not_scale_image_datar   z>i2r   )r   r*   r+   rr   rQ   r   rb   r   r   r   test_do_not_scale_image_dataV  s    8z/TestImageFunctions.test_do_not_scale_image_datac                 C   s   t j| dtjg ddd tddgd}t j| d|d t j| ddd$}|d	 j	j
dkspJ W d
   n1 s0    Y  d
S )zRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/56
        (BZERO and BSCALE added in the wrong location when appending scaled
        data)
        rs   uint8rq   rL   d   uint16Tuintr	   N)r   rU   rT   rQ   r   zerosastypert   r*   r+   rr   )r   r   fr   r   r   test_append_uint_data]  s    
z(TestImageFunctions.test_append_uint_datac                 C   s(   t tjdd}|jdddd dS )zT
        Regression test for https://github.com/astropy/astropy/issues/6399
        r   r   r	   r   )typebscalebzeroN)r   r   rQ   randomZrandscale)r   r   r   r   r   %test_scale_with_explicit_bzero_bscalek  s    z8TestImageFunctions.test_scale_with_explicit_bzero_bscalec           	   	   C   sx  dD ]l}d| d }|dkr(t |}d| }t jd|d}|| |t jd|d8 }tj|d}t |j|ks|J |jj	j
d| ksJ d	|jv sJ |jd	 d|d  ksJ d| d
}|| | tj| |ddt}|d }t |j|ksJ |jj	j
d| ks&J d	|jv s6J |jd	 d|d  ksRJ W d   q1 sh0    Y  qdS )z
        Regression test for https://github.com/astropy/astropy/issues/2305

        This ensures that an HDU containing unsigned integer data always has
        the appropriate BZERO value in its header.
        )       @   r   r	   r   r   r   rq   rL   BZEROz.fitsTr   r   N)rQ   Zuint64emptyZfillrR   r   r$   r   r+   rr   r   r   rU   rT   r*   )	r   Zint_sizeZmax_uintrr   arruint_hdurk   rb   Znew_uint_hdur   r   r   test_uint_header_consistencyt  s*    



z/TestImageFunctions.test_uint_header_consistency	from_file)FTdo_not_scale)Fc           
      C   s^  t jddd}|rtt|}d}|| | tj| ||d}|d }|j}W d   q1 sh0    Y  ntj||d}d|jv sJ d	|jv sJ |jd d
ksJ |jd	 dksJ |jd |_|jd dk sJ d|jvsJ d	|jvsJ d}|| | t| |(}	|	d jdk	 s:J W d   n1 sP0    Y  dS )a<  
        Regression test for https://github.com/astropy/astropy/issues/4974

        BZERO/BSCALE should be removed if data is converted to a floating
        point type.

        Currently excluding the case where do_not_scale_image_data=True
        because it is not clear what the expectation should be.
        r   r   rq   zunsigned_int.fitsr   r   NBSCALEr   r	   i   rz   BITPIXztest_uint_to_float.fits)
rQ   r   r   r$   rU   rT   r*   r+   r   r   )
r   r   r   r   Ztmp_uintrk   r   r   _rb   r   r   r   5test_uint_header_keywords_removed_after_bitpix_change  s4    
&zHTestImageFunctions.test_uint_header_keywords_removed_after_bitpix_changec                 C   s   t jdt jd}d|d< tj|d}d|jd< || d t| d,}t 	|d j
d  slJ W d   n1 s0    Y  dS )	zhTest image data with blank spots in it (which should show up as
        NaNs in the data array.
        
   r   rq   i  r	   rL   BLANKrs   N)rQ   r   r{   r   r   r   rU   rT   r*   isnanr+   r   r   r   r   rb   r   r   r   test_blanks  s    
zTestImageFunctions.test_blanksc              	   C   s   t jdt jd}tj|d}d|jd< tjtdd }|	| 
d W d	   n1 sZ0    Y  t|d
kstJ tjtddX}t| 
d(}t ||d jksJ W d	   n1 s0    Y  W d	   n1 s0    Y  t|d
ksJ d	S )z
        Test that invalid use of the BLANK keyword leads to an appropriate
        warning, and that the BLANK keyword is ignored when returning the
        HDU data.

        Regression test for https://github.com/astropy/astropy/issues/3865
        r    rq   rL   r   r   !Invalid 'BLANK' keyword in headerr   rs   Nr	   r   )rQ   rR   float64r   r$   r   r-   r   r   rU   rT   rH   r*   r   r+   )r   r   r   r   hr   r   r   test_invalid_blanks  s    	
.Tz&TestImageFunctions.test_invalid_blanksz(ignore:Invalid 'BLANK' keyword in headerc           	   	   C   s  t jdt jd}tj|d}|jddd | d}d|jd	< d|jd
< |	| t
|n}|d	 j}t |d	 szJ tjtjjdd  |	| d W d   n1 s0    Y  W d   n1 s0    Y  t
| d@}d
|d	 jvsJ |d	 j}t |d	 sJ W d   n1 s20    Y  tj
|ddd.}|d	 j}t |d	 slJ W d   n1 s0    Y  tj
|ddX}|d	 jd
 dksJ |d	 jd dksJ |d	 jd	 dksJ W d   n1 s0    Y  dS )a  
        Test that when auto-rescaling integer data with "blank" values (where
        the blanks are replaced by NaN in the float data), that the "BLANK"
        keyword is removed from the header.

        Further, test that when using the ``scale_back=True`` option the blank
        values are restored properly.

        Regression test for https://github.com/astropy/astropy/issues/3865
        r    rq   rL   r;   gGz?r   ra   i'  r   r   r   r   
test2.fitsNTrw   )
scale_backrO   r   r   )rQ   rR   r{   r   r$   r   rT   r+   r   rU   r*   r   r-   r   r   VerifyWarning)	r   r   r   rk   rb   r+   hdul2Zhdul3Zhdul4r   r   r   test_scale_back_with_blanks  s>    





L
4
4z.TestImageFunctions.test_scale_back_with_blanksc                 C   s   t dd }tj|d}d|jd< || d t| d.}|d7 }|d j|k	 sdJ W d   n1 sx0    Y  dS )zUTest use of the BZERO keyword in an image HDU containing float
        data.
        r   r	   rL   rz   r   rs   N)
rQ   r   r   r   r   rU   rT   r*   r+   r   r   r   r   r   test_bzero_with_floats5  s    
z)TestImageFunctions.test_bzero_with_floatsc                 C   sb  t | d}|d j}|j| ddd |  t | d}|d j|k s\J |  t | d}|j| ddd |  t | d}|d j|k sJ |  t j| ddd}|j| dddd |  t | d}|d j}|  t j| dd	d
}|  t | d}|d j|k sVJ |  dS )zRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/84 and
        https://aeon.stsci.edu/ssb/trac/pyfits/ticket/101
        fixed-1890.fitsr   rs   T	overwriter   	silentfixr   Zoutput_verifyrw   rN   N)r   r*   r+   rU   rT   r,   r   )r   rb   	orig_datar   r   r   !test_rewriting_large_scaled_imageC  s8    

z4TestImageFunctions.test_rewriting_large_scaled_imagec                 C   s   |  d tj| ddd<}|d j }|d j }|d= ||d _W d   n1 s`0    Y  t| d&}||d jk sJ W d   n1 s0    Y  dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/105

        Replacing the original header to an image HDU and saving should update
        the NAXISn keywords appropriately and save the image data correctly.
        r(   rw   rN   r	   zNAXIS*N)	copy_filer   r*   rT   r+   copyr   r   )r   rb   r   Zhdr_copyr   r   r   test_image_update_headeri  s    	
(z+TestImageFunctions.test_image_update_headerc                 C   s  |  d t| dj}td tj| ddd	  |t| djksXJ td t| dd}|d j
}|	  |t| djksJ tj| ddd}|d j
jtdksJ |d jd dksJ d	|d jvsJ d
|d jvs
J ||d j
k s"J d|d j
_|	  t| d}|d jdksZJ |d j
jtdksvJ |d jd dksJ d	|d jvsJ d
|d jvsJ |	  dS )al  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/119
        (Don't update scaled image data if the data is not read)

        This ensures that merely opening and closing a file containing scaled
        image data does not cause any change to the data (or the header).
        Changes should only occur if the data is accessed.
        r   r	   rw   rN   r   z>f4r   r   r   *   r   N)r   r   statrT   st_mtimetimesleepr   r*   r,   r+   rr   rQ   r   r   shape)r   mtimerb   r   r   r   r   test_open_scaled_in_update_mode|  s2    



z2TestImageFunctions.test_open_scaled_in_update_modec                 C   s  |  d tj| ddddV}|d jd }|d jd }|d jd }|d j }d|d jd< W d	   n1 s|0    Y  tj| ddd
}|d jd |ksJ |d jd |ksJ |d jd |ksJ tt	| | }|d jd |k
 sJ W d	   n1 s$0    Y  t| d8}|d jdd	 |dd	 k
 shJ W d	   n1 s~0    Y  d	S )z|A simple test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/120

        The scale_back feature for image HDUs.
        r   rw   TrO   r   r   r   r   r   Nr   r	   )r   r   r*   rT   r   r+   r   intmathfloorr   )r   rb   orig_bitpix
orig_bzeroorig_bscaler   
zero_pointr   r   r   test_scale_back  s*    
,<z"TestImageFunctions.test_scale_backc                 C   s   t | d8}|d j d|d _|d | d W d   n1 sN0    Y  t | d\}|d jdu s|J |d jd dksJ d|d jvsJ d|d jvsJ W d   n1 s0    Y  dS )	zX
        Regression test for https://github.com/spacetelescope/PyFITS/issues/27
        r(   r	   Nra   NAXISr   NAXIS1NAXIS2)r   r*   r+   rU   rT   r   )r   r   r   r   r   test_image_none  s    

2z"TestImageFunctions.test_image_nonec              	   C   s$  t jdt jd}t|}d|jd< tjtjj	dd  |
| d W d   n1 s\0    Y  ttX}t| d(}t |d	 j|ksJ W d   n1 s0    Y  W d   n1 s0    Y  t|d
ksJ d}|t|d	 jv sJ d}|t|d jv s J dS )z
        Regression test for https://github.com/astropy/astropy/issues/2711

        If the BLANK keyword contains an invalid value it should be ignored for
        any calculations (though a warning should be issued).
        r   rq   nanr   z2Invalid value for 'BLANK' keyword in header: 'nan'r   ra   Nr   r   z+Invalid value for 'BLANK' keyword in headerzInvalid 'BLANK' keywordr	   )rQ   rR   r   r   r$   r   r-   r   r   r   rU   rT   r   r*   r   r+   rH   r0   message)r   r+   r   r   rb   msgr   r   r   test_invalid_blank  s    

.Tz%TestImageFunctions.test_invalid_blankc                 C   s   t jdt jd}tj| d}|jdd || d t	| dd}|
 }W d   n1 sj0    Y  tj|}t |d	 j|sJ dS )
zT
        Regression test for https://github.com/astropy/astropy/issues/2710
        r   rq   rL   g?r   ra   rbNr   )rQ   rR   r   r   r$   r   r   rU   rT   r*   readr#   Z
fromstringallcloser+   )r   rZ   r   r   Z	file_datarb   r   r   r   test_scaled_image_fromfile  s    &z-TestImageFunctions.test_scaled_image_fromfilec                 C   s   t  }td}||_dS )z4
        Test data assignment - issue #5087
        r   N)r   r   rQ   rR   r+   )r   ZimZarr   r   r   test_set_data  s    
z TestImageFunctions.test_set_datac                 C   sf   t jddt jd}tj| d}tj| d}|jddd |jddd t |j|jsbJ d	S )
zT
        Regression test for https://github.com/astropy/astropy/issues/4600
        r      rq   rL   r;        X@r   rv   N)	rQ   rR   r;   r   r$   r   r   r  r+   r   rZ   hdu1r   r   r   r   test_scale_bzero_with_int_data  s    z1TestImageFunctions.test_scale_bzero_with_int_datac                 C   s   t jddt jd}t|| d tj| dddd2\}d|jd	d	< t 	|jdsbJ W d	   n1 sv0    Y  d	S )
z
        Extend fix for #4600 to assignment to data

        Suggested by:
        https://github.com/astropy/astropy/pull/4602#issuecomment-208713748
        r   r  rq   ra   rw   Tr   r   N)
rQ   rR   r   r   r$   rU   rT   r*   r+   r  )r   rZ   r   r   r   r   test_scale_back_uint_assignment  s    z2TestImageFunctions.test_scale_back_uint_assignmentc                 C   s|   d}t jt|d tjdd W d    n1 s40    Y  t jt|d tjdd W d    n1 sn0    Y  d S )Nz9data object array\(1\) should have at least one dimensionr   r	   rL   )r-   r.   	TypeErrorr   r   r$   )r   r  r   r   r   test_hdu_creation_with_scalar-  s
    *z0TestImageFunctions.test_hdu_creation_with_scalarN)-__name__
__module____qualname__r   r"   r'   r5   rD   rI   r]   r_   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   markparametrizer   r   r   filterwarningsr   r   r   r   r   r  r  r  r  r  r  r  r  r   r   r   r   r      sT   " 
C&-	$8

8&4	r   c                   @   s  e Zd Zdd Zejdejdej	dddfejdej	ddd	fejdej	dd
d	fedd ddfedddfgejdddgdd Z
ejd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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&ejdLdMej'ej	fdMej(ej	fdMej)ej*fdNej'ej	fdNej(ej	fdNej)ej*fgdOdP Z+ejdQej'ej(ej,ej)ej-fdRdS Z.dTdU Z/dVdW Z0dXS )YTestCompressedImagec                 C   s&  t  }|jdu sJ || d t j| ddd\}t|dksLJ t|d t js`J |d jdu srJ tj	dtj
d|d _W d   n1 s0    Y  t | dZ}t|dksJ t|d t jsJ t|d jtj	dtj
dksJ W d   n1 s0    Y  dS )	zT
        Regression test for https://github.com/astropy/astropy/issues/2595
        Nra   rw   rN   r   r	   r   rq   )r   CompImageHDUr+   rU   rT   r*   rH   rG   rQ   rR   r{   r   r   r   rb   r   r   r   
test_empty6  s    4zTestCompressedImage.test_emptyr+   compression_typequantize_levelr   r   r   rq   RICE_1r   GZIP_1g{GzZGZIP_2r   r   r	   HCOMPRESS_1r   ZPLIO_1
byte_order<>c           	      C   s  | |}t }t|}tj|d||d}|| |j| ddd |  t	| d}|d j
|k s|J |d jd |jd ksJ |d jd |jd ksJ |d jd	 |jd	 ksJ |d jd
 |jd
 ksJ W d    n1 s0    Y  d S )Nr8   )r   r)  r*  rs   Tr   r	   r  r	  r
  r   )Znewbyteorderr   r$   r#   r%  rt   rU   rT   r,   r*   r+   r   r   )	r   r+   r)  r*  r0  r%   r&   chdur\   r   r   r   test_comp_imageM  s     



z#TestCompressedImage.test_comp_imageznot HAS_SCIPYc                 C   sH  ddl }tjd |j tjddd  }t|	| 
d tj|ddd	d
d	| 
d tj|dddd
d	| 
d t| 
d}t| 
d}t| 
d}t||rJ tjt|| dddsJ tjt|| dddsJ tjt|| ddds$J tjt|| dddsDJ dS )z
        Regression test for https://github.com/astropy/astropy/issues/5969

        Test that quantize_level is used.

        r   Nr   i   r   zim1.fitsr,  r	   r    )r)  quantize_methodr*  dither_seedzim2.fitsizim3.fitsg      gMbP?)Zatolg      ?g?2   )Z
scipy.miscrQ   r   seedZmiscZascentZrandnr   r   rU   rT   r%  rX   r~   Ziscloseminmax)r   Zscipyr+   Zim1Zim2Zim3r   r   r   test_comp_image_quantize_levelg  s,    

  z2TestCompressedImage.test_comp_image_quantize_levelc              	   C   s.   t jttjtjdtjddddg dd dS )z
        Tests compression with the HCOMPRESS_1 algorithm with data that is
        not 2D and has a non-2D tile size.
        r+  rq   r8   r/  r   )r   r)  r*  	tile_sizeN)r-   r.   r}   r   r%  rQ   r   r   )r   r   r   r   +test_comp_image_hcompression_1_invalid_data  s
    
z?TestCompressedImage.test_comp_image_hcompression_1_invalid_datac                 C   s   t jdt jdddd}tj|dddg dd	}|| d
 t| d
0}t 	|d j
|  dk stJ W d   n1 s0    Y  dS )a  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/171

        Tests that data containing more than two dimensions can be
        compressed with HCOMPRESS_1 so long as the user-supplied tile size can
        be flattened to two dimensions.
        i,  rq   r   r   r8   r/  r   )r    r    r	   )r+   r   r)  r*  r>  ra   g?N)rQ   rR   r   rS   r   r%  rU   rT   r*   absr+   r<  )r   Zcuber   rb   r   r   r   %test_comp_image_hcompress_image_stack  s    	z9TestCompressedImage.test_comp_image_hcompress_image_stackc                 C   s   t ddd}|d d d d }tj|ttd}|	| 
d t| 
d}t|d tjsrJ d	|d jv sJ |d jd	 d
ksJ d|d jv sJ |d jd |ksJ t |d j|ksJ W d   n1 s0    Y  dS )aF  
        Regression test for https://github.com/spacetelescope/PyFITS/issues/32

        Ensure that when floating point data is compressed with the
        SUBTRACTIVE_DITHER_1 quantization method that the correct ZDITHER0 seed
        is added to the header, and that the data can be correctly
        decompressed.
        g      Y@r   r   r   i'  r	   )r+   r6  r7  ra   ZZQUANTIZr   ZZDITHER0N)rQ   rR   rS   Zviewsumr   r%  r   r   rU   rT   r*   rG   _headerr   r+   )r   r   Zcsumr   rb   r   r   r   test_subtractive_dither_seed  s    
z0TestCompressedImage.test_subtractive_dither_seedc                 C   s   t j| ddd8}t|d t js*J t|d t jr>J W d    n1 sR0    Y  t | d$}t|d t jsJ W d    n1 s0    Y  d S )N	comp.fitsTZdisable_image_compressionr	   )r   r*   r+   rG   ZBinTableHDUr%  r   r   r   r   test_disable_image_compression  s    2z2TestCompressedImage.test_disable_image_compressionc                 C   s\   |  d t| dj}td tj| ddd	  |t| djksXJ dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/167

        Similar to test_open_scaled_in_update_mode(), but specifically for
        compressed images.
        rE  r	   rw   rN   N)
r   r   r   rT   r   r   r   r   r*   r,   )r   r   r   r   r   #test_open_comp_image_in_update_mode  s
    	

z7TestCompressedImage.test_open_comp_image_in_update_modec                 C   s  t j| ddd:}t j|d j|d jd}|| d W d   n1 sT0    Y  t| dj	}t
d t j| ddd	  |t| dj	ksJ t
d t | dd}|d j |  |t| dj	ksJ t j| ddd	}|d jjtd
ks$J |d jd dks<J d|d jvsPJ d|d jvsdJ d|d j_|  t | d}|d jdksJ |d jjtd
ksJ |d jd dksJ d|d jvsJ d|d jvsJ |  dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/88 2

        Identical to test_open_scaled_in_update_mode() but with a compressed
        version of the scaled image.
        r   Tr   r   r+   r   Nr	   rw   rN   r   r   r   r   r   r   )r   r*   r+   r%  r   rU   rT   r   r   r   r   r   r,   rr   rQ   r   )r   rb   r3  r   r   r   r   *test_open_scaled_in_update_mode_compressed  s>    
.


z>TestCompressedImage.test_open_scaled_in_update_mode_compressedc              	   C   s   t | d$}|d | d W d    n1 s:0    Y  t | dx}t | dH}t|d j|d jksJ t|d j|d jsJ W d    n1 s0    Y  W d    n1 s0    Y  d S )NrE  r	   ra   )	r   r*   r+   rU   rT   rQ   r   r
   compressed_datar   rb   hdul1r   r   r   r   (test_write_comp_hdu_direct_from_existing  s    2
z<TestCompressedImage.test_write_comp_hdu_direct_from_existingc                 C   s  t j| ddd:}t j|d j|d jd}|| d W d   n1 sT0    Y  t | d}|d j}|j| d	dd
 |  t | d	}|d j|k sJ |  t | d}|j| d	dd
 |  t | d	}|d j|k sJ |  t j| ddd}|j| d	ddd |  t | d	}|d j}|  t j| d	dd}|  t | d	}|d j|k sJ |  dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/88 1

        Identical to test_rewriting_large_scaled_image() but with a compressed
        image.
        r   Tr   r   rI  zfixed-1890-z.fitsNr	   rs   r   r   r   rw   rN   )	r   r*   r+   r%  r   rU   rT   r,   r   )r   rb   r3  r   r   r   r   ,test_rewriting_large_scaled_image_compressed  sH    .

z@TestCompressedImage.test_rewriting_large_scaled_image_compressedc           	   	   C   sD  t j| ddd:}t j|d j|d jd}|| d W d   n1 sT0    Y  t j| ddddV}|d	 jd
 }|d	 jd }|d	 jd }|d	 j }d|d	 jd< W d   n1 s0    Y  t j| ddd}|d	 jd
 |ksJ |d	 jd |ks J |d	 jd |ks8J tt	
| | }|d	 jd |k shJ W d   n1 s~0    Y  t | d}|d	 jd	d |d	d k sJ t | d<}d|d jd< |d	 j|d jk s J W d   n1 s0    Y  W d   n1 s60    Y  dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/88 3

        Identical to test_scale_back() but uses a compressed image.
        r   Tr   r   rI  Nrw   r   r	   r   r   r   )r   r*   r+   r%  r   rU   rT   r   r   r  r  r   )	r   rb   r3  r  r  r  r   r  r   r   r   r   test_scale_back_compressedK  s>    .,<(z.TestCompressedImage.test_scale_back_compressedc                 C   s   t jd}|jdd}tj|dd}|| d t| d0}t 	||d j
  dkshJ W d	   n1 s|0    Y  ~tj|ddd
}|j| ddd t| d&}||d j
k sJ W d	   n1 s0    Y  d	S )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/198r   )   rQ  sizer-  )r+   r)  ra   r	   g        Nr(  Tr   )rQ   r   Zdefault_rngnormalr   r%  rU   rT   r*   r@  r+   r<  r   )r   rngZnoiseZchdu1r   Zchdu2r   r   r   test_lossless_gzip_compressiont  s    >z2TestCompressedImage.test_lossless_gzip_compressionc                 C   s   t jddt jdd ddt jf t dd }t jd t jjdd	}||d|jd
 d|jd f< tj	|ddd}|
| d tj| dddD}td|d jd sJ td|d jd sJ W d   n1 s0    Y  dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/199r	   r   rq   r   NrK   i9  )      rR  r   r,  )rF   rK   )r)  r>  ra   TrF  z^1PB\(\d+\)$ZTFORM1ZTFORM2)rQ   rR   r   Znewaxisr   r:  Zuniformr   r   r%  rU   rT   r*   rer   r   )r   Zdata2Zdata1r3  r   r   r   r   test_compression_column_tforms  s     "
 z2TestCompressedImage.test_compression_column_tformsc                 C   s  |  d tj| ddd@}t|d tjs4J d|d jd< d|d jd< W d   n1 sd0    Y  t| d`}d|d jv sJ |d jd dksJ d|d jv sJ |d jd dksJ W d   n1 s0    Y  tj| ddd(}|d j}d	||d
< W d   n1 s20    Y  t| d(}|d jd
 d	ksfJ W d   n1 s|0    Y  tj| ddd}d|d jd< W d   n1 s0    Y  t| d4}t	|d jd 
 ddgks J W d   n1 s0    Y  tj| ddd4}|d j}|d
}d|||d < W d   n1 sp0    Y  t| d4}t	|d jd 
 ddgksJ W d   n1 s0    Y  tj| ddd}d|d jd< W d   n1 s
0    Y  t| dH}|d jd d dksBJ |d jd d dks^J W d   n1 st0    Y  tj| ddd8}|d j}|d= |d
}|||d = W d   n1 s0    Y  t| d}d|d jvsJ d|d jvsJ d
|d jvs*J d
|d jvs>J d|d jvsRJ d|d jvsfJ W d   n1 s|0    Y  dS )zWRegression test for
        https://github.com/spacetelescope/PyFITS/issues/23
        rE  rw   rN   r	   testZtest1Ztest2NZfooZTEST1quxzTEST*barr   zI am fire. I am death!)COMMENTr	   r^  ZTEST2)r   r   r*   rT   rG   r%  r   rC  indexlistvalues)r   rb   r   idxr   r   r   test_compression_update_header  sT    
,4
.8.D

0D.<

.z2TestCompressedImage.test_compression_update_headerc                 C   sv   dd }t | dJ}|d j}||dd ||dd ||d	d
 ||dd W d   n1 sh0    Y  dS )z
        Ensure that setting reserved keywords related to the table data
        structure on CompImageHDU image headers fails.
        c                 S   sr   t t}|| |< W d    n1 s(0    Y  t|dksBJ t|d jd|dsbJ || vsnJ d S )Nr	   r   zKeyword z is reserved)r-   r   UserWarningrH   r0   r  
startswith)r   keywordr1   r   r   r   r   test_set_keyword  s    &
zZTestCompressedImage.test_compression_update_header_with_reserved.<locals>.test_set_keywordrE  r	   TFIELDSr   ZTTYPE1ZFooZZCMPTYPEZASDFZZVAL1N)r   r*   r+   r   )r   rg  rb   r   r   r   r   ,test_compression_update_header_with_reserved  s    
z@TestCompressedImage.test_compression_update_header_with_reservedc              	   C   s8  t | d}|d j}|d j}tjtdd}|d W d    n1 sV0    Y  t	|dkspJ d|vs|J |jddd d	|v sJ |d
 dksJ d	|v sJ |d
 dksJ |d d|v sJ |d dksJ d|vsJ d|v sJ |d dksJ W d    n1 s*0    Y  d S )NrE  r	   Keyword 'TFIELDS' is reservedr   rh  )r   r]  r\  T)endr   r5  r]  )CHECKSUMabcd1234rl  rm  ZZHECKSUM)
r   r*   r+   r   rC  r-   r   rd  rt   rH   r   rb   imghdrtblhdrr   r   r   r   test_compression_header_append  s$    

(
z2TestCompressedImage.test_compression_header_appendc                 C   sr   t | dN}|d j}t|dk r2|  q|d |d |d W d   n1 sd0    Y  dS )zZ
        Regression test for issue https://github.com/astropy/astropy/issues/5827
        rE  r	     )ZQ1_OSAVGr	   z[adu] quadrant 1 overscan mean)ZQ1_OSSTDr	   z [adu] quadrant 1 overscan stddev)ZQ1_OSMEDr	   z [adu] quadrant 1 overscan medianN)r   r*   r+   r   rH   rt   )r   rb   r   r   r   r   test_compression_header_append2	  s    



z3TestCompressedImage.test_compression_header_append2c              	   C   st  t | dL}|d j}|d j}tjtdd}|dd W d    n1 sX0    Y  t	|dksrJ d|vs~J |
ddksJ |dd d	|v sJ |d	|dd ksJ d	|v sJ |d	|dd ksJ |d	}|d	d
 d|v sJ |d|ks$J d|v s2J |d|d	d ksPJ W d    n1 sf0    Y  d S )NrE  r	   rj  r   rr  rh  ZTELESCOP)OBSERVERz
Phil Plaitrt  )r   r   )r   r*   r+   r   rC  r-   r   rd  insertrH   countr_  )r   rb   ro  rp  r   rb  r   r   r   test_compression_header_insert  s&    

*
z2TestCompressedImage.test_compression_header_insertc              	   C   s  t | d}|d j}|d j}tjtdd"}|jddddd	 W d    n1 s^0    Y  t	|dksxJ d|vsJ |
ddksJ |d dksJ |jd
ddd |d
|dd ksJ |d
 dksJ |d|dd ksJ |d dksJ |ddks$J |d
dks8J |d
 dksJJ |jd
ddd	 |d
|dd ksxJ |d
 dksJ |d|dd ksJ |d dksJ |ddksJ |d
dksJ |d
 dksJ W d    n1 s
0    Y  d S )NrE  r	   zKeyword 'ZBITPIX' is reserved r   ZBITPIXM   ZasdfZXTENSION)ZafterZGCOUNTrv   ZPCOUNT)ZbeforeZZGCOUNTZZPCOUNTr    rF   r   )r   r*   r+   r   rC  r-   r   rd  setrH   rv  r_  rn  r   r   r   (test_compression_header_set_before_after2  s2    

0z<TestCompressedImage.test_compression_header_set_before_afterc                 C   s   t tjdgtjd}d|jd< |jd dgks6J || d t | d(}|d jd dgkspJ W d   n1 s0    Y  dS )zT
        Regression test for https://github.com/astropy/astropy/issues/2363
        r   rq   zhello worldr^  ra   r	   N)	r   r%  rQ   r   r{   r   rU   rT   r*   r&  r   r   r   )test_compression_header_append_commentaryR  s    
z=TestCompressedImage.test_compression_header_append_commentaryc                 C   s   t jddd}t ddd|d< t jjdd|d< tj|d}|| d	 t	| d	4}|d }t 
|jd |d ksJ W d
   n1 s0    Y  d
S )zX
        Regression test for https://github.com/spacetelescope/PyFITS/issues/71
        )r   X  r   rq   r   r	   r}  rR  rL   ra   N)rQ   r   Zlinspacer   rT  r   r%  rU   rT   r*   r   r+   )r   r   r   rb   comp_hdur   r   r   !test_compression_with_gzip_column_  s    z5TestCompressedImage.test_compression_with_gzip_columnc                 C   s   t jdt jd}tj|d}|j}|jd || d t	| d:}||d jksbJ |d j
ddkszJ W d	   n1 s0    Y  d	S )
aP  
        Regression test for https://github.com/astropy/astropy/issues/2750

        Tests that the fake header (for the compressed image) can still be read
        even if the real header contained a duplicate ZTENSION keyword (the
        issue applies to any keyword specific to the compression convention,
        however).
        r   rq   rL   )ZTENSIONZIMAGEra   r	   r  r   N)rQ   rR   r{   r   r%  rC  rt   rU   rT   r*   rv  )r   r   r   r   rb   r   r   r   *test_duplicate_compression_header_keywordsw  s    
z>TestCompressedImage.test_duplicate_compression_header_keywordsc                 C   sf   t jddt jd}tj| d}tj| d}|jddd |jddd t |j|jsbJ d	S )
z
        Regression test for https://github.com/astropy/astropy/issues/4600
        and https://github.com/astropy/astropy/issues/4588

        Identical to test_scale_bzero_with_int_data() but uses a compressed
        image.
        r   r  rq   rL   r;   r  r  rv   N)	rQ   rR   r;   r   r%  r   r   r  r+   r  r   r   r   )test_scale_bzero_with_compressed_int_data  s    	z=TestCompressedImage.test_scale_bzero_with_compressed_int_datac                 C   s   t jddt jd}t|| d tj| dddd8}d|d	 jd
d
< t 	|d	 jdshJ W d
   n1 s|0    Y  d
S )z
        Extend fix for #4600 to assignment to data

        Identical to test_scale_back_uint_assignment() but uses a compressed
        image.

        Suggested by:
        https://github.com/astropy/astropy/pull/4602#issuecomment-208713748
        r   r  rq   ra   rw   Tr   r   r	   N)
rQ   rR   r   r   r%  rU   rT   r*   r+   r  )r   rZ   rb   r   r   r   *test_scale_back_compressed_uint_assignment  s    z>TestCompressedImage.test_scale_back_compressed_uint_assignmentc                 C   s   t jddt jd}t|}|jd tt	 |j
 W d    n1 sN0    Y  t|}|jd tt	 |j
 W d    n1 s0    Y  d S )Nr   r  rq   ZZNAXISrx  )rQ   rR   r   r   r%  rC  popr-   r.   KeyErrorrK  )r   rZ   r~  r   r   r   %test_compressed_header_missing_znaxis  s    
$
z9TestCompressedImage.test_compressed_header_missing_znaxisc              	   C   s  t | d}|d }|jjd }t|dks8J |jdksFJ d|jv sTJ |j|jd kshJ |jjd }t|dksJ d}||_|j|ksJ |jd |ksJ |jd |ksJ |jd |ksJ d|jd< |jdksJ |j	| 
dd	d
 t | 
dB}|d }t|jjd dks2J |jdksBJ W d   n1 sX0    Y  |jd= d|_|jdksJ tt d|_W d   n1 s0    Y  W d   n1 s0    Y  dS )z^Test that a double EXTNAME with one default value does not
        mask the non-default value.zdouble_ext.fitsr	   r   r   Zccd00ZNEW_NAMEZNEW2ztmp.fitsTr   NzRE-ADDEDr   )r   r*   r+   rC  _keyword_indicesrH   r   r   Z_image_headerrU   rT   r-   r.   r  )r   rb   r   indicesnew_namerM  r  r   r   r   %test_compressed_header_double_extname  s6    
0z9TestCompressedImage.test_compressed_header_double_extnamec                 C   s   d}t jtd|d}|jd |ks*J |jd |ks<J |j|ksJJ d}||_|jd |ksfJ |jd |ksxJ |j|ksJ t|jjd dksJ dS )z/Test consistent EXTNAME / hdu name interaction.r   r   ry   r   ZBARr	   N)	r   r%  rQ   rR   rC  r   r   rH   r  )r   r   r   r   r   r   test_compressed_header_extname  s    z2TestCompressedImage.test_compressed_header_extnamec                 C   sP   t jtdt  d t ddi}t jtd|d}|jd dksLJ dS )a  
        Regression test for https://github.com/astropy/astropy/issues/11694

        Tests that CompImageHDU can be initialized with a Header that
        contains few or no cards, and doesn't require specific cards
        such as 'BITPIX' or 'NAXIS'.
        r   rI  ZHELLOZworldN)r   r%  rQ   rR   r   r   )r   r   r   r   r   r   test_compressed_header_minimal  s    z2TestCompressedImage.test_compressed_header_minimal)rf  rr   expectedr   r   c                 C   s   d}t tjdd|d}||j|< || d ~t | d:}|d j| |ks^J |d jj	|ksrJ W d   n1 s0    Y  dS )a  
        If BSCALE,BZERO is set to floating point values, the image
        should be floating-point.

        https://github.com/astropy/astropy/pull/6492

        Parameters
        ----------
        keyword : `str`
            Keyword to set to a floating-point value to trigger
            floating-point pixels.
        dtype : `numpy.dtype`
            Type of original array.
        expected : `numpy.dtype`
            Expected type of uncompressed array.
        g46?r   r   rq   ra   r	   N)
r   r%  rQ   rR   r   rU   rT   r*   r+   rr   )r   rf  rr   r  r1   r   r   r   r   test_compressed_scaled_float
  s    
z0TestCompressedImage.test_compressed_scaled_floatrr   c                 C   sh   t |jd }t j|d |d |d}| d}tj|d}|j|dd t|}t j	
|| dS )	zTest that the various integer dtypes are correctly written and read.

        Regression test for https://github.com/astropy/astropy/issues/9072

        r   r9  rq   ra   rL   Tr   N)rQ   Ziinfor<  rR   rT   r   r%  rU   rX   rV   rW   )r   rr   Zmidr+   Ztestfiler   newr   r   r   test_compressed_integers)  s    

z,TestCompressedImage.test_compressed_integersc                 C   sr   t jdtdjddd}|jjr$J t }t|}t	||g}|
| d t| d}t|| dS )zT
        Regression test for https://github.com/astropy/astropy/issues/2150
        r   rq   r   r   )orderra   N)rQ   rR   floatrS   flags
contiguousr   r$   r%  r#   rU   rT   rX   r   )r   Zorigrd   r   hdulistZactualr   r   r   test_write_non_contiguous_data9  s    
z2TestCompressedImage.test_write_non_contiguous_datac              	   C   s   t | dV}|d jddddf |d _|d jjjrDJ |d | d W d   n1 sl0    Y  t | df}t | d6}t|d jddddf |d j W d   n1 s0    Y  W d   n1 s0    Y  dS )zT
        Regression test for https://github.com/astropy/astropy/issues/9955
        rE  r	   Nr  r   ra   )r   r*   r+   r  r  rU   rT   r   rL  r   r   r   test_slice_and_write_comp_hduG  s     2z1TestCompressedImage.test_slice_and_write_comp_hduN)1r  r  r   r'  r-   r!  r"  rQ   r   r   r4  Zskipifr=  r?  rA  rD  rG  rH  rJ  rN  rO  rP  rV  rZ  rc  ri  rq  rs  rw  r{  r|  r  r  r  r  r  r  r  r  r   r;   r{   r   r  r   uint32r  r  r  r   r   r   r   r$  5  sl   

6
/)? .

r$  c                 C   s  |  dj}|  dj}tjdd }t }tjtj|d tddd}d	|j	d
< d|j	d< t
||g}|| t|@}tj|d jtj|d j	d|d< || W d   n1 s0    Y  t|}|d d W d   n1 s0    Y  dS )z
    Regression test for a bug that caused extensions that used BZERO and BSCALE
    that got turned into CompImageHDU to end up with BZERO/BSCALE before the
    TFIELDS.
    z
3hdus.fitsz3hdus_comp.fitsr.  r   r9  rq   Tr   ikO  r   gffffff@r   r	   rI  NZ	exception)r|   strpathrQ   r   r   r$   r   r   r   r   r#   rU   r*   r%  r+   r   r  r   )tmpdirZ	filename1	filename2r>   Zx0Zx1Zhdusr   r   r   test_comphdu_bscaleU  s     



(r  c                  C   s(   t tjdgtjd} | jdd d S )Nr	   rq   g?r  )r   r   rQ   r   r{   r   )r   r   r   r   test_scale_implicit_castingt  s    r  c                  C   sD   t d} t| }|d }|j W d    n1 s60    Y  d S )Nz data/compressed_float_bzero.fitsr	   )r   r   r*   r+   )rk   rb   r   r   r   r   &test_bzero_implicit_casting_compressed}  s    	r  c                 C   sj   |  dj}ttd}d|jd< |j|dd t|}|	  W d    n1 s\0    Y  d S )Nzfloatimg_with_bzero.fitsr   r   r   Tr   )
r|   r  r   r   rQ   r   r   rU   r*   rC   )r  rk   r   rb   r   r   r   test_bzero_mishandled_info  s    
r  c                 C   s   t g d}|jdd tj|d}|  | dj}|| t	|$}t
|d jg d W d    n1 sx0    Y  t g d}|jdd tj|d}| dj}|| t	|$}t
|d jg d W d    n1 s0    Y  d S )	N)r	   r   r   F)writerL   ra   r	   )rz   g       @g      @r   )rQ   r   Zsetflagsr   r   Zadd_datasumr|   r  rU   r*   r   r+   r%  )r  r>   Zghdurk   r  r   r   r   test_image_write_readonly  s    
2
r  c                 C   s   t jddt jddd}t|}|| d  t| d x}|d jd dksXJ |d jd	 d
ksnJ |d jd dksJ t	|d j
| |d j
j|jksJ W d   n1 s0    Y  dS )zFTest for int8 support, https://github.com/astropy/astropy/issues/11995r8  r9  rq   r   z	int8.fitsr   r   r   r   ir   rz   N)rQ   rR   Zint8rS   r   r$   rU   r*   r   r   r+   rr   )Ztmp_pathZimgr   rb   r   r   r   	test_int8  s    
r  ) r  r   rY  r   r-   ZnumpyrQ   Znumpy.testingr   Z
astropy.ior   Zastropy.io.fits.hdu.compressedr   r   Zastropy.utils.exceptionsr   Zastropy.utils.datar   Z"astropy.utils.compat.optional_depsr   Z
test_tabler
   r   r   r   r$  r  r  r  r  r  r  r   r   r   r   <module>   sF           '      &	