U
    e»{jQ ã                   @   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k
r|   dZY nX d dlmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlm Z m!Z! d dl"m#Z#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 „ Z0d!d"„ Z1d#d$„ Z2d%d&„ Z3d'd(„ Z4d)d*„ Z5d+d,„ Z6dS )-é    N)ÚcharTF)Úfits)Ú
NUMPY2FITSÚColumnAttributeÚDelayed)Údecode_ascii)ÚVerifyError©ÚTable)ÚUnitÚUnitsWarningÚUnrecognizedUnit)ÚNUMPY_LT_1_22ÚNUMPY_LT_1_22_1)ÚAstropyDeprecationWarningÚAstropyUserWarningé   )Ú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r–d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¼‰Ø—²Òœ<gñhãˆµøä>r   ç        FT)ÚdtypeÚnameÚnpÚabsoluteÚanyÚmax)ÚaÚbZaaZbbÚ	precisionÚdiffZmask0Zmasknz© r    ú_/var/www/html/bwave/python/venv/lib/python3.8/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	|ƒƒsÌt|t	|ƒƒsÌtdt	|ƒd|ƒ tdt	|ƒd|ƒ td|› d	�ƒ  dS t |ƒ�r t|d
 t
jƒ�r t||ƒ�sêtd|ƒ td|ƒ td|› d�ƒ  dS q4t|tjjƒ�s@t|tjjƒ�r²t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>   sR    	

 ÿ

 ÿ

r.   c                 C   s†   |j j| j jkst‚dd„ tjj ¡ D ƒ}|j jD ]N}|j | }| j | }|D ]0}t||ƒrNt||ƒrNt||ƒt||ƒksNt‚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>w   s    
 z$_assert_attr_col.<locals>.<listcomp>N)Úcolumnsr%   ÚAssertionErrorr   ÚColumnÚ__dict__ÚitemsÚgetattr)Ú	new_tbhduÚtbhduÚattrsr   ÚcolZnew_colÚattrr    r    r!   Ú_assert_attr_colq   s    
ÿ

r>   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`„ Z2e3j4 5dadbdcg¡ddde„ ƒZ6dfdg„ Z7dhdi„ Z8djdk„ Z9dldm„ Z:dndo„ Z;dpdq„ Z<drds„ Z=dtdu„ Z>dvdw„ Z?dxdy„ Z@dzd{„ ZAd|d}„ ZBd~d„ ZCd€d�„ ZDd‚dƒ„ ZEd„d…„ ZFd†d‡„ ZGdˆd‰„ ZHe3j4jIeJ dŠd‹�dŒd�„ ƒZKe3j4jIeJ dŠd‹�e3j4jLdŽd�„ ƒƒZMd�d‘„ ZNd’d“„ ZOd”d•„ ZPd–d—„ ZQd˜d™„ ZRdšS )›ÚTestTableFunctionsc                 C   s`   t  t  ¡ t  ¡ g¡}|d j}d|d< t j|d�}t  |¡}d|d jd< |d dks\t‚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ÚBinTableHDUrA   r4   )ÚselfZifdZthdrÚthduZofdr    r    r!   Útest_constructor_copies_headerƒ   s    

z1TestTableFunctions.test_constructor_copies_headerc                 C   sÔ  t  |  d¡¡}t  |  d¡¡}t dddg¡}tjdddgtjd	�}t jdd
|d�}t jdd|d�}tjdddgdd	�}t jdd|d�}	tjdddgdd	�}
t jdd|
d�}tjdddg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dd d!gd"d	�}t jd#d$|d�}tjdddddddddddgdddddddddddgdddddddddddg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|ƒ�sôt‚|jd d |d k�st‚|jd d |d k�s,t‚|jd d |d k�sHt‚|jd d |
d k�sdt‚|jd d |d k�s€t‚|jd d |d  d,¡k ¡ �s¦t‚|jd d- |d k�sÂt‚|jd d. |d k ¡ �sât‚t|j d¡ƒd/k�süt‚t  	|d ¡}t  t  ¡ ¡}| |¡ |j|  d0¡d1d2� t  |  d0¡¡�B}|d j d.¡}|d d1d1d3d1d3d1d1d1d3d3d1gk ¡ �s„t‚W 5 Q R X t  |  d4¡d5¡}| |d ¡ | |¡ | ¡  | ¡  | ¡  d S )6Nútb.fitsz
test0.fitsÚabcÚdefZxxç      &@ç      (@ç      *@©r   Ú3A©r   ÚformatÚarrayÚEé   é   é   Úi2ÚxyzÚIr   é   Út1y      @      @y      @      @y      @      @Úc8Út2ÚCr   Út3ÚXée   éf   ég   Úi4Út4ÚJZt5Z11X©Únrows©r   rI   g   À™™@r   ©rZ   zxy g   ÀÌÌ@r   úc1, c2, c3, c4©r%   Úboolé   é   z['abc' 'def' 'xx']ztableout1.fitsT©Ú	overwriteFztableout2.fitsÚappend)r   ÚopenÚdataÚ	chararrayrR   r   r   r5   Úuint8ÚColDefsrD   Úfrom_columnsÚrecr.   r4   ÚviewÚallÚstrr(   rB   rC   rr   ÚwritetoÚtempÚclose)rE   Zhome_is_dataÚttÚfdÚa1Úr1Úc1Úc2Úa3Úc3Úa4Úc4Úa5Úc5Úa6Úc6Úa7Úc7Úa8r\   Úxr:   Zx2r]   ÚraÚ_ZfoutÚf2r~   Zfout2r    r    r!   Ú	test_open™   sŠ    ýúþ& 
õÿÿ
zTestTableFunctions.test_openc                 C   sˆ  t  |  d¡¡}|d jd dks&t‚ddddgdd	d
dgddddgddddgddddgddddgddddgddddgddddgddddgddddgddddgddddgddddgddddgdœ}|d jjdd�|ksÜt‚tjj	ddgdd�}t
|d j|d d… ƒ�st‚d|d j d¡d< |d j ¡  ttjj |d jd¡ƒdk�sTt‚|d j d¡t 	ddg¡k ¡ �s|t‚| ¡  d S )NrH   r   Ztform1Ú1Jr„   r…   r‡   r‰   rO   Ú1EZ1LÚ i  €rT   gš™™™™™Ù?ZI11ÚA3zG15.7ZL6)r   rQ   ÚunitÚnullÚbscaleÚbzeroÚdispÚstartÚdimÚ	coord_incÚ
coord_typeÚ
coord_unitÚcoord_ref_pointÚcoord_ref_valueÚtime_ref_posF©Úoutputri   rj   rk   rl   rZ   r   z[84 84])r   rs   rt   rA   r4   r3   Úinfor   ry   rR   r.   r(   Z_scale_backr|   Úrecarrayr{   r   )rE   Útr©   r’   r    r    r!   Útest_binary_table  s:    














ñþ$(z$TestTableFunctions.test_binary_tablec              	   C   s<  t  |  d¡¡}tjjdddddgdd�}t|d	 j|ƒs>t‚|d	 jd
d … d
d … }tjjdgdd�}t||ƒsxt‚| d	¡t dg¡k 	¡ s–t‚tjjdddgdd�}t|d	 jd d d
… |ƒsÊt‚t
 ddg¡}t ddg¡}t jddd|d�}t jddd|d�}	t jdddddgd�}
t j |	||
g¡}t|jjjƒt d¡dft d¡d
ft d¡d fd!œk�spt‚|j|  d"¡d#d$� t  |  d"¡¡}t|j|d	 jƒ�s¬t‚| ¡  t ddg¡}t jdd%|d&d'd(�}	t j |	g¡}|j|  d"¡d#d$� t|  d"¡ƒ�}d)| ¡ k�st‚W 5 Q R X t  |  d"¡¡�}t|j|d	 jƒ�sNt‚W 5 Q R X t jd*d+dddgd�}t jd,d-dddgd�}	t jd.d/dddgd�}
t j ||	|
g¡}|jjtjk�sÀt‚|	jjtjk�sÔt‚|
jjtjk�sèt‚|j|  d"¡d#d$� t  |  d"¡¡�}t|j|d	 jƒ�s&t‚W 5 Q R X | ¡  d S )0Nú
ascii.fits)g   àù>$@é%   )g   ÀÌÌ@é   )g   àQ8/@é   )r   r   )g     �u@éY  zc1, c2rl   r   rZ   r±   ÚabcdrJ   rK   rL   rI   r™   é   )r   rQ   rŸ   rR   rS   rT   r[   rY   é[   é\   é]   rP   z|S3é   z|S15z|S10é   )rI   rJ   r[   ú	toto.fitsTrp   ÚDçffffff@g333333ã?)r   rQ   rR   rœ   r�   z4.95652173913043548D+00r]   ZI2re   ZI5Zt8ÚI10)r   rs   rt   r   ry   rR   r.   r4   r(   r{   ru   r5   ÚTableHDUrx   Údictr   Úfieldsr}   r~   r   ÚreadÚint16Úint32Zint64)rE   r   Zra1Úa2Zra2Zra3r‚   rƒ   r„   r…   r‡   ÚhduÚhdulÚfr    r    r!   Útest_ascii_table0  sl    ûø
þý""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 ¡ s¤t‚| ¡  d S )N©r   rN   rT   rv   r   ZChannelszPB()rP   ZRFIútestendian.fitsTrp   )r   ÚndarrayÚobjectrR   r   r5   rw   rD   rx   r   r}   r~   rs   rt   r(   r{   r4   r   )
rE   r‘   Z
channelsInr<   Úcolsr:   ZhduLZrfiHDUrt   ZchannelsOutr    r    r!   Útest_endianness|  s    z"TestTableFunctions.test_endiannessc           	   	   C   sö   ddddg}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 ¡ sxt	‚|jd |k ¡ sŽt	‚|j
|  d¡dd� t |  d¡¡�:}|d jd |k ¡ sÎt	‚|d jd |k ¡ sèt	‚W 5 Q R X 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<f8rN   z>f8r   rº   rP   r   rÉ   Trp   r   N)r   rR   r   r5   rw   rD   rx   rt   r{   r4   r}   r~   rs   )	rE   r   r‚   rÃ   Úcol1Úcol2rÌ   r:   rÅ   r    r    r!   Útest_column_endiannessŒ  s    z)TestTableFunctions.test_column_endiannessc                 C   sŒ   t jjdddgddd�}t |¡}t|j|ƒs2t‚|j|  	d¡dd	� t 
|  	d¡¡}t|j|d
 jƒslt‚t||d
 jƒs€t‚| ¡  d S )N©r   ÚSeriusç333333÷¿ÚA1V©rZ   ÚCanopysç\�Âõ(\ç¿ÚF0Ib©rT   z
Rigil Kentgš™™™™™¹¿ZG2Vzint16,a20,float32,a10úorder,name,mag,Sp©Úformatsr%   r¹   Trp   r   )r   ry   rR   r   rD   r.   rt   r4   r}   r~   rs   r   )rE   ÚbrightrÄ   rÅ   r    r    r!   Útest_recarray_to_bintablehdu¥  s    ýù	
z/TestTableFunctions.test_recarray_to_bintablehduc                 C   sœ   t  ddddgddddgd	œ¡}t jd
ddg|d�}t |¡}t|j| tj¡ƒsVt	‚|j
|  d¡dd� t |  d¡¡}t|j|d jƒs�t	‚| ¡  d S )NÚorderr   ÚmagÚSpÚintZS20r   ZS10©r%   rà   rÕ   rÙ   rÝ   rN   r¹   Trp   r   ©r   r   rR   r   rD   r.   rt   rz   ÚFITS_recr4   r}   r~   rs   r   ©rE   Údescr   rÄ   rÅ   r    r    r!   Ú!test_numpy_ndarray_to_bintablehdu·  s$    

þÿýú
z4TestTableFunctions.test_numpy_ndarray_to_bintablehduc                 C   sœ   t  ddddgddddgd	œ¡}t jd
ddg|d�}t |¡}t|j| tj¡ƒsVt	‚|j
|  d¡dd� t |  d¡¡}t|j|d jƒs�t	‚| ¡  d S )Nrã   r   rä   rå   ræ   ZU20r   ZU10rç   rÕ   rÙ   rÝ   rN   r¹   Trp   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dddgddd�}tjj|dd�}t|jjj	d	 jƒt|jjj
d	 ƒksRt‚t|jjj	d	 jƒt|j	j	d	 jƒks|t‚t|jjj	d	 jƒt|j	j
d	 ƒks¤t‚d
|jd	 d	< |jd	 d	 d
ksÈt‚|jjj
d	 d	 d
ksât‚|jjj	d	 jd	 d
ksþt‚|j	j
d	 d	 d
k�st‚|j	j	d	 jd	 d
k�s4t‚d|jjj
d	 d	< |jd	 d	 dk�s^t‚|jjj
d	 d	 dk�szt‚|jjj	d	 jd	 dk�s˜t‚|j	j
d	 d	 dk�s²t‚|j	j	d	 jd	 dk�sÎt‚d|jjj	d	 jd	< |jd	 d	 dk�sút‚|jjj
d	 d	 dk�st‚|jjj	d	 jd	 dk�s4t‚|j	j
d	 d	 dk�sNt‚|j	j	d	 jd	 dk�sjt‚d|j	j
d	 d	< |jd	 d	 dk�s’t‚|jjj
d	 d	 dk�s®t‚|jjj	d	 jd	 dk�sÌt‚|j	j
d	 d	 dk�sæt‚|j	j	d	 jd	 dk�st‚d|j	j	d	 jd	< |jd	 d	 dk�s,t‚|jjj
d	 d	 dk�sHt‚|jjj	d	 jd	 dk�sft‚|j	j
d	 d	 dk�s€t‚|j	j	d	 jd	 dk�sœt‚|j d	¡t jddgt jd�k ¡ �sÆt‚|jd	 d dk�sÞt‚|jd d dk�söt‚|j d¡t jddgt jd�k ¡ �s t‚|jd	 d dk�s8t‚|jd d dk�sPt‚|j|  d¡dd� t |  d¡¡�Ò}|d j d	¡t jddgt jd�k ¡ �s¤t‚|d jd	 d dk�sÀt‚|d jd d dk�sÜt‚|d j d¡t jddgt jd�k ¡ �s
t‚|d jd	 d dk�s&t‚|d jd d dk�sBt‚W 5 Q R X ~tjj|dd�}t jjddgddd�}t|j|ƒ�s†t‚|j|  d¡dd� t |  d¡¡�}t|j|d jƒ�sÄt‚W 5 Q R X d S )NrÕ   rÙ   rÝ   zint16,a20,float64,a10rÞ   rß   rZ   rg   r   éÕ   éd   éô  éX  é   rN   r   rÖ   rÚ   r×   rÛ   rT   rØ   rÜ   r¹   Trp   )r   ry   rR   r   r½   rx   Úidrt   Ú_coldefsr3   Ú_arraysr4   r(   rÁ   r{   Úfloat64r}   r~   rs   rD   r.   )rE   rá   rÄ   rÅ   Útmpr    r    r!   Útest_new_table_from_recarrayã  s�    ýù	ÿ
ÿ
(**.&ÿ&ýz/TestTableFunctions.test_new_table_from_recarrayc              	   C   sb   t  |  d¡¡�}|d j}W 5 Q R X tjdg|jd�}t ||¡ t j¡}t	|ƒ 
d¡s^t‚dS )zR
        Tests creating a new FITS_rec object from a multi-field ndarray.
        rH   r   )rT   Zqweç      @FrN   z	FITS_rec(N)r   rs   rt   r   rR   r   rr   rz   ré   ÚreprÚ
