a
    ߙfb"5                    @   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Zd dlZd dlZ	d dlm
Z zd dlZdZW n eyz   dZY n0 d dlmZ d dlmZ d dlmZ d dlmZmZ d d	l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 Z%dd Z&dd Z'G dd de$Z(e j)dd Z*G dd de$Z+G dd de$Z,dd Z-dd  Z.d!d" Z/d#d$ Z0d%d& Z1d'd( Z2d)d* Z3dS )+    N)charTF)fitsTable)UnitsWarning)NUMPY_LT_1_22NUMPY_LT_1_22_1)AstropyDeprecationWarningAstropyUserWarning)ColumnAttributeDelayed
NUMPY2FITS)decode_ascii)VerifyError   )FitsTestCasec                 C   s   | }|}|j jdks |j jdkr&d}nd}d}t|| }|dk}|dk}t|rj||  dkrjdS t|r|| t||   |krdS dS )	z
    Compare two float scalars or arrays and see if they are consistent

    Consistency is determined ensuring the difference is less than the
    expected amount. Return True if consistent, False if any differences.
    float32gư>gؗҜ<gh㈵>r           FT)dtypenamenpZabsoluteanymax)abZaaZbb	precisionZdiffZmask0Zmasknz r   ?lib/python3.9/site-packages/astropy/io/fits/tests/test_table.pycomparefloats!   s     

r   c                 C   s  t | jj}t |jj}||kr,td dS t|D ]}| |}||}|jjdkrbt|}|jjdkrvt|}t|t	|st|t	|stdt	|d| tdt	|d| td| d	  dS t |r t|d
 t
jr t||std| td| td| d  dS q4t|tjjs@t|tjjrtt |D ]b}t
|| || krLtd| d||   td| d||   td| d|  qLq4t
||kr4td| td| td| d  dS q4dS )z
    Compare two record arrays

    Does this field by field, using approximation testing for float columns
    (Complex not yet handled.)
    Column names not compared, but column types and sizes are.
    znumber of fields don't matchFSztype(fielda): z	 fielda: ztype(fieldb): z	 fieldb: zfield z type differsr   zfielda: zfieldb: z differszfielda[z]: zfieldb[z differs in row T)lenr   namesprintrangefieldr   r   
isinstancetyper   Zfloatingr   r   columnZ_VLFr   )r   r   ZnfieldsaZnfieldsbiZfieldaZfieldbrowr   r   r   comparerecords=   sN    	





r*   c                 C   s   |j j| j jksJ dd tjj D }|j jD ]N}|j | }| j | }|D ]0}t||rNt||rNt||t||ksNJ qNq2dS )z6
    Helper function to compare column attributes
    c                 S   s   g | ]\}}t |tr|qS r   )r%   r   ).0kvr   r   r   
<listcomp>t   s   
z$_assert_attr_col.<locals>.<listcomp>N)columnsr!   r   Column__dict__itemsgetattr)	new_tbhdutbhduattrsr   colZnew_colattrr   r   r   _assert_attr_coln   s    

