U
    e»{j2  ã                   @   sv   d dl Z d dlmZ d dlZd dlZd dlmZ d dlm	Z	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)ÚOrderedDict)Ú	Cosmology)Úfrom_mappingÚ
to_mappingé   )ÚToFromDirectTestBaseÚToFromTestMixinBasec                   @   s�   e Zd ZdZdd„ Zdd„ Zej de	e
g¡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g¡dd„ ƒZdS )ÚToFromMappingTestMixinaœ  Tests for a Cosmology[To/From]Format with ``format="mapping"``.

    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 define a :func:`pytest.fixture`
    ``cosmo`` that returns/yields an instance of a |Cosmology|.
    See ``TestCosmology`` for an example.
    c                 C   sÞ   |dƒ}t | ¡ ƒ}t|tƒs"t‚|d dks2t‚| d¡|jksFt‚|d dksVt‚| d¡|jksjt‚t|j	dd�D ]4\}}|| |ks�t‚t
 | |¡t||ƒ¡sxt‚qx|d d	ks¾t‚| d	¡|jksÒt‚|rÚt‚d
S )z+Test default usage of Cosmology -> mapping.Úmappingr   Ú	cosmologyr   Únameé   )ÚstartéÿÿÿÿÚmetaN)ÚtupleÚkeysÚ
isinstanceÚdictÚAssertionErrorÚpopÚ	__class__r   Ú	enumerateÚ__parameters__ÚnpÚarray_equalÚgetattrr   )ÚselfÚcosmoÚ	to_formatÚmr   ÚiÚk© r#   úf/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/cosmology/io/tests/test_mapping.pyÚtest_to_mapping_default   s    z.ToFromMappingTestMixin.test_to_mapping_defaultc              	   C   s*   t jtdd�� |dtd� W 5 Q R X dS )z4Test incorrect argument ``cls`` in ``to_mapping()``.z'cls' must be©Úmatchr
   ©ÚclsN)ÚpytestÚraisesÚ	TypeErrorÚlist)r   r   r#   r#   r$   Útest_to_mapping_wrong_cls2   s    z0ToFromMappingTestMixin.test_to_mapping_wrong_clsÚmap_clsc                 C   s   |d|d�}t ||ƒst‚dS )z*Test argument ``cls`` in ``to_mapping()``.r
   r(   N)r   r   )r   r   r/   r    r#   r#   r$   Útest_to_mapping_cls7   s    z*ToFromMappingTestMixin.test_to_mapping_clsc                 C   sŽ   |dƒ}|ddd�}t  |d ¡s&t‚||d ks6t‚||ksBt‚|ddd�}t|d tƒs`t‚|d |jksrt‚t| ¡ ƒd dksŠt‚dS )z7Test argument ``cosmology_as_str`` in ``to_mapping()``.r
   F©Zcosmology_as_strr   Tr   N)ÚinspectÚisclassr   r   ÚstrÚ__qualname__r   r   )r   Z	cosmo_clsr   Údefaultr    r#   r#   r$   Ú test_to_mapping_cosmology_as_str=   s    z7ToFromMappingTestMixin.test_to_mapping_cosmology_as_strc                 C   s8   |ddd�}||dd�}||ks$t ‚|j|jks4t ‚dS )z’Test roundtrip with ``cosmology_as_str=True``.

        The test for the default option (`False`) is in ``test_tofrom_mapping_instance``.
        r
   Tr1   ©ÚformatN©r   r   ©r   r   r   Úfrom_formatr    Úgotr#   r#   r$   Ú$test_tofrom_mapping_cosmology_as_strN   s    z;ToFromMappingTestMixin.test_tofrom_mapping_cosmology_as_strc                    sª   |dƒ}|ddd�‰ dˆ   ¡ ks$t‚t‡ fdd„ˆ d D ƒƒrBt‚ˆ |ksNt‚|ddd�‰ dˆ   ¡ ksjt‚t‡ fdd„|d D ƒƒsˆt‚t‡ fd	d„| ¡ D ƒƒs¦t‚d
S )z5Test argument ``move_from_meta`` in ``to_mapping()``.r
   F©Zmove_from_metar   c                    s   g | ]}|ˆ k‘qS r#   r#   ©Ú.0r"   ©r    r#   r$   Ú