startswithr4   )rE   Úhrt   Znew_dataZappendedr    r    r!   Útest_new_fitsrec?  s
    z#TestTableFunctions.test_new_fitsrecc                 C   s	  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	|	 |  d¡¡ t  ddddg¡}t  ddd d!g¡}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dddg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k�sÌt‚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�sRt‚t jd)d)d)d)d)g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 dd+|d'fd!dd+|d'fgd-d.�}t|j
|ƒ�sît‚d/|j
d d< |j
jjd d d/k�st‚|j
jjd jd d/k�s6t‚|jjd d d/k�sPt‚|jjd jd d/k�slt‚|j
d d d/k�s„t‚d0|j
jjd d< |j
jjd d d0k�s²t‚|j
jjd jd d0k�sÐt‚|jjd d d0k�sêt‚|jjd jd d0k�st‚|j
d d d0k�st‚d1|j
jjd jd< |j
jjd d d1k�sNt‚|j
jjd jd d1k�slt‚|jjd d d1k�s†t‚|jjd jd d1k�s¢t‚|j
d d d1k�sºt‚d2|jjd d< |j
jjd d d2k�sæt‚|j
jjd jd d2k�st‚|jjd d d2k�st‚|jjd jd d2k�s:t‚|j
d d d2k�sRt‚d3|jjd jd< |j
jjd d d3k�s€t‚|j
jjd jd d3k�sžt‚|jjd d d3k�s¸t‚|jjd jd d3k�sÔt‚|j
d d d3k�sìt‚t 	|  d$¡¡}|d }d/|j
d d< |j
jjd d d/k�s.t‚|j
jjd jd d/k�sLt‚|jjd d d/k�sft‚|jjd jd d/k�s‚t‚|j
d d d/k�sšt‚d0|j
jjd d< |j
jjd d d0k�sÈt‚|j
jjd jd d0k�sæt‚|jjd d d0k�s t‚|jjd jd d0k�st‚|j
d d d0k�s4t‚d1|j
jjd jd< |j
jjd d d1k�sdt‚|j
jjd jd d1k�s‚t‚|jjd d d1k�sœt‚|jjd jd d1k�s¸t‚|j
d d d1k�sÐt‚d2|jjd d< |j
jjd d d2k�süt‚|j
jjd jd d2k�st‚|jjd d d2k�s4t‚|jjd jd d2k�sPt‚|j
d d d2k�sht‚d3|jjd jd< |j
jjd d d3k�s–t‚|j
jjd jd d3k�s´t‚|jjd d d3k�sÎt‚|jjd jd d3k�sêt‚|j
d d d3k�	st‚|
 ¡  | ¡  | ¡  d S )4Né8  éN  é4  é=  ÚNGC1ÚNGC2ÚNGC3ÚNCG4ÚtargetÚ10ArP   Úcountsrf   ÚDN©r   rQ   rš   rR   ÚnotesÚA10©r   rQ   ÚspectrumÚ5EÚflagÚLr   r   útable1.fitséœ  é²  é˜  é¡  ÚNGC5ÚNGC6ÚNGC7ÚNCG8útable2.fitsrg   únewtable.fits©r   ZPRIMARYr   rC   rU   r    r˜   r˜   )r   r˜   r   rD   r³   z8R x 5Cz[10A, J, 10A, 5E, L]r˜   Fr§   r   rN   r˜   Túa10,u4,a10,5f4,l©rà   é,  éÈ   rï   éZ   éP   )r   rR   r   r5   rw   rD   rx   r}   r~   rs   rt   Úshaper3   rõ   r4   r'   r$   r(   r©   r   ry   r.   rô   r   )rE   r  r%   r„   r…   r‡   r‰   r‹   Úcoldefsr:   r[   r]   Znrows1rh   rÄ   r,   r©   ÚzrR   rÅ   r    r    r!   Útest_appending_a_columnN  sà     ($þø
õz*TestTableFunctions.test_appending_a_columnc              	   C   sN  t  ddddg¡}t  ddddg¡}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dddgd�}t ||||g¡}tj |¡}	|	jjd	dddgks°t	‚|| }
tj |
¡}|jjd	ddddgksÞt	‚t jdddddg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|ƒ�sJt	‚d S © Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   r   rN   r˜   TFr  r  )r   rR   r   r5   rw   rD   rx   r3   r%   r4   r   ry   r.   rt   )rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   Zcoldefs1Útbhdu1r&  rR   r    r    r!   Útest_adding_a_columnæ  s.    üù	z'TestTableFunctions.test_adding_a_columnc              	   C   sF  t  ddddg¡}t  ddddg¡}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dddgd�}t ||||g¡}tj |¡}	|	jjd	dddgks°t	‚|	j 
|¡ |	jjd	ddddgksÖt	‚t jdddddg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|ƒ�sBt	‚d S r(  )r   rR   r   r5   rw   rD   rx   r3   r%   r4   Úadd_colr   ry   r.   rt   ©rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   r&  rR   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dddgksTt	‚tj
jd	d
dgdd�}t|j|ƒszt	‚| ¡  d S )Nú
table.fitsr   r   rZ   ÚK©r   rR   rQ   r  ÚV_mag)ÚNGC1001ç333333&@r   )ÚNGC1002gš™™™™™(@rZ   )ÚNGC1003gffffff.@r   z	a20,f4,i8r  )r   rs   rt   r5   r   rR   r3   r+  r%   r4   ry   r.   r   )rE   rÅ   r:   r<   rR   r    r    r!   Útest_adding_a_column_to_file!  s    þz/TestTableFunctions.test_adding_a_column_to_filec                 C   s¨  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	|	jjd	ddddgks´t	‚|	j 
d¡ |	jjd	dddgksØt	‚t jdddddg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<t	‚|	j 
d¡ |	j 
d¡ |	jjd	dgk�sjt	‚t jjd|
fd|
fd|
fd|
fgdd�}t|	j|ƒ�s¤t	‚d S )Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   r   rN   r˜   za10,u4,a10,5f4r  za10,5f4)r   rR   r   r5   rw   rD   rx   r3   r%   r4   Údel_colr   ry   r.   rt   r,  r    r    r!   Útest_removing_a_column_inplace.  s<    



üù	 ÿz1TestTableFunctions.test_removing_a_column_inplacec                 C   sh   t  |  d¡¡}|d }|j d¡ |jjdgks6t‚tjj	dddgdd	�}t
|j|ƒs\t‚| ¡  d S )
Nr.  r   r1  r  )r2  )r4  )r5  Za20r  )r   rs   rt   r3   r7  r%   r4   r   ry   rR   r.   r   )rE   rÅ   r:   rR   r    r    r!   Ú test_removing_a_column_from_fileT  s    z3TestTableFunctions.test_removing_a_column_from_filec                 C   sD	  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	|	 |  d¡¡ t  ddddg¡}t  ddd d!g¡}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dddgd�}t |||||g¡}tj |¡}	|	 |  d'¡¡ t 	|  d¡¡}
t 	|  d'¡¡}tj |
d j
|d j
 ¡}t jd(d(d(d(d(g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+d!dd*|d,f
gd-d.�}t|j|ƒ�s$t‚| |  d/¡¡ d0|jd d< |jjjd d d0k�s^t‚|jjj
d jd d0k�s|t‚|j
jd d d0k�s–t‚|j
j
d jd d0k�s²t‚|jd d d0k�sÊt‚d1|jjjd d< |jjjd d d1k�søt‚|jjj
d jd d1k�st‚|j
jd d d1k�s0t‚|j
j
d jd d1k�sLt‚|jd d d1k�sdt‚d2|jjj
d jd< |jjjd d d2k�s”t‚|jjj
d jd d2k�s²t‚|j
jd d d2k�sÌt‚|j
j
d jd d2k�sèt‚|jd d d2k�s t‚d3|j
jd d< |jjjd d d3k�s,t‚|jjj
d jd d3k�sJt‚|j
jd d d3k�sdt‚|j
j
d jd d3k�s€t‚|jd d d3k�s˜t‚d4|j
j
d jd< |jjjd d d4k�sÆt‚|jjj
d jd d4k�sät‚|j
jd d d4k�sþt‚|j
j
d jd d4k�st‚|jd d d4k�s2t‚d5d6g}tj|  d/¡d,d7�|k�sXt‚t 	|  d/¡¡}|d }|j
jd	ddddd"d#d$d%d&g
k�s–t‚t jd(d(d(d(d(g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+d!dd*|d,f
gd-d.�}t|j|ƒ�s*t‚d0|jd d< |jjjd d d0k�sTt‚|jjj
d jd d0k�srt‚|j
jd d d0k�sŒt‚|j
j
d jd d0k�s¨t‚|jd d d0k�sÀt‚d1|jjjd d< |jjjd d d1k�sît‚|jjj
d jd d1k�st‚|j
jd d d1k�s&t‚|j
j
d jd d1k�sBt‚|jd d d1k�sZt‚d2|jjj
d jd< |jjjd d d2k�sŠt‚|jjj
d jd d2k�s¨t‚|j
jd d d2k�sÂt‚|j
j
d jd d2k�sÞt‚|jd d d2k�söt‚d3|j
jd d< |jjjd d d3k�s"t‚|jjj
d jd d3k�s@t‚|j
jd d d3k�sZt‚|j
j
d jd d3k�svt‚|jd d d3k�sŽt‚d4|j
j
d jd< |jjjd d d4k�s¼t‚|jjj
d jd d4k�sÚt‚|j
jd d d4k�sôt‚|j
j
d jd d4k�	st‚|jd d d4k�	s(t‚|
 ¡  | ¡  | ¡  d S )8Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  r  Ztarget1Zcounts1Znotes1Z	spectrum1Zflag1r  r   rN   r˜   TFz!a10,u4,a10,5f4,l,a10,u4,a10,5f4,lr  r  r   r!  rï   r"  r#  r  )r   r˜   r   rD   é   z4R x 10Cz([10A, J, 10A, 5E, L, 10A, J, 10A, 5E, L]r˜   r§   )r   rR   r   r5   rw   rD   rx   r}   r~   rs   r3   r   ry   r.   rt   r4   rô   rõ   r©   r%   r   )rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   r[   r]   rÄ   r&  rR   r©   rÅ   r    r    r!   Útest_merge_tables]  sú    üù	þöüù	z$TestTableFunctions.test_merge_tablesc              	   C   sÞ   ddddœ}t jttddddgddd	d
gddddgƒƒdtfdd	tfgd�}tj|d�}|jD ]}||j	 |_
q^|j|  d¡dd� t |  d¡¡�@}|d j}|d dks°t‚|d dksÀt‚|d dksÐt‚W 5 Q R X dS )z¼Regression 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.
        rZ   r   r»   )r   r   Úcr   rT   rU   r   r<  Údrù   çÍÌÌÌÌÌ@gÍÌÌÌÌÌ!@)r   ZS1rN   ©rt   ú	test.fitsTrp   ÚTNULL1ZTNULL2ZTNULL3N)r   rR   ÚlistÚzipræ   Úfloatr   rD   r3   r   r›   r}   r~   rs   rA   r4   )rE   ZNULLSrt   r   r<   rÅ   rA   r    r    r!   Útest_modify_column_attributes  s    &þ

z0TestTableFunctions.test_modify_column_attributesc           
      C   s¶  dt dffdt dfdfg}tjd|d�}dd	g|d< d