r9   c                   @   s~  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d-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2e3j45dadbdcgddde Z6dfdg Z7dhdi Z8djdk Z9dldm Z:dndo Z;dpdq Z<drds Z=dtdu Z>dvdw Z?dxdy Z@dzd{ ZAd|d} ZBd~d ZCdd ZDdd ZEdd ZFdd ZGdd ZHe3j4Iddd ZJe3j4Iddd ZKdd ZLdd ZMdd ZNdd ZOdS )TestTableFunctionsc                 C   s`   t t  t  g}|d j}d|d< t j|d}t |}d|d jd< |d dks\J dS )a  
        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.

        This is like the test of the same name in test_image, but tests this
        for tables as well.
        r   zlabq01i3q_rawtag.fitsZFILENAMEheaderzlabq01i3q_flt.fitsr   N)r   HDUList
PrimaryHDUBinTableHDUr<   )selfZifdZthdrthduZofdr   r   r   test_constructor_copies_header   s    

z1TestTableFunctions.test_constructor_copies_headerc              
   C   s  t | d}t | d}tg d}tjg dtjd}t jdd|d}t jd	d
|d}tjg ddd}t jdd|d}tjg ddd}	t jdd|	d}
tjg ddd}t jdd|d}tjdgdgdggtjd}t jdd|d}tjg ddd}t jdd|d}tjg dg dg dgtjd}t jd d!|d}t 	||||
||||g}t j
|}t 	|d }t j
j|d"d#}tjjd$d%gd&d'}t|j|sJ |jd d |d ksJ |jd d |d ksJ |jd d" |d ksJ |jd d( |	d ks"J |jd d) |d ks>J |jd d* |d d+k sdJ |jd d, |d ksJ |jd d- |d k sJ t|jdd.ksJ t 	|d }t t  }|| |j| d/d0d1 t | d/:}|d jd-}|d g d2k s0J W d    n1 sF0    Y  t | d3d4}||d  || |  |  |  d S )5Ntb.fitsz
test0.fits)abcdefZxx)      &@      (@g      *@r   rD   3Ar   formatarrayrE   E         i2xyzIr      rO   t1)y      @      @y      @      @y      @      @c8t2Cr   r   t3X)e   f   g   i4t4J)r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   Zt5Z11XrV   nrowsr   rD   g   @r   rV   zxy g   @r   c1, c2, c3, c4r!   rO   rP   rQ   bool      z['abc' 'def' 'xx']ztableout1.fitsTZ	overwrite)TTFTFTTTFFTztableout2.fitsappend)r   opendata	chararrayrL   r   r   r0   uint8ColDefsr?   from_columnsrecr*   viewallstrr$   r=   r>   rm   writetotempclose)r@   Zttfda1r1c1c2a3c3a4c4a5c5a6c6a7c7a8rX   xr5   Zx2rY   ra_Zfoutf2ry   Zfout2r   r   r   	test_open   sp    
& 
:
zTestTableFunctions.test_openc                 C   sJ  t | d}|d jd dks&J g dg dg dg dg d	g d
g dg dg dg dg dg dg dg dg dd}|d jjdd|ksJ tjjddgdd}t	|d j|d d sJ d|d j
dd< |d j  ttjj
|d jddksJ |d j
dtddgk s>J |  d S )NrC   r   Ztform11Jr~   r   r   r   )r   rI   1EZ1L) r   r   r   )i  r   r   r   )r   r   rO   r   )r   r   g?r   )ZI11A3zG15.7ZL6)r   rK   unitnullbscalebzerodispstartdim	coord_inc
coord_type
coord_unitcoord_ref_pointcoord_ref_valuetime_ref_posFoutputre   rf   rg   rh   rV   r   r   z[84 84])r   rn   ro   r<   r/   infor   rt   rL   r*   r$   Z_scale_backrw   recarrayrv   rz   )r@   tr   r   r   r   r   test_binary_table   s>    $(z$TestTableFunctions.test_binary_tablec                 C   sn  t | d}tjjg ddd}t|d j|s8J |d jdd  dd  }tjjdgdd}t||srJ |dtdgk sJ tjjg d	dd}t|d jd d d |sJ t	d
dg}tddg}t j
ddd|d}t j
ddd|d}	t j
ddg dd}
t j|	||
g}t|jjjtddftddftddfdksfJ |j| ddd  t | d}t|j|d jsJ |  tddg}t j
dd!|d"d#d$}	t j|	g}|j| ddd  t| d"}d%| v sJ W d    n1 s&0    Y  t | d(}t|j|d jsZJ W d    n1 sp0    Y  t j
d&d'g dd}t j
d(d)g dd}	t j
d*d+g dd}
t j||	|
g}|jjtjksJ |	jjtjksJ |
jjtjksJ |j| ddd  t | d(}t|j|d jsBJ W d    n1 sX0    Y  |  d S ),N
ascii.fits)g   >$@%   )g   @   g   Q8/@   )r   r   g     u@Y  zc1, c2rh   r   rV   r   r   )r   r   r   ZabcdrE   rF   rG   rD   r      )r   rK   r   rL   rM   rO   rW   rT   )[   \   ]   rJ   z|S3   z|S15z|S10   )rD   rE   rW   	toto.fitsTrl   Dffffff@g333333?)r   rK   rL   r   r   z4.95652173913043548D+00rY   ZI2ra   ZI5Zt8I10)r   rn   ro   r   rt   rL   r*   r$   rv   rp   r0   TableHDUrs   dictr   fieldsrx   ry   rz   readint16int32Zint64)r@   r   Zra1a2Zra2Zra3r|   r}   r~   r   r   hduhdulfr   r   r   test_ascii_table  sd    
288z#TestTableFunctions.test_ascii_tablec           
      C   s   t jdtd}t jdgdd}||d< tjdd|d}t|g}tj|}d	|_	|j
| d
dd t| d
}|d	 }|j}|dd }	||	k sJ |  d S )Nr   rH   rO   rq   r   ZChannelszPB()rJ   ZRFItestendian.fitsTrl   )r   ndarrayobjectrL   r   r0   rr   r?   rs   r   rx   ry   rn   ro   r$   rv   rz   )
r@   r   Z
channelsInr7   colsr5   ZhduLZrfiHDUro   ZchannelsOutr   r   r   test_endianness^  s    z"TestTableFunctions.test_endiannessc           	      C   s  g d}t j|dd}t j|dd}tjdd|d}tjdd|d}t||g}tj|}|jd |k stJ |jd |k sJ |j	| 
d	d
d t| 
d	D}|d jd |k sJ |d jd |k sJ W d   n1 s0    Y  dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/77
        (Astropy doesn't preserve byte order of non-native order column arrays)
              ?       @      @      @z<f8rH   z>f8r   r   rJ   r   r   Trl   r   N)r   rL   r   r0   rr   r?   rs   ro   rv   rx   ry   rn   )	r@   r   r|   r   col1col2r   r5   r   r   r   r   test_column_endiannessn  s    z)TestTableFunctions.test_column_endiannessc                 C   s   t jjg dddd}t|}t|j|s0J |j| ddd t	| d}t|j|d jsjJ t||d js~J |
  d S )	Nr   Serius333333A1VrV   Canopys\(\F0Ib)rO   z
Rigil KentgZG2Vzint16,a20,float32,a10order,name,mag,Spformatsr!   r   Trl   r   )r   rt   rL   r   r?   r*   ro   rx   ry   rn   rz   )r@   brightr   r   r   r   r   test_recarray_to_bintablehdu  s    
z/TestTableFunctions.test_recarray_to_bintablehduc                 C   s   t g dg dd}t jg d|d}t|}t|j|tjsLJ |j	| 
ddd t| 
d}t|j|d	 jsJ |  d S )
Norderr   magZSp)intZS20r   ZS10r!   r   r   rH   r   Trl   r   r   r   rL   r   r?   r*   ro   ru   FITS_recrx   ry   rn   rz   r@   Zdescr   r   r   r   r   r   !test_numpy_ndarray_to_bintablehdu  s    


z4TestTableFunctions.test_numpy_ndarray_to_bintablehduc                 C   s   t g dg dd}t jg d|d}t|}t|j|tjsLJ |j	| 
ddd t| 
d}t|j|d	 jsJ |  d S )
Nr   )r   ZU20r   ZU10r   r   rH   r   Trl   r   r   r   r   r   r   .test_numpy_ndarray_to_bintablehdu_with_unicode  s    


zATestTableFunctions.test_numpy_ndarray_to_bintablehdu_with_unicodec                 C   s  t jjg dddd}tjj|dd}t|jjj	d jt|jjj
d ksPJ t|jjj	d jt|j	j	d jkszJ t|jjj	d jt|j	j
d ksJ d|jd d< |jd d dksJ |jjj
d d dksJ |jjj	d jd dksJ |j	j
d d dksJ |j	j	d jd dks2J d	|jjj
d d< |jd d d	ks\J |jjj
d d d	ksxJ |jjj	d jd d	ksJ |j	j
d d d	ksJ |j	j	d jd d	ksJ d
|jjj	d jd< |jd d d
ksJ |jjj
d d d
ksJ |jjj	d jd d
ks2J |j	j
d d d
ksLJ |j	j	d jd d
kshJ d|j	j
d d< |jd d dksJ |jjj
d d dksJ |jjj	d jd dksJ |j	j
d d dksJ |j	j	d jd dks J d|j	j	d jd< |jd d dks*J |jjj
d d dksFJ |jjj	d jd dksdJ |j	j
d d dks~J |j	j	d jd dksJ |jdt jddgt jdk sJ |jd d dksJ |jd d dksJ |jdt jddgt jdk sJ |jd d dks6J |jd d dksNJ |j| ddd t| d}|d jdt jddgt jdk sJ |d jd d dksJ |d jd d dksJ |d jdt jddgt jdk sJ |d jd d dks$J |d jd d dks@J W d    n1 sV0    Y  ~tjj|dd}t jjddgddd}t|j|sJ |j| ddd t| d(}t|j|d jsJ W d    n1 s0    Y  d S )Nr   zint16,a20,float64,a10r   r   rV   rc   r      d     X     rH   r   r   r   r   r   rO   r   r   r   Trl   r   r   )r   rt   rL   r   r   rs   idro   _coldefsr/   _arraysr$   r   rv   float64rx   ry   rn   r?   r*   )r@   r   r   r   tmpr   r   r   test_new_table_from_recarray  s    

<z/TestTableFunctions.test_new_table_from_recarrayc                 C   sv   t | d}|d j}W d   n1 s00    Y  tjdg|jd}t||t j}t	|
dsrJ dS )zR
        Tests creating a new FITS_rec object from a multi-field ndarray.
        rC   r   N)rO   Zqwe      @FrH   z	FITS_rec()r   rn   ro   r   rL   r   rm   ru   r   repr
startswith)r@   hro   Znew_dataZappendedr   r   r   test_new_fitsrec  s
    (z#TestTableFunctions.test_new_fitsrecc                 C   s 	  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	|	| d t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	|	| d t	| d}
t	| d}|
d j
jd }|
d j
jd |d j
jd  }|
d jjd |
d jjd ju sJ tjj|
d j|d}tt|
d jD ]&}|d j
||j
||d < q|| d ddg}tj| ddd|ks:J t jg dt jd }t jjd!d"d#|d$fd%d&d#|dfd'd(d#|d$fd)d*d#|d$fd+d,d#|dfd-d.d#|d$fd/d0d#|dfd1d2d#|dfgd3d4}t|j
|sJ d5|j
d d< |j
jjd d d5ksJ |j
jjd jd d5ksJ |jjd d d5ks2J |jjd jd d5ksNJ |j
d d d5ksfJ d6|j
jjd d< |j
jjd d d6ksJ |j
jjd jd d6ksJ |jjd d d6ksJ |jjd jd d6ksJ |j
d d d6ks J d7|j
jjd jd< |j
jjd d d7ks0J |j
jjd jd d7ksNJ |jjd d d7kshJ |jjd jd d7ksJ |j
d d d7ksJ d8|jjd d< |j
jjd d d8ksJ |j
jjd jd d8ksJ |jjd d d8ks J |jjd jd d8ksJ |j
d d d8ks4J d9|jjd jd< |j
jjd d d9ksbJ |j
jjd jd d9ksJ |jjd d d9ksJ |jjd jd d9ksJ |j
d d d9ksJ t	| d}|d }d5|j
d d< |j
jjd d d5ksJ |j
jjd jd d5ks.J |jjd d d5ksHJ |jjd jd d5ksdJ |j
d d d5ks|J d6|j
jjd d< |j
jjd d d6ksJ |j
jjd jd d6ksJ |jjd d d6ksJ |jjd jd d6ksJ |j
d d d6ksJ d7|j
jjd jd< |j
jjd d d7ksFJ |j
jjd jd d7ksdJ |jjd d d7ks~J |jjd jd d7ksJ |j
d d d7ksJ d8|jjd d< |j
jjd d d8ksJ |j
jjd jd d8ksJ |jjd d d8ksJ |jjd jd d8ks2J |j
d d d8ksJJ d9|jjd jd< |j
jjd d d9ksxJ |j
jjd jd d9ksJ |jjd d d9ksJ |jjd jd d9ksJ |j
d d d9ksJ |
  |  |  d S ):N8  N  4  =  NGC1NGC2NGC3NCG4target10ArJ   countsrb   DNr   rK   r   rL   notesA10r   rK   spectrum5EflagLr   r   r   r   table1.fits        NGC5NGC6NGC7NCG8r   r   r   r   table2.fitsr   r   rc   newtable.fitsr   ZPRIMARYr   r>   rP   r   r   r   )r   r   r   r?   r   z8R x 5Cz[10A, J, 10A, 5E, L]r   Fr   r   r   r   r   r   rH   r  r   r   Tr  r   r  r   r  r   r  r  r  r  r  r  r  r  a10,u4,a10,5f4,lr   ,     r   Z   P   )r   rL   r   r0   rr   r?   rs   rx   ry   rn   ro   shaper/   r   r#   r    r$   r   r   rt   r*   r   rz   )r@   r  r!   r~   r   r   r   r   coldefsr5   rW   rY   Znrows1rd   r   r(   r   zrL   r   r   r   r   test_appending_a_column  s     ($z*TestTableFunctions.test_appending_a_columnc              	   C   s2  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t||||g}tj|}	|	jjg dksJ || }
tj|
}|jjg dksJ t jg dt j	d}t j
jddd|dfddd|dfddd|dfdd d|dfgd!d"}t|j|s.J d S #Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r  r  r
  r  r  r  r
  r  r  r!  rH   r  r   r   Tr  r   Fr  r   r  r   r"  r#  )r   rL   r   r0   rr   r?   rs   r/   r!   r   rt   r*   ro   )r@   r  r!   r~   r   r   r   r   r)  r5   Zcoldefs1tbhdu1r*  rL   r   r   r   test_adding_a_column  s.    z'TestTableFunctions.test_adding_a_columnc              	   C   s*  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t||||g}tj|}	|	jjg dksJ |	j	| |	jjg dksJ t jg dt j
d}
t jjddd|
dfddd|
dfddd|
dfdd d|
dfgd!d"}t|	j|s&J d S r,  )r   rL   r   r0   rr   r?   rs   r/   r!   add_colr   rt   r*   ro   r@   r  r!   r~   r   r   r   r   r)  r5   r*  rL   r   r   r   test_adding_a_column_inplace  s,    z/TestTableFunctions.test_adding_a_column_inplacec                 C   s   t | d}|d }t jdtddgdd}|j| |jjg dksRJ tj	jg dd	d
}t
|j|svJ |  d S )N
table.fitsr   r   rV   Kr   rL   rK   )r  V_magr   ))NGC1001g333333&@r   )NGC1002g(@rV   )NGC1003gffffff.@r   z	a20,f4,i8r#  )r   rn   ro   r0   r   rL   r/   r1  r!   rt   r*   rz   )r@   r   r5   r7   rL   r   r   r   test_adding_a_column_to_file  s    z/TestTableFunctions.test_adding_a_column_to_filec                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	|	jjg dksJ |	j	d |	jjg dksJ t jg dt j
d}
t jjddd|
fddd|
fddd|
fddd|
fgdd }t|	j|s J |	j	d |	j	d
 |	jjddgksNJ t jjd|
fd|
fd|
fd|
fgd!d }t|	j|sJ d S )"Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r.  r-  r!  rH   r  r   r   r  r   r  r   r  r   za10,u4,a10,5f4r#  za10,5f4)r   rL   r   r0   rr   r?   rs   r/   r!   del_colr   rt   r*   ro   r2  r   r   r   test_removing_a_column_inplace  sD    



z1TestTableFunctions.test_removing_a_column_inplacec                 C   sf   t | d}|d }|jd |jjdgks6J tjjg ddd}t	|j|sZJ |
  d S )Nr4  r   r7  r  ))r8  )r9  )r:  Za20r#  )r   rn   ro   r/   r<  r!   r   rt   rL   r*   rz   )r@   r   r5   rL   r   r   r    test_removing_a_column_from_file  s    z3TestTableFunctions.test_removing_a_column_from_filec                 C   s	  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	|	| d t g d}t g d}tjdd|d}tjddd|d	}tjddd}tjddd}tjddg dd}t|||||g}tj|}	|	| d t	| d}
t	| d}tj|
d j
|d j
 }t jg dt jd}t jjdd d!|d"d#d$d!|d%f
d&d'd!|d%d(d)d!|d"f
d*d+d!|d"d,d-d!|d%f
d.d/d!|d"d0d1d!|d%f
gd2d3}t|j|sJ || d4 d5|jd6 d< |jjjd d6 d5ks@J |jjj
d jd6 d5ks^J |j
jd d6 d5ksxJ |j
j
d jd6 d5ksJ |jd6 d d5ksJ d7|jjjd d6< |jjjd d6 d7ksJ |jjj
d jd6 d7ksJ |j
jd d6 d7ksJ |j
j
d jd6 d7ks.J |jd6 d d7ksFJ d8|jjj
d jd6< |jjjd d6 d8ksvJ |jjj
d jd6 d8ksJ |j
jd d6 d8ksJ |j
j
d jd6 d8ksJ |jd6 d d8ksJ d9|j
jd d6< |jjjd d6 d9ksJ |jjj
d jd6 d9ks,J |j
jd d6 d9ksFJ |j
j
d jd6 d9ksbJ |jd6 d d9kszJ d:|j
j
d jd6< |jjjd d6 d:ksJ |jjj
d jd6 d:ksJ |j
jd d6 d:ksJ |j
j
d jd6 d:ksJ |jd6 d d:ksJ d;d<g}tj| d4d%d=|ks:J t	| d4}|d }|j
jg d>kshJ t jg dt jd}t jjdd d!|d"d#d$d!|d%f
d&d'd!|d%d(d)d!|d"f
d*d+d!|d"d,d-d!|d%f
d.d/d!|d"d0d1d!|d%f
gd2d3}t|j|sJ d5|jd6 d< |jjjd d6 d5ks J |jjj
d jd6 d5ks>J |j
jd d6 d5ksXJ |j
j
d jd6 d5kstJ |jd6 d d5ksJ d7|jjjd d6< |jjjd d6 d7ksJ |jjj
d jd6 d7ksJ |j
jd d6 d7ksJ |j
j
d jd6 d7ksJ |jd6 d d7ks&J d8|jjj
d jd6< |jjjd d6 d8ksVJ |jjj
d jd6 d8kstJ |j
jd d6 d8ksJ |j
j
d jd6 d8ksJ |jd6 d d8ksJ d9|j
jd d6< |jjjd d6 d9ksJ |jjj
d jd6 d9ksJ |j
jd d6 d9ks&J |j
j
d jd6 d9ksBJ |jd6 d d9ksZJ d:|j
j
d jd6< |jjjd d6 d:ksJ |jjj
d jd6 d:ksJ |j
jd d6 d:ksJ |j
j
d jd6 d:ksJ |jd6 d d:ksJ |
  |  |  d S )?Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r  r  r  target1counts1notes1	spectrum1flag1r  r  r   r!  rH   r  r   r   Tr  r  Fr  r   r  r  r  r   r  r  r  r   r  r  z!a10,u4,a10,5f4,l,a10,u4,a10,5f4,lr#  r  r$  r   r%  r   r&  r'  r   )r   r   r   r?      z4R x 10Cz([10A, J, 10A, 5E, L, 10A, J, 10A, 5E, L]r   r   )
r  r  r
  r  r  r?  r@  rA  rB  rC  )r   rL   r   r0   rr   r?   rs   rx   ry   rn   r/   r   rt   r*   ro   r   r   r   r!   rz   )r@   r  r!   r~   r   r   r   r   r)  r5   rW   rY   r   r*  rL   r   r   r   r   r   test_merge_tables$  s    
z$TestTableFunctions.test_merge_tablesc                 C   s   dddd}t jttg dg dg ddtfd	d
tfgd}tj|d}|jD ]}||j	 |_
qR|j| ddd t| dJ}|d j}|d dksJ |d dksJ |d dksJ W d   n1 s0    Y  dS )zRegression test for https://github.com/astropy/astropy/issues/996

        This just tests one particular use case, but it should apply pretty
        well to other similar cases.
        rV   r   r   r   r   cr   rV   rO   rP   )r   r   rG  d)r   r   @g!@r   )r   ZS1rG  rH   ro   	test.fitsTrl   r   TNULL1ZTNULL2ZTNULL3N)r   rL   listzipr   floatr   r?   r/   r   r   rx   ry   rn   r<   )r@   ZNULLSro   r   r7   r   r<   r   r   r   test_modify_column_attributes  s     

z0TestTableFunctions.test_modify_column_attributesc           
      C   s  t dt dfft dt dfdfg}tjd|d}dd	g|d< g d
|d d< g d|d d< t|}t| d| t| d}|d j|d jksJ |d j|d jksJ t	|d |d ksJ d
|d |d t	|d |d ksJ d
|d |d t }t|}t||g}|| d t| d}|d j}|  |d j|d jksJ |d j|d jksJ t	|d |d ksJ d
|d |d t	|d |d ksJ d
|d |d || d tj| ddd}	|d j|	d jks8J |d j|	d jksRJ t	|d |	d ksJ d
|d |	d t	|d |	d ksJ d
|d |	d dS )zRegression test for https://github.com/astropy/astropy/issues/5280
        and https://github.com/astropy/astropy/issues/5287

        multidimentional tables can now be written with the correct TDIM.
        Author: Stephen Bailey.
        r   rQ   yrO   )rP   rV   rH   ZabcderS   )AZBCZDEFZ123r   )r\   ZYZZPQRZ999r   rL  zx: {} != {}zy: {} != {}
test2.fits
test3.fitsF)Zcharacter_as_bytesN)rw   r   zerosr   r   rx   ry   getdatar   rv   rK   r>   r?   r=   rn   ro   rz   writer   )
r@   r   ro   tableZdxZhdu0Zhdu1hxZfxZtxr   r   r   0test_multidimension_table_from_numpy_rec_columns  s>    	.0

000zCTestTableFunctions.test_multidimension_table_from_numpy_rec_columnsc                 C   s   t | d}|d j}|ddk}|| }t |}|| d t | d}d}t|t	|jstJ t|t	|d jsJ |
  |
  d S )Nr4  r   r7     r  z<\[\('NGC1002',\s+12.3[0-9]*\) \(\'NGC1003\',\s+15.[0-9]+\)\])r   rn   ro   r$   r?   rx   ry   rematchrw   rz   )r@   r   tbdatamaskZ	newtbdatar   r   Zexpectr   r   r   test_mask_array  s    

z"TestTableFunctions.test_mask_arrayc                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	|	| d t	| d}
|
d j
d }|d dksJ |dd \}}}||d ksJ |dksJ |t jg dt jdk sJ d|d< |d dks6J d|d< |d dksPJ |dd d dksjJ ttdd | d|dd d< |dd d dksJ |d dksJ d|dd d < |dd d dksJ d|dd d< |dd d dksJ d!|dd d d d" d"< |dd d d!ks@J d|ddd d < |dd d dkslJ ttd#d | |dd d dksJ |dd ddksJ tt|dd jd |dd dd! |dd d d!ksJ tt|dd jdd$ |
d j
jjd d d!ks8J |
d j
jjd jd d!ksZJ |
d jjd d d!ksxJ |
d jjd jd d!ksJ |
d j
d d d!ksJ |
  d S )%Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r  r   rV   r   rP   r   r!  rH   i6  i;  c                 S   s   | dd d S Nr   rP   r  r   rr   r   r   <lambda>(      z5TestTableFunctions.test_slice_a_row.<locals>.<lambda>r$  i  r   r   c                 S   s   | dd d S rb  r   rc  r   r   r   re  9  rf  F)r   rL   r   r0   rr   r?   rs   rx   ry   rn   ro   r   rv   pytestraisesKeyErrorr$   Zsetfieldr   r   r/   rz   )r@   r  r!   r~   r   r   r   r   r)  r5   rW   r)   r   r   rG  r   r   r   test_slice_a_row  s^    " " z#TestTableFunctions.test_slice_a_rowc                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	|	| d t	| d}
t
|
d jd dksJ t
|
d jd dd dksJ t
|
d jd dd dksJ t
|
d jd dd dks2J t
|
d jd dd dksVJ t
|
d jd dd dkszJ t
|
d jd dd dksJ t
|
d jd dd dksJ t
|
d jd dd dksJ |
  d S )Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r  r   r   rQ   rP   rj   rk   rO   )r   rL   r   r0   rr   r?   rs   rx   ry   rn   r    ro   rz   r@   r  r!   r~   r   r   r   r   r)  r5   rW   r   r   r   test_fits_record_lenM  s*    "$$$$$$$z'TestTableFunctions.test_fits_record_lenc                 C   s   t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	tjddd}tjdddd}tjd
dd}tjddd}tjddd}t|||||g}tjj|dd}
|	jd |
jd< |	jd |
jd< dddt jg dt jddf|
jd< dd dt jg d!t jddg|
jd< t	|
jj
jd jt	|
jj
jd ksJ t	|
jj
jd jt	|
jjd jksJ t	|
jj
jd jt	|
jjd ksJ |
jd d" dksJ |
jj
jd" d dksJ |
jj
jd" jd dks6J |
jjd" d dksPJ |
jjd" jd dkslJ |
jjd jd dksJ |
jjd jd d#ksJ |
jjd jd t jg d$t jdk sJ |
jjd jd dksJ |
jd d" d%ksJ |
jj
jd" d d%ks$J |
jj
jd" jd d%ksBJ |
jjd" d d%ks\J |
jjd" jd d%ksxJ |
jjd jd dksJ |
jjd jd dksJ |
jjd jd t jg d!t jdk sJ |
jjd jd dksJ d S )&Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r   rK   r   rQ   rc   r   rO   rP   r  r   zA Note)皙?皙@ffffff
@g@g      @rH   TrV   ZJIM1Z33r   r   r   r   g      @r   r   r!  !   )r   rL   r   r0   rr   r?   rs   ro   r   r   r   r/   r   rv   )r@   r  r!   r~   r   r   r   r   r)  r/  r5   r   r   r   test_add_data_by_rowsg  sr    




z(TestTableFunctions.test_add_data_by_rowsc                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}
t jg dt jd|
jd d< tjj|	jdd}|
j|jdd < t	|jj
jd jt	|jj
jd ksJ t	|jj
jd jt	|jjd jksJ t	|jj
jd jt	|jjd ksJ |jd d dksJ |jj
jd d dksJ |jj
jd jd dks0J |jjd d dksJJ |jjd jd dksfJ |jjd jd dksJ |jjd jd d ksJ |jjd jd t jg d!t jdk sJ |jjd jd d"ksJ |jd d d#ksJ |jj
jd d d#ksJ |jj
jd jd d#ks<J |jjd d d#ksVJ |jjd jd d#ksrJ |jjd jd d$ksJ |jjd jd d ksJ |jjd jd t jg dt jdk sJ |jjd jd d%ksJ |jjd jd& dksJ |jjd jd& d ks.J |jjd jd& d ksJJ |jjd jd& t jg d!t jdk szJ |jjd jd& d%ksJ d S )'Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  )p      l   u   r  r  rr  rH   r   rO   	   rc   rP   r   r   r  rV   r   r!  Tru  r  F   )r   rL   r   r0   rr   r?   rs   r   ro   r   r   r/   r   rv   )r@   r  r!   r~   r   r   r   r   r)  r/  r5   tbhdu2r   r   r   "test_assign_multiple_rows_to_table  sv    


z5TestTableFunctions.test_assign_multiple_rows_to_tablec                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	t|jd t|ksJ t|jd jt|ksJ t|jd jt|jksJ t|jd jt|j	d ksJ t|t|	jksJ t|jd t|	jjd ksBJ t|jd jt|	jjd jksjJ t|	jt|	j
jksJ t|	j
jjd jt|	j
jj	d ksJ t|	j
jjd jt|	jjd jksJ t|	j
jjd jt|	jj	d ksJ |	| d t| d}
d|
d j
d d< |
d j
d d dksVJ |
d j
jj	d d dksvJ |
d j
jjd jd dksJ |
d jj	d d dksJ |
d jjd jd dksJ d|
d j
jj	d d< |
d j
d d dksJ |
d j
jj	d d dks(J |
d j
jjd jd dksJJ |
d jj	d d dkshJ |
d jjd jd dksJ d|
d j
jjd jd< |
d j
d d dksJ |
d j
jj	d d dksJ |
d j
jjd jd dksJ |
d jj	d d dksJ |
d jjd jd dks<J d|
d jj	d d< |
d j
d d dkslJ |
d j
jj	d d dksJ |
d j
jjd jd dksJ |
d jj	d d dksJ |
d jjd jd dksJ d|
d jjd jd< |
d j
d d dksJ |
d j
jj	d d dks>J |
d j
jjd jd dks`J |
d jj	d d dks~J |
d jjd jd dksJ |
  d S )Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r   r  r   r   r   r   r   r   )r   rL   r   r0   rr   r?   rs   r   r/   r   ro   r   rx   ry   rn   rz   rl  r   r   r   test_verify_data_references  sz    $$



 "  "  "  "  " z.TestTableFunctions.test_verify_data_referencesc                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	tj|	jt j	}
