U
    e»{j—K  ã                   @   s‚   d Z ddlZddlZddl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 G dd„ dƒZG d	d
„ d
eƒZdS )z+Testing :mod:`astropy.cosmology.parameter`.é    N)Ú	Cosmology)Ú_COSMOLOGY_CLASSES)Ú	ParameterÚ_validate_to_floatÚ_validate_with_unit)ÚAstropyDeprecationWarningc                   @   s´   e Zd Zd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„ 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 ))ÚParameterTestMixina+  Tests for a :class:`astropy.cosmology.Parameter` on a Cosmology.

    :class:`astropy.cosmology.Parameter` is a descriptor and this test suite
    tests descriptors by class inheritance, so ``ParameterTestMixin`` is mixed
    into ``TestCosmology`` (tests :class:`astropy.cosmology.Cosmology`).
    c                 c   s   t |t|jƒ ¡ ƒV  dS )zCosmological ParametersN)ÚgetattrÚsetÚ__parameters__Úpop©ÚselfÚ	cosmo_cls© r   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/cosmology/tests/test_parameter.pyÚ	parameter'   s    zParameterTestMixin.parameterc                 c   s   t |t|jƒ ¡ ƒV  dS )z$Cosmological All Parameter instancesN)r	   r
   Ú__all_parameters__r   r   r   r   r   Úall_parameter0   s    z ParameterTestMixin.all_parameterc                 C   sZ   t |dƒst‚t|jtƒst‚tdd„ |j ¡ D ƒƒs:t‚tdd„ |j ¡ D ƒƒsVt‚dS )z>Test :class:`astropy.cosmology.Parameter` attributes on class.Ú_registry_validatorsc                 s   s   | ]}t |tƒV  qd S ©N)Ú
isinstanceÚstr)Ú.0Úkr   r   r   Ú	<genexpr>A   s    zEParameterTestMixin.test_Parameter_class_attributes.<locals>.<genexpr>c                 s   s   | ]}t |ƒV  qd S r   )Úcallable)r   Úvr   r   r   r   D   s     N)ÚhasattrÚAssertionErrorr   r   ÚdictÚallÚkeysÚvalues©r   r   r   r   r   Útest_Parameter_class_attributes<   s    ÿz2ParameterTestMixin.test_Parameter_class_attributesc                 C   s¨   t ƒ }|jtkst‚|jdks"t‚|jg ks0t‚|jdks>t‚|jdksLt‚t dddt 	¡ gdd�}|jt
ksrt‚|jtjks‚t‚|jt 	¡ gks–t‚|jdks¤t‚dS )z8Test :class:`astropy.cosmology.Parameter` instantiation.NFÚfloatZ	DOCSTRINGÚkmT)Ú	fvalidateÚdocÚunitÚequivalenciesÚderived)r   r(   r   r   r*   r+   r,   ÚnameÚuÚmass_energyr   r'   )r   r   r   r   r   Útest_Parameter_initF   s"    ûz&ParameterTestMixin.test_Parameter_initc              	   C   sJ   t  t¡� tdd�}W 5 Q R X |jdks.t‚| ¡ }|d dksFt‚dS )z5Test that passing the argument ``fmt`` is deprecated.z.4f)Úfmtr1   N)ÚpytestÚwarnsr   r   Ú_format_specr   Z_get_init_arguments)r   r   Z	init_argsr   r   r   Ú"test_Parameter_init_deprecated_fmt]   s
    z5ParameterTestMixin.test_Parameter_init_deprecated_fmtc                 C   s‚   t |dƒst‚t|jƒst‚t |dƒs*t‚t |dƒs8t‚t |dƒsFt‚t |dƒsTt‚t |dƒsbt‚t |dƒspt‚t |dƒs~t‚d	S )