dddg|d d< ddddg|d d< t|ƒ}t |  d¡|¡ t |  d¡¡}|d j|d jksžt	‚|d j|d jks¶t	‚t 
|d |d k¡sät	d |d |d ¡ƒ‚t 
|d |d k¡�st	d |d |d ¡ƒ‚t ¡ }t |¡}t ||g¡}| |  d¡¡ t |  d¡¡}|d j}| ¡  |d j|d jk�s€t	‚|d j|d jk�sšt	‚t 
|d |d k¡�sÊt	d |d |d ¡ƒ‚t 
|d |d k¡�sút	d |d |d ¡ƒ‚| |  d¡¡ tj|  d¡dd�}	|d j|	d jk�s8t	‚|d j|	d jk�sRt	‚t 
|d |	d k¡�s‚t	d |d |	d ¡ƒ‚t 
|d |	d k¡�s²t	d |d |	d ¡ƒ‚dS )zñRegression 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‘   rV   ÚyrT   )rU   rZ   rN   ZabcderX   ÚAÚBCZDEFZ123r   r`   ZYZZPQRZ999r   r@  zx: {} != {}zy: {} != {}ú
test2.fitsú
test3.fitsF)Zcharacter_as_bytesN)r|   r   Úzerosr
   r   r}   r~   Úgetdatar   r4   r{   rQ   rC   rD   rB   rs   rt   r   ÚwriterÀ   )
rE   r   rt   Ú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ƒ¡stt
‚t |t	|d jƒ¡sŽt
‚| ¡  | ¡  d S )Nr.  r   r1  é   r  z<\[\('NGC1002',\s+12.3[0-9]*\) \(\'NGC1003\',\s+15.[0-9]+\)\])r   rs   rt   r(   rD   r}   r~   ÚreÚmatchr|   r4   r   )rE   r«   ÚtbdataÚmaskZ	newtbdatarÄ   rÅ   Úexpectr    r    r!   Útest_mask_arrayM  s    

z"TestTableFunctions.test_mask_arrayc                 C   sÔ  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	|	 |  d¡¡ t 	|  d¡¡}
|
d j
d }|d dksØt‚|dd… \}}}||d ksút‚|dk�st‚|t jdddddgt jd�k ¡ �s0t‚d|d< |d dk�sJt‚d |d< |d d k�sdt‚|dd… d d k�s~t‚t td!d"„ |¡ d#|dd… d< |dd… d d#k�sºt‚|d d#k�sÌt‚d$|dd… d< |dd… d d$k�söt‚d#|dd… d< |dd… d d#k�s t‚d%|dd… d d d&… d&< |dd… d d%k�sTt‚d#|ddd… d< |dd… d d#k�s€t‚t td'd"„ |¡ |dd…  d¡d#k�s®t‚|dd…  d¡d#k�sÊt‚t t|dd… jd¡ |dd…  dd%¡ |dd…  d¡d%k�st‚t t|dd… jdd(¡ |
d j
jjd d d%k�sLt‚|
d j
jjd jd d%k�snt‚|
d jjd d d%k�sŒt‚|
d jjd jd d%k�s¬t‚|
d j
d d d%k�sÈt‚|
 ¡  d S ))Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   r  rZ   rU   r˜   r   rN   i6  i;  c                 S   s   | dd… d S ©Nr   rU   r  r    ©Úrr    r    r!   Ú<lambda>z  ó    z5TestTableFunctions.test_slice_a_row.<locals>.<lambda>r   i�  rð   éÿÿÿÿc                 S   s   | dd… d S rX  r    rY  r    r    r!   r[  ‹  r\  F)r   rR   r   r5   rw   rD   rx   r}   r~   rs   rt   r4   r   r{   ÚpytestÚraisesÚKeyErrorr(   Zsetfieldrô   rõ   r3   r   )rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   r[   r-   r   r   r<  r    r    r!   Útest_slice_a_row_  s^    ( " z#TestTableFunctions.test_slice_a_rowc                 C   sþ  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	|	 |  d¡¡ t 	|  d¡¡}
t
|
d jd ƒdksÔt‚t
|
d jd dd… ƒdksöt‚t
|
d jd dd… ƒdk�st‚t
|
d jd dd… ƒdk�s>t‚t
|
d jd dd… ƒdk�sbt‚t
|
d jd dd… ƒdk�s†t‚t
|
d jd dd… ƒdk�sªt‚t
|
d jd dd… ƒdk�sÎt‚t
|
d jd dd… ƒdk�sòt‚|
 ¡  d S )Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   r  rV   rU   rn   ro   rT   )r   rR   r   r5   rw   rD   rx   r}   r~   rs   r$   rt   r4   r   ©rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   r[   r    r    r!   Útest_fits_record_lenŸ  s*    "$$$$$$$z'TestTableFunctions.test_fits_record_lenc              	   C   sT  t  ddddg¡}t  ddddg¡}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dddg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dd d!d"d#gt jd$�d%f|
jd&< d'd(dt jd)d*d+d,d-gt jd$�d%g|
jd< t	|
jj
jd jƒt	|
jj
jd ƒk�s¦t‚t	|
jj
jd jƒt	|
jjd jƒk�sÒt‚t	|
jj
jd jƒt	|
jjd ƒk�süt‚|
jd d dk�st‚|
jj
jd d dk�s0t‚|
jj
jd jd dk�sNt‚|
jjd d dk�sht‚|
jjd jd dk�s„t‚|
jjd jd dk�s t‚|
jjd& jd d.k�s¼t‚|
jjd jd t jd/d/d/d/d/gt jd$�k ¡ �sòt‚t|
jjd jd t jk }tt jfƒ�r"|�s&t‚|
jd d d0k�s>t‚|
jj
jd d d0k�sZt‚|
jj
jd jd d0k�sxt‚|
jjd d d0k�s’t‚|
jjd jd d0k�s®t‚|
jjd jd d'k�sÊt‚|
jjd& jd dk�sæt‚|
jjd jd t jd)d*d+d,d-gt jd$�k ¡ �st‚t|
jjd jd t jk }tt jfƒ�rL|�sPt‚d S )1Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   ©r   rQ   rš   rV   rg   rT   rU   zA Noteçš™™™™™ñ?çš™™™™™@çffffff
@gš™™™™™@g      @rN   TrZ   ZJIM1Z33rÎ   rÏ   rÐ   rÑ   ç      @r˜   r   é!   )r   rR   r   r5   rw   rD   rx   rt   r   ró   rô   r3   rõ   r4   r{   r)   ÚTrue_rm   Úbool_)rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r)  r:   r1   r    r    r!   Útest_add_data_by_rows¹  s’    û

û

ÿÿ*ÿÿ ÿÿüÿÿ ÿÿüz(TestTableFunctions.test_add_data_by_rowsc                 C   s  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	t  ddddg¡}t  dddd g¡}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dddgd�}t |||||g¡}tj |¡}
t jd!d"d#d$d%g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�s¦t‚t	|jj
jd jƒt	|jjd jƒk�sÒt‚t	|jj
jd jƒt	|jjd ƒk�süt‚|jd d dk�st‚|jj
jd d dk�s0t‚|jj
jd jd dk�sNt‚|jjd d dk�sht‚|jjd jd dk�s„t‚|jjd jd dk�s t‚|jjd+ jd d,k�s¼t‚|jjd' jd t jd-d-d-d-d-gt jd&�k ¡ �sòt‚t|jjd* jd t jk }tt jfƒ�r"|�s&t‚|jd* d dk�s>t‚|jj
jd d* dk�sZt‚|jj
jd jd* dk�sxt‚|jjd d* dk�s’t‚|jjd jd* dk�s®t‚|jjd jd* dk�sÊt‚|jjd+ jd* d,k�sæt‚|jjd' jd* t jd!d"d#d$d%gt jd&�k ¡ �st‚t|jjd* jd* t jk }tt jfƒ�rL|�sPt‚|jjd jd. dk�slt‚|jjd jd. d,k�sˆt‚|jjd+ jd. d,k�s¤t‚|jjd' jd. t jd-d-d-d-d-gt jd&�k ¡ �sÚt‚t|jjd* jd. t jk }tt jfƒ�r
|�st‚d S )/Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   ép   é†   él   éu   r  r  r  r  rÎ   rÏ   rÐ   rÑ   rh  rN   rT   é	   rg   rU   rZ   r˜   r   é   )r   rR   r   r5   rw   rD   rx   r   rt   ró   rô   r3   rõ   r4   r{   r)   rj  rm   rk  ZFalse_)rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r)  r:   Útbhdu2r1   r    r    r!   Ú"test_assign_multiple_rows_to_table  s     $ÿÿ
ÿÿÿ ÿÿüÿÿ ÿÿüÿÿ ÿÿüz5TestTableFunctions.test_assign_multiple_rows_to_tablec                 C   s¶  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	t|jd ƒt|ƒks´t	‚t|jd jƒt|ƒksÐt	‚t|jd jƒt|jƒksît	‚t|jd jƒt|j
d ƒk�st	‚t|ƒt|	jƒk�s*t	‚t|jd ƒt|	jjd ƒk�sNt	‚t|jd jƒt|	jjd jƒk�svt	‚t|	jƒt|	jjƒk�s’t	‚t|	jjjd jƒt|	jjj
d ƒk�s¾t	‚t|	jjjd jƒt|	jjd jƒk�sêt	‚t|	jjjd jƒt|	jj
d ƒk�st	‚|	 |  d¡¡ t |  d¡¡}
d|
d jd d< |
d jd d dk�sbt	‚|
d jjj
d d dk�s‚t	‚|
d jjjd jd dk�s¤t	‚|
d jj
d d dk�sÂt	‚|
d jjd jd dk�sât	‚d|
d jjj
d d< |
d jd d dk�st	‚|
d jjj
d d dk�s4t	‚|
d jjjd jd dk�sVt	‚|
d jj
d d dk�stt	‚|
d jjd jd dk�s”t	‚d|
d jjjd jd< |
d jd d dk�sÈt	‚|
d jjj
d d dk�sèt	‚|
d jjjd jd dk�s
t	‚|
d jj
d d dk�s(t	‚|
d jjd jd dk�sHt	‚d|
d jj
d d< |
d jd d dk�sxt	‚|
d jjj
d d dk�s˜t	‚|
d jjjd jd dk�sºt	‚|
d jj
d d dk�sØt	‚|
d jjd jd dk�søt	‚d|
d jjd jd< |
d jd d dk�s*t	‚|
d jjj
d d dk�sJt	‚|
d jjjd jd dk�slt	‚|
d jj
d d dk�sŠt	‚|
d jjd jd dk�sªt	‚|
 ¡  d S )Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   r  rî   rï   rð   rñ   rò   )r   rR   r   r5   rw   rD   rx   ró   r3   r4   rõ   rt   rô   r}   r~   rs   r   rb  r    r    r!   Útest_verify_data_referencesn  sr    $$(ÿÿ* "  "  "  "  " z.TestTableFunctions.test_verify_data_referencesc                 C   sÐ  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	tj |	j t j	¡¡}
t
|
jjjd jƒt
|
jjjd ƒksÚt‚t
|
jjjd jƒt
|
jjd jƒk�st‚t
|
jjjd jƒt
|
jjd ƒk�s0t‚d|
jd d< |
jd d dk�sVt‚|
jjjd d dk�srt‚|
jjjd jd dk�s�t‚|
jjd d dk�sªt‚|
jjd jd dk�sÆt‚d|
jjjd d< |
jd d dk�sðt‚|
jjjd d dk�st‚|
jjjd jd dk�s*t‚|
jjd d dk�sDt‚|
jjd jd dk�s`t‚d|
jjjd jd< |
jd d dk�sŒt‚|
jjjd d dk�s¨t‚|
jjjd jd dk�sÆt‚|
jjd d dk�sàt‚|
jjd jd dk�süt‚d|
jjd d< |
jd d dk�s$t‚|
jjjd d dk�s@t‚|
jjjd jd dk�s^t‚|
jjd d dk�sxt‚|
jjd jd dk�s”t‚d|
jjd jd< |
jd d dk�s¾t‚|
jjjd d dk�sÚt‚|
jjjd jd dk�søt‚|
jjd d dk�st‚|
jjd jd dk�s.t‚|
 |  d¡¡ t |  d¡¡}d|d jd d< |d jd d dk�s|t‚|d jjjd d dk�sœt‚|d jjjd jd dk�s¾t‚|d jjd d dk�sÜt‚|d jjd jd dk�süt‚d|d jjjd d< |d jd d dk�s.t‚|d jjjd d dk�sNt‚|d jjjd jd dk�spt‚|d jjd d dk�sŽt‚|d jjd jd dk�s®t‚d|d jjjd jd< |d jd d dk�sât‚|d jjjd d dk�st‚|d jjjd jd dk�s$t‚|d jjd d dk�sBt‚|d jjd jd dk�sbt‚d|d jjd d< |d jd d dk�s’t‚|d jjjd d dk�s²t‚|d jjjd jd dk�sÔt‚|d jjd d dk�sòt‚|d jjd jd dk�st‚d|d jjd jd< |d jd d dk�sDt‚|d jjjd d dk�sdt‚|d jjjd jd dk�s†t‚|d jjd d dk�s¤t‚|d jjd jd dk�sÄt‚| ¡  d S )Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   rî   rï   rð   rñ   rò   r  )r   rR   r   r5   rw   rD   rx   rt   rz   rÊ   ró   rô   r3   rõ   r4   r}   r~   rs   r   )rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   r)  r[   r    r    r!   Útest_new_table_with_ndarrayÉ  s¤    ÿ
ÿ
ÿ "  "  "  "  " z.TestTableFunctions.test_new_table_with_ndarrayc                 C   sò	  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	d|	jd d< |	jd d dks¾t‚|	jj	j
d d dksØt‚|	jj	jd jd dksôt‚|	jj
d d dk�st‚|	jjd jd dk�s*t‚d|	jj	j
d d< |	jd d dk�sTt‚|	jj	j
d d dk�spt‚|	jj	jd jd dk�sŽt‚|	jj
d d dk�s¨t‚|	jjd jd dk�sÄt‚d|	jj	jd jd< |	jd d dk�sðt‚|	jj	j
d d dk�st‚|	jj	jd jd dk�s*t‚|	jj
d d dk�sDt‚|	jjd jd dk�s`t‚d|	jj
d d< |	jd d dk�sˆt‚|	jj	j
d d dk�s¤t‚|	jj	jd jd dk�sÂt‚|	jj
d d dk�sÜt‚|	jjd jd dk�søt‚d|	jjd jd< |	jd d dk�s"t‚|	jj	j
d d dk�s>t‚|	jj	jd jd dk�s\t‚|	jj
d d dk�svt‚|	jjd jd dk�s’t‚d|	jjd jd< |	 |  d¡¡ t |  d¡¡}
d|
d jd d< |
d j}|
d jd d dk�süt‚|
d jj	j
d d dk�st‚|
d jj	jd jd dk�s>t‚|
d jj
d d dk�s\t‚|
d jjd jd dk�s|t‚|d d dk�s’t‚|j	j
d d dk�s¬t‚|j	jd jd dk�sÈt‚d|j	jd jd< tj |¡}d}|jD ]r}tt|ƒƒD ]V}t|| t jƒ�r8|| |	j| | k ¡ �sTt‚n|| |	j| | k�s t‚�q |d }�qðd|jd d< |
d jd d dk�sŽt‚|
d jj	j
d d dk�s®t‚|
d jj	jd jd dk�sÐt‚|
d jj
d d dk�sît‚|
d jjd jd dk�st‚|d d dk�s$t‚|j	j
d d dk�s>t‚|j	jd jd dk�sZt‚|jd d dk�srt‚|jj	j
d d dk�sŽt‚|jj	jd jd dk�s¬t‚|jj
d d dk�sÆt‚|jjd jd dk�sât‚d|
d jd d< |
d jd d dk�st‚|
d jj	j
d d dk�s0t‚|
d jj	jd jd dk�sRt‚|
d jj
d d dk�spt‚|
d jjd jd dk�s�t‚|d d dk�s¦t‚|j	j
d d dk�sÀt‚|j	jd jd dk�sÜt‚|jd d dk�sôt‚|jj	j
d d dk�st‚|jj	jd jd dk�s.t‚|jj
d d dk�sHt‚|jjd jd dk�sdt‚d |jj	j
d d< |
d jd d dk�s’t‚|
d jj	j
d d dk�s²t‚|
d jj	jd jd dk�sÔt‚|
d jj
d d dk�sòt‚|
d jjd jd dk�	st‚|d d dk�	s(t‚|j	j
d d dk�	sBt‚|j	jd jd dk�	s^t‚|jd d d k�	svt‚|jj	j
d d d k�	s’t‚|jj	jd jd d k�	s°t‚|jj
d d d k�	sÊt‚|jjd jd d k�	sæt‚|
 ¡  d S )!Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   rî   rï   rð   rñ   rò   r  é
   iš  )r   rR   r   r5   rw   rD   rx   rt   r4   rô   rõ   r3   r}   r~   rs   r'   r$   r)   rÊ   r{   r   )rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r:   r[   Úfrr)  r,   r-   Újr    r    r!   Útest_new_table_with_fits_rec5  sÐ    
 " 
"  "  "  " z/TestTableFunctions.test_new_table_with_fits_recc                 C   sú  t  ddddg¡}t  ddddg¡}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dddgd�}t |||||g¡}tj |¡}	t |	j¡}
t|
jj	j
d jƒt|
jj	jd ƒksÐt‚t|
jj	j
d jƒt|
j
j
d jƒksút‚t|
jj	j
d jƒt|
j
jd ƒk�s$t‚t|	jj	j
d jƒt|
jj	jd ƒk�sPt‚d|
jd d< |
jd d dk�svt‚|
jj	jd d dk�s’t‚|
jj	j
d jd dk�s°t‚|
j
jd d dk�sÊt‚|
j
j
d jd dk�sæt‚|	jd d dk�sþt‚|	jj	jd d dk�st‚|	jj	j
d jd dk�s8t‚|	j
jd d dk�sRt‚|	j
j
d jd dk�snt‚d|
jj	jd d< |
jd d dk�s˜t‚|
jj	jd d dk�s´t‚|
jj	j
d jd dk�sÒt‚|
j
jd d dk�sìt‚|
j
j
d jd dk�st‚|	jd d dk�s t‚|	jj	jd d dk�s<t‚|	jj	j
d jd dk�sZt‚|	j
jd d dk�stt‚|	j
j
d jd dk�s�t‚d|
jj	j
d jd< |
jd d dk�s¼t‚|
jj	jd d dk�sØt‚|
jj	j
d jd dk�söt‚|
j
jd d dk�st‚|
j
j
d jd dk�s,t‚|	jd d dk�sDt‚|	jj	jd d dk�s`t‚|	jj	j
d jd dk�s~t‚|	j
jd d dk�s˜t‚|	j
j
d jd dk�s´t‚d|
j
jd d< |
jd d dk�sÜt‚|
jj	jd d dk�søt‚|
jj	j
d jd dk�st‚|
j
jd d dk�s0t‚|
j
j
d jd dk�sLt‚|	jd d dk�sdt‚|	jj	jd d dk�s€t‚|	jj	j
d jd dk�sžt‚|	j
jd d dk�s¸t‚|	j
j
d jd dk�sÔt‚d|
j
j
d jd< |
jd d dk�sþt‚|
jj	jd d dk�st‚|
jj	j
d jd dk�s8t‚|
j
jd d dk�sRt‚|
j
j
d jd dk�snt‚|	jd d dk�s†t‚|	jj	jd d dk�s¢t‚|	jj	j
d jd dk�sÀt‚|	j
jd d dk�sÚt‚|	j
j
d jd dk�söt‚d S )Nrþ   rÿ   r   r  r  r  r  r  r  r  rP   r  rf   r	  r
  r  r  r  r  r  r  r  r   r   rî   rï   rð   rñ   rò   )r   rR   r   r5   rw   rD   rx   rt   ró   rô   r3   rõ   r4   )rE   r  r%   r„   r…   r‡   r‰   r‹   r%  r)  rÄ   r    r    r!   Útest_bin_table_hdu_constructor¶  s–    ÿ