<listcomp>`   s     zIToFromMappingTestMixin.test_to_mapping_move_from_meta.<locals>.<listcomp>Tc                    s   g | ]}|ˆ k‘qS r#   r#   r@   rB   r#   r$   rC   g   s     c                    s(   g | ] \}}|d krt  |ˆ | ¡‘qS )r   )r   r   )rA   r"   ÚvrB   r#   r$   rC   i   s      N)r   r   ÚanyÚallÚitems)r   r   r6   r#   rB   r$   Útest_to_mapping_move_from_metaY   s    z5ToFromMappingTestMixin.test_to_mapping_move_from_metac              	   C   s²   |ddd�}d|d< t |jj ¡ ƒd jdkr\||dd�}|j|jksJt‚d|jksXt‚d	S tj	t
d
d�� ||dd� W 5 Q R X ||ddd�}||ksœt‚|jd dks®t‚d	S )zATest roundtrip of ``move_from/to_meta`` in ``to/from_mapping()``.r
   Tr?   z
will errorZmismatchingr   é   r8   Nzthere are unused parametersr&   )r9   Zmove_to_meta)r   Ú_init_signatureÚ
parametersÚvaluesÚkindr   r   r   r*   r+   r,   r;   r#   r#   r$   Ú$test_tofrom_mapping_move_tofrom_metak   s    z;ToFromMappingTestMixin.test_tofrom_mapping_move_tofrom_metac              	   C   s*   t  ttf¡� |ddd� W 5 Q R X dS )z.Test incorrect map type in ``from_mapping()``.z	NOT A MAPr
   r8   N)r*   r+   r,   Ú
ValueError)r   r   r<   r#   r#   r$   Útest_from_not_mapping†   s    z,ToFromMappingTestMixin.test_from_not_mappingc                 C   sX   |dƒ}||dd�}||ks t ‚|j|jks0t ‚||ƒ}||ksDt ‚|j|jksTt ‚dS )z)Test (cosmology -> Mapping) -> cosmology.r
   r8   Nr:   r;   r#   r#   r$   Útest_from_mapping_default‹   s    z0ToFromMappingTestMixin.test_from_mapping_defaultc                 C   sÄ   |  d¡}| dd¡ | dd¡ |jj|dd�}tj|d|jd�}tj|d|jjd�}||krh||kslt‚||ksxt‚|j|jjj	d j
ks’t‚|j|j|j|jd�|ks°t‚|j|jksÀt‚dS )zy
        Test writing from an instance and reading from that class.
        This works with missing information.
        r
   r   NÚTcmb0r8   )r9   r   )r   rR   Úm_nu)r   r   r   r<   r   r5   r   rR   rJ   rK   r6   Úcloner   rS   r   )r   r   r    r=   Zgot2Zgot3r#   r#   r$   Ú-test_fromformat_subclass_partial_info_mapping™   s    
  ÿzDToFromMappingTestMixin.test_fromformat_subclass_partial_info_mappingr9   TFNr
   c                 C   s@   |dƒ}t |tƒrt‚|j||d�}||dk	r2dndks<t‚dS )zêTest :meth:`astropy.cosmology.Cosmology.is_equivalent`.

        This test checks that Cosmology equivalency can be extended to any
        Python object that can be converted to a Cosmology -- in this case
        a mapping.
        r
   r8   FTN)r   r   r   Zis_equivalent)r   r   r   r9   ÚobjZis_equivr#   r#   r$   Útest_is_equivalent_to_mappingµ   s    z4ToFromMappingTestMixin.test_is_equivalent_to_mapping)Ú__name__Ú
__module__r5   Ú__doc__r%   r.   r*   ÚmarkZparametrizer   r   r0   r7   r>   rH   rN   rP   rQ   rU   rW   r#   r#   r#   r$   r	      s   	
r	   c                   @   s,   e Zd ZdZdd„ Zej d¡dd„ ƒZdS )ÚTestToFromMappingz"Directly test ``to/from_mapping``.c                 C   s   t tdœ| _d S )N)ÚtoÚfrom)r   r   Z	functions©r   r#   r#   r$   Úsetup_classÇ   s    zTestToFromMapping.setup_classzN/Ac                 C   s   dS )z1This test does not apply to the direct functions.Nr#   r_   r#   r#   r$   rU   Ê   s    z?TestToFromMapping.test_fromformat_subclass_partial_info_mappingN)	rX   rY   r5   rZ   r`   r*   r[   ÚskiprU   r#   r#   r#   r$   r\   Ä   s   
r\   )r2   Úcollectionsr   Únumpyr   r*   Zastropy.cosmologyr   Zastropy.cosmology.io.mappingr   r   Úbaser   r   r	   r\   r#   r#   r#   r$   Ú<module>   s    1