U
    e»{jŽ<  ã                   @   sÀ  d 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m	Z	 ddl
mZmZmZmZmZ ddlmZmZmZ ddlmZmZ ddlmZ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# ddl$m%Z% ej&dd„ ƒZ'ej&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 „ Z0d!d"„ Z1d#d$„ Z2d%d&„ Z3d'd(„ Z4d)d*„ Z5ej6 7d+d,d-g¡d.d/„ ƒZ8d0d1„ Z9d2d3„ Z:d4d5„ Z;d6d7„ Z<d8d9„ Z=d:d;„ Z>d<d=„ Z?d>d?„ Z@G d@dA„ dAƒZAdS )Bz+
Test the conversion to/from astropy.table
é    N)Úreload_configÚset_temp_config)ÚconfÚ
from_tableÚ
is_votableÚtreeÚvalidate)ÚE25ÚW39Ú	VOWarning)ÚparseÚwriteto)ÚColumnÚTable)Úsimple_table)ÚUnit)Úget_pkg_data_filenameÚget_pkg_data_fileobjÚget_pkg_data_path)ÚAstropyDeprecationWarning)Ú_NOT_OVERWRITING_MSG_MATCHc                 C   s$   t dƒ}|  d|¡ |  d|¡ dS )zÂ
    Pytest fixture to run a test case with tilde-prefixed paths.

    In the tilde-path case, environment variables are temporarily
    modified so that '~' resolves to the data directory.
    ÚdataÚHOMEÚUSERPROFILEN)r   Úsetenv)ÚmonkeypatchÚpath© r   úb/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/votable/tests/table_test.pyÚhome_is_data   s    r   c                 C   s$   |   dt|ƒ¡ |   dt|ƒ¡ dS )zÂ
    Pytest fixture to run a test case with tilde-prefixed paths.

    In the tilde-path case, environment variables are temporarily
    modified so that '~' resolves to the temp directory.
    r   r   N)r   Ústr)r   Útmp_pathr   r   r   Úhome_is_tmpdir+   s    	r"   c                 C   sZ  t jdd�� ttdƒƒ}W 5 Q R X | ¡ }| ¡ }|jjjD ]$}t  	|j
| |jj
| k¡s>t‚q>t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ifdddifdddifdddifdddifdddifddddœfdddifddddœfddddœfddddœfdddifdddifd dddœfd!dd"dœfd#ddifd$dddœfd%ddifd&dd'dœfd(ddifd)ddifd*dddœfd+dd,dœfg}t|j|ƒD ]n\}}	|	\}}
|j|k�sÞt‚|j|
d k�st|› d-|
d › d.|j› �ƒ‚d/|
k�r¾|j|
d/ k�s¾t‚�q¾t t¡� t|t| d0 ƒƒ W 5 Q R X d S )1NÚignore©Zoverúdata/regression.xmlZstring_testÚcharÚ*)ÚdatatypeÚ	arraysizeZstring_test_2Ú10Zunicode_testZunicodeCharZfixed_unicode_testZstring_array_testÚ4ZunsignedByter(   ÚshortÚintÚlongÚdoubleÚfloatÚarrayz2*ÚbitZbitarrayZ3x2ZbitvararrayZbitvararray2z3x2*ZfloatComplexZdoubleComplexZdoubleComplexArrayZdoubleComplexArrayFixedÚ2ÚbooleanZbooleanArrayZnullsZnulls_arrayZ2x2Z
precision1Z
precision2ZdoublearrayZ	bitarray2Z16z
 expected z	 but get r)   zthrough_table.xml)ÚnpÚerrstater   r   Úget_first_tableÚto_tabler1   ZdtypeÚnamesÚallÚmaskÚAssertionErrorr   ZVOTableFiler   ÚzipÚfieldsZIDr(   r)   ÚpytestÚwarnsr
   r   r    )r!   ÚvotableÚtableÚastropy_tableÚnameZvotable2ÚtZfield_typesÚfieldÚtypeÚdr   r   r   Ú