ÿ
*ÿz1TestTableFunctions.test_bin_table_hdu_constructorc                 C   sÄ   t jt jfD ]²}|ƒ }|jdks$t‚d|jks2t‚d|_|jdksFt‚|jd dksXt‚|dd�}|jdkspt‚|jd dks‚t‚t  ¡ }d|d< ||dd�}|jdks¬t‚|jd dkst‚qdS )zëtestConstructorNameArg

        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)rA   r   N)r   rD   r½   r   r4   rA   ÚHeader©rE   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$t‚d|jks2t‚d|_|jdksFt‚|jd dksXt‚|dd�}|jdkspt‚|jd dks‚t‚t  ¡ }d|d< ||dd�}|jdks¬t‚|jd dkst‚qd S )	Nr   ZEXTVERrZ   rT   )ÚverrU   rV   )rA   r�  )r   rD   r½   r�  r4   rA   r}  r~  r    r    r!   Útest_constructor_ver_arg2  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spamrS   g      E@rP   N)r   r5   rD   rx   )rE   r<   r    r    r!   Útest_unicode_colnameH  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^t‚|j d¡d tjddgt	d�k 
¡ sˆt‚t j |j¡}|j d¡d tjddgt	d�k 
¡ sÀt‚|j d¡d tjddgt	d�k 
¡ sêt‚d S )	Nr  Z2LTFrP   r   rN   r   )r   r5   rw   rD   rx   rt   r(   r   rR   rm   r{   r4   )rE   r„   r%  r)  r:   r    r    r!   Ú!test_bin_table_with_logical_arrayQ  s    $ÿ$ÿ$ÿ$ÿz4TestTableFunctions.test_bin_table_with_logical_arrayc                 C   s~  t  |  d¡¡}|j| d¡k ¡ s(t‚|j|d k ¡ s>t‚t  |  d¡¡}dD ]8}t||ƒ}|| |¡k ¡ svt‚||| k ¡ sRt‚qRt  |  d¡¡}dD ]8}t||ƒ}|| |¡k ¡ sÄt‚||| k ¡ s t‚q t jddt	j
d	d
gdddggt	jd�d�}t j |g¡}t|jd ƒt|jjƒk�s2t‚|jd d |jjd k ¡ �sVt‚|jd d |jjd k ¡ �szt‚d S )Nr.  r1  rH   )r„   r…   r‡   r‰   r­   )r   r   r‘   úPI()é-   é8   é   rQ  é   rN   rP   r   r   )r   rL  rt   r1  r(   r{   r4   r8   r5   r   rR   Úobject_rD   rx   r*   r‘   )rE   rT  r<   rt   rÒ   rÄ   r    r    r!   Útest_fits_rec_column_accessg  s,    

ý $z.TestTableFunctions.test_fits_rec_column_accessc                 C   s‚  t  |  d¡¡}|d }d|jjks(t‚d|jjks8t‚d|jjjksJt‚|jd d dks`t‚t|jd d tj	dd	d
gtj
d�ƒsŠt‚|jd d dks t‚|jd d dks¶t‚|jd d dksÌt‚t|jd d tj	dddgtj
d�ƒsöt‚|jd d dk�st‚|jd d dk�s&t‚| |  d¡¡ | ¡  t  |  d¡¡}|d }d|jjk�sht‚d|jjk�szt‚d|jjjk�sŽt‚|jd d dk�s¦t‚t|jd d tj	dd	d
gtj
d�ƒ�sÒt‚|jd d dk�sêt‚|jd d dk�st‚|jd d dk�st‚t|jd d tj	dddgtj
d�ƒ�sFt‚|jd d dk�s^t‚|jd d dk�svt‚| ¡  d S )Núzerowidth.fitsrZ   ZORBPARMr   ZANNAMEzVLA:_W16ZSTABXYZg~Ï°=@gsž�!ø—”Àgz®a‚ù†ÀrN   ZNOSTAr   ZMNTSTAr]  zVPT:_OUTr   é   r  )r   rs   rt   r3   r%   r4   r   r"   r   rR   rö   r}   r~   r   )rE   rÅ   r:   r    r    r!   Ú!test_table_with_zero_width_column…  sR    þ ÿþ
 ÿ
z4TestTableFunctions.test_table_with_zero_width_columnc              	   C   s¶  ddddg}d}t jddt |¡d�}t j |g¡}|j ¡  d	¡|ksLt	‚| 
|  d
¡¡ t  |  d
¡¡�<}|d j ¡  d	¡|ksŠt	‚|d jd |k ¡ s¤t	‚W 5 Q R X ~t j |g¡}|j
|  d
¡dd� t  |  d
¡¡�^}|d j ¡  d	¡| dd¡k�s
t	‚|d jd |k ¡ �s&t	‚t j |d j ¡ ¡}W 5 Q R X ~|j
|  d
¡dd� t  |  d
¡¡�@}|d j ¡  d	¡|k�sŒt	‚|d jd |k ¡ �s¨t	‚W 5 Q R X d S )NZimg1Zimg2Zimg3aÚpz(img1      img2      img3a     p         ZMEMNAMEr  rP   zraw-unicode-escaper  r   Trp   ú ú )r   r5   ru   rR   rD   rx   rt   ÚtobytesÚdecoder4   r}   r~   rs   r{   r½   ÚreplaceÚcopy)rE   r   ÚsÚacolZahdurÅ   r    r    r!   Útest_string_column_padding´  s2    ÿ$ ÿ z-TestTableFunctions.test_string_column_paddingc              
   C   sv  t jjddddddgdfdd	d
dddgdfdddddd	gdfgdd�}tj |¡}| |  d¡¡ tj|  d¡dd��"}d|d j	d< d|d j	d< W 5 Q R X t |  d¡¡�À}|d }|j
 d¡}|j
 d¡}|jdksÞt‚|jdksìt‚|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@t‚|t  ddgddgddgg¡k ¡ �sjt‚W 5 Q R X ~~~~t jdddgd�}d|d < d!|d"< tj|  d¡|d#d$� t |  d¡¡}| d¡jjd% d&k�sàt‚| d¡jd'k�söt‚t jddd(gd�}d|d < d!|d"< ~tj|  d¡|d#d$� t |  d¡¡}| d¡jjd% d&k�s\t‚| d¡jd)k�srt‚d*S )+zv
        Tests the multidimensional column implementation with both numeric
        arrays and string arrays.
        r   r   rZ   rT   rU   rV   Zrow1row1rn   ro   rr  rq  Zrow2row2Zrow3row3z6i4,a8r  r  Úupdate©Úmodeú(2,3)ÚTDIM1z(4,2)ÚTDIM2)rT   rT   rZ   ©rT   rZ   Zrow1Zrow2Zrow3)r‘   Úf4)r–  ÚS5rU   rN   )r   rZ   rT   r‘   Úokr–  Trp   r]  Ú5)rT   rU   )r–  r¡  )rU   rT   )rT   rU   rT   N)r   ry   rR   r   rD   rx   r}   r~   rs   rA   rt   r(   r$  r4   r{   rK  rL  r   r|   )rE   rt   rF   rÅ   r„   r…   r«   r    r    r!   Útest_multi_dimensional_columnsØ  s`    ýú	ýÿÿÿ"ÿz1TestTableFunctions.test_multi_dimensional_columnsc              	   C   s„   t jddgdgd�}tj |¡}| |  d¡¡ t |  d¡¡�:}|d }|j 	d¡}|j
dksdt‚|jd	 d
ksvt‚W 5 Q R X d S )NrÈ   ©rZ   )r‘   rd   rÈ   rN   zonedtable.fitsr   r   )rZ   r   r�  z(1))r   rR   r   rD   rx   r}   r~   rs   rt   r(   r$  r4   rA   )rE   rt   rF   rÅ   r<  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)S4rN   r?  c              	      sÄ   | j d jdkst‚| j d jj d¡s,t‚| jˆ  d¡dd� t 	ˆ  d¡¡�j}|d }|j
d d	kslt‚|j d jdks€t‚| j d jj d¡s˜t‚t |j d | j d k¡s¶t‚W 5 Q R X d S )
Nr#   )rV   rT   rZ   ZU4r@  Trp   r   r�  z(4,2,3))rt   r$  r4   r   r|   Úendswithr}   r~   r   rs   rA   r   r{   )r:   rÅ   rs  ©rE   r    r!   Útest_dims_and_roundtripG  s    z`TestTableFunctions.test_bin_table_init_from_string_array_column.<locals>.test_dims_and_roundtripN)r   rR   r   rD   rx   )rE   rt   Úarrr)  r©  rs  r    r¨  r!   Ú,test_bin_table_init_from_string_array_column2  s     ÿz?TestTableFunctions.test_bin_table_init_from_string_array_columnc           
   
   C   sL  ddgddgddgg}ddd	d