ú?Test :class:`astropy.cosmology.Parameter` attributes from init.r(   Ú__doc__Ú_unitÚ_equivalenciesÚ_derivedr4   Ú
_attr_nameÚ_attr_name_privateN©r   r   r   r(   r$   r   r   r   Ú"test_Parameter_instance_attributesh   s    z5ParameterTestMixin.test_Parameter_instance_attributesc                 C   s    t |dƒst‚t|jƒst‚dS )ú3Test :attr:`astropy.cosmology.Parameter.fvalidate`.r(   Nr=   r$   r   r   r   Útest_Parameter_fvalidatey   s    z+ParameterTestMixin.test_Parameter_fvalidatec                 C   s2   t |dƒst‚t|jtƒst‚|j|jks.t‚dS )ú.Test :attr:`astropy.cosmology.Parameter.name`.r-   N)r   r   r   r-   r   r;   r$   r   r   r   Útest_Parameter_name~   s    z&ParameterTestMixin.test_Parameter_namec                 C   s<   t |dƒst‚t|jtjtdƒfƒs(t‚|j|jks8t‚dS )ú.Test :attr:`astropy.cosmology.Parameter.unit`.r*   N)r   r   r   r*   r.   ZUnitBaseÚtyper8   r$   r   r   r   Útest_Parameter_unit„   s    z&ParameterTestMixin.test_Parameter_unitc                 C   s8   t |dƒst‚t|jttjfƒs$t‚|j|jks4t‚dS )ú7Test :attr:`astropy.cosmology.Parameter.equivalencies`.r+   N)r   r   r   r+   Úlistr.   ZEquivalencyr9   r$   r   r   r   Útest_Parameter_equivalenciesŠ   s    z/ParameterTestMixin.test_Parameter_equivalenciesc              	   C   s<   t  t¡� |j}W 5 Q R X t|tƒs*t‚||jks8t‚dS )ú5Test :attr:`astropy.cosmology.Parameter.format_spec`.N)r2   r3   r   Úformat_specr   r   r   r4   )r   r   r1   r   r   r   Útest_Parameter_format_spec�   s    z-ParameterTestMixin.test_Parameter_format_specc                 C   s\   t |dƒst‚t|jtƒst‚|j|jks.t‚|j|jkrJ|jdksXt‚n|jdksXt‚dS )ú1Test :attr:`astropy.cosmology.Parameter.derived`.r,   FTN)r   r   r   r,   Úboolr:   r-   r   ©r   r   r   r   r   r   Útest_Parameter_derived˜   s    z)ParameterTestMixin.test_Parameter_derivedc                 C   sP   t ||jƒ}t|tƒst‚||ks&t‚t ||jƒ}t |t ||jƒk¡sLt‚dS )z1Test :attr:`astropy.cosmology.Parameter.__get__`.N)r	   r-   r   r   r   Únpr!   r<   )r   r   Úcosmor   r   r   r   r   Útest_Parameter_descriptor_get§   s
    z0ParameterTestMixin.test_Parameter_descriptor_getc              	   C   s<   t ||jƒst‚tjtdd�� t||jdƒ W 5 Q R X dS )z1Test :attr:`astropy.cosmology.Parameter.__set__`.zcan't set attribute©ÚmatchN)r   r<   r   r2   ÚraisesÚAttributeErrorÚsetattrr;   )r   rQ   r   r   r   r   Útest_Parameter_descriptor_set²   s    z0ParameterTestMixin.test_Parameter_descriptor_setc                 C   s8   t |tƒst‚|j|jkst‚|js4|j|jks4t‚dS )z>Test each `astropy.cosmology.Parameter` attached to Cosmology.N)r   r   r   r-   r   r,   r   rN   r   r   r   Útest_Parameter_listedÂ   s    z(ParameterTestMixin.test_Parameter_listedc                 C   s    t |dƒst‚t |dƒst‚dS )z8Test `astropy.cosmology.Parameter`-related on Cosmology.r   r   N)r   r   r   r   r   r   Ú.test_parameter_related_attributes_on_CosmologyÍ   s    zAParameterTestMixin.test_parameter_related_attributes_on_Cosmologyc                 C   sD   G dd„ d|ƒ}G dd„ d|ƒ}|j |j ks0t‚|j|jks@t‚dS )z>Cosmology Parameter not unique to class when subclass defined.c                   @   s   e Zd Zeƒ ZdS )zAParameterTestMixin.test_Parameter_not_unique.<locals>.ExampleBaseN)Ú__name__Ú
__module__Ú__qualname__r   Úparamr   r   r   r   ÚExampleBase×   s   r_   c                   @   s   e Zd ZdS )z=ParameterTestMixin.test_Parameter_not_unique.<locals>.ExampleN©r[   r\   r]   r   r   r   r   ÚExampleÚ   s   ra   N)r^   r   r   )r   r   Úclean_registryr_   ra   r   r   r   Útest_Parameter_not_uniqueÓ   s    z,ParameterTestMixin.test_Parameter_not_uniquec                 C   sP   G dd„ d|ƒ}|j d dk |j d dkrLt|j dd… ƒt|j ƒksLt‚dS )zTest parameters are reordered.c                   @   s"   e Zd Zeƒ Zdddœdd„ZdS )zHParameterTestMixin.test_Parameters_reorder_by_signature.<locals>.ExampleN©r-   Úmetac                S   s   d S r   r   ©r   r^   r-   re   r   r   r   Ú__init__æ   s    zQParameterTestMixin.test_Parameters_reorder_by_signature.<locals>.Example.__init__)r[   r\   r]   r   r^   rg   r   r   r   r   ra   ã   s   ra   r   r^   é   N)r   r
   r   ©r   r   rb   ra   r   r   r   Ú$test_Parameters_reorder_by_signatureà   s    z7ParameterTestMixin.test_Parameters_reorder_by_signaturec                 C   sœ   G dd„ d|ƒ}|dƒj dtj ks(t‚|dtj ƒj dtj ksFt‚|dtj ƒj dtj  tj¡kslt‚|dtj ƒj dtj  tjt ¡ ¡ks˜t‚dS )z6Test the parameter creation process. Uses ``__set__``.c                       sB   e Zd Zeeje ¡ d�Zdddœdd„Ze	‡ fdd„ƒZ