t
|
jjjd jt
|
jjjd ksJ t
|
jjjd jt
|
jjd jksJ t
|
jjjd jt
|
jjd ks"J d|
jd d< |
jd d dksHJ |
jjjd d dksdJ |
jjjd jd dksJ |
jjd d dksJ |
jjd jd dksJ d|
jjjd d< |
jd d dksJ |
jjjd d dksJ |
jjjd jd dksJ |
jjd d dks6J |
jjd jd dksRJ d|
jjjd jd< |
jd d dks~J |
jjjd d dksJ |
jjjd jd dksJ |
jjd d dksJ |
jjd jd dksJ d|
jjd d< |
jd d dksJ |
jjjd d dks2J |
jjjd jd dksPJ |
jjd d dksjJ |
jjd jd dksJ d|
jjd jd< |
jd d dksJ |
jjjd d dksJ |
jjjd jd dksJ |
jjd d dksJ |
jjd jd dks J |
| d t| d}d|d jd d< |d jd d dksnJ |d jjjd d dksJ |d jjjd jd dksJ |d jjd d dksJ |d jjd jd dksJ d|d jjjd d< |d jd d dks J |d jjjd d dks@J |d jjjd jd dksbJ |d jjd d dksJ |d jjd jd dksJ d|d jjjd jd< |d jd d dksJ |d jjjd d dksJ |d jjjd jd dksJ |d jjd d dks4J |d jjd jd dksTJ d|d jjd d< |d jd d dksJ |d jjjd d dksJ |d jjjd jd dksJ |d jjd d dksJ |d jjd jd dksJ d|d jjd jd< |d jd d dks6J |d jjjd d dksVJ |d jjjd jd dksxJ |d jjd d dksJ |d jjd jd dksJ |  d S )Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r   r   r   r   r   r   r   r  )r   rL   r   r0   rr   r?   rs   ro   ru   r   r   r   r/   r   rx   ry   rn   rz   )r@   r  r!   r~   r   r   r   r   r)  r5   r/  rW   r   r   r   test_new_table_with_ndarrayH  s    
 "  "  "  "  " z.TestTableFunctions.test_new_table_with_ndarrayc                 C   s	  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	d|	jd d< |	jd d dksJ |	jjj	d d dksJ |	jjj
d jd dksJ |	j
j	d d dksJ |	j
j
d jd dksJ d|	jjj	d d< |	jd d dksHJ |	jjj	d d dksdJ |	jjj
d jd dksJ |	j
j	d d dksJ |	j
j
d jd dksJ d|	jjj
d jd< |	jd d dksJ |	jjj	d d dks J |	jjj
d jd dksJ |	j
j	d d dks8J |	j
j
d jd dksTJ d|	j
j	d d< |	jd d dks|J |	jjj	d d dksJ |	jjj
d jd dksJ |	j
j	d d dksJ |	j
j
d jd dksJ d|	j
j
d jd< |	jd d dksJ |	jjj	d d dks2J |	jjj
d jd dksPJ |	j
j	d d dksjJ |	j
j
d jd dksJ d|	j
j
d jd< |	| d t| d}
d|
d jd d< |
d j}|
d jd d dksJ |
d jjj	d d dksJ |
d jjj
d jd dks2J |
d j
j	d d dksPJ |
d j
j
d jd dkspJ |d d dksJ |jj	d d dksJ |jj
d jd dksJ d|jj
d jd< tj|}d}|jD ]r}tt|D ]V}t|| t jr,|| |	j| | k sHJ n|| |	j| | ksJ q|d }qd|jd d< |
d jd d dksJ |
d jjj	d d dksJ |
d jjj
d jd dksJ |
d j
j	d d dksJ |
d j
j
d jd dksJ |d d dksJ |jj	d d dks2J |jj
d jd dksNJ |jd d dksfJ |jjj	d d dksJ |jjj
d jd dksJ |j
j	d d dksJ |j
j
d jd dksJ d|
d jd d< |
d jd d dksJ |
d jjj	d d dks$J |
d jjj
d jd dksFJ |
d j
j	d d dksdJ |
d j
j
d jd dksJ |d d dksJ |jj	d d dksJ |jj
d jd dksJ |jd d dksJ |jjj	d d dksJ |jjj
d jd dks"J |j
j	d d dks<J |j
j
d jd dksXJ d|jjj	d d< |
d jd d dksJ |
d jjj	d d dksJ |
d jjj
d jd dksJ |
d j
j	d d dksJ |
d j
j
d jd dk	sJ |d d dk	sJ |jj	d d dk	s6J |jj
d jd dk	sRJ |jd d dk	sjJ |jjj	d d dk	sJ |jjj
d jd dk	sJ |j
j	d d dk	sJ |j
j
d jd dk	sJ |
  d S )Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r   r   r   r   r   r   r   r   r  
   i  )r   rL   r   r0   rr   r?   rs   ro   r   r   r/   rx   ry   rn   r#   r    r%   r   rv   rz   )r@   r  r!   r~   r   r   r   r   r)  r5   rW   frr/  r(   r)   jr   r   r   test_new_table_with_fits_rec  s    
 " 