dg}t j||f||fgddgd�}tj|d�}| |  d¡¡ t|  d¡dƒ�}| ¡ }W 5 Q R X t|  d¡dƒ�}| | 	dd¡¡ W 5 Q R X t |  d¡¡�‚}|d }|j
d dksÜt‚|j
d dksît‚|jD ]H}	t  |	d ddgddggk¡�st‚t  |	d ddd	d
dgk¡sôt‚qôW 5 Q R X 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   klr   rZ   rT   rU   rV   )r   z(3, 2)S2)r   Z5i8rN   r?  r@  ÚrbÚwbs   (2,2,3)s   (2,2,2)r�  z(2,2,2)ÚTFORM1Z12Ar   ÚabÚcdZefÚghr   N)r   rR   r   rD   r}   r~   rs   rÀ   rM  r”  rA   r4   rt   r{   )
rE   Úarr1Úarr2rª  r:   rÆ   Z	raw_bytesrÅ   rs  r-   r    r    r!   Ú!test_columns_with_truncating_tdimY  s&     ÿ
$z4TestTableFunctions.test_columns_with_truncating_tdimc              	   C   sî  dddgdddgddd	gg}t jj|f|fgd
gd�}tj|d�}| |  d¡¡ t |  d¡¡�’}d|d jksvt	‚|d jd dksŒt	‚t
|d jƒdks¢t	‚t
|d jd ƒdks¼t	‚|d j d¡d t j | d¡d d¡k ¡ sðt	‚W 5 Q R X t |  d¡¡�(}|d jdd…  | |  d¡¡ W 5 Q R X t |  d¡¡�œ}d|d jk�s^t	‚|d jd dk�svt	‚t
|d jƒdk�sŽt	‚t
|d jd ƒdk�sªt	‚|d j d¡d t j | d¡d d¡k ¡ �sàt	‚W 5 Q R X dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/201rI   rJ   ZghiZjklZmnoZpqrZstuZvwxzyz z(3,3)S3r  r?  r@  r�  r   z(3,3,3)rZ   r   ÚasciiNrI  )r   ry   rR   r   rD   r}   r~   rs   rA   r4   r$   rt   r(   r   r“  r{   )rE   rt   Zrecarrr«   rü   r    r    r!   Útest_string_array_round_tripˆ  s*    .ÿ.ÿz/TestTableFunctions.test_string_array_round_tripc              	   C   s"  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¡¡�b}|d	 j
d  d¡|k ¡ sØt‚|d	 j
d  d¡|k ¡ søt‚|d	 j
d |k ¡ �st‚W 5 Q R X dS )zVRegression test for
        https://github.com/spacetelescope/PyFITS/issues/3
        r   r   z|S1rN   Úbcr°  Úez|S2r   rZ   rT   rU   rV   rn   ro   rr  r|   Z1ArP   ZstrarrayZ4Aú(2,2)©r   rQ   r    rR   ZintarrayÚ4Iz(2, 2)r@  rµ  N)r   rR   r   r5   rD   rx   rw   r}   r~   rs   rt   Úencoder{   r4   )rE   ÚarraÚarrbZarrcrÌ   rÄ   rü   r    r    r!   Útest_new_table_with_nd_columnª  s    &ý  z0TestTableFunctions.test_new_table_with_nd_columnc              	   C   sr  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sºt‚|d j
d dksÐt‚|d j
d |d j
d   krødksþn t‚|d jd |k ¡ �st‚|d jd |k ¡ �s6t‚|d jjdk�sLt‚W 5 Q R X 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   rZ   rT   rU   rV   rn   ro   rr  rq  rw  rˆ  rQ  r‰  é   é   é   r   Z20Ir¹  rº  r   r»  r@  r®  ÚTFORM2r�  rž  é0   Z2IN)r   rR   r   r5   rD   rx   rw   r}   r~   rs   rA   r4   rt   r{   Úitemsizer^  r_  r   )rE   r½  r¾  rÌ   rÄ   rü   r    r    r!   Útest_mismatched_tform_and_tdimÃ  s,    	&&þ.      ÿz1TestTableFunctions.test_mismatched_tform_and_tdimc              	   C   s8   t  |  d¡¡�}|d jd jdks*t‚W 5 Q R X dS )z@Regression test for https://github.com/astropy/astropy/pull/3580z	tdim.fitsr   r1  )rT   r   r   N)r   rs   rt   r$  r4   )rE   Zhdulistr    r    r!   Útest_tdim_of_size_oneæ  s    z(TestTableFunctions.test_tdim_of_size_onec              	   C   s  t  |  d¡¡�}|d j}W 5 Q R X | d¡}|dd… }| d¡|k ¡ sRt‚tt|ƒd ƒD ]X}|d|… }| d¡|d|… k ¡ s�t‚||d… }| d¡||d… k ¡ sbt‚qb|ddd… }| d¡|ddd… k ¡ sêt‚|ddd… }| d¡|ddd… k ¡ �st‚dS )zDRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/52r.  r   r  NrZ   r]  )r   rs   rt   r(   r{   r4   r'   r$   )rE   rÆ   rt   Útargetsr–  Únr    r    r!   Útest_slicingì  s    
  zTestTableFunctions.test_slicingc              	   C   s²   t  |  d¡¡�}|d j}W 5 Q R X ||d dk }|t |d dk¡ }|dg }|dd… }||||fD ]}t|t jƒsnt‚qnt||ƒs’t‚t||ƒs t‚t||ƒs®t‚dS )zDRegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/55r.  r   r  r2  r   N©	r   rs   rt   r   Úwherer)   ré   r4   r.   ©rE   rÆ   rt   Ús1Ús2Zs3Zs4r–  r    r    r!   Útest_array_slicingþ  s    
z%TestTableFunctions.test_array_slicingc              
   C   sª   t  |  d¡¡��}|d j}d|d< t |d dk¡s:t‚d|d< t |d dk¡sXt‚tttjfD ]6}|dddgƒ|d< t 	|d t dddg¡¡sdt‚qdW 5 Q R X dS )zV
        Regression test for https://github.com/spacetelescope/PyFITS/pull/48
        r.  r   r   r1  rZ   rT   N)
r   rs   rt   r   r{   r4   rB  ÚtuplerR   Úarray_equal)rE   rÄ   rt   Ú	containerr    r    r!   Útest_array_broadcasting	  s    
z*TestTableFunctions.test_array_broadcastingc              	   C   s¶   t j|  d¡dd��}|d j}W 5 Q R X ||d dk }|t |d dk¡ }|dg }|dd… }||||fD ]}t|t jƒsrt‚qrt||ƒs–t‚t||ƒs¤t‚t||ƒs²t‚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.
        r.  Úreadonlyrš  r   r  r2  r   NrË  rÍ  r    r    r!   Útest_array_slicing_readonly	  s    
z.TestTableFunctions.test_array_slicing_readonlyÚ	tablenamer.  rH   c              	   C   s„   t  |  |¡¡�j}|d }|  d¡}|  d¡}|  d¡}| |||¡ t j |||¡}t|j|jƒsht‚t	||d ƒ W 5 Q R X 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   rs   rt   r~   ÚdumprD   Úloadr.   r4   r>   )rE   r×  rÅ   r:   ÚdatafileÚcdfileÚhfiler9   r    r    r!   Útest_dump_load_round_trip1	  s    


z,TestTableFunctions.test_dump_load_round_tripc                 C   s¦   t jjdddddgdfddd	d
dgdfgdd�}tj |¡}|  d¡}|  d¡}|  d¡}| |||¡ tj |||¡}t	|j
|j
ƒsŠt‚t|jƒt|jƒks¢t‚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   r   rZ   rT   rU   gš™™™™™¹?r   rV   rn   ro   rr  gš™™™™™É?z	a1,4i4,f8r  rØ  rÙ  rÚ  N)r   ry   rR   r   rD   rx   r~   rÛ  rÜ  r.   rt   r4   r|   rA   )rE   rt   r:   rÝ  rÞ  rß  r9   r    r    r!   Útest_dump_load_array_columsF	  s    " ÿ


z.TestTableFunctions.test_dump_load_array_columsc              
   C   sŽ  t jdddgtd�}tjdd|d�}t jddd	gt jd�}tjd
d|d�}t jdddgt jd�}tjdd|d�}t jdddgt jd�}tjdd|d�}t  dddg¡}	tjdd|	d�}
t jdddgt jd�}tjdd|d�}t jdd d!gt j	d�}tjd"d#|d�}t jdd$d%gd&d'd(gd)d*d+ggt jd�}tjd,d-|d�}tj
 |||||
|||g¡}|  d.¡}| |¡ tj
 |¡}t|j|jƒ�sŠt‚d/S )0a9  
        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.
        FTrN   Úc0r  rP   r   é€   éÿ   r…   ÚBiÐŠÿÿé   r‡   rY   iMJ©øiÒ  i³µVr‰   rf   r   rI   r¯  r‹   r™   re  rf  rg  r�   rº   yš™™™™™ñ?š™™™™™@yffffff
@š™™™™™@y      @ffffff@r�   ÚMrZ   rT   rU   rV   rn   ro   rr  rq  r\   úPJ()rØ  N)r   rR   rm   r   r5   rv   rÁ   rÂ   rö   Z
complex128rD   rx   r~   rÛ  rÜ  r.   rt   r4   )rE   Za0râ  rÃ   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r\   r:   rÝ  r9   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dddgks^t‚|jjdgd kstt‚|jd dgk ¡ sŒt‚|jd dgk ¡ s¤t‚|jj	dgk ¡ sºt‚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%   rY   r   rP   rà   rZ   ÚotherrT   N)
r   r5   rD   rx   rt   r%   r4   rà   r{   rê  )rE   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s4t‚t	|j
|ƒsDt‚| |  d¡¡ tj|  d¡dd�}|jjddgks|t‚t	||ƒsŠt‚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  r.  r   )ÚextN)r   ry   rR   r   rD   rx   r3   rà   r4   r.   rt   r}   r~   rL  )rE   rR   rF   rt   r    r    r!   Útest_table_from_bool_fields�	  s    z.TestTableFunctions.test_table_from_bool_fieldsc                 C   s@   t jdddgdgd�}tj|d�}|jd |d k ¡ s<t‚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)T)r   ú?rN   r?  r   N)r   rR   r   rD   rt   r{   r4   )rE   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	��*}d|d
 jd d
< d|d
 jd d< W 5 Q R X t  |  d¡¡�B}|d
 jd ddgk 	¡ sÂt
‚|d
 jd ddgk 	¡ sàt
‚W 5 Q R X dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/139ÚF1r  TF©rR   ZF2r.  r™  rš  r   r   N)r   r5   rD   rx   rw   r}   r~   rs   rt   r{   r4   )rE   r„   r…   rF   rÅ   r    r    r!   Útest_bool_column_update»	  s    z*TestTableFunctions.test_bool_column_updatec              
      s  t jdddt ddddg¡dd�}t j |g¡}| |  d	¡¡ t j|  d	¡d
d�� ‰ dˆ d j	d< ˆ d j	d= W 5 Q R X t  |  d	¡¡�‰ t
 t‡ fdd„¡ W 5 Q R X z.t  |  d	¡¡�‰ ˆ d jd  W 5 Q R X W n6 tk
�r } zt|ƒ d¡sþt‚W 5 d}~X Y nX dS )zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/197rð  r™   z---z1.0z2.0z3.0T)r›   rR   rµ  r@  r™  rš  ZE3r   r®  rA  c                      s   ˆ d j d S )Nr   rð  r?  r    ©rü   r    r!   r[  ß	  r\  z7TestTableFunctions.test_missing_tnull.<locals>.<lambda>zYthe header may be missing the necessary TNULL1 keyword or the table contains invalid dataN)r   r5   r   rR   r½   rx   r}   r~   rs   rA   r^  r_  Ú
ValueErrorrt   r|   r§  r4   )rE   r<  rN  r¸  r    ró  r!   Útest_missing_tnullË	  s*    ûÿz%TestTableFunctions.test_missing_tnullc           	      C   s¢  d}t jdd|t dddddg¡d	d
�}t j |g¡}| |  d¡¡ t|  d¡dd��*}| 	¡  
dd¡}| d¡ | |¡ W 5 Q R X t j|  d¡d	d�� }|d jd d dks¸t‚W 5 Q R X d}t jdd|t ddddg¡d	d
�}t j |g¡}| |  d¡¡ t|  d¡dd��*}| 	¡  
dd¡}| d¡ | |¡ W 5 Q R X t j|  d¡d	d��<}|d jd d dk�s”t |d jd d ¡�s”t‚W 5 Q R X 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I8r   r   rZ   rT   rU   T)rQ   r›   rR   rµ  zascii_null.fitszr+rš  z2       z        ©ZmemmapÚNaNzF12.8rÎ   rÏ   rÐ   rÑ   zascii_null2.fitsz
3.00000000z
          r   N)r   r5   r   rR   r½   rx   r}   r~   rs   rÀ   r”  ÚseekrM  rt   r4   Úisnan)	rE   Znullval1r„   rN  rü   ZnulledrÆ   Znullval2r…   r    r    r!   Útest_blank_field_zeroê	  s@    û