‡  ZS )z<ParameterTestMixin.test_make_from_Parameter.<locals>.Example)r*   r+   Nrd   c                S   s
   || _ d S r   ©r^   rf   r   r   r   rg   ö   s    zEParameterTestMixin.test_make_from_Parameter.<locals>.Example.__init__c                    s
   t ƒ  ¡ S r   ©ÚsuperÚis_flat©r   ©Ú	__class__r   r   rn   ù   s    zDParameterTestMixin.test_make_from_Parameter.<locals>.Example.is_flat)r[   r\   r]   r   r.   ÚeVr/   r^   rg   Úpropertyrn   Ú__classcell__r   r   rp   r   ra   ó   s   ra   rh   N)r^   r.   rr   r   ÚJÚtoZkgr/   ri   r   r   r   Útest_make_from_Parameterð   s
    
&z+ParameterTestMixin.test_make_from_ParameterN)r[   r\   r]   r7   r2   Úfixturer   r   r%   r0   r5   r>   r@   rB   rE   rH   rK   rO   rR   rX   rY   rZ   rc   rj   rw   r   r   r   r   r      s,   


r   c                       s  e Zd ZdZdd„ Zdd„ Zejdddgd	�d
d„ ƒZejdd�dd„ ƒZ	ejdd�dd„ ƒZ
‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ f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‡  ZS )3ÚTestParameterzŒ
    Test `astropy.cosmology.Parameter` directly. Adds a lot of specific tests
    that wouldn't be covered by the per-cosmology tests.
    c                    s4   G dd„ dt ƒ‰ G ‡ fdd„dˆ ƒ}ˆ |dœ| _d S )Nc                       s>   e Zd Zedeje ¡ d�Zddd„Ze	‡ fdd„ƒZ
‡  ZS )	z+TestParameter.setup_class.<locals>.Example1ú!Description of example parameter.)r)   r*   r+   é   c                 S   s
   || _ d S r   rk   ©r   r^   r   r   r   rg     s    z4TestParameter.setup_class.<locals>.Example1.__init__c                    s
   t ƒ  ¡ S r   rl   ro   rp   r   r   rn     s    z3TestParameter.setup_class.<locals>.Example1.is_flat)r{   )r[   r\   r]   r   r.   Úmr/   r^   rg   rs   rn   rt   r   r   rp   r   ÚExample1  s   ý
r~   c                       s.   e Zd Zdej fdd„Z” jjdd„ ƒZdS )z+TestParameter.setup_class.<locals>.Example2r{   c                 S   s
   || _ d S r   rk   r|   r   r   r   rg     s    z4TestParameter.setup_class.<locals>.Example2.__init__c                 S   s   |  tj¡S r   )rv   r.   r'   )r   r^   Úvaluer   r   r   r^      s    z1TestParameter.setup_class.<locals>.Example2.paramN)r[   r\   r]   r.   r}   rg   r^   Ú	validatorr   ©r~   r   r   ÚExample2  s   r‚   )r~   r‚   )r   Úclasses)r   r‚   r   r�   r   Úsetup_class  s    	zTestParameter.setup_classc                 C   s    | j  ¡ D ]}t |j¡ q