"  "  "  " z/TestTableFunctions.test_new_table_with_fits_recc                 C   s  t g d}t g d}tjdd|d}tjddd|d	}tjd
dd}tjddd}tjddg dd}t|||||g}tj|}	t|	j}
t|
jj	j
d jt|
jj	jd ksJ t|
jj	j
d jt|
j
j
d jksJ t|
jj	j
d jt|
j
jd ksJ t|	jj	j
d jt|
jj	jd ksDJ d|
jd d< |
jd d dksjJ |
jj	jd d dksJ |
jj	j
d jd dksJ |
j
jd d dksJ |
j
j
d jd dksJ |	jd d dksJ |	jj	jd d dksJ |	jj	j
d jd dks,J |	j
jd d dksFJ |	j
j
d jd dksbJ d|
jj	jd d< |
jd d dksJ |
jj	jd d dksJ |
jj	j
d jd dksJ |
j
jd d dksJ |
j
j
d jd dksJ |	jd d dksJ |	jj	jd d dks0J |	jj	j
d jd dksNJ |	j
jd d dkshJ |	j
j
d jd dksJ d|
jj	j
d jd< |
jd d dksJ |
jj	jd d dksJ |
jj	j
d jd dksJ |
j
jd d dksJ |
j
j
d jd dks J |	jd d dks8J |	jj	jd d dksTJ |	jj	j
d jd dksrJ |	j
jd d dksJ |	j
j
d jd dksJ d|
j
jd d< |
jd d dksJ |
jj	jd d dksJ |
jj	j
d jd dks
J |
j
jd d dks$J |
j
j
d jd dks@J |	jd d dksXJ |	jj	jd d dkstJ |	jj	j
d jd dksJ |	j
jd d dksJ |	j
j
d jd dksJ d|
j
j
d jd< |
jd d dksJ |
jj	jd d dksJ |
jj	j
d jd dks,J |
j
jd d dksFJ |
j
j
d jd dksbJ |	jd d dkszJ |	jj	jd d dksJ |	jj	j
d jd dksJ |	j
jd d dksJ |	j
j
d jd dksJ d S )Nr   r   r  r  rJ   r  rb   r  r	  r
  r  r  r  r  r  r  r  r   r   r   r   r   r   r   )r   rL   r   r0   rr   r?   rs   ro   r   r   r/   r   )r@   r  r!   r~   r   r   r   r   r)  r/  r   r   r   r   test_bin_table_hdu_constructor2  s    

z1TestTableFunctions.test_bin_table_hdu_constructorc                 C   s   t jt jfD ]}| }|jdks$J d|jvs2J d|_|jdksFJ |jd dksXJ |dd}|jdkspJ |jd dksJ t  }d|d< ||dd}|jdksJ |jd dksJ qdS )ztestConstructorNameArg

        Passing name='...' to the BinTableHDU and TableHDU constructors
        should set the .name attribute and 'EXTNAME' header keyword, and
        override any name in an existing 'EXTNAME' value.
        r   ZEXTNAMEFOO)r   ZEVENTS)r<   r   N)r   r?   r   r   r<   Headerr@   Zhduclsr   hdrr   r   r   test_constructor_name_arg  s    
z,TestTableFunctions.test_constructor_name_argc                 C   s   t jt jfD ]}| }|jdks$J d|jvs2J d|_|jdksFJ |jd dksXJ |dd}|jdkspJ |jd dksJ t  }d|d< ||dd}|jdksJ |jd dksJ qd S )	Nr   ZEXTVERrV   rO   )verrP   rQ   )r<   r  )r   r?   r   r  r<   r  r  r   r   r   test_constructor_ver_arg  s    
z+TestTableFunctions.test_constructor_ver_argc                 C   s$   t jdddgd}t j|g dS )z
        Regression test for https://github.com/astropy/astropy/issues/5204
        "Handle unicode FITS BinTable column names on Python 2"
        ZspamrM   g      E@rJ   N)r   r0   r?   rs   )r@   r7   r   r   r   test_unicode_colname  s    z'TestTableFunctions.test_unicode_colnamec                 C   s   t jddddgddggd}t |g}t j|}|jdd tjddgt	dk
 s^J |jdd tjddgt	dk
 sJ t j|j}|jdd tjddgt	dk
 sJ |jdd tjddgt	dk
 sJ d S )	Nr  Z2LTFrJ   r   rH   r   )r   r0   rr   r?   rs   ro   r$   r   rL   ri   rv   )r@   r~   r)  r/  r5   r   r   r   !test_bin_table_with_logical_array  s$    z4TestTableFunctions.test_bin_table_with_logical_arrayc                 C   s|  t | d}|j|dk s(J |j|d k s>J t | d}dD ]8}t||}|||k svJ ||| k sRJ qRt | d}dD ]8}t||}|||k sJ ||| k sJ qt jddtj	d	d
gg dgtj
dd}t j|g}t|jd t|jjks0J |jd d |jjd k sTJ |jd d |jjd k sxJ d S )Nr4  r7  rC   r   r   )r   r   r   PI()-   8      r\     rH   rJ   r   r   )r   rW  ro   r7  r$   rv   r3   r0   r   rL   object_r?   rs   r&   r   )r@   r_  r7   ro   r   r   r   r   r   test_fits_rec_column_access  s,    

 $z.TestTableFunctions.test_fits_rec_column_accessc                 C   sz  t | d}|d }d|jjv s(J d|jjv s8J d|jjjv sJJ |jd d dks`J t|jd d tjg dtj	d	sJ |jd d
 dksJ |jd d dksJ |jd d dksJ t|jd d tjg dtj	d	sJ |jd d
 dks
J |jd d dks"J |
| d |  t | d}|d }d|jjv sdJ d|jjv svJ d|jjjv sJ |jd d dksJ t|jd d tjg dtj	d	sJ |jd d
 dksJ |jd d dksJ |jd d dksJ t|jd d tjg dtj	d	s>J |jd d
 dksVJ |jd d dksnJ |  d S )Nzerowidth.fitsrV   ZORBPARMr   ZANNAMEzVLA:_W16ZSTABXYZ)g~ϰ=@gs!gzarH   ZNOSTAr   ZMNTSTArg  zVPT:_OUT)r   r   r      r  )r   rn   ro   r/   r!   r   r   r   rL   r   rx   ry   rz   )r@   r   r5   r   r   r   !test_table_with_zero_width_column  sZ    



z4TestTableFunctions.test_table_with_zero_width_columnc                 C   s  g d}d}t jddt|d}t j|g}|j d|ksHJ |	| 
d t | 
dF}|d j d|ksJ |d jd |k sJ W d    n1 s0    Y  ~t j|g}|j	| 
dd	d
 t | 
dh}|d j d|ddksJ |d jd |k s6J t j|d j }W d    n1 sb0    Y  ~|j	| 
dd	d
 t | 
dJ}|d j d|ksJ |d jd |k sJ W d    n1 s0    Y  d S )N)Zimg1Zimg2Zimg3apz(img1      img2      img3a     p         ZMEMNAMEr  rJ   zraw-unicode-escaper  r   Trl     )r   r0   rp   rL   r?   rs   ro   tobytesdecoderx   ry   rn   rv   r   replacecopy)r@   r   sacolZahdur   r   r   r   test_string_column_padding)  s2    8

6z-TestTableFunctions.test_string_column_paddingc              
   C   s  t jjg ddfg ddfg ddfgdd}tj|}|| d	 tj| d	d
d,}d|d j	d< d|d j	d< W d   n1 s0    Y  t| d	}|d }|j
d}|j
d}|jdksJ |jdksJ |t ddgddgddggddgddgddggddgddgddgggk s<J |t ddgddgddggk sfJ W d   n1 s|0    Y  ~~~~t jdd d!gd"}d#|d$< d%|d&< tj| d	|d'd( t| d	}|djjd) d*ksJ |djd+ksJ t jdd d,gd"}d#|d$< d%|d&< ~tj| d	|d'd( t| d	}|djjd) d*ksnJ |djd-ksJ dS ).zv
        Tests the multidimensional column implementation with both numeric
        arrays and string arrays.
        )r   r   rV   rO   rP   rQ   Zrow1row1)rj   rk   rz  ry  r   r   Zrow2row2)rV   rO   rP   rQ   rj   rk   Zrow3row3z6i4,a8r#  r  updatemode(2,3)r   TDIM1z(4,2)TDIM2Nr   )rO   rO   rV   rO   rV   rV   rO   rP   rQ   rj   rk   rz  ry  Zrow1Zrow2Zrow3)r   f4)r  S5rP   rH   rU   r   okr  Trl   rg  5)rO   rP   )r  r  )rP   rO   )rO   rP   rO   )r   rt   rL   r   r?   rs   rx   ry   rn   r<   ro   r$   r(  rv   rV  rW  r   rw   )r@   ro   rA   r   r~   r   r   r   r   r   test_multi_dimensional_columnsK  sZ    


,2z1TestTableFunctions.test_multi_dimensional_columnsc                 C   s   t jddgdgd}tj|}|| d t| dD}|d }|j	d}|j
dksdJ |jd	 d
ksvJ W d    n1 s0    Y  d S )Nr   rV   )r   r`   r   rH   zonedtable.fitsr   r   )rV   r   r  z(1))r   rL   r   r?   rs   rx   ry   rn   ro   r$   r(  r<   )r@   ro   rA   r   rG  r   r   r   test_oned_array_single_element  s    z1TestTableFunctions.test_oned_array_single_elementc                    sr   ddgddgddgg}t j|f|f|f|f|fgdgd}tj|d	} fd
d}|| tj|}|| dS )a}  
        Tests two ways of creating a new `BinTableHDU` from a column of
        string arrays.

        This tests for a couple different regressions, and ensures that
        both BinTableHDU(data=arr) and BinTableHDU.from_columns(arr) work
        equivalently.

        Some of this is redundant with the following test, but checks some
        subtly different cases.
        s   abcds   efghs   ijkls   mnops   qrsts   uvwx)r   z(3, 2)S4rH   rK  c                    s   | j d jdksJ | j d jjds,J | j ddd t dt}|d }|j	d d	kslJ |j d jdksJ | j d jjdsJ t
