U
    e»{jÞ(  ã                   @   s–   d dl 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mZmZ d dlmZ d dlmZ ddlmZmZ G d	d
„ d
eƒZG dd„ deeƒZdS )é    N)Ú_FORMAT_TABLEÚread_html_tableÚwrite_html_table)Ú	Parameter)ÚQTableÚTableÚvstack)ÚNoneType)ÚHAS_BS4é   )ÚReadWriteDirectTestBaseÚReadWriteTestMixinBasec                   @   sê   e Zd ZdZejje dd�dd„ ƒZejje dd�dd„ ƒZ	ej 
deeg¡ejje dd�d	d
„ ƒƒZejje dd�dd„ ƒZejje dd�dd„ ƒZejje dd�ej 
dddg¡dd„ ƒƒZejje dd�dd„ ƒZdS )ÚReadWriteHTMLTestMixinaŸ  
    Tests for a Cosmology[Read/Write] with ``format="ascii.html"``.
    This class will not be directly called by :mod:`pytest` since its name does
    not begin with ``Test``. To activate the contained tests this class must
    be inherited in a subclass. Subclasses must dfine a :func:`pytest.fixture`
    ``cosmo`` that returns/yields an instance of a |Cosmology|.
    See ``TestCosmology`` for an example.
    úrequires beautifulsoup4©Úreasonc              	   C   sh   |d }||dd� t jtdd�� ||ddd� W 5 Q R X t jtdd�� ||d	dd� W 5 Q R X d
S )z'Test if argument ``index`` is incorrectz!test_to_html_table_bad_index.htmlú
ascii.html©Úformatzindex 2 out of range©Úmatché   ©Úindexr   zNo matches found for keyúrow 0N)ÚpytestÚraisesÚ
IndexErrorÚKeyError)ÚselfÚreadÚwriteÚtmp_pathÚfp© r$   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/cosmology/io/tests/test_html.pyÚtest_to_html_table_bad_index   s    z3ReadWriteHTMLTestMixin.test_to_html_table_bad_indexc              	   C   s4   |d }t jtdd�� ||dtd� W 5 Q R X dS )zTest failed table type.z"test_to_html_table_failed_cls.htmlz'cls' must ber   r   ©r   ÚclsN)r   r   Ú	TypeErrorÚlist)r   r!   r"   r#   r$   r$   r%   Útest_to_html_table_failed_cls-   s    z4ReadWriteHTMLTestMixin.test_to_html_table_failed_clsÚtbl_clsc                 C   s   |d }||d|d� d S )Nztest_to_html_table_cls.htmlr   r'   r$   )r   r!   r,   r"   r#   r$   r$   r%   Útest_to_html_table_cls5   s    z-ReadWriteHTMLTestMixin.test_to_html_table_clsc           
   	   C   s8  |d }||dd� t  |¡}|d |jks0t‚d|d< |j|ddd� t|jj ¡ ƒd	 j	d
kr�||dd�}	|	j
|ks|t‚|	j|jksŒt‚dS tjtdd�� ||dd� W 5 Q R X ||ddd�}	|	|ksÐt‚| d¡ |j|ddd� ||dd�}	|	|k�st‚||dd�}	|	|k�st‚||ƒ}	|	|k�s4t‚dS )z*Test cosmology -> ascii.html -> cosmology.z'test_readwrite_html_table_instance.htmlr   r   Únamez
will errorZmismatchingT)r   Ú	overwriteéÿÿÿÿé   Nzthere are unused parametersr   )r   Zmove_to_meta)r   r    r.   ÚAssertionErrorr!   ÚtupleÚ_init_signatureÚ
parametersÚvaluesÚkindÚ	__class__r   r   r)   Zremove_column)
r   Ú	cosmo_clsÚcosmor    r!   r"   Úadd_cur#   ÚtblÚgotr$   r$   r%   Ú"test_readwrite_html_table_instance=   s.    

z9ReadWriteHTMLTestMixin.test_readwrite_html_table_instancec           	      C   s‚   |d }||ddd� t  |¡}|jdd… D ]}|t ¡ ks.t‚q.||dd�}| d¡}|jd	d… D ]}|t ¡ ksht‚qhdS ©
zTests renaming columnsz#test_rename_html_table_columns.htmlr   T©r   Úlatex_namesr   Nr   úastropy.tabler   ©r   r    Úcolnamesr   r6   r2   Ú	to_formatÚkeys©	r   r    r!   r"   r#   r<   Zcolumn_namer:   Zconverted_tblr$   r$   r%   Útest_rename_html_table_columnsw   s    