d S r   )rƒ   r#   r   r   r]   )r   Úclsr   r   r   Úteardown_class'  s    zTestParameter.teardown_classÚclassr~   r‚   )ÚscopeÚparamsc                 C   s   | j |j S )zCosmology class.)rƒ   r^   )r   Úrequestr   r   r   r   +  s    zTestParameter.cosmo_cls)rˆ   c                 C   s   |ƒ S )zCosmology instancer   r   r   r   r   rQ   0  s    zTestParameter.cosmoc                 C   s   |j S )z+Get Parameter 'param' from cosmology class.rk   r   r   r   r   r^   5  s    zTestParameter.paramc                    sz   t ƒ  |¡ |jdkst‚|jtjks*t‚|jt ¡ ks<t‚|j	dksJt‚|j
tjksZt‚|jdksht‚|jdksvt‚dS )r6   rz   Ú r^   Ú_paramN)rm   r>   r7   r   r8   r.   r}   r9   r/   r4   r:   rP   ZFalse_r;   r<   r|   rp   r   r   r>   <  s    z0TestParameter.test_Parameter_instance_attributesc                    s6   t ƒ  |¡ | ||dtj ¡}|dtj ks2t‚dS )r?   éè  rh   N)rm   r@   r(   r.   r}   r'   r   ©r   rQ   r^   r   rp   r   r   r@   M  s    z&TestParameter.test_Parameter_fvalidatec                    s   t ƒ  |¡ |jdkst‚dS )rA   r^   N)rm   rB   r-   r   r|   rp   r   r   rB   T  s    z!TestParameter.test_Parameter_namec                    s    t ƒ  |¡ |jtjkst‚dS )rC   N)rm   rE   r*   r.   r}   r   r|   rp   r   r   rE   Z  s    z!TestParameter.test_Parameter_unitc                    s"   t ƒ  |¡ |jt ¡ kst‚dS )rF   N)rm   rH   r+   r.   r/   r   r|   rp   r   r   rH   `  s    z*TestParameter.test_Parameter_equivalenciesc              	      s4   t ƒ  |¡ t t¡� |jdks&t‚W 5 Q R X dS )rI   r‹   N)rm   rK   r2   r3   r   rJ   r   r|   rp   r   r   rK   f  s    z(TestParameter.test_Parameter_format_specc                    s    t ƒ  ||¡ |jdkst‚dS )rL   FN)rm   rO   r,   r   )r   r   r^   rp   r   r   rO   m  s    z$TestParameter.test_Parameter_derivedc                    s2   t ƒ  |||¡ t||jƒ}|dtj ks.t‚dS )z1Test :meth:`astropy.cosmology.Parameter.__get__`.r{   N)rm   rR   r	   r-   r.   r}   r   )r   r   rQ   r^   r   rp   r   r   rR   v  s    z+TestParameter.test_Parameter_descriptor_getc              	   C   sx   t jD ]"}| |¡}|j|j| kst‚qtjtdd�� t dd� W 5 Q R X tjtdd�� t t	ƒ d� W 5 Q R X dS )z3Test :meth:`astropy.cosmology.Parameter.validator`.z`fvalidate`, if strrS   zNOT REGISTERED)r(   z!`fvalidate` must be a function orN)
r   r   r€   r(   r   r2   rU   Ú
ValueErrorÚ	TypeErrorÚobject)r   r^   r   Únewparamr   r   r   Útest_Parameter_validator�  s    

z&TestParameter.test_Parameter_validatorc                 C   sd   |  |dtj ¡}|j|jd krB|jtjks2t‚|jdks`t‚n|jtjksRt‚|jdks`t‚dS )z2Test :meth:`astropy.cosmology.Parameter.validate`.r�   Údefaultrh   N)	Úvalidater.   r}   r(   r   r*   r   r   r'   rŽ   r   r   r   Útest_Parameter_validate�  s    z%TestParameter.test_Parameter_validatec              
   C   s¦   t jtdd�� |j dd¡ W 5 Q R X dd„ }z|j d|¡}||ksLt‚W 5 |jj dd¡ X z,|j d¡dd	„ ƒ}|jjd |ksŒt‚W 5 |jj dd¡ X dS )
z<Test :meth:`astropy.cosmology.Parameter.register_validator`.zvalidator 'default' alreadyrS   r”   Nc                 S   s   | S r   r   )Úxr   r   r   Únotnonefunc¢  s    zDTestParameter.test_Parameter_register_validator.<locals>.notnonefuncZnewvalidatorc                 S   s   |S r   r   )Z	cosmologyr^   r   r   r   r   Úfunc®  s    z=TestParameter.test_Parameter_register_validator.<locals>.func)r2   rU   ÚKeyErrorrq   Zregister_validatorr   r   r   )r   r^   r˜   r€   r™   r   r   r   Ú!test_Parameter_register_validator›  s    