$û
z(TestTableFunctions.test_blank_field_zeroc                 C   s0   dgd }t jdd|d�}||jk ¡ s,t‚dS ©zERegression test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/218i�ÿÿÿé   rä   rS   ©rQ   rR   N©r   r5   rR   r{   r4   ©rE   rª  r<   r    r    r!   Útest_column_array_type_mismatch!
  s    
z2TestTableFunctions.test_column_array_type_mismatchc              	   C   sþ   t  |  d¡¡�Z}|d j d|d _t|d jt jƒs<t‚t|d jƒdksRt‚|d  |  d¡¡ W 5 Q R X t  |  d¡¡�t}|d j	d dks˜t‚|d j	d d	ks®t‚|d j	d
 dksÄt‚t|d jt jƒsÚt‚t|d jƒdksðt‚W 5 Q R X dS )zWRegression test
        for https://github.com/spacetelescope/PyFITS/issues/27
        rH   r   Nr   r@  ZNAXISrZ   ÚNAXIS1rQ  ÚNAXIS2)
r   rs   rt   r)   ré   r4   r$   r}   r~   rA   )rE   rü   r    r    r!   Útest_table_none(
  s    

z"TestTableFunctions.test_table_nonec              
   C   s¸   t  |  d¡¡�}|d  |  d¡¡ W 5 Q R X d|d jksBt‚t  |  d¡¡�\}t  |  d¡¡�@}t|d jƒt|d jƒks†t‚t	|d j|d jƒs t‚W 5 Q R X W 5 Q R X 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.
        r.  r   r@  rt   N)
r   rs   rt   r}   r~   r6   r4   r|   rA   r.   )rE   rü   Zh1Úh2r    r    r!   Útest_unncessary_table_load;
  s    	 z-TestTableFunctions.test_unncessary_table_loadc              	   C   s¨   t  |  d¡¡}t|d jjd tƒs*t‚t j 	|d j¡}t|d jjd tƒrVt‚| 
|  d¡¡ t  |  d¡¡� }t|d j|d jƒs’t‚W 5 Q R X | ¡  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.
        r.  r   r   r@  N)r   rs   rt   r)   r3   rõ   r   r4   rD   rx   r}   r~   r.   r   )rE   rÅ   r«   Úhdul2r    r    r!   Ú&test_table_from_columns_of_other_tableP
  s    $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¡srt‚t |d |d k¡sŒt‚t |d	  	tj
¡|d	  	tj
¡k¡s¶t‚t t |d
 dd¡|d
 k¡sÚt‚W 5 Q R X W 5 Q R X dS )z?Tests initializing a TableHDU with the data from a BinTableHDU.rH   r   r?  r@  Trp   r„   r…   r‡   r‰   ÚTÚFN)r   rs   rt   r½   r}   r~   r   r{   r4   Zastyper   rÌ  )rE   rÅ   rT  r:   r  Ztbdata2r    r    r!   Útest_bintable_to_asciitablem
  s    

ÿz.TestTableFunctions.test_bintable_to_asciitablec              
   C   s~  t  |  d¡¡�h}t|d jjd tƒs,t‚t 	|d j¡}t 
|¡}t|d jjd tƒr`t‚t||d jƒstt‚W 5 Q R X t  |  d¡¡�4}t 	|d j¡}t 
|¡}t||d jƒs¾t‚W 5 Q R X t  |  d¡¡�6}t 	|d j¡}t 
|¡}	t|	|d jƒ�s
t‚W 5 Q R X t  |  d¡¡�P}
t 	|
d j¡}t 
|¡}tjtdd	�� t||
d jƒ�sft‚W 5 Q R X W 5 Q R X d
S )ú�
        Regression test for https://github.com/astropy/astropy/issues/1597

        Tests for pickling FITS_rec objects
        rH   r   r   r­   úrandom_groups.fitsrŒ  rZ   zField 2 has a repeat count of 0©rS  N©r   rs   rt   r)   r3   rõ   r   r4   ÚpickleÚdumpsÚloadsr.   r^  ÚwarnsÚUserWarning©rE   ZbtbZbtb_pdZbtb_plÚascZasc_pdZasc_plZrgrZrgr_pdZrgr_plZzwcZzwc_pdZzwc_plr    r    r!   Útest_pickle‚
  s&    


 
zTestTableFunctions.test_picklec                 C   sr   t jg dddgd�}t |¡}|jd dks0t‚|jd dksBt‚|jd	 d
ksTt‚|j d¡}|jdksnt‚d S )N)r   Úi8)r   ZS64)r<  )rd   rŸ  rN   r  é`   r  r   ZTDIM3rœ  r   )r   )	r   rR   r   rD   rA   r4   rt   r(   r$  )rE   rR   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¡srt‚W 5 Q R X 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   rR   r    rQ   r@  r   N)r   rL  rt   r5   rD   rx   r}   r~   rs   r   r{   r4   )rE   rt   r<   rF   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… ƒs‚t‚t|dd… |dd… ƒs t‚t|t  |  d¡¡ƒsºt‚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
        rH   rg   Nr„   r   )r   rL  rt   r$   ré   rx   r.   r4   )rE   Zdata1Zdata2rh   ZmergedrU  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��2}d|d jd	 d
< |d jd	 d
 dksft‚W 5 Q R X t |  d¡¡� }|d jd	 d
 dksœt‚W 5 Q R X t jdddgdddggfgdgd�}t |  d¡|¡ dddgdddgg}tj|  d¡dd��R}|d jd dk�st‚d|d jd	 d< t  	|d jd	 d
 |k¡�sRt‚W 5 Q R X t |  d¡¡�@}|d jd dk�s†t‚t  	|d jd	 d
 |k¡�s¨t‚W 5 Q R X 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'``.
        )rI   )r   ÚS3rN   r@  r™  rš  ZXYZr   r   r   rI   rJ   ZgehZijkZlmnZopq)r   )r  ©rZ   rT   rI  r�  z(3,3,2))r   r   r   N)
r   rR   r   r}   r~   rs   rt   r4   rA   r{   )rE   rt   rÅ   Úexpectedr    r    r!   Ú!test_update_string_column_inplaceâ
  s(    $$þ,z4TestTableFunctions.test_update_string_column_inplacezrequires objgraph©Úreasonc              	   C   s.   dd„ }t dƒ� ||  d¡ƒ W 5 Q R X dS )z?Regression test for https://github.com/astropy/astropy/pull/520c              	   S   s>   t  | ¡�}|d j ¡ }W 5 Q R X |jjD ]}||  q,d S )Nr   )r   rs   rt   r•  r   r%   )ÚfilenamerÅ   rt   Zcolnamer    r    r!   Úreadfile  s    z8TestTableFunctions.test_reference_leak.<locals>.readfileré   zmemtest.fitsN)Ú_refcountingrt   )rE   r$  r    r    r!   Útest_reference_leak  s    
z&TestTableFunctions.test_reference_leakc              
   C   sâ   ddl m} ddlm} |ƒ }| ¡  z tdƒ� | ¡  W 5 Q R X W 5 | ¡  X ~|  ¡ }dD ]<}| ¡  z$tdƒ� t	||ƒƒ  W 5 Q R X W 5 | ¡  X q`~|ƒ }| 
¡  z"tdƒ� | |¡ W 5 Q R X W 5 | ¡  X ~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   )ÚTestMultipleHDU)ÚTestCoreré   )râ   rì   rø   rý   N)Ztest_connectr'  Z	test_corer(  Zsetup_methodZteardown_methodr%  Ztest_add_del_columns2Ú	__class__r8   Zsetup_classZteardown_classZ	test_read)rE   Útmp_pathr'  r(  r[   r]   Z	test_namer_   r    r    r!   Útest_reference_leak2  s0    




z'TestTableFunctions.test_reference_leak2c              
   C   s’   t  |  d¡¡�x}|d }|  d¡}|  d¡}|  d¡}| |||¡ d}tjt|d�� | |||¡ W 5 Q R X |j|||dd	� W 5 Q R X d S )
Nr.  r   rØ  rÙ  rÚ  z›File .* already exists\.  File .* already exists\.  File .* already exists\.  If you mean to replace the file\(s\) then use the argument 'overwrite=True'\.r  Trp   )r   rs   rt   r~   rÛ  r^  r_  ÚOSError)rE   rÅ   r:   rÝ  rÞ  rß  Úmsgr    r    r!   Útest_dump_overwriteK  s    


ÿz&TestTableFunctions.test_dump_overwritec              	   C   sj  t jdddgt jd�}tjddd|d�}tj |g¡}| |  d	¡¡ tj	|  d	¡d
d��~}|d }d|j
ksrt‚|j
d dks„t‚|jd jt  d¡ksžt‚t  |jd |k¡s¶t‚d|jd d< | |  d¡¡ W 5 Q R X tj	|  d¡d
d��n}|d }d|j
k�st‚|j
d dk�s t‚|jd jt  d¡k�s<t‚t  |jd dddgk¡�s\t‚W 5 Q R X dS )zP
        Tests updating a table column containing pseudo-unsigned ints.
        r   rZ   rT   rN   rG  r–   ì        )r   rQ   r�   rR   r@  T)ZuintZTZERO1Úuint32éc   r   rI  N)r   rR   r0  r   r5   rD   rx   r}   r~   rs   rA   r4   rt   r   r{   )rE   rt   r<   rF   rÅ   rÄ   r    r    r!   Útest_pseudo_unsigned_ints[  s$    z,TestTableFunctions.test_pseudo_unsigned_intsc              	   C   s  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stt‚t  |  
d
¡¡�B}d|d jd d	< |d jd d	 dks²t‚| 	|  
d¡¡ W 5 Q R X t  |  
d¡¡� }|d jd d	 dksøt‚W 5 Q R X dS )z–Check that a scaled column if correctly saved once it is modified.
        Regression test for https://github.com/astropy/astropy/issues/6887
        r„   r   z>i2rN   Ú1Ié €  )r   rR   rQ   rœ   r�   rZ   r   za.fitsrw  zb.fitsN)r   r5   r   rR   rB   rC   rD   rx   rt   r}   r~   r4   rs   )rE   r„   r#   r`   rÅ   r    r    r!   Útest_column_with_scalingx  s"    ûz+TestTableFunctions.test_column_with_scalingc                 C   s¨   t jdddddgdd�}t jddd	d
dgdd�}t jdddddgdd�}t jdddddgdd�}t||d |||gƒ}t |  d¡¡}|j|jks–t‚t||ƒs¤t‚dS )zš
        Test correct integer dtypes according to ASCII table field widths.
        Regression for https://github.com/astropy/astropy/issues/9899
        rr  i  € i  Àÿrw  rd   rN   ræ  iÿÿÿi   àr:  r  i   l   ÿÿÿÿ lûÿÿÿ         é(   i    i þÿÿé2   rW   rZ   zascii_i4-i20.fitsN)r   rR   r
   rÀ   rt   r   r4   r.   )rE   Zi08Zi10Zi20Zi02Út0r[   r    r    r!   Útest_ascii_inttypes–  s    z&TestTableFunctions.test_ascii_inttypesc              	   C   s°   t jddt ddg¡dd�}t jddt d	d
g¡dd�}t jddt ddg¡dd�}t j |||g¡}| |  d¡¡ t j|  d¡dd��}t	|d j
|j
ƒs¢t‚W 5 Q R X dS )zTest different float formats.r   rº   r3  gffffff(@T)r   rQ   rR   rµ  r   ZD16g      /@gš™™™™™0@r<  zD16.7re  rf  zfoo.fitsFrö  r   N)r   r5   r   rR   r½   rx   r}   r~   rs   r.   rt   r4   )rE   rÒ   rÓ   Zcol3rÄ   rÅ   r    r    r!   Útest_ascii_floattypes¥  s,       ÿ   ÿ   ÿz(TestTableFunctions.test_ascii_floattypesN)SÚ__name__Ú
__module__Ú__qualname__rG   r•   r¬   rÇ   rÍ   rÔ   râ   rì   rí   rø   rý   r'  r*  r-  r6  r8  r9  r;  rE  rP  rW  ra  rc  rl  rt  ru  rv  rz  r{  r€  r‚  rƒ  r„  r‹  rŽ  r˜  r¤  r¦  r«  r´  r¶  r¿  rÆ  rÇ  rÊ  rÐ  rÔ  rÖ  r^  ÚmarkÚparametrizerà  rá  ré  rë  rí  rï  rò  rõ  rú  r   r  r  r  r
  r  r  r  r  r   ÚskipifÚHAVE_OBJGRAPHr&  Zslowr+  r.  r2  r5  r9  r:  r    r    r    r!   r?   ‚   s¢   k,L\ &	 (/@Y\[l _	/$L'/"#
)7%
 +
.r?   c                 c   sB   t  ¡  tt | ¡ƒ}|V  t  ¡  tt | ¡ƒ|ks>t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_typer4   )Útype_Ú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ejjejdk dd�ejjejdkdd�ejj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¡¡�`}|d	 j	 
d¡}|d d
d… tjddddgtjd�k ¡ s¦t‚|d	 jd j d¡sÀt‚W 5 Q R X d S )NÚQUAL_SPEr   i#  éá   rP   r¹   Trp   r   rU   rr  rN   zJ(1571))r   r5   rD   rx   rC   rB   r}   r~   rs   rt   r(   r   rR   rv   r{   r4   r3   rQ   r§  )Úformat_coder<   Útb_hduÚpri_hduÚhdu_listZtotoÚqr¨  r    r!   ÚtestÍ  s      ÿ0z8TestVLATables.test_variable_length_columns.<locals>.test©rè  zQJ()r    ©rE   rN  Ú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`t‚t|jd ƒdksvt‚|jd d	 |d	 k ¡ s”t‚|jd d
 |d
 k ¡ s²t‚|jd d d	gd k ¡ sÒt‚|jd d d	gd k ¡ sòt‚d S )Nr   rw  ZTESTVLFrP   ZTESTSCArf   rÁ  rg   r   rq  r]  )r   r5   rD   rx   r$   rt   r4   r{   )rI  rª  rÒ   rÓ   rJ  r    r    r!   rN  á  s     z=TestVLATables.test_extend_variable_length_array.<locals>.testrO  Nr    rP  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¡¡�l}|d
 j	d j
 d¡sŠt‚tdƒD ]B}tt|| ƒƒD ],}|d
 j d¡| | || | ks¦t‚q¦q’W 5 Q R X d S )Nç¹nP‹*@õ;ç'©x[¹‹õ;r   ÚOÚtestarP   r  Trp   r   r   úD(2)rT   ©r   rR   r   r5   rD   rx   r}   r~   rs   r3   rQ   r§  r4   r'   r$   rt   r(   ©rI  r   r—  r:   r)  ry  r,   r¨  r    r!   rN  õ  s    " ÿzRTestVLATables.test_variable_length_table_format_pd_from_object_array.<locals>.test©zPD()zQD()r    rP  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¡¡�l}|d	 j	d
 j
 d¡s‚t‚tdƒD ]B}tt|| ƒƒD ],}|d	 j d