z5ReadWriteHTMLTestMixin.test_rename_html_table_columnsrA   TFc                 C   sÆ   |d }||d|d� t  |¡}	|r(dnd}
|	|
= |	j|dd� |j|dd�}||d|d	�}||d|jd	�}||kr|||ks€t‚||ksŒt‚|j|jjd jks¤t‚|j	|j
|j|jd
�|ksÂt‚dS )zy
        Test writing from an instance and reading from that class.
        This works with missing information.
        z)test_read_html_subclass_partial_info.htmlr   r@   z	$$T_{0}$$ÚTcmb0T)r/   r   )r   Ú	cosmology)r.   rI   Úm_nuN)r   r    r!   Ú__qualname__r2   rI   r4   r5   ÚdefaultÚcloner.   rK   )r   r9   r:   r    r!   rA   r"   r;   r#   r<   Úcnamer=   Úgot2Zgot3r$   r$   r%   Ú)test_readwrite_html_subclass_partial_info�   s    	
z@ReadWriteHTMLTestMixin.test_readwrite_html_subclass_partial_infoc              	   C   sV  |d }|j dd�}|j dd�}tdd„ |||fD ƒdd�}	t|ƒ}
|
tkrTd	sTt‚t|	j|	 ¡ ƒD ]P\}}|d
krvqdt|
|ƒ}t	|t
ƒrd|jdtjfkrœqd|	j|||j> jd	d� qd|	j|dd� tjtdd�� ||dd� W 5 Q R X |
j|ddd�}||k�st‚|
j||jdd�}||k�s(t‚|	 d¡ |
j||jdd�}||k�sRt‚dS )z Test if table has multiple rows.z!test_readwrite_html_mutlirow.htmlr   )r.   zrow 2c                 S   s   g | ]}|  d ¡‘qS )rB   )rE   )Ú.0Úcr$   r$   r%   Ú
<listcomp>»   s     zGReadWriteHTMLTestMixin.test_readwrite_html_mutlirow.<locals>.<listcomp>Zsilent)Zmetadata_conflictsFrJ   N)Úcopyr   r   zneed to select a specific rowr   r   r   r.   )rN   r   Útyper	   r2   ÚziprD   ZitercolsÚgetattrÚ
isinstancer   ÚunitÚuÚoneZreplace_columnÚvaluer!   r   r   Ú
ValueErrorr    r.   Z	add_index)r   r:   r    r!   r"   r;   r#   Zcosmo1Zcosmo2Útabler9   ÚnÚcolÚparamr=   rP   r$   r$   r%   Útest_readwrite_html_mutlirow²   s6    þ

z3ReadWriteHTMLTestMixin.test_readwrite_html_mutlirowN)Ú__name__Ú
__module__rL   Ú__doc__r   ÚmarkÚskipifr
   r&   r+   Zparametrizer   r   r-   r>   rH   rQ   rc   r$   r$   r$   r%   r      s"   	


9
#r   c                   @   s2   e Zd ZdZdd„ Zejje dd�dd„ ƒZ	dS )	ÚTestReadWriteHTMLzí
    Directly test ``read/write_html``.
    These are not public API and are discouraged from use, in favor of
    ``Cosmology.read/write(..., format="ascii.html")``, but should be
    tested regardless b/c they are used internally.
    c                 C   s   t tdœ| _d S )N)r    r!   )r   r   Z	functions)r   r$   r$   r%   Úsetup_classí   s    zTestReadWriteHTML.setup_classr   r   c           	      C   s‚   |d }||ddd� t  |¡}|jdd… D ]}|t ¡ ks.t‚q.||dd�}| d¡}|jd	d… D ]}|t ¡ ksht‚qhdS r?   rC   rG   r$   r$   r%   Ú%test_rename_direct_html_table_columnsð   s    

z7TestReadWriteHTML.test_rename_direct_html_table_columnsN)
rd   re   rL   rf   rj   r   rg   rh   r
   rk   r$   r$   r$   r%   ri   å   s   ri   )r   Zastropy.unitsZunitsr[   Zastropy.cosmology.io.htmlr   r   r   Zastropy.cosmology.parameterr   Zastropy.tabler   r   r   Zastropy.units.decoratorsr	   Z"astropy.utils.compat.optional_depsr
   Úbaser   r   r   ri   r$   r$   r$   r%   Ú<module>   s    T