|j d | j d ksJ W d    n1 s0    Y  d S )
Nr   )rQ   rO   rV   ZU4rL  Trl   r   r  z(4,2,3))ro   r(  r   rw   endswithrx   ry   r   rn   r<   r   rv   )r5   r   r{  r@   r   r   test_dims_and_roundtrip  s    z`TestTableFunctions.test_bin_table_init_from_string_array_column.<locals>.test_dims_and_roundtripN)r   rL   r   r?   rs   )r@   ro   arrr/  r  r{  r   r  r   ,test_bin_table_init_from_string_array_column  s    z?TestTableFunctions.test_bin_table_init_from_string_array_columnc           
      C   s  ddgddgddgg}g d}t j||f||fgdd	gd
}tj|d}|| d t| dd}| }W d   n1 s0    Y  t| dd"}||	dd W d   n1 s0    Y  t| d}|d }|j
d dksJ |j
d dksJ |jD ]F}	t |	d ddgddggks@J t |	d g dksJ qW d   n1 sv0    Y  dS )a  
        According to the FITS standard (section 7.3.2):

            If the number of elements in the array implied by the TDIMn is less
            than the allocated size of the ar- ray in the FITS file, then the
            unused trailing elements should be interpreted as containing
            undefined fill values.

        *deep sigh* What this means is if a column has a repeat count larger
        than the number of elements indicated by its TDIM (ex: TDIM1 = '(2,2)',
        but TFORM1 = 6I), then instead of this being an outright error we are
        to take the first 4 elements as implied by the TDIM and ignore the
        additional two trailing elements.
        s   abs   cds   efs   ghs   ijs   klr   rV   rO   rP   rQ   )r   z(3, 2)S2)r   Z5i8rH   rK  rL  rbNwbs   (2,2,3)s   (2,2,2)r   r  z(2,2,2)TFORM1Z12Ar   abcdZefZghr   )r   rL   r   r?   rx   ry   rn   r   rX  r  r<   ro   rv   )
r@   arr1arr2r  r5   r   Z	raw_bytesr   r{  r)   r   r   r   !test_columns_with_truncating_tdim  s$    &0
$z4TestTableFunctions.test_columns_with_truncating_tdimc                 C   s(  g dg dg dg}t jj|f|fgdgd}tj|d}|| d t| d}d|d	 jv spJ |d	 jd d
ksJ t	|d	 j
dksJ t	|d	 j
d d	ksJ |d	 j
dd t j|dd dk sJ W d   n1 s0    Y  t| d2}|d	 j
dd  || d W d   n1 sR0    Y  t| d}d|d	 jv sJ |d	 jd d
ksJ t	|d	 j
dksJ t	|d	 j
d d	ksJ |d	 j
dd t j|dd dk sJ W d   n1 s0    Y  dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/201)rD   rE   Zghi)ZjklZmnoZpqr)ZstuZvwxzyz z(3,3)S3r#  rK  rL  r  r   z(3,3,3)rV   r   asciiNrT  )r   rt   rL   r   r?   rx   ry   rn   r<   r    ro   r$   r   r  rv   )r@   ro   Zrecarrr   r   r   r   r   test_string_array_round_trip  s4    *0z/TestTableFunctions.test_string_array_round_tripc                 C   s8  t jddgdd}t jddgddggdd}t d	d
gddggddgddggg}tjdd|dtjddd|dtjddd|dg}tjt|}|| d t	| dl}|d	 j
d d|k sJ |d	 j
d d|k sJ |d	 j
d |k sJ W d   n1 s*0    Y  dS )zVRegression test for
        https://github.com/spacetelescope/PyFITS/issues/3
        r   r   z|S1rH   Zbcr  ez|S2r   rV   rO   rP   rQ   rj   rk   rz  rw   Z1ArJ   ZstrarrayZ4A(2,2)r   rK   r   rL   Zintarray4Iz(2, 2)rL  r  N)r   rL   r   r0   r?   rs   rr   rx   ry   rn   ro   encoderv   )r@   arraarrbZarrcr   r   r   r   r   r   test_new_table_with_nd_column  s"    &

  z0TestTableFunctions.test_new_table_with_nd_columnc                 C   s  t ddgddggddgddggg}t d	d
gddggddgddggg}tjddd|dtjddd|dg}tjt|}|| d t	| d}|d j
d dksJ |d j
d dksJ |d j
d |d j
d   krdksn J |d jd |k sJ |d jd |k s6J |d jjdksLJ W d   n1 sb0    Y  tjttjddd|d dS )ay  Normally the product of the dimensions listed in a TDIMn keyword
        must be less than or equal to the repeat count in the TFORMn keyword.

        This tests that this works if less than (treating the trailing bytes
        as unspecified fill values per the FITS standard) and fails if the
        dimensions specified by TDIMn are greater than the repeat count.
        r   rV   rO   rP   rQ   rj   rk   rz  ry  r  r  r\  r           r   Z20Ir  r  r   r  rL  r  TFORM2r  r  0   NZ2I)r   rL   r   r0   r?   rs   rr   rx   ry   rn   r<   ro   rv   itemsizerh  ri  r   )r@   r  r  r   r   r   r   r   r   test_mismatched_tform_and_tdim-  s*    	&&

.6z1TestTableFunctions.test_mismatched_tform_and_tdimc                 C   sL   t | d(}|d jd jdks*J W d   n1 s>0    Y  dS )z@Regression test for https://github.com/astropy/astropy/pull/3580z	tdim.fitsr   r7  )rO   r   r   N)r   rn   ro   r(  )r@   Zhdulistr   r   r   test_tdim_of_size_oneO  s    z(TestTableFunctions.test_tdim_of_size_onec                 C   s2  t | d}|d j}W d   n1 s00    Y  |d}|dd }|d|k sfJ tt|d D ]X}|d| }|d|d| k sJ ||d }|d||d k svJ qv|ddd }|d|ddd k sJ |ddd }|d|ddd k s.J dS )zDRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/52r4  r   Nr  rV   rg  )r   rn   ro   r$   rv   r#   r    )r@   r   ro   targetsr  nr   r   r   test_slicingU  s    (
  zTestTableFunctions.test_slicingc                 C   s   t | d}|d j}W d   n1 s00    Y  ||d dk }|t|d dk }|dg }|dd }||||fD ]}t|t jsJ qt||sJ t||sJ t||sJ dS )zDRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/55r4  r   Nr  r8  r   r   rn   ro   r   wherer%   r   r*   r@   r   ro   s1s2Zs3Zs4r  r   r   r   test_array_slicingg  s    (
z%TestTableFunctions.test_array_slicingc              	   C   s   t | d}|d j}d|d< t|d dks:J d|d< t|d dksXJ tttjfD ]2}|g d|d< t|d tg dsdJ qdW d   n1 s0    Y  dS )zV
        Regression test for https://github.com/spacetelescope/PyFITS/pull/48
        r4  r   r   r7  rU   N)	r   rn   ro   r   rv   rN  tuplerL   array_equal)r@   r   ro   Z	containerr   r   r   test_array_broadcastingw  s    
z*TestTableFunctions.test_array_broadcastingc                 C   s   t j| ddd}|d j}W d   n1 s40    Y  ||d dk }|t|d dk }|dg }|dd }||||fD ]}t|t jsJ qt||sJ t||sJ t||sJ dS )	z
        Like test_array_slicing but with the file opened in 'readonly' mode.
        Regression test for a crash when slicing readonly memmap'd tables.
        r4  readonlyr  r   Nr  r8  r   r  r  r   r   r   test_array_slicing_readonly  s    (
z.TestTableFunctions.test_array_slicing_readonly	tablenamer4  rC   c                 C   s   t | |t}|d }| d}| d}| d}|||| t j|||}t|j|jshJ t||d  W d   n1 s0    Y  dS )z
        A simple test of the dump/load methods; dump the data, column, and
        header files and try to reload the table from them.
        r   data.txtcoldefs.txt
header.txtN)	r   rn   ro   ry   dumpr?   loadr*   r9   )r@   r  r   r5   datafilecdfilehfiler4   r   r   r   test_dump_load_round_trip  s    


z,TestTableFunctions.test_dump_load_round_tripc                 C   s   t jjdg ddfdg ddfgdd}tj|}| d	}| d
}| d}|||| tj|||}t	|j
|j
sJ t|jt|jksJ dS )z
        Regression test for https://github.com/spacetelescope/PyFITS/issues/22

        Ensures that a table containing a multi-value array column can be
        dumped and loaded successfully.
        r   rH  g?r   )rQ   rj   rk   rz  g?z	a1,4i4,f8r#  r  r  r  N)r   rt   rL   r   r?   rs   ry   r  r  r*   ro   rw   r<   )r@   ro   r5   r  r  r  r4   r   r   r   test_dump_load_array_colums  s    


z.TestTableFunctions.test_dump_load_array_columsc              
   C   sz  t jg dtd}tjdd|d}t jg dt jd}tjdd|d}t jg d	t jd}tjd
d|d}t jg dt jd}tjdd|d}t g d}	tjdd|	d}
t jg dt jd}tjdd|d}t jg dt j	d}tjdd|d}t jg dg dg dgt jd}tjdd|d}tj
|||||
|||g}| d}|| tj
|}t|j|jsvJ dS )a9  
        Tests loading a table dump with no supplied coldefs or header, so that
        the table format has to be guessed at.  There is of course no exact
        science to this; the table that's produced simply uses sensible guesses
        for that format.  Ideally this should never have to be used.
        )FTFrH   c0r  rJ   )r         r   B)iЊr      r   rT   )iMJi  iVr   rb   )r   rD   r  r   r   ro  rp  rq  r   r   )y?@yffffff
@@y      @ffffff@r   MrU   )rP   rQ   rj   )rk   rz  ry  rX   PJ()r  N)r   rL   ri   r   r0   rq   r   r   r   Z
complex128r?   rs   ry   r  r  r*   ro   )r@   Za0r  r   r   r   r   r   r   r   r   r   r   r   r   r   rX   r5   r  r4   r   r   r   test_load_guess_format  s.    	
"

z)TestTableFunctions.test_load_guess_formatc                 C   s   t jdddgd}t jdddgd}t jdddgd}t j|||g}|jjg d	ks\J |jjdgd ksrJ |jd dgk sJ |jd dgk sJ |jjdgk sJ d
S )a=  
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/86

        Numpy recarray objects have a poorly-considered feature of allowing
        field access by attribute lookup.  However, if a field name coincides
        with an existing attribute/method of the array, the existing name takes
        presence (making the attribute-based field lookup completely unreliable
        in general cases).

        This ensures that any FITS_rec attributes still work correctly even
        when there is a field with the same name as that attribute.
        r!   rT   r   rJ   r   rV   otherrO   )r!   r   r  N)	r   r0   r?   rs   ro   r!   r   rv   r  )r@   r~   r   r   r   r   r   r   test_attribute_field_shadowing  s    z1TestTableFunctions.test_attribute_field_shadowingc                 C   s   t jjddgdd}tj|}|jjddgks4J t|j	|sDJ |
| d tj| ddd}|jjddgks|J t||sJ d	S )
z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/113

        Tests creating a table from a recarray containing numpy.bool columns.
        )TF)FTz|b1,|b1r#  r  r4  r   )ZextN)r   rt   rL   r   r?   rs   r/   r   r*   ro   rx   ry   rW  )r@   rL   rA   ro   r   r   r   test_table_from_bool_fields	  s    z.TestTableFunctions.test_table_from_bool_fieldsc                 C   s>   t jg ddgd}tj|d}|jd |d k s:J dS )z
        Regression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/215

        Tests the case where a multi-field ndarray (not a recarray) containing
        a bool field is used to initialize a `BinTableHDU`.
        )F)Tr  )r   ?rH   rK  r   N)r   rL   r   r?   ro   rv   )r@   r  r   r   r   r   test_table_from_bool_fields2	  s    z/TestTableFunctions.test_table_from_bool_fields2c                 C   s  t jddddgd}t jddddgd}t jt ||g}|| d t j| ddd	4}d|d
 jd d
< d|d
 jd d< W d   n1 s0    Y  t | dL}|d
 jd ddgk	 sJ |d
 jd ddgk	 sJ W d   n1 s
0    Y  dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/139F1r  TFrL   ZF2r4  r  r  r   r   N)
r   r0   r?   rs   rr   rx   ry   rn   ro   rv   )r@   r~   r   rA   r   r   r   r   test_bool_column_update%	  s    0z*TestTableFunctions.test_bool_column_updatec              
      sR  t jdddtg ddd}t j|g}|| d t j| ddd	* d
 d j	d<  d j	d= W d   n1 s0    Y  t | d$ t
t fdd W d   n1 s0    Y  zDt | d  d jd  W d   n1 s0    Y  W n: tyL } z t|ds8J W Y d}~n
d}~0 0 dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/197r  r   ---)z1.0z2.0r  z3.0T)r   rL   r  rL  r  r  ZE3r   r  rM  Nc                      s    d j d S )Nr   r  rK  r   r   r   r   re  E	  rf  z7TestTableFunctions.test_missing_tnull.<locals>.<lambda>zYthe header may be missing the necessary TNULL1 keyword or the table contains invalid data)r   r0   r   rL   r   rs   rx   ry   rn   r<   rh  ri  
ValueErrorro   rw   r  )r@   rG  rY  r  r   r  r   test_missing_tnull5	  s$    
*22z%TestTableFunctions.test_missing_tnullc           	      C   s  d}t jdd|tg ddd}t j|g}|| d t| ddd	4}|	 
d
d}|d || W d   n1 s0    Y  t j| ddd*}|d jd d dksJ W d   n1 s0    Y  d}t jdd|tg ddd}t j|g}|| d t| ddd	4}|	 
dd}|d || W d   n1 sr0    Y  t j| dddF}|d jd d dkst|d jd d sJ W d   n1 s0    Y  dS )aY  Regression test for https://github.com/astropy/astropy/issues/5134

        Blank values in numerical columns of ASCII tables should be replaced
        with zeros, so they can be loaded into numpy arrays.

        When a TNULL value is set and there are blank fields not equal to that
        value, they should be replaced with zeros.
        r  r  ZI8r   r   rV   rO   rP   T)rK   r   rL   r  zascii_null.fitszr+r  z2       z        r   N)Zmemmapr   rV   ZNaNzF12.8r   zascii_null2.fitsz
3.00000000z
          r   )r   r0   r   rL   r   rs   rx   ry   rn   r   r  seekrX  ro   Zisnan)	r@   Znullval1r~   rY  r   Znulledr   Znullval2r   r   r   r   test_blank_field_zeroO	  s4    

(8

*z(TestTableFunctions.test_blank_field_zeroc                 C   s0   dgd }t jdd|d}||jk s,J dS zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/218i   r   rM   rK   rL   Nr   r0   rL   rv   r@   r  r7   r   r   r   test_column_array_type_mismatch~	  s    
z2TestTableFunctions.test_column_array_type_mismatchc                 C   s*  t | dd}|d j d|d _t|d jt js<J t|d jdksRJ |d | d W d   n1 sz0    Y  t | d}|d jd dksJ |d jd d	ksJ |d jd
 dksJ t|d jt jsJ t|d jdksJ W d   n1 s0    Y  dS )zWRegression test
        for https://github.com/spacetelescope/PyFITS/issues/27
        rC   r   Nr   rL  ZNAXISrV   NAXIS1r\  NAXIS2)	r   rn   ro   r%   r   r    rx   ry   r<   )r@   r   r   r   r   test_table_none	  s    

2z"TestTableFunctions.test_table_nonec              	   C   s   t | d$}|d | d W d   n1 s:0    Y  d|d jvsVJ t | dz}t | dJ}t|d jt|d jksJ t|d j|d jsJ W d   n1 s0    Y  W d   n1 s0    Y  dS )aC  Test unnecessary parsing and processing of FITS tables when writing
        directly from one FITS file to a new file without first reading the
        data for user manipulation.

        In other words, it should be possible to do a direct copy of the raw
        data without unnecessary processing of the data.
        r4  r   rL  Nro   )	r   rn   ro   rx   ry   r1   rw   r<   r*   )r@   r   Zh1h2r   r   r   test_unncessary_table_load	  s    	2 z-TestTableFunctions.test_unncessary_table_loadc                 C   s   t | d}t|d jjd ts*J t j|d j}t|d jjd trVJ |	| 
d t | 
d*}t|d j|d jsJ W d   n1 s0    Y  |  dS )a  Tests a rare corner case where the columns of an existing table
        are used to create a new table with the new_table function.  In this
        specific case, however, the existing table's data has not been read
        yet, so new_table has to get at it through the Delayed proxy.

        Note: Although this previously tested new_table it now uses
        BinTableHDU.from_columns directly, around which new_table is a mere
        wrapper.
        r4  r   r   rL  N)r   rn   ro   r%   r/   r   r   r?   rs   rx   ry   r*   rz   )r@   r   r   hdul2r   r   r   &test_table_from_columns_of_other_table	  s    8z9TestTableFunctions.test_table_from_columns_of_other_tablec              	   C   s  t | d}|d j}t j|d}|j| ddd t | d}|d j}t|d |d ksrJ t|d |d ksJ t|d	 tj	|d	 tj	ksJ tt
|d
 dd|d
 ksJ W d   n1 s0    Y  W d   n1 s0    Y  dS )z?Tests initializing a TableHDU with the data from a BinTableHDU.rC   r   rK  rL  Trl   r~   r   r   r   TFN)r   rn   ro   r   rx   ry   r   rv   Zastyper   r  )r@   r   r_  r5   r  Ztbdata2r   r   r   test_bintable_to_asciitable	  s    


z.TestTableFunctions.test_bintable_to_asciitablec              	   C   s  t | dr}t|d jjd ts,J t|d j}t	|}t|d jjd tr`J t
||d jstJ W d   n1 s0    Y  t | d>}t|d j}t	|}t
||d jsJ W d   n1 s0    Y  t | d@}t|d j}t	|}	t
|	|d js2J W d   n1 sH0    Y  t | dp}
t|
d j}t	|}tjtd	d
& t
||
d jsJ W d   n1 s0    Y  W d   n1 s0    Y  dS )
        Regression test for https://github.com/astropy/astropy/issues/1597

        Tests for pickling FITS_rec objects
        rC   r   r   Nr   random_groups.fitsr  rV   zField 2 has a repeat count of 0r^  r   rn   ro   r%   r/   r   r   pickledumpsloadsr*   rh  warnsUserWarningr@   ZbtbZbtb_pdZbtb_plZascZasc_pdZasc_plZrgrZrgr_pdZrgr_plZzwcZzwc_pdZzwc_plr   r   r   test_pickle	  s&    