z/TestParameter.test_Parameter_register_validatorc              	   C   sŠ   |  ¡ |kst‚|  ¡ |k	s t‚|j dd�}|jtjtj tj ksHt‚|jtjtj tj ksdt‚t t	¡� |j dd� W 5 Q R X dS )z/Test :meth:`astropy.cosmology.Parameter.clone`.z
km/(yr sr)©r*   T)Znot_a_valid_parameterN)
Úcloner   r*   r.   r'   ÚyrÚsrr2   rU   r�   )r   r^   r’   r   r   r   Útest_Parameter_clone¸  s    z"TestParameter.test_Parameter_clonec                 C   sF   t dd�}t dd�}||ks t‚t dd�}||ks6t‚|dksBt‚dS )zz
        Test Parameter equality.
        Determined from the processed initialization args (including defaults).
        zkm / (s Mpc)rœ   zkm / sé   N)r   r   )r   Úp1Zp2Zp3r   r   r   Útest_Parameter_equalityË  s    


z%TestParameter.test_Parameter_equalityc                 C   s\   t |ƒ}d|kst‚dD ]}||kst|ƒ‚q|j|j ¡ krLd|ksXt‚nd|ksXt‚dS )zTest Parameter repr.z
Parameter()zderived=Falsezunit=Unit("m")z%equivalencies=[(Unit("kg"), Unit("J")z'doc='Description of example parameter.'zfvalidate='default'zfvalidate=<N)Úreprr   r(   r   r#   )r   r   r^   ÚrÚsubsr   r   r   Útest_Parameter_reprÝ  s    z!TestParameter.test_Parameter_reprc                 C   s(   t ddd�}tt|ƒƒ}||ks$t‚dS )z?Test ``eval(repr(Parameter))`` can round trip to ``Parameter``.z A description of this parameter.T)r)   r,   N)r   Úevalr¤   r   )r   r^   ÚPZNPr   r   r   Útest_Parameter_repr_roundtripð  s    z+TestParameter.test_Parameter_repr_roundtripc                 C   s2   G dd„ dƒ}G dd„ d|ƒ}|j |j ks.t‚dS )z?Descriptors are initialized once and not updated on subclasses.c                   @   sH   e Zd Zd	dd„Ze e¡Zejeej	 
¡ ƒdd… d�Zedd�ZdS )
zRTestParameter.test_Parameter_doesnt_change_with_generic_class.<locals>.ExampleBaser{   c                 S   s
   || _ d S r   )rŒ   r|   r   r   r   rg   ý  s    z[TestParameter.test_Parameter_doesnt_change_with_generic_class.<locals>.ExampleBase.__init__rh   N)Ú
parameterszexample parameter)r)   )r{   )r[   r\   r]   rg   ÚinspectÚ	signatureÚsigÚreplacerG   r«   r#   Z_init_signaturer   r^   r   r   r   r   r_   ü  s   

r_   c                   @   s   e Zd ZdS )zNTestParameter.test_Parameter_doesnt_change_with_generic_class.<locals>.ExampleNr`   r   r   r   r   ra     s   ra   N)r^   r   )r   r_   ra   r   r   r   Ú/test_Parameter_doesnt_change_with_generic_classù  s    	z=TestParameter.test_Parameter_doesnt_change_with_generic_classc                 C   s>   G dd„ d|ƒ}|j |j ks t‚t |j¡ |jtks:t‚dS )zCCosmology reinitializes all descriptors when a subclass is defined.c                   @   s   e Zd ZdS )zJTestParameter.test_Parameter_doesnt_change_with_cosmology.<locals>.ExampleNr`   r   r   r   r   ra     s   ra   N)r^   r   r   r   r]   )r   r   ra   r   r   r   Ú+test_Parameter_doesnt_change_with_cosmology
  s    z9TestParameter.test_Parameter_doesnt_change_with_cosmology)r[   r\   r]   r7   r„   r†   r2   rx   r   rQ   r^   r>   r@   rB   rE   rH   rK   rO   rR   r“   r–   r›   r    r£   r§   rª   r°   r±   rt   r   r   rp   r   ry     s4   




		ry   )r7   r¬   ÚnumpyrP   r2   Zastropy.unitsZunitsr.   Zastropy.cosmologyr   Zastropy.cosmology.corer   Zastropy.cosmology.parameterr   r   r   Zastropy.utils.exceptionsr   r   ry   r   r   r   r   Ú<module>   s    h