test_table9   s`    "












äÿþ
rI   c              	   C   sB   t j dd¡}tjdd�� t|ƒ}tj|ddd� W 5 Q R X d S )Nú~zregression.xmlr#   r$   rA   Ú
main_table©ÚformatÚtable_id)Úosr   Újoinr5   r6   r   r   Úread)r   r   rA   r   r   r   Útest_read_from_tilde_patht   s    rR   c              
   C   sÊ   t jdd��. tddd��}tj|ddd�}W 5 Q R X W 5 Q R X t|ƒd	ksPt‚|d
 jd ksbt‚| d }t 	t
¡� |j|ddd� W 5 Q R X t|dƒ�}tj|ddd�}W 5 Q R X t|ƒd	ksÆt‚d S )Nr#   r$   r%   Úbinary©ÚencodingrA   rK   rL   é   r0   ztable_interface.xmlZFOO)rN   rM   Úrb)r5   r6   r   r   rQ   Úlenr<   rM   r?   r@   r
   ÚwriteÚopen)r!   ÚfdrE   ÚfnÚt2r   r   r   Ú!test_read_through_table_interface}   s    $r^   c               
   C   sT   t jdd��. tddd��} tj| ddd�}W 5 Q R X W 5 Q R X t|ƒd	ksPt‚d S )
Nr#   r$   r%   rS   rT   rA   Z
last_tablerL   r   )r5   r6   r   r   rQ   rX   r<   ©r[   rE   r   r   r   Ú"test_read_through_table_interface2”   s    $r`   c                  C   s2   t dƒ} tj| ddd�}|d jtdƒks.t‚d S )Nzdata/nonstandard_units.xmlrA   Zgeneric)rM   Zunit_formatZFlux1zerg / (Angstrom cm2 s))r   r   rQ   Úunitr   r<   )ÚfilenamerE   r   r   r   Ú(test_pass_kwargs_through_table_interface�   s    rc   c                  C   sd   t ddd��} t| ƒ}W 5 Q R X | ¡ jdd�}|jdddd	d
ddddddddddddgks`t‚d S )Núdata/names.xmlrS   rT   T©Zuse_names_over_idsÚNameZGLONZGLATZRAdegZDEdegZJmagZHmagZKmagzG3.6magzG4.5magzG5.8magzG8.0magz4.5magz8.0magZEmagZ24magZf_Name©r   r   r7   r8   Zcolnamesr<   ©r[   rA   rB   r   r   r   Útest_names_over_ids¤   s,    ïri   c                  C   sd   t ddd��} t| ƒ}W 5 Q R X | ¡ jdd�}|jdddd	d
ddddddddddddgks`t‚d S )Nrd   rS   rT   Fre   Zcol1Zcol2Zcol3Zcol4Zcol5Zcol6Zcol7Zcol8Zcol9Zcol10Zcol11Zcol12Zcol13Zcol14Zcol15Zcol16Zcol17rg   rh   r   r   r   Útest_explicit_ids¿   s,    ïrj   c               	   C   s:   t ddd��} tj| dd�}W 5 Q R X t|ƒdks6t‚dS )z
    Issue #927
    rd   rS   rT   rA   ©rM   é   N)r   r   rQ   rX   r<   r_   r   r   r   Ú#test_table_read_with_unnamed_tablesÚ   s    rm   c                  C   sJ   t  tdƒ¡} t| ƒ ¡  ¡ }t|ƒdks.t‚t|d d ƒdksFt‚dS )zF
    Testing when votable is passed as pathlib.Path object #4412.
    rd   rl   r   é   i
  N)	ÚpathlibÚPathr   r   r7   r8   rX   r<   r-   )ZfpathrB   r   r   r   Útest_votable_path_objectä   s    rq   c                  C   s<   t ƒ } tdddgdd�}|  |¡ t ¡ }| j|dd� d S )Nrl   é   rn   Úa©r   rD   rA   rk   )r   r   Ú
add_columnÚioÚBytesIOrY   )rE   ÚcÚoutputr   r   r   Útest_from_table_without_maskï   s
    