2
2
6
zTestTableFunctions.test_picklec                 C   sp   t jg g dd}t|}|jd dks.J |jd dks@J |jd dksRJ |jd	}|jd
kslJ d S )N))r   i8)r   ZS64)rG  )r`   r  rH   r  `   r	  r   ZTDIM3r  r   )r   )r   rL   r   r?   r<   ro   r$   r(  )r@   rL   r   r$   r   r   r   test_zero_length_table
  s    
z)TestTableFunctions.test_zero_length_tablec                 C   s   t | dd }t jd|ddd}t j|g}|| d t | d,}t	
|d jd |ksrJ W d	   n1 s0    Y  d	S )
a  
        When creating a table column with non-trivial TDIMn, and
        big-endian array data read from an existing FITS file, the data
        should not be unnecessarily byteswapped.

        Regression test for https://github.com/astropy/astropy/issues/3561
        r  ZDATATESTz(3,1,128,1,1)Z1152E)r   rL   r   rK   rL  r   N)r   rW  ro   r0   r?   rs   rx   ry   rn   r   rv   )r@   ro   r7   rA   r   r   r   r   #test_dim_column_byte_order_mismatch
  s    	
z6TestTableFunctions.test_dim_column_byte_order_mismatchc                 C   s   t | d}t | d}t|t| }t jj||d}||t|d< |d dk}|| }t|dd |dd sJ t|dd |dd sJ t|t | dsJ dS )a*  
        Tests creating a `FITS_rec` object with `FITS_rec.from_columns`
        from an existing `FITS_rec` object read from a FITS file.

        This ensures that the per-column arrays are updated properly.

        Regression test for https://github.com/spacetelescope/PyFITS/issues/99
        rC   rc   Nr~   r   )r   rW  ro   r    r   rs   r*   )r@   Zdata1Zdata2rd   Zmergedr`  Zmaskedr   r   r   test_fits_rec_from_existing#
  s    z.TestTableFunctions.test_fits_rec_from_existingc                 C   s  t jdgdgd}t| d| tj| ddd<}d|d jd	 d
< |d jd	 d
 dksfJ W d   n1 sz0    Y  t| d*}|d jd	 d
 dksJ W d   n1 s0    Y  t jg dg dgfgdgd}t| d| g dg dg}tj| ddd\}|d jd dks>J d|d jd	 d< t |d jd	 d
 |ksrJ W d   n1 s0    Y  t| dJ}|d jd dksJ t |d jd	 d
 |ksJ W d   n1 s0    Y  dS )z
        Regression test for https://github.com/astropy/astropy/issues/4452

        Ensure that changes to values in a string column are saved when
        a file is opened in ``mode='update'``.
        )rD   )r   S3rH   rL  r  r  XYZr   r   r   N)rD   rE   Zgeh)ijkZlmnopq)r   )r#  )rV   rO   rT  )r%  r$  r&  r  z(3,3,2))r   r   r   )	r   rL   r   rx   ry   rn   ro   r<   rv   )r@   ro   r   Zexpectedr   r   r   !test_update_string_column_inplaceC
  s.    88
Bz4TestTableFunctions.test_update_string_column_inplaceznot HAVE_OBJGRAPHc                 C   sB   dd }t d || d W d   n1 s40    Y  dS )z?Regression test for https://github.com/astropy/astropy/pull/520c                 S   sR   t | }|d j }W d    n1 s.0    Y  |jjD ]}||  q@d S )Nr   )r   rn   ro   r  r   r!   )filenamer   ro   Zcolnamer   r   r   readfiler
  s    ,z8TestTableFunctions.test_reference_leak.<locals>.readfiler   zmemtest.fitsN)_refcountingro   )r@   r)  r   r   r   test_reference_leakn
  s    
z&TestTableFunctions.test_reference_leakc              	   C   s8  ddl m} ddlm} | }|  z<td |  W d   n1 sN0    Y  W |  n
|  0 ~|  }dD ]X}|  z@td t	||  W d   n1 s0    Y  W |  q||  0 q|~| }|
  z@td || W d   n1 s0    Y  W |  n
|  0 ~dS )aG  
        Regression test for https://github.com/astropy/astropy/pull/4539

        This actually re-runs a small set of tests that I found, during
        careful testing, exhibited the reference leaks fixed by #4539, but
        now with reference counting around each test to ensure that the
        leaks are fixed.
        r   )TestCore)TestMultipleHDUr   N)r   r   r   r   )Z	test_corer,  Ztest_connectr-  Zsetupr*  Ztest_add_del_columns2Zteardown	__class__r3   Zsetup_classZ	test_readZteardown_class)r@   tmpdirr,  r-  rW   rY   Z	test_namer[   r   r   r   test_reference_leak2|
  s0    
(
,
,z'TestTableFunctions.test_reference_leak2c              	   C   s   t | d}|d }| d}| d}| d}|||| d}tjt|d |||| W d    n1 s|0    Y  |j|||dd	 tjt	d
d" |j|||dd W d    n1 s0    Y  W d    n1 s0    Y  d S )Nr4  r   r  r  r  zFile .* already exists\.  File .* already exists\.  File .* already exists\.  If you mean to replace the file\(s\) then use the argument 'overwrite=True'\.r  Trl   zq"clobber" was deprecated in version 2\.0 and will be removed in version 5\.1\. Use argument "overwrite" instead\.)Zclobber)
r   rn   ro   ry   r  rh  ri  OSErrorr  r	   )r@   r   r5   r  r  r  msgr   r   r   test_dump_clobber_vs_overwrite
  s    


,z1TestTableFunctions.test_dump_clobber_vs_overwritec                 C   s  t jg dt jd}tjddd|d}tj|g}|| d tj	| ddd	}|d
 }d|j
v spJ |j
d dksJ |jd jt dksJ t |jd |ksJ d|jd d< || d W d   n1 s0    Y  tj	| ddd	v}|d
 }d|j
v sJ |j
d dks2J |jd jt dksNJ t |jd g dkslJ W d   n1 s0    Y  dS )zP
        Tests updating a table column containing pseudo-unsigned ints.
        rU   rH   rS  r           )r   rK   r   rL   rL  T)Zuintr   ZTZERO1uint32c   r   rT  N)r6  rV   rO   )r   rL   r5  r   r0   r?   rs   rx   ry   rn   r<   ro   r   rv   )r@   ro   r7   rA   r   r   r   r   r   test_pseudo_unsigned_ints
  s$    .z,TestTableFunctions.test_pseudo_unsigned_intsc                 C   s2  t jdtjdgdddddd}t t  t j|gg}d|d jd d	< |	| 
d
 |d jd dkstJ t | 
d
L}d|d jd d	< |d jd d	 dksJ |	| 
d W d   n1 s0    Y  t | 
d,}|d jd d	 dksJ W d   n1 s$0    Y  dS )zCheck that a scaled column if correctly saved once it is modified.
        Regression test for https://github.com/astropy/astropy/issues/6887
        r~   r   z>i2rH   1I   )r   rL   rK   r   r   rV   r   za.fitsr  zb.fitsN)r   r0   r   rL   r=   r>   r?   rs   ro   rx   ry   rn   )r@   r~   r   r\   r   r   r   r   test_column_with_scaling
  s    
.z+TestTableFunctions.test_column_with_scalingc                 C   s   t jg ddd}t jg ddd}t jg ddd}t jg ddd}t||d	 |||g}t| d
}|j|jks~J t||sJ dS )z
        Test correct integer dtypes according to ASCII table field widths.
        Regression for https://github.com/astropy/astropy/issues/9899
        )rz     i  r  r;  r`   rH   )r  i   rD  r<  r  )i       l         (   r=  )r      i 2   r?  rR   rV   zascii_i4-i20.fitsN)r   rL   r   r   ro   r   r*   )r@   Zi08Zi10Zi20Zi02Zt0rW   r   r   r   test_ascii_inttypes
  s    z&TestTableFunctions.test_ascii_inttypesN)P__name__