¡| | || | ksžt‚qžqŠW 5 Q R X d S )NrT  rU  r   rW  rP   r  Trp   r   r   rX  rT   rY  rZ  r¨  r    r!   rN    s    $zJTestVLATables.test_variable_length_table_format_pd_from_list.<locals>.testr[  r    rP  r    r¨  r!   Ú.test_variable_length_table_format_pd_from_list  s    z<TestVLATables.test_variable_length_table_format_pd_from_listc                    s"   ‡ fdd„}dD ]}||ƒ qd S )Nc              	      sè   t  t  dddg¡t  ddg¡t  dg¡gd¡}tjd| |d	�}tj |g¡}|jˆ  d
¡dd� t ˆ  d
¡¡�l}|d j	d j
 d¡sŽt‚tdƒD ]B}tt|| ƒƒD ],}|d j d¡| | || | ksªt‚qªq–W 5 Q R X d S )Nr   r   r<  r=  r¸  rÆ   rV  rW  rP   r  Trp   r   r   úA(3)rT   rY  ©rI  r   r—  r:   rÅ   ry  r,   r¨  r    r!   rN    s    & ÿzRTestVLATables.test_variable_length_table_format_pa_from_object_array.<locals>.test©zPA()zQA()r    rP  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Â   dddg}t jd| |d�}t j |g¡}|jˆ  d¡dd� t  ˆ  d¡¡�l}|d	 jd
 j 	d¡sht
‚tdƒD ]B}tt|| ƒƒD ],}|d	 j d
¡| | || | ks„t
‚q„qpW 5 Q R X d S )Nr   r¯  rI   rW  rP   r  Trp   r   r   r^  rT   )r   r5   rD   rx   r}   r~   rs   r3   rQ   r§  r4   r'   r$   rt   r(   r_  r¨  r    r!   rN  (  s    
zJTestVLATables.test_variable_length_table_format_pa_from_list.<locals>.testr`  r    rP  r    r¨  r!   Ú.test_variable_length_table_format_pa_from_list'  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 ¡ stt‚qtd S )NrG  i$  rH  rP   r¹   Trp   )r   r5   r   ÚarangerD   rx   rC   rB   r}   r~   rL  rC  rR   r{   r4   )rI  r<   rJ  rK  rL  rt   Zrow_aZrow_br¨  r    r!   rN  :  s      ÿz,TestVLATables.test_getdata_vla.<locals>.testrO  Nr    rP  r    r¨  r!   Útest_getdata_vla7  s    zTestVLATables.test_getdata_vlaÚwin32z+https://github.com/numpy/numpy/issues/20699r!  c                 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¡¡�`}	|	d jd dksÊt‚|	d jd dksàt‚t|	d j|jƒsöt‚t|	d j|jƒ�st‚W 5 Q R X t |  
d¡¡�0}	tj|	d j|	d jd�}
|
 	|  
d¡¡ W 5 Q R X t |  
d¡¡�}t|d j|jƒ�sˆt‚W 5 Q R X t t ¡ g¡}| 	|  
d¡¡ tj|  
d¡dd��H}t dƒD ]8}t |  
d¡¡�}	| |	d ¡ | ¡  W 5 Q R X �qÐW 5 Q R X t |  
d¡¡�0}t ddƒD ]}t|| j|jƒ�s0t‚�q0W 5 Q R X dS )zX
        Regression test for https://github.com/spacetelescope/PyFITS/issues/47
        c                 S   s   g | ]}t  |d  ¡‘qS rÈ   ©r   rc  ©r/   rÉ  r    r    r!   r2   W  s     z/TestVLATables.test_copy_vla.<locals>.<listcomp>rä  c                 S   s   g | ]}t  d d| ¡‘qS )rä  ræ  rf  rg  r    r    r!   r2   X  s     rN  rf   rý  rG  ÚPJrå  r@  Trp   r   rÃ  zPJ(255)rZ   )rt   rA   rJ  rI  rr   rš  rT   N)r'   r   r5   r   rc  rD   rx   rB   rC   r}   r~   rs   rA   r4   r.   rt   rr   Úflush)rE   r²  r³  r<  r„   r…   r[   r]   rÅ   rü   Znew_hdur  Znew_hdulr“   Úidxr    r    r!   Útest_copy_vlaM  s:    
"" zTestVLATables.test_copy_vlac                 C   sj   t  |  d¡¡}|d j}|jdks(t‚|d d dks<t‚t |d d dddd	d
g¡s^t‚| ¡  d S )Nztheap-gap.fitsr   )rð   r,   iñ  rª  r   rZ   rT   rU   )r   rs   rt   r$  r4   r   rÒ  r   )rE   rÅ   rt   r    r    r!   Útest_vla_with_gapƒ  s    
"zTestVLATables.test_vla_with_gapc                 C   s„   t jddtjdddgddggtjd�d	�}t j |g¡}|j ¡ dddggddgggks\t	‚|jd  ¡ dddgddggks€t	‚d S )
NÚvarr…  r   rZ   rT   rˆ  rQ  rN   rP   )
r   r5   r   rR   rŠ  rD   rx   rt   Útolistr4   )rE   r<   rÄ   r    r    r!   Útest_tolist‹  s    ý$zTestVLATables.test_tolistc              	   C   s€   |   d¡}t |¡�b}|d }|j  ¡ ddgddggdddgdd	gggksNt‚|j d
  ¡ ddgdddggksrt‚W 5 Q R X d S )Nzvariable_length_table.fitsr   r†  r‡  rˆ  rT   rQ  r‰  rU   rm  )rt   r   rs   rn  r4   )rE   r#  rÅ   rÄ   r    r    r!   Útest_tolist_from_file•  s
    
0z#TestVLATables.test_tolist_from_filel        zrequires 64-bit systemzCannot test on Windowsc              	   C   sˆ   d}t jdt jd�}t  dt|d ƒ¡|d< tjdd|› d�d	|d
�}tj |g¡}d|_	t
jtdd�� | |  d¡¡ W 5 Q R X dS )zÓ
        Regression test for https://github.com/astropy/astropy/issues/10812

        Check if the error is raised when the heap size is bigger than what can be
        indexed with a 32 bit signed int.
        i   r   rN   r   r   ZMATRIXzPD(ú)r˜   r
  z3Please consider using the 'Q' format for your file.r  zmatrix.fitsN)r   rK  rŠ  rc  rD  r   r5   rD   rx   r   r^  r_  rô  r}   r~   )rE   ZnelemÚmatrixr<   r«   r    r    r!   Útest_heapsize_P_limit�  s     ÿz#TestVLATables.test_heapsize_P_limitc              	   C   s¢   t jdddd�t jddg g fd�g}t j |¡ |  d¡¡ t  |  d¡¡�L}tt|d j	d ƒƒD ].}t
 |d j	d | t
jg t
jd	�¡sdt‚qdW 5 Q R X d
S )z…
        Regression test for https://github.com/astropy/astropy/issues/12881

        Check if empty vla are correctly read.
        Úintegerrå  )r   rZ   rP   Úemptyrh  zbug.fitsr   rN   N)r   r5   rD   rx   r}   r~   rs   r'   r$   rt   r   rÒ  rR   rÂ   r4   )rE   r3   rÄ   r,   r    r    r!   Útest_empty_vla_raw_data·  s    þ ÿz%TestVLATables.test_empty_vla_raw_datac                 C   s  t  d¡}t  d¡}t j||gtd�}tjddd|d�}tj |g¡ |  	d¡¡ t 
|  	d¡¡�–}t|d	 jd d
 ƒ |d	 jjdgks�t‚t  |d	 jd d
 t  dddddgg¡¡sÀt‚t  |d	 jd d	 t  dddddddgg¡¡sôt‚W 5 Q R X t  d¡ d¡}t  d¡ d¡}t j||gtd�}tjddd|d�}tj |g¡ |  	d¡¡ t 
|  	d¡¡�²}|d	 jjdgk�s†t‚t  |d	 jd d
 t  ddgddgddgddgddgg¡¡�sÊt‚t  |d	 jd d	 t  ddgddgddgddgddgddgddgg¡¡�st‚W 5 Q R X t  d ¡ d!¡}t  d"¡ d#¡}t j||gtd�}tjdd$d%|d�}tj |g¡ |  	d&¡¡ t 
|  	d&¡¡�‚}|d	 jjd$gk�s¬t‚t  |d	 jd d
 t  dddgg¡¡�sÚt‚t  |d	 jd d	 t  dddgdddgg¡¡�st‚W 5 Q R X d'S )(zÄ
        Check if multidimensional VLF are correctly write and read.
        See https://github.com/astropy/astropy/issues/12860
        and https://github.com/astropy/astropy/issues/7810
        rV   ro   rN   rN  zPD(7)z(7,1)rº  r@  r   r   r   rÎ   rÏ   rÐ   rÑ   rh  g      @rw  )rV   rZ   rÀ  )ro   rZ   zPD(14)z(2,7)rI  g      @g       @g      "@g      $@rK   rL   rM   rT   )r   rT   rn   r  zPD(6)z(3,2)rJ  N)r   rc  rR   rË   r   r5   rD   rx   r}   r~   rs   r&   rt   r3   rà   r4   rÒ  Zreshape)rE   r   r   rR   r<   Zhdusr    r    r!   Útest_multidim_VLA_tablesË  sh    

 ÿ ÿ&þ