rz   c                  C   s®   t ƒ } tdddgdd�}|  |¡ t ¡ }| j|ddd� | ¡ }d	|ksNt‚d
|ksZt‚d|ksft‚t ¡ }| j|ddd� | ¡ }d	|ks’t‚d|ksžt‚d|ksªt‚d S )Nrl   rr   rn   rs   rt   rA   rS   ©rM   Ztabledata_formats   VOTABLE version="1.4"s   BINARYs	   TABLEDATAZbinary2s   BINARY2)r   r   ru   rv   rw   rY   Úgetvaluer<   )rE   rx   ry   Úobuffr   r   r   Útest_write_with_format÷   s    
r~   c              	   C   s\   t ddƒ}| d }|j|dd� tjttd�� |j|dd� W 5 Q R X |j|ddd� d S )Nrn   zoverwrite_test.votrA   rk   )ÚmatchT)rM   Ú	overwrite)r   rY   r?   ÚraisesÚOSErrorr   )r!   rE   rb   r   r   r   Útest_write_overwrite  s    
rƒ   c              	   C   sŽ   t j dd¡}tƒ }dddg|d< |j|ddd	� t j |¡rBt‚tt j |¡ƒ�}| 	¡ }W 5 Q R X d
|ksrt‚d|ks~t‚d|ksŠt‚d S )NrJ   ry   rl   rr   rn   rs   rA   rS   r{   úVOTABLE version="1.4"ÚBINARYÚ	TABLEDATA)
rO   r   rP   r   rY   Úexistsr<   rZ   Ú
expanduserrQ   )r"   ÚfnamerE   Úfr}   r   r   r   Útest_write_tilde_path  s    r‹   Úpath_formatÚplainÚtildec              	   C   s®   | dkrt |d ƒ}ntj dd¡}tƒ }dddg|d< t|ƒ}t||ƒ | dkrbtj |¡rbt‚t	tj 
|¡ƒ�}| ¡ }W 5 Q R X d	|ks’t‚d
|ksžt‚d|ksªt‚d S )Nr�   zwriteto_test.votrJ   rl   rr   rn   rs   rŽ   r„   r…   r†   )r    rO   r   rP   r   r   r   r‡   r<   rZ   rˆ   rQ   )rŒ   r!   r"   r‰   rE   ÚvtrŠ   r}   r   r   r   Útest_writeto%  s    
r�   c                  C   s    t tdƒƒ} |  ¡ }| ¡  d S )Nzdata/empty_table.xml)r   r   r7   r8   ©rA   rB   r   r   r   Útest_empty_table>  s    r’   c                  C   s<   t tdƒƒ} |  ¡ }t|jƒdks&t‚t|jƒdks8t‚d S )Nú!data/no_field_not_empty_table.xmlr   rl   )r   r   r7   rX   r>   r<   Úinfosr‘   r   r   r   Útest_no_field_not_empty_tableD  s    r•   c                	   C   s*   t  t¡� ttdƒdd� W 5 Q R X d S )Nr“   Ú	exception©Úverify)r?   r�   r	   r   r   r   r   r   r   Ú'test_no_field_not_empty_table_exceptionK  s
    þr™   c                  C   sL   t tdƒƒ} |  ¡ }| ¡ }t |jjd ¡r2t‚t	 
¡ }|j|dd� dS )z
    Issue #8995
    zdata/binary2_masked_strings.xmlZepoch_photometry_urlrA   rk   N)r   r   r7   r8   r5   Úanyr1   r;   r<   rv   rw   rY   )rA   rB   rC   ry   r   r   r   Útest_binary2_masked_stringsS  s    r›   c                  C   sT   t dƒ} t| dd�}t|tƒs"t‚d|ks.t‚t| ƒ}t|tƒsDt‚|dksPt‚dS )zn
    Issue #12603. Test that we get the correct output from votable.validate with an invalid
    votable.
    r%   N©ry   z+E02: Incorrect number of elements in array.F©r   r   Ú