__module____qualname__rB   r   r   r   r   r   r   r   r   r   r   r+  r0  r3  r;  r=  r>  rE  rQ  r[  ra  rk  rm  rt  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rh  markparametrizer  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r!  r"  r'  skipifr+  r0  r3  r7  r:  rA  r   r   r   r   r:   ~   s   W)IX ' /@BD[i ]	/"A(.""
*/% +



,r:   c                 c   sB   t   tt| }|V  t   tt| |ks>J ddS )z
    Perform the body of a with statement with reference counting for the
    given type (given by class name)--raises an assertion error if there
    are more unfreed objects of the given type than when we entered the
    with statement.
    z/More {0!r} objects still in memory than before.N)gcZcollectr    objgraphZby_type)type_Zrefcountr   r   r   r*    s    	r*  c                   @   s   e Zd Z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je o\eo\ejdkdddd Zdd Zdd Zdd ZdS )TestVLATablesz;Tests specific to tables containing variable-length arrays.c                    s"    fdd}dD ]}|| qd S )Nc                    s   t jd| dgd gd d}t j|g}t  }t ||g}|j ddd t  df}|d	 j	
d}|d d
d tjg dtjdk sJ |d	 jd jdsJ W d    n1 s0    Y  d S )NQUAL_SPEr   i#     rJ   r   Trl   r   rP   rz  )r   r   r   r   rH   zJ(1571))r   r0   r?   rs   r>   r=   rx   ry   rn   ro   r$   r   rL   rq   rv   r/   rK   r  )format_coder7   tb_hdupri_hduhdu_listZtotoqr  r   r   test  s    z8TestVLATables.test_variable_length_columns.<locals>.testr  zQJ()r   r@   rS  coder   r  r   test_variable_length_columns  s    z*TestVLATables.test_variable_length_columnsc                 C   s   dd }dD ]}|| qdS )zDRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/54c                 S   s   dgd gd }t jd| |d}t jdddgd d}t jj||gdd}t|jd dks`J t|jd dksvJ |jd d	 |d	 k sJ |jd d
 |d
 k sJ |jd d d	gd k sJ |jd d d	gd k sJ d S )Nr   r  ZTESTVLFrJ   ZTESTSCArb   r  rc   r   ry  rg  )r   r0   r?   rs   r    ro   rv   )rN  r  r   r   rO  r   r   r   rS  +  s     z=TestVLATables.test_extend_variable_length_array.<locals>.testrT  Nr   rU  r   r   r   !test_extend_variable_length_array(  s    z/TestVLATables.test_extend_variable_length_arrayc                    s"    fdd}dD ]}|| qd S )Nc                    s   t t ddgt dgt dggd}tjd| |d}tj|g}|j ddd	 t dv}|d
 j	d j
dsJ tdD ]B}tt|| D ],}|d
 jd| | || | ksJ qqW d    n1 s0    Y  d S )NnP*@;'x[;r   OtestarJ   r  Trl   r   r   D(2)rO   r   rL   r   r0   r?   rs   rx   ry   rn   r/   rK   r  r#   r    ro   r$   rN  r   r  r5   r/  r  r(   r  r   r   rS  ?  s    
zRTestVLATables.test_variable_length_table_format_pd_from_object_array.<locals>.testzPD()zQD()r   rU  r   r  r   6test_variable_length_table_format_pd_from_object_array>  s    zDTestVLATables.test_variable_length_table_format_pd_from_object_arrayc                    s"    fdd}dD ]}|| qd S )Nc                    s   t ddgt dgt dgg}tjd| |d}tj|g}|j ddd t dv}|d	 j	d
 j
dsJ tdD ]B}tt|| D ],}|d	 jd
| | || | ksJ qqW d    n1 s0    Y  d S )NrY  rZ  r   r\  rJ   r  Trl   r   r   r]  rO   r^  r_  r  r   r   rS  O  s    
zJTestVLATables.test_variable_length_table_format_pd_from_list.<locals>.testr`  r   rU  r   r  r   .test_variable_length_table_format_pd_from_listN  s    z<TestVLATables.test_variable_length_table_format_pd_from_listc                    s"    fdd}dD ]}|| qd S )Nc                    s   t t g dt ddgt dggd}tjd| |d}tj|g}|j dd	d
 t dv}|d j	d j
dsJ tdD ]B}tt|| D ],}|d jd| | || | ksJ qqW d    n1 s0    Y  d S )NrF  rI  r  r   r[  r\  rJ   r  Trl   r   r   A(3)rO   r^  rN  r   r  r5   r   r  r(   r  r   r   rS  `  s    
zRTestVLATables.test_variable_length_table_format_pa_from_object_array.<locals>.testzPA()zQA()r   rU  r   r  r   6test_variable_length_table_format_pa_from_object_array_  s    zDTestVLATables.test_variable_length_table_format_pa_from_object_arrayc                    s"    fdd}dD ]}|| qd S )Nc                    s   g d}t jd| |d}t j|g}|j ddd t  dv}|d jd j	d	sfJ t
d
D ]B}t
t|| D ],}|d jd| | || | ksJ qqnW d    n1 s0    Y  d S )N)r   r  rD   r\  rJ   r  Trl   r   r   rc  rO   )r   r0   r?   rs   rx   ry   rn   r/   rK   r  r#   r    ro   r$   rd  r  r   r   rS  q  s    zJTestVLATables.test_variable_length_table_format_pa_from_list.<locals>.testre  r   rU  r   r  r   .test_variable_length_table_format_pa_from_listp  s    z<TestVLATables.test_variable_length_table_format_pa_from_listc                    s"    fdd}dD ]}|| qdS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/200c                    s   t jd| tdgd d}t j|g}t  }t ||g}|j 	ddd t 
 	d}t|d |jD ]\}}||k stJ qtd S )NrL  i$  rM  rJ   r   Trl   )r   r0   r   aranger?   rs   r>   r=   rx   ry   rW  rO  rL   rv   )rN  r7   rO  rP  rQ  ro   Zrow_aZrow_br  r   r   rS    s    z,TestVLATables.test_getdata_vla.<locals>.testrT  Nr   rU  r   r  r   test_getdata_vla  s    zTestVLATables.test_getdata_vlaZwin32z+https://github.com/numpy/numpy/issues/20699)reasonc              
   C   s  dd t dD }dd t dD }tjddtdd}tjdd	|d}tjd
d	|d}tj||g}tj||g}tt ||g}|j	| 
ddd t| 
dj}	|	d jd dksJ |	d jd dksJ t|	d j|jsJ t|	d j|jsJ W d   n1 s$0    Y  t| 
d:}	tj|	d j|	d jd}
|
	| 
d W d   n1 s0    Y  t| 
d(}t|d j|jsJ W d   n1 s0    Y  tt g}|	| 
d tj| 
dddh}t dD ]N}t| 
d&}	||	d  |  W d   n1 sT0    Y  qW d   n1 sx0    Y  t| 
d:}t ddD ]}t|| j|jsJ qW d   n1 s0    Y  dS )zX
        Regression test for https://github.com/spacetelescope/PyFITS/issues/47
        c                 S   s   g | ]}t |d  qS r   r   rh  r+   r  r   r   r   r.     rf  z/TestVLATables.test_copy_vla.<locals>.<listcomp>r  c                 S   s   g | ]}t d d| qS )r  r  rk  rl  r   r   r   r.     rf  rS  rb   r  rS  PJr  rL  Trl   r   r  zPJ(255)rV   N)ro   r<   rU  rT  rm   r  rO   )r#   r   r0   r   rh  r?   rs   r=   r>   rx   ry   rn   r<   r*   ro   rm   flush)r@   r  r  rG  r~   r   rW   rY   r   r   Znew_hdur  Znew_hdulr   idxr   r   r   test_copy_vla  s:    808LzTestVLATables.test_copy_vlac                 C   sd   t | d}|d j}|jdks(J |d d dks<J t|d d g dsXJ |  d S )Nztheap-gap.fitsr   )r   r(   i  r  r  )r   rn   ro   r(  r   r  rz   )r@   r   ro   r   r   r   test_vla_with_gap  s    
zTestVLATables.test_vla_with_gapc                 C   s~   t jddtjg dddggtjdd}t j|g}|j g dgddgggksXJ |jd  g dddggkszJ d S )Nvarr  rU   r  r\  rH   rJ   )	r   r0   r   rL   r  r?   rs   ro   tolist)r@   r7   r   r   r   r   test_tolist  s    "zTestVLATables.test_tolistc                 C   s   |  d}t|h}|d }|j  ddgddggg ddd	gggksLJ |j d
  ddgg dgksnJ W d    n1 s0    Y  d S )Nzvariable_length_table.fitsr   r  r  r  rO   r  r\  rP   rr  )ro   r   rn   rs  )r@   r(  r   r   r   r   r   test_tolist_from_file  s
    
.z#TestVLATables.test_tolist_from_fileN)rB  rC  rD  __doc__rW  rX  ra  rb  rf  rg  ri  rh  rE  rG  r   r   sysplatformrp  rq  rt  ru  r   r   r   r   rK    s   
2rK  c                
   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zejddddddddd deejdd!d"dgd#d$ Zd%S )&TestColumnFunctionsc                 C   s  t  D ]P\}}tdt|}|j|k td|}|j|k td|}|j|k qtdd}|jdkstJ |jjdksJ |jjdksJ tdd}|jdksJ |jjdksJ |jjdksJ |jjdksJ tdd	}|jjd
ksJ |jjdksJ |jjdksJ tdd}|jjdks<J |jjdksNJ |jjdks`J tdd}|jjdks~J |jjdksJ |jjdksJ tdd}|jjd
ksJ |jjdksJ |jjdksJ tdd}|jjdksJ |jjdksJ |jjdks&J tdd}|jdksBJ |jj	dksTJ tjdddd}|jdkstJ |jj	dksJ tjdddd}|jdksJ |jj	dksJ tjdddd}|jdksJ |jj	dksJ tjdddd}|jdks
J |jj	dksJ tdd
}|jd
ks8J |jj	dksJJ tjdd
dd}|jdksjJ tdd}|jdksJ tdd}|jdksJ |jj	dksJ tjdddd}|jdksJ dS ) a  
        Test to ensure that when Numpy-style record formats are passed in to
        the Column constructor for the format argument, they are recognized so
        long as it's unambiguous (where "unambiguous" here is questionable
        since Numpy is case insensitive when parsing the format codes.  But
        their "proper" case is lower-case, so we can accept that.  Basically,
        actually, any key in the NUMPY2FITS dict should be accepted.
        r   ZI4rT   rP   zF15.8r  r  rz  zE15.8rM   zD15.8r   zF10.0r  r   zE10.0zD10.0rR   T)r  r   r`   ZI9ZI12r  r  zE15.7zF16.7Zf8zD25.17N)
r   r2   r   r0   r   r   rK   widthr   	recformat)r@   r{  Z
fitsformatrG  r   r   r   !test_column_format_interpretation  s~    


z5TestColumnFunctions.test_column_format_interpretationc                 C   s   t jddg dd}t j|g}|| d t | d}|d jd dksZJ |d jd j	t
	dksxJ t
|d jd g d	ksJ t
jj|d jd}| d
ksJ W d   n1 s0    Y  dS )zT
        Regression test for https://github.com/astropy/astropy/issues/3422
        r   zF5.0r  r  rL  r   r  r   )r   r   r   s      1.   2.   3.N)r   r0   r   rs   rx   ry   rn   r<   ro   r   r   rv   rt   r   r$   r  )r@   rG  r   r   rawr   r   r    test_zero_precision_float_columnI  s     z4TestColumnFunctions.test_zero_precision_float_columnc                 C   s0   dgd }t jdd|d}||jk s,J dS r  r  r  r   r   r   r  \  s    