ùÿþ. ÿz&TestVLATables.test_multidim_VLA_tablesN)r;  r<  r=  Ú__doc__rR  rS  r\  r]  ra  rb  rd  r^  r>  r@  r   r   ÚsysÚplatformrk  rl  ro  rp  ÚmaxsizeZhugememrs  rv  rw  r    r    r    r!   rF  É  s,   þ
2
rF  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stt‚|jjdks„t‚|jjdks”t‚t dd¡}|jdks®t‚|jjdks¾t‚|jjdksÎt‚|jj	dksÞt‚t dd	¡}|jjd
ksút‚|jjdk�st‚|jj	dk�st‚t dd¡}|jjdk�s<t‚|jjdk�sNt‚|jj	dk�s`t‚t dd¡}|jjdk�s~t‚|jjdk�s�t‚|jj	dk�s¢t‚t dd¡}|jjd
k�sÀt‚|jjdk�sÒt‚|jj	dk�sät‚t dd¡}|jjdk�st‚|jjdk�st‚|jj	dk�s&t‚t dd¡}|jdk�sBt‚|jj
dk�sTt‚tjdddd�}|jdk�stt‚|jj
dk�s†t‚tjdddd�}|jdk�s¦t‚|jj
dk�s¸t‚tjdddd�}|jdk�sØt‚|jj
dk�sêt‚tjdddd�}|jdk�s
t‚|jj
dk�st‚t dd
¡}|jd
k�s8t‚|jj
dk�sJt‚tjdd
dd�}|jdk�sjt‚t dd¡}|jdk�s†t‚t dd¡}|jdk�s¢t‚|jj
dk�s´t‚tjdddd�}|jdk�sÔt‚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I4rY   rU   zF15.8r	  rÁ  rr  zE15.8rS   zD15.8rº   zF10.0rw  r   zE10.0zD10.0rW   T)rµ  r¼   rd   ZI9ZI12r  r   zE15.7zF16.7Zf8zD25.17N)r   r7   r   r5   r   r   rQ   r4   Úwidthr   Ú	recformat)rE   r~  Z
fitsformatr<  r    r    r!   Ú!test_column_format_interpretation  s~    


z5TestColumnFunctions.test_column_format_interpretationc              	   C   sÐ   t jdddddgd�}t j |g¡}| |  d¡¡ t  |  d¡¡�‚}|d jd	 dks\t‚|d j	d j
t 
d
¡kszt‚t |d j	d dddgk¡sœt‚tjj |d j	d¡}| ¡ dksÂt‚W 5 Q R X dS )zT
        Regression test for https://github.com/astropy/astropy/issues/3422
        r  zF5.0re  rf  rg  rñ  r@  r   r®  rö   rÎ   rÏ   rÐ   s      1.   2.   3.N)r   r5   r½   rx   r}   r~   rs   rA   r4   rt   r   r   r{   ry   rª   r(   r’  )rE   r<  r«   rÅ   Úrawr    r    r!   Ú test_zero_precision_float_columnr  s    "z4TestColumnFunctions.test_zero_precision_float_columnc                 C   s0   dgd }t jdd|d�}||jk ¡ s,t‚dS rû  rþ  rÿ  r    r    r!   r   …  s    
z3TestColumnFunctions.test_column_array_type_mismatchc                 C   s   t  ttjdddg¡ dS )zvTest that a TypeError is raised when a ColDefs is instantiated with
        a sequence of non-Column objects.
        r   rZ   rT   N)r^  r_  Ú	TypeErrorr   rw   r¨  r    r    r!   Ú%test_new_coldefs_with_invalid_seqenceŒ  s    z9TestColumnFunctions.test_new_coldefs_with_invalid_seqencec                 C   sF   t jdddgd�}tj |¡}d|d jks0t‚d|d jksBt‚d	S )
z}Test that ColDefs._init_from_array works with single element data-
        types as well as multi-element data-types
        rÈ   )rG  z<u4r¥  )rå  z>u2rN   r/  rG  r4  rå  N)r   rÊ   r   r+   rw   r�   r4   )rE   Znd_arrayZcol_defsr    r    r!   Útest_coldefs_init_from_array“  s    z0TestColumnFunctions.test_coldefs_init_from_arrayc              
   C   s~  t  |  d¡¡�h}t|d jjd tƒs,t‚t 	|d j¡}t 
|¡}t|d jjd tƒr`t‚t||d jƒstt‚W 5 Q R X t  |  d¡¡�4}t 	|d j¡}t 
|¡}t||d jƒs¾t‚W 5 Q R X t  |  d¡¡�6}t 	|d j¡}t 
|¡}	t|	|d jƒ�s
t‚W 5 Q R X t  |  d¡¡�P}
t 	|
d j¡}t 
|¡}tjtdd	�� t||
d jƒ�sft‚W 5 Q R X W 5 Q R X d
S )r  rH   r   r   r­   r  rŒ  rZ   z2Field 2 has a repeat count of 0 in its format coder  Nr  r  r    r    r!   r  œ  s,    


 
þzTestColumnFunctions.test_picklec                 C   sV   t jddd�}t jddd�}t  ||g¡}|d |d ks>t‚|d |d ksRt‚dS )z5Tests that a `ColDefs` can be indexed by column name.r   rº   r  r   r   r   N)r   r5   rw   r4   )rE   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sLt	‚d|_
|j
dks`t	‚d|jksnt	‚|jd dks€t	‚|jjdgks’t	‚t t¡� |jd  W 5 Q R X |j dd	¡ t t¡� |jd  W 5 Q R X |jd	 j
d	ksôt	‚|jjjd
k�st	‚|jjd	gk�st	‚|jjjd	gk�s2t	‚d|jd	 _
t t¡� |jd	  W 5 Q R X |jd j
dk�stt	‚|jjjdk�sˆt	‚|jjdgk�sœt	‚|jjjdgk�s²t	‚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º   )rQ   r   )r   ZHELLOÚTTYPE2ÚTTYPE1ÚGOODBYE)rˆ  Úfoo)r‰  N)r   rD   rx   r5   r3   r7  rt   r   r%   r4   r   rA   r^  r_  r`  Zchange_name)rE   rN  r   r    r    r!   Ú*test_column_attribute_change_after_removalÏ  s6    ÿ
z>TestColumnFunctions.test_column_attribute_change_after_removalc                 C   s^   t jdddddddgd�}t |¡}|j|jks4t‚|j|jksDt‚t |j	|j	k¡sZt‚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5Xr   r   rý  N©
r   r5   r•  Údeepcopyr   r4   rQ   r   r{   rR   )rE   r<  r…   r    r    r!   Útest_x_column_deepcopy   s
    
z*TestColumnFunctions.test_x_column_deepcopyc                 C   s  t jddddgdddggd�}t |¡}|j|jks8t‚|j|jksHt‚t |j	d	 |j	d	 k¡sft‚t |j	d |j	d k¡s„t‚t jd
dddgdddggd�}t |¡}|j|jks¼t‚|j|jksÌt‚t |j	d	 |j	d	 k¡sêt‚t |j	d |j	d k¡�s
t‚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pcolrh  r   rZ   rT   rU   rV   rý  r   ZqcolZQJNr‹  )rE   r<  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dddddgd�}W 5 Q R X dt|jƒksBt‚t  t¡�$}tjd	d
ddddddddd�
}W 5 Q R X ddddddddddg
}|D ]}|t|jƒks’t‚q’d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   rY   rZ   rT   rU   rV   rý  z(Column name must be a string able to fitr<   r   ZNanÚ1)	rQ   r›   rž   r¢   r£   r¡   r¦   r¤   r¥   z(keyword arguments to Column were invalidÚTFORMZTNULLÚTDISPZTCTYPZTCUNIZTCRPXZTCRVLZTCDLTZTRPOSN)r^  r_  r4   r   r5   r|   Úvaluer   )rE   Úerrr“   Zerr_msgsr-  r    r    r!   Útest_column_verify_keywords#  s:    $ööz/TestColumnFunctions.test_column_verify_keywordsc              	   C   sÄ   t  t¡�}tjddddddgd�}W 5 Q R X dt|jƒks@t‚t  t¡�}tjddddddgd�}W 5 Q R X d	t|jƒks€t‚t  t¡�}tjddd
dddgd�}W 5 Q R X dt|jƒksÀt‚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å  r   rZ   rT   )rQ   rŸ   rR   z=start option (TBCOLn) is not allowed for binary table columnsrY   z;start option (TBCOLn) must be a positive integer (got 'a').z-56z;start option (TBCOLn) must be a positive integer (got -56).N)r^  r_  r   r   r5   r|   r’  r4   )rE   r“  r“   r    r    r!   Útest_column_verify_startJ  s    
"ÿ
"ÿ
"ÿz,TestColumnFunctions.test_column_verify_startÚkeysÚZrS   )r�  r‘  Ú2Z2ErT   g333333@r˜   zE.5c              	   C   sl   t  t¡�}tjd|d |d d�}W 5 Q R X | ¡ D ]0}|t|jƒksLt‚t|| ƒt|jƒks6t‚q6dS )z�
        Additional tests for verification of 'TFORM' and 'TDISP' keyword
        arguments used to initialize a Column.
        r<   r�  r‘  )rQ   rž   N)	r^  r_  r   r   r5   r–  r|   r’  r4   )rE   r–  r“  r“   Úkeyr    r    r!   Útest_column_verify_formatsf  s
    "z.TestColumnFunctions.test_column_verify_formatsN)r;  r<  r=  r  r�  r   rƒ  r„  r  r…  rŠ  r�  rŽ  r”  r•  r^  r>  r?  rD  r   rö   rš  r    r    r    r!   r|    s,   c	(1'
ûþ
r|  c                  C   sF   t  dddg¡} tjd| dd�}tj |g¡}|jd= d|jd	 _d S )
Nr   rZ   rT   r   rS   r0  r‡  r   r   )	r   rR   r   r5   rD   rx   Z_headerr3   r   )r‘   r<   rÄ   r    r    r!   Útest_regression_5383}  s
    r›  c               	   C   s  ddl m}  | dddgdddgd	d
dggdddgdddgd�}d|d _d|d _d|jd< tjtdd��}tj|t 	ddi¡d�}W 5 Q R X t
|ƒdksžt‚dD ]}t || |j| ¡s¢t‚q¢|j d¡|j d¡k sÞt‚|jd dksðt‚|jd dk�st‚d S )Nr   r	   r   rZ   rT   r   r   r<  r»   rù   r>  r,   ZU1rÆ   )r%   r   zm/sz
not-a-unitÚbarr‰  z''not-a-unit' did not parse as fits unitr  r  r@   rI   ÚTUNIT1r†  r|  )Úastropy.tabler
   rš   Úmetar^  r  r   r   rD   r}  r$   r4   r   rÒ  rt   rA   Úindex)r
   rN  ÚwrÄ   r   r    r    r!   Útest_table_to_hdu‡  s*    ý


 ÿ"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 ƒƒsRt	‚d S )
N)rÎ   rZ   )rÐ   rU   r‘   rF  rN   r   rÈ   c                 s   s   | ]\}}||kV  qd S )Nr    )r/   r   r   r    r    r!   Ú	<genexpr>®  s     z2test_regression_scalar_indexing.<locals>.<genexpr>)
r   rR   rD  ræ   rz   r   ré   r{   rC  r4   )r‘   Zx1aZx1br    r    r!   Útest_regression_scalar_indexing¤  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 5 Q R X t
|d$ jƒ d%¡�st‚|jd$ jdk�s"t‚|jd& jdk�s8t‚|jd' jd k�sNt‚|jd
 dk�sbt‚|jd dk�svt‚d|jk�s†t‚|jd$ jd k�sœt‚|jd& jd k�s²t‚|jd' jd k�sÈt‚d(|jk�sØt‚|jd dk�sìt‚|jd dk�s t‚|jd! d k�st‚|jd# d"k�s(t‚| d) }| |¡ tjd*d+��$}t |¡�}|d& }W 5 Q R X W 5 Q R X t|ƒd$k�s‚t‚|jd$ jdk�s˜t‚|jd& jdk�s®t‚|jd' jd k�sÄt‚|jd
 dk�sØt‚|jd dk�sìt‚d|jk�süt‚|jd$ jd k�st‚|jd& jdk�s(t‚|jd' jdk�s>t‚d(|jk�sNt‚|jd dk�sbt‚|jd dk�svt‚|jd! d k�sŠt‚|jd# d"k�sžt‚d S ),NZTIMEr—   r–  rd  ZRAWXr3  ZpixelZRAWYr  r�  ÚmZTUNIT2ZTUNIT3zRA---TANZTCTYP2ZANGLEZTCTYP3g     8�ÀZTCRVL2ZTCRVL3rÎ   ZTCRPX2ZTCRPX3i @  ZTALEN2i   ZTALEN3ZangstromZTCUNI2ÚdegZTCUNI3g      ø?ZRArÐ   ZDECr   z4The following keywords are now recognized as specialr   rZ   ZTCTYP1r@  T)Úrecord)rr   r   r5   rw   r}  r^  r  r   rD   rx   r|   Úmessagerû   r4   r3   rš   rA   r¢   r}   ÚwarningsÚcatch_warningsrs   r$   )	r*  r<   r°  r  Zwarning_listrÄ   r#  rÅ   Zhdu2r    r    r!   Ú$test_new_column_attributes_preserved±  sx    
ÿ

r«  c              	   C   s    | d }t jd d dd�}| |¡ t  |¡�}|d jjdksBt‚W 5 Q R X | d }t jd d dd�}|j|dd� t  |¡�}|d jjdks’t‚W 5 Q R X d S )Nzemptytable.fitsr  )rA   rt   r   r   zemptytable.fits.gzTrp   )r   rD   r}   rs   rt   Úsizer4   )r*  ZofilerÄ   rÅ   r    r    r!   Útest_empty_table!  s    
r­  c              
   C   sÔ   | d }t j t jddt d¡d�g¡}d|jd< |j|dd	� t  |¡�€}|d
 jd dksbt	‚t
 t¡�}| d¡ W 5 Q R X t|d jƒdks˜t	‚t|d jƒ d¡s°t	‚|d
 jd dksÆt	‚W 5 Q R X d S )Nr@  r|  rf   rw  rP   ZA3DTABLEZXTENSIONÚignore©Zoutput_verifyr   Zfixr   zVerification reported errors:rZ   z+Converted the XTENSION keyword to BINTABLE.ZBINTABLE)r   rD   rx   r5   r   rc  rA   r}   rs   r4   r^  r  r   Úverifyr|   r¨  r§  )r*  ÚtestfilerÄ   rÅ   r¡  r    r    r!   Útest_a3dtable1  s    ÿ
r²  c              	   C   sd   t  ¡ }d |jd< tj|jjd _| d }|j|dd� t  |¡�}|d j	d k	sVt
‚W 5 Q R X d S )Nr|  r@  r®  r¯  r   )r   rD   rA   r   ÚnanZcardsÚ_valuer}   rs   rt   r4   )r*  rÄ   r±  rÅ   r    r    r!   Útest_invalid_fileE  s    
rµ  c              	   C   sú   | d }d}t |ƒ}tddddgiƒ}| |¡ tj|dd��}||d jd	< W 5 Q R X t t¡� t 	|¡}W 5 Q R X t
|d jtƒsŒt‚tj	|d
d�}t
|d jtƒs®t‚t t¡� tj	|dd� W 5 Q R X t t¡� tj	|dd� W 5 Q R X d S )Nzinvalid_unit.fitsz1 / (MeV sr s)r   r   rZ   rT   r™  rš  r�  Zsilent)Zunit_parse_strictÚraiseÚwarn)r   r
   rM  r   rs   rA   r^  r  r   rÀ   r)   rš   r   r4   r_  rô  )r*  ÚpathZinvalid_unitrš   r«   rÅ   r    r    r!   Útest_unit_parse_strictQ  s     
r¹  )7Ú
contextlibr•  rB  r  rR  ry  r©  Únumpyr   r^  r   ru   rC  rA  ÚImportErrorZ
astropy.ior   Zastropy.io.fits.columnr   r   r   Zastropy.io.fits.utilr   Zastropy.io.fits.verifyr   rž  r
   Zastropy.unitsr   r   r   Zastropy.utils.compatr   r   Zastropy.utils.exceptionsr   r   Zconftestr   r"   r.   r>   r?   Úcontextmanagerr%  rF  r|  r›  r¢  r¤  r«  r­  r²  rµ  r¹  r    r    r    r!   Ú<module>   s‚   
3                      K
  G  q
p