isinstancer    r<   Úbool)Zinvalid_votable_filepathÚvalidate_outr   r   r   Útest_validate_output_invalidb  s    r¡   c                  C   sT   t dƒ} t| dd�}t|tƒs"t‚d|ks.t‚t| ƒ}t|tƒsDt‚|dksPt‚dS )zj
    Issue #12603. Test that we get the correct output from votable.validate with a valid
    votable
    zdata/valid_votable.xmlNrœ   z&astropy.io.votable found no violationsTr�   )Zvalid_votable_filepathr    r   r   r   Útest_validate_output_validx  s    r¢   c                 C   s   t tj dd¡ƒ d S ©NrJ   zvalid_votable.xml)r   rO   r   rP   ©r   r   r   r   Útest_validate_tilde_path�  s    r¥   c                 C   s   t tj dd¡ƒst‚d S r£   )r   rO   r   rP   r<   r¤   r   r   r   Útest_is_votable_tilde_path“  s    r¦   c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestVerifyOptionsc                 C   s   t tdƒƒ d S )Núdata/gemini.xml©r   r   ©Úselfr   r   r   Útest_defaultš  s    zTestVerifyOptions.test_defaultc                 C   s   t tdƒdd� d S )Nr¨   r#   r—   r©   rª   r   r   r   Útest_verify_ignoreŸ  s    z$TestVerifyOptions.test_verify_ignorec              	   C   s:   t  t¡�}ttdƒdd� W 5 Q R X t|ƒdks6t‚d S )Nr¨   Úwarnr—   é   ©r?   r@   r   r   r   rX   r<   ©r«   Úwr   r   r   Útest_verify_warn¢  s    z"TestVerifyOptions.test_verify_warnc              	   C   s*   t  t¡� ttdƒdd� W 5 Q R X d S )Nr¨   r–   r—   )r?   r�   r   r   r   rª   r   r   r   Útest_verify_exception§  s    z'TestVerifyOptions.test_verify_exceptionc              	   C   s:   t  t¡�}ttdƒdd� W 5 Q R X t|ƒdks6t‚d S )Nr¨   F©Zpedanticé   r°   r±   r   r   r   Útest_pedantic_false­  s    z%TestVerifyOptions.test_pedantic_falsec              
   C   s@   t  t¡�, t  t¡� ttdƒdd� W 5 Q R X W 5 Q R X d S )Nr¨   Trµ   )r?   r@   r   r�   r   r   r   rª   r   r   r   Útest_pedantic_true²  s    z$TestVerifyOptions.test_pedantic_truec              	   C   s(   t  dd¡� ttdƒƒ W 5 Q R X d S )Nr˜   r#   r¨   )r   Úset_tempr   r   rª   r   r   r   Útest_conf_verify_ignore¹  s    z)TestVerifyOptions.test_conf_verify_ignorec              
   C   sN   t  dd¡�8 t t¡�}ttdƒƒ W 5 Q R X t|ƒdks@t‚W 5 Q R X d S )Nr˜   r®   r¨   r¯   )	r   r¹   r?   r@   r   r   r   rX   r<   r±   r   r   r   Útest_conf_verify_warn½  s    z'TestVerifyOptions.test_conf_verify_warnc              
   C   s>   t  dd¡�( t t¡� ttdƒƒ W 5 Q R X W 5 Q R X d S )Nr˜   r–   r¨   )r   r¹   r?   r�   r   r   r   rª   r   r   r   Útest_conf_verify_exceptionÃ  s    z,TestVerifyOptions.test_conf_verify_exceptionc              
   C   sz   t |ƒ�h t|d d dƒ�}| d¡ W 5 Q R X tdƒ t t¡�}ttdƒƒ W 5 Q R X t	|ƒdkslt
‚W 5 Q R X d S )NÚastropyúastropy.cfgr²   z[io.votable]
pedantic = Falseúastropy.io.votabler¨   r¶   )r   rZ   rY   r   r?   r@   r   r   r   rX   r<   )r«   r!   rŠ   r²   r   r   r   Útest_conf_pedantic_falseÊ  s    
z*TestVerifyOptions.test_conf_pedantic_falsec                 C   s€   t |ƒ�n t|d d dƒ�}| d¡ W 5 Q R X tdƒ t t¡�( t t¡� t	t
dƒƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )Nr½   r¾   r²   z[io.votable]
pedantic = Truer¿   r¨   )r   rZ   rY   r   r?   r@   r   r�   r   r   r   )r«   r!   rŠ   r   r   r   Útest_conf_pedantic_trueÕ  s    
z)TestVerifyOptions.test_conf_pedantic_trueN)Ú__name__Ú
__module__Ú__qualname__r¬   r­   r³   r´   r·   r¸   rº   r»   r¼   rÀ   rÁ   r   r   r   r   r§   —  s   r§   )BÚ__doc__rv   rO   ro   Únumpyr5   r?   Zastropy.configr   r   Zastropy.io.votabler   r   r   r   r   Zastropy.io.votable.exceptionsr	   r
   r   Zastropy.io.votable.tabler   r   Zastropy.tabler   r   Zastropy.table.table_helpersr   Zastropy.unitsr   Zastropy.utils.datar   r   r   Zastropy.utils.exceptionsr   Zastropy.utils.miscr   Zfixturer   r"   rI   rR   r^   r`   rc   ri   rj   rm   rq   rz   r~   rƒ   r‹   ÚmarkZparametrizer�   r’   r•   r™   r›   r¡   r¢   r¥   r¦   r§   r   r   r   r   Ú<module>   sV   

;		
	