z3TestColumnFunctions.test_column_array_type_mismatchc                 C   s   t ttjg d dS )zvTest that a TypeError is raised when a ColDefs is instantiated with
        a sequence of non-Column objects.
        rU   N)rh  ri  	TypeErrorr   rr   r  r   r   r   %test_new_coldefs_with_invalid_seqencec  s    z9TestColumnFunctions.test_new_coldefs_with_invalid_seqencec                 C   sF   t jdddgd}tj|}d|d jks0J d|d jksBJ d	S )
z}Test that ColDefs._init_from_array works with single element data-
        types as well as multi-element data-types
        r   )rS  z<u4r  )r  z>u2rH   r4  rS  r9  r  N)r   r   r   r'   rr   r   )r@   Znd_arrayZcol_defsr   r   r   test_coldefs_init_from_arrayj  s    z0TestColumnFunctions.test_coldefs_init_from_arrayc              	   C   s  t | dr}t|d jjd ts,J t|d j}t	|}t|d jjd tr`J t
||d jstJ W d   n1 s0    Y  t | d>}t|d j}t	|}t
||d jsJ W d   n1 s0    Y  t | d@}t|d j}t	|}	t
|	|d js2J W d   n1 sH0    Y  t | dp}
t|
d j}t	|}tjtd	d
& t
||
d jsJ W d   n1 s0    Y  W d   n1 s0    Y  dS )r  rC   r   r   Nr   r  r  rV   z2Field 2 has a repeat count of 0 in its format coder  r  r  r   r   r   r  s  s&    
2
2
6
zTestColumnFunctions.test_picklec                 C   sV   t jddd}t jddd}t ||g}|d |d ks>J |d |d ksRJ dS )z5Tests that a `ColDefs` can be indexed by column name.r   r   r  r   r   r   N)r   r0   rr   )r@   r   r   r   r   r   r   test_column_lookup_by_name  s
    z.TestColumnFunctions.test_column_lookup_by_namec                 C   s  t jt jdddt jdddg}|jd }|jd |jjjdksLJ d|_	|j	dks`J d|j
vsnJ |j
d dksJ |jjdgksJ tt |jd  W d	   n1 s0    Y  |jdd
 tt |jd  W d	   n1 s0    Y  |jd
 j	d
ksJ |jjjdks2J |jjd
gksFJ |jjjd
gks\J d|jd
 _	tt |jd
  W d	   n1 s0    Y  |jd j	dksJ |jjjdksJ |jjdgksJ |jjjdgksJ d	S )a6  
        This is a test of the column attribute change notification system.

        After a column has been removed from a table (but other references
        are kept to that same column) changes to that column's attributes
        should not trigger a notification on the table it was removed from.
        r   r   )rK   r   )r   ZHELLOTTYPE2TTYPE1NGOODBYE)r  foo)r  )r   r?   rs   r0   r/   r<  ro   r   r!   r   r<   rh  ri  rj  Zchange_name)r@   rY  r   r   r   r   *test_column_attribute_change_after_removal  s8    
((*z>TestColumnFunctions.test_column_attribute_change_after_removalc                 C   sX   t jddg dd}t|}|j|jks.J |j|jks>J t|j|jksTJ dS )z
        Regression test for https://github.com/astropy/astropy/pull/4514

        Tests that columns with the X (bit array) format can be deep-copied.
        ZxcolZ5X)r   r   r   r   r   r  N	r   r0   r  deepcopyr   rK   r   rv   rL   )r@   rG  r   r   r   r   test_x_column_deepcopy  s
    
z*TestColumnFunctions.test_x_column_deepcopyc                 C   s
  t jddddgg dgd}t|}|j|jks6J |j|jksFJ t|jd |jd ksdJ t|jd |jd ksJ t jdd	ddgg dgd}t|}|j|jksJ |j|jksJ t|jd |jd ksJ t|jd |jd ksJ d
S )z
        Regression test for https://github.com/astropy/astropy/pull/4514

        Tests that columns with the P/Q formats (variable length arrays) can be
        deep-copied.
        Zpcolrm  r   rV   rN   r  r   ZqcolZQJNr  )r@   rG  r   r   r   r   r   r   test_p_column_deepcopy  s    

z*TestColumnFunctions.test_p_column_deepcopyc                 C   s   t t$}tjddg dd}W d   n1 s40    Y  dt|jv sPJ t t.}tjddd	ddd
ddddd
}W d   n1 s0    Y  g d}|D ]}|t|jv sJ qdS )z
        Test that the keyword arguments used to initialize a Column, specifically
        those that typically read from a FITS header (so excluding array),
        are verified to have a valid value.
        r   rT   r  r  Nz(Column name must be a string able to fitr7   r   ZNanrV   1)	rK   r   r   r   r   r   r   r   r   )
z(keyword arguments to Column were invalidTFORMZTNULLTDISPZTCTYPZTCUNIZTCRPXZTCRVLZTCDLTZTRPOS)rh  ri  AssertionErrorr   r0   rw   valuer   )r@   errr   Zerr_msgsr2  r   r   r   test_column_verify_keywords  s    2$z/TestColumnFunctions.test_column_verify_keywordsc                 C   s   t t&}tjdddg dd}W d   n1 s60    Y  dt|jv sRJ t t&}tjdddg dd}W d   n1 s0    Y  dt|jv sJ t t&}tjddd	g dd}W d   n1 s0    Y  d
t|jv sJ dS )at  
        Regression test for https://github.com/astropy/astropy/pull/6359

        Test the validation of the column start position option (ASCII table only),
        corresponding to ``TBCOL`` keyword.
        Test whether the VerifyError message generated is the one with highest priority,
        i.e. the order of error messages to be displayed is maintained.
        r   r  rU   )rK   r   rL   Nz=start option (TBCOLn) is not allowed for binary table columnsrT   z;start option (TBCOLn) must be a positive integer (got 'a').z-56z;start option (TBCOLn) must be a positive integer (got -56).)rh  ri  r   r   r0   rw   r  )r@   r  r   r   r   r   test_column_verify_start  s    
444z,TestColumnFunctions.test_column_verify_startkeysZrM   )r  r  2Z2ErO   g333333@r   zE.5c                 C   s   t t(}tjd|d |d d}W d   n1 s80    Y  | D ]0}|t|jv s`J t|| t|jv sJJ qJdS )z
        Additional tests for verification of 'TFORM' and 'TDISP' keyword
        arguments used to initialize a Column.
        r7   r  r  )rK   r   N)rh  ri  r   r   r0   r  rw   r  )r@   r  r  r   keyr   r   r   test_column_verify_formats#  s
    6z.TestColumnFunctions.test_column_verify_formatsN)rB  rC  rD  r|  r~  r  r  r  r  r  r  r  r  r  r  rh  rE  rF  rP  r   r   r  r   r   r   r   ry    s*   c	&1
ry  c                  C   sD   t g d} tjd| dd}tj|g}|jd= d|jd _d S )NrU   r   rM   r6  r  r   r   )	r   rL   r   r0   r?   rs   Z_headerr/   r   )r   r7   r   r   r   r   test_regression_53836  s
    r  c                  C   s  ddl m}  | g dg dg dgg dg dd}d|d	 _d
|d _d|jd< tjtdd(}tj|t	ddid}W d    n1 s0    Y  t
|dksJ dD ]}t|| |j| sJ q|jd|jdk sJ |jd dksJ |jd dksJ d S )Nr   r   rU   rF  )r   r   rJ  )r(   ZU1r   )r!   r   zm/sr   z
not-a-unitr   Zbarr  z''not-a-unit' did not parse as fits unitr  r   r   r;   rD   TUNIT1r  r  )astropy.tabler   r   metarh  r  r   r   r?   r  r    r   r  ro   r<   index)r   rY  wr   r   r   r   r   test_table_to_hduA  s     


6r  c                  C   sV   t jddgdtfdtfgdtj} | d }| d }tdd	 t||D sRJ d S )
N)r   rV   )r   rP   r   rR  rH   r   r   c                 s   s   | ]\}}||kV  qd S )Nr   )r+   r   r   r   r   r   	<genexpr>b  rf  z2test_regression_scalar_indexing.<locals>.<genexpr>)	r   rL   rP  r   ru   r   r   rv   rO  )r   Zx1aZx1br   r   r   test_regression_scalar_indexingY  s    
r  c           	   	   C   s  g }| tjdddd | tjdddd | tjddd	 t|}t }d|d
< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d|d< d |d!< d"|d#< tt}tj	||}W d    n1 s0    Y  t
|d$ jd%s J |jd$ jdks6J |jd& jdksLJ |jd' jd u sbJ |jd
 dksvJ |jd dksJ d|jvsJ |jd$ jd u sJ |jd& jd u sJ |jd' jd u sJ d(|jvsJ |jd dks J |jd dksJ |jd! d ks(J |jd# d"ks<J | d)j}|| tjd*d+D}t|}|d& }W d    n1 s0    Y  W d    n1 s0    Y  t|d$ksJ |jd$ jdksJ |jd& jdksJ |jd' jd u sJ |jd
 dksJ |jd dks0J d|jvs@J |jd$ jd u sVJ |jd& jdkslJ |jd' jdksJ d(|jvsJ |jd dksJ |jd dksJ |jd! d ksJ |jd# d"ksJ d S ),NZTIMEr   r  rn  ZRAWXr8  ZpixelZRAWYr  r  mZTUNIT2ZTUNIT3zRA---TANZTCTYP2ZANGLEZTCTYP3g     8ZTCRVL2ZTCRVL3r   ZTCRPX2ZTCRPX3i @  ZTALEN2i   ZTALEN3ZangstromZTCUNI2ZdegZTCUNI3g      ?ZRAr   ZDECr   z4The following keywords are now recognized as specialr   rV   ZTCTYP1rL  T)record)rm   r   r0   rr   r  rh  r  r	   r?   rs   rw   messager   r/   r   r<   r   joinZstrpathrx   warningscatch_warningsrn   r    )	r/  r7   r  r  Zwarning_listr   r(  r   Zhdu2r   r   r   $test_new_column_attributes_preservede  sx    
,

Hr  c                 C   s   t | d}tjd d dd}|| t|$}|d jjdksHJ W d    n1 s\0    Y  t | d}tjd d dd}|j|dd t|$}|d jjdksJ W d    n1 s0    Y  d S )Nzemptytable.fitsr   )r<   ro   r   r   zemptytable.fits.gzTrl   )rw   r  r   r?   rx   rn   ro   size)r/  Zofiler   r   r   r   r   test_empty_table  s    
2r  c              	   C   s  t | d}tjtjddtddg}d|jd< |j	|dd	 t
|}|d
 jd dkshJ tt}|d W d    n1 s0    Y  t |d jdksJ t |d jdsJ |d
 jd dksJ W d    n1 s0    Y  d S )NrL  r  rb   r  rJ   ZA3DTABLEZXTENSIONignoreZoutput_verifyr   Zfixr   zVerification reported errors:rV   z+Converted the XTENSION keyword to BINTABLE.ZBINTABLE)rw   r  r   r?   rs   r0   r   rh  r<   rx   rn   rh  r  r
   Zverifyr  r  )r/  testfiler   r   r  r   r   r   test_a3dtable  s    
(r  c                 C   sx   t  }d |jd< tj|jjd _| d }|j|dd t |"}|d j	d usVJ W d    n1 sj0    Y  d S )Nr  rL  r  r  r   )
r   r?   r<   r   nanZcardsZ_valuerx   rn   ro   )Ztmp_pathr   r  r   r   r   r   test_invalid_file  s    
r  )4
contextlibr  rH  r  r]  rw  r  rh  Znumpyr   r   rp   rI  ZHAVE_OBJGRAPHImportErrorZ
astropy.ior   r  r   Zastropy.unitsr   Zastropy.utils.compatr   r   Zastropy.utils.exceptionsr	   r
   Zastropy.io.fits.columnr   r   r   Zastropy.io.fits.utilr   Zastropy.io.fits.verifyr   r   r   r   r*   r9   r:   contextmanagerr*  rK  ry  r  r  r  r  r  r  r  r   r   r   r   <module>   s|   
1                     
 S  Sp