U
    e»{jG•  ã                   @   s¬  d Z ddl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mZmZmZ ddlmZ ddlmZ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!m"Z" dd
l#m$Z$ G dd„ deƒZ%ej&j'e$dd�dd„ ƒZ(G dd„ de ƒZ)G dd„ de ƒZ*G dd„ de ƒZ+G dd„ de ƒZ,G dd„ de ƒZ-G dd„ de ƒZ.G dd„ de ƒZ/G dd „ d ee)e*e+e,e-e.e/ƒ
Z0G d!d"„ d"e0ƒZ1G d#d$„ d$e+ƒZ2G d%d&„ d&ee2ƒZ3dS )'z+Testing :mod:`astropy.cosmology.flrw.base`.é    N)ÚFLRWÚFlatLambdaCDMÚ	LambdaCDMÚPlanck18)Ú_COSMOLOGY_CLASSES)Ú_a_B_c2Ú_critdens_constÚ_H0units_to_invsÚquad)Ú	Parameter)Úget_redshift_methods)ÚCosmologySubclassTest)ÚFlatCosmologyMixinTestÚParameterTestMixinÚ
invalid_zsÚvalid_zs)Ú	HAS_SCIPYc                       s   e Zd Z‡ fdd„Z‡  ZS )ÚSubFLRWc                    s   t ƒ  |¡S ©N)ÚsuperÚw)ÚselfÚz©Ú	__class__© úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/cosmology/flrw/tests/test_base.pyr   '   s    z	SubFLRW.w)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r   r   r   r   r   &   s   r   zscipy is installed©Úreasonc                	   C   s$   t jtdd�� tƒ  W 5 Q R X dS )zATest stand-in functions when optional dependencies not installed.z!No module named 'scipy.integrate'©ÚmatchN)ÚpytestÚraisesÚModuleNotFoundErrorr
   r   r   r   r   Útest_optional_deps_functions0   s    r(   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚParameterH0TestMixina%  Tests for `astropy.cosmology.Parameter` H0 on a Cosmology.

    H0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c              	   C   sä   t  d¡}t|jtƒst‚d|jjks*t‚|jj|ks:t‚|j |d¡d| ksTt‚|j |d| ¡d| ksrt‚t	j
tdd�� |j |ddg¡ W 5 Q R X |j|jks®t‚|j| jd ksÂt‚t|jt jƒrÜ|jj|ksàt‚d	S )
zTest Parameter ``H0``.z
km/(s Mpc)zHubble constanté   é
   úH0 is a non-scalar quantityr#   é   ÚH0N)ÚuZUnitÚ
isinstancer.   r   ÚAssertionErrorÚ__doc__ÚunitÚvalidater%   r&   Ú
ValueErrorÚ_H0Ú	_cls_argsÚQuantity)r   Ú	cosmo_clsÚcosmor3   r   r   r   Útest_H0B   s    
zParameterH0TestMixin.test_H0c              	   C   s¨   ||j |jŽ}|j|jd ks"t‚|jd j|jd< ||j |jŽ}|jj|jd ksXt‚t ddgtjtj	 tj
 ¡|jd< tjtdd�� ||j |jŽ W 5 Q R X dS )z)Test initialization for values of ``H0``.r.   éF   éd   r,   r#   N)ÚargsÚkwargsr.   Ú	argumentsr1   Úvaluer/   r8   ÚkmÚsÚMpcr%   r&   r5   ©r   r9   Úbar:   r   r   r   Útest_init_H0V   s    $z!ParameterH0TestMixin.test_init_H0N)r   r   r   r2   r;   rG   r   r   r   r   r)   :   s   r)   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚParameterOm0TestMixina'  Tests for `astropy.cosmology.Parameter` Om0 on a Cosmology.

    Om0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c              	   C   s²   t |jtƒst‚d|jjks t‚|j |d¡dks6t‚|j |dtj ¡dksRt‚tj	t
dd�� |j |d¡ W 5 Q R X |j|jksŠt‚|j| jd ksžt‚t |jtƒs®t‚dS )	zTest Parameter ``Om0``.zOmega matterr*   r+   zOm0 cannot be negativer#   éÿÿÿÿÚOm0N)r0   rJ   r   r1   r2   r4   r/   Úoner%   r&   r5   Ú_Om0r7   Úfloat©r   r9   r:   r   r   r   Útest_Om0o   s    zParameterOm0TestMixin.test_Om0c              	   C   s¢   |j d tj> |j d< ||j|jŽ}|j|j d ks8t‚|j d j|j d< ||j|jŽ}|j|j d kslt‚d|j d< tj	t
dd�� ||j|jŽ W 5 Q R X dS )z*Test initialization for values of ``Om0``.rJ   gHáz®GÑ¿zOm0 cannot be negative.r#   N)r@   r/   rK   r>   r?   rJ   r1   rA   r%   r&   r5   rE   r   r   r   Útest_init_Om0€   s    
z#ParameterOm0TestMixin.test_init_Om0N)r   r   r   r2   rO   rP   r   r   r   r   rH   g   s   rH   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚParameterOde0TestMixina)  Tests for `astropy.cosmology.Parameter` Ode0 on a Cosmology.

    Ode0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                 C   s$   t |jtƒst‚d|jjks t‚dS )ú%Test Parameter ``Ode0`` on the class.zOmega dark energyN)r0   ÚOde0r   r1   r2   ©r   r9   r   r   r   Útest_Parameter_Ode0š   s    z*ParameterOde0TestMixin.test_Parameter_Ode0c              	   C   sd   |j  |d¡dkst‚|j  |dtj ¡dks2t‚tjtdd�� |j  |dtj ¡ W 5 Q R X dS )ú#Test Parameter ``Ode0`` validation.gš™™™™™ñ?r+   g      $@úonly dimensionlessr#   N)	rS   r4   r1   r/   rK   r%   r&   Ú	TypeErrorrB   rN   r   r   r   Útest_Parameter_Ode0_validationŸ   s    z5ParameterOde0TestMixin.test_Parameter_Ode0_validationc                 C   s8   |j |jkst‚|j | jd ks$t‚t|j tƒs4t‚dS )rV   rS   N)rS   Ú_Ode0r1   r7   r0   rM   ©r   r:   r   r   r   Ú	test_Ode0¦   s    z ParameterOde0TestMixin.test_Ode0c              	   C   sü   |j d tj> |j d< ||j|jŽ}|j|j d ks8t‚|j d j|j d< ||j|jŽ}|j|j d kslt‚d|j d< ||j|jŽ}t | 	ddddg¡ddddg¡sªt‚t | 	d¡d¡sÀt‚dtj
 |j d< tjtdd	�� ||j|jŽ W 5 Q R X d
S )ú+Test initialization for values of ``Ode0``.rS   ç        r   r*   r-   é   r+   rW   r#   N)r@   r/   rK   r>   r?   rS   r1   rA   ÚallcloseÚOderB   r%   r&   rX   rE   r   r   r   Útest_init_Ode0­   s    
&z%ParameterOde0TestMixin.test_init_Ode0N)r   r   r   r2   rU   rY   r\   rb   r   r   r   r   rQ   ’   s
   rQ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚParameterTcmb0TestMixina+  Tests for `astropy.cosmology.Parameter` Tcmb0 on a Cosmology.

    Tcmb0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c              	   C   sä   t |jtƒst‚d|jjks t‚|jjtjks2t‚|j |d¡dtj ksNt‚|j |dtj ¡dtj kspt‚t	j
tdd�� |j |ddg¡ W 5 Q R X |j|jks¬t‚|j| jd ksÀt‚t |jtjƒrÜ|jjtjksàt‚dS )	zTest Parameter ``Tcmb0``.zTemperature of the CMBr*   r+   úTcmb0 is a non-scalar quantityr#   r-   ÚTcmb0N)r0   re   r   r1   r2   r3   r/   ÚKr4   r%   r&   r5   Z_Tcmb0Ú
cls_kwargsr8   rN   r   r   r   Ú
test_Tcmb0Í   s    "z"ParameterTcmb0TestMixin.test_Tcmb0c              	   C   sœ   ||j |jŽ}|j|jd ks"t‚|jd j|jd< ||j |jŽ}|jj|jd ksXt‚t ddgtj¡|jd< t	j
tdd�� ||j |jŽ W 5 Q R X dS )z,Test initialization for values of ``Tcmb0``.re   r^   r-   rd   r#   N)r>   r?   re   r@   r1   rA   r/   r8   rf   r%   r&   r5   rE   r   r   r   Útest_init_Tcmb0ß   s    z'ParameterTcmb0TestMixin.test_init_Tcmb0N)r   r   r   r2   rh   ri   r   r   r   r   rc   Å   s   rc   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚParameterNeffTestMixina)  Tests for `astropy.cosmology.Parameter` Neff on a Cosmology.

    Neff is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c              	   C   s¶   t |jtƒst‚d|jjks t‚|j |d¡dks6t‚|j |dtj ¡dksRt‚tj	t
dd�� |j |d¡ W 5 Q R X |j|jksŠt‚|j| j dd¡ks¢t‚t |jtƒs²t‚d	S )
zTest Parameter ``Neff``.z$Number of effective neutrino speciesr*   r+   zNeff cannot be negativer#   rI   ÚNeffgR¸…ëQ@N)r0   rk   r   r1   r2   r4   r/   rK   r%   r&   r5   Ú_Neffrg   ÚgetrM   rN   r   r   r   Ú	test_Neffø   s    z ParameterNeffTestMixin.test_Neffc              	   C   sž   |j d tj> |j d< ||j|jŽ}|j|j d ks8t‚|j d j|j d< ||j|jŽ}|j|j d kslt‚d|j d< t 	t
¡� ||j|jŽ W 5 Q R X dS )z+Test initialization for values of ``Neff``.rk   rI   N)r@   r/   rK   r>   r?   rk   r1   rA   r%   r&   r5   rE   r   r   r   Útest_init_Neff	  s    
z%ParameterNeffTestMixin.test_init_NeffN)r   r   r   r2   rn   ro   r   r   r   r   rj   ð   s   rj   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚParameterm_nuTestMixina)  Tests for `astropy.cosmology.Parameter` m_nu on a Cosmology.

    m_nu is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                 C   sü   t |jtƒst‚d|jjks t‚|jjtjks2t‚|jjt 	¡ ksFt‚t 
|jdddgtj ¡sdt‚|jjdkr€|jdksøt‚nx|js t 
|jdtj ¡søt‚nX| jdkr¼|j|jksøt‚n<t 
|jd| j… dtj ¡sÞt‚t 
|j| j |j¡søt‚dS )zTest Parameter ``m_nu``.zMass of neutrino speciesr^   r   N)r0   Úm_nur   r1   r2   r3   r/   ÚeVZequivalenciesZmass_energyr`   ÚTnu0rA   Ú
_massivenuZ_nmasslessnuZ_massivenu_massrN   r   r   r   Ú	test_m_nu"  s    
"z Parameterm_nuTestMixin.test_m_nuc              	   C   sÚ   ||j |jŽ}t |j|jd k¡s(t‚|jr2t‚|jjt	j
ksDt‚|jd j|jd< ||j |jŽ}t |jj|jd k¡s€t‚|jrŠt‚t |¡}t	 dddgt	j
¡|jd< tjtdd�� ||j |jŽ W 5 Q R X dS )z�Test initialization for values of ``m_nu``.

        Note this requires the class to have a property ``has_massive_nu``.
        rq   g333333Ó¿çš™™™™™É?çš™™™™™¹?Úinvalidr#   N)r>   r?   ÚnpÚallrq   r@   r1   Úhas_massive_nur3   r/   rr   rA   Úcopyr8   r%   r&   r5   ©r   r9   rF   r:   Útbar   r   r   Útest_init_m_nu9  s    


z%Parameterm_nuTestMixin.test_init_m_nuc              	   C   sD  t   |¡}d|jd< t dddgtj¡|jd< tjtdd�� ||j|j	Ž W 5 Q R X d	|jd< ||j|j	Ž}|j
rxt‚t|jƒd
ksŠt‚|jjtjksœt‚t |jd	tj ¡s´t‚tj| d¡ddd�sÎt‚dtj |jd< ||j|j	Ž}|j
söt‚t|jƒd
k�s
t‚|jjtjk�st‚t |jddddgtj ¡�s@t‚dS )z¬Test initialization for values of ``m_nu`` and ``Neff``.

        Note this test requires ``Neff`` as constructor input, and a property
        ``has_massive_nu``.
        g333333@rk   g333333Ã?rv   rw   rq   zunexpected number of neutrinor#   r   é   ç      ð?gTX§0àní?g�íµ ÷Æ°>©ZrtolN)r|   r@   r/   r8   rr   r%   r&   r5   r>   r?   r{   r1   Úlenrq   r3   r`   Únu_relative_density©r   r9   rF   r~   r:   r   r   r   Útest_init_m_nu_and_NeffP  s,    



  ÿ

z.Parameterm_nuTestMixin.test_init_m_nu_and_Neffc                 C   sx   t   |¡}d|jd< ||j|jŽ}|jdks0t‚|jr:t‚t   |¡}d|jd< ||j|jŽ}|jdksjt‚|jrtt‚dS )z Test initialization for values of ``m_nu``.

        Note this test requires ``Tcmb0`` as constructor input, and a property
        ``has_massive_nu``.
        r   rk   Nre   )r|   r@   r>   r?   rq   r1   r{   r…   r   r   r   Ú test_init_m_nu_override_by_Tcmb0q  s    




z7Parameterm_nuTestMixin.test_init_m_nu_override_by_Tcmb0N)r   r   r   r2   ru   r   r†   r‡   r   r   r   r   rp     s
   !rp   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚParameterOb0TestMixina'  Tests for `astropy.cosmology.Parameter` Ob0 on a Cosmology.

    Ob0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c              	   C   sà   t |jtƒst‚d|jjks t‚|j |d¡dks6t‚|j |d¡dksLt‚|j |dtj ¡dksht‚tj	t
dd�� |j |d¡ W 5 Q R X tj	t
dd�� |j ||jd ¡ W 5 Q R X |j|jksÎt‚|jd	ksÜt‚dS )
zTest Parameter ``Ob0``.zOmega baryon;Nrw   úOb0 cannot be negativer#   rI   ú"baryonic density can not be largerr*   ç¸…ëQ¸ž?)r0   ÚOb0r   r1   r2   r4   r/   rK   r%   r&   r5   rJ   Z_Ob0rN   r   r   r   Útest_Ob0Ž  s    zParameterOb0TestMixin.test_Ob0c              	   C   sÎ  t |jd tjƒst‚||j|jŽ}|j|jd ks8t‚|jd j|jd< ||j|jŽ}|j|jd kslt‚d|jd< ||j|jŽ}|jdks’t‚| j	sÔt 
| d¡d¡s®t‚t 
| ddddg¡ddddg¡sÔt‚t |¡}d|jd< tjtdd	�� ||j|jŽ W 5 Q R X |jd
 d |jd< tjtdd	�� ||j|jŽ W 5 Q R X t |¡}|j dd¡ ||j|jŽ}t t¡� | d¡ W 5 Q R X t t¡� | d¡ W 5 Q R X |jjd jdk�sÊt‚dS )z*Test initialization for values of ``Ob0``.rŒ   r^   r*   r   r-   r_   g{®Gáz¤¿r‰   r#   rJ   rw   rŠ   N)r0   r@   r/   r8   r1   r>   r?   rŒ   rA   Ú
abstract_wr`   ZObr|   r%   r&   r5   ÚpopZOdmZ_init_signatureÚ
parametersÚdefaultr}   r   r   r   Útest_init_Ob0¡  s6    
&


z#ParameterOb0TestMixin.test_init_Ob0N)r   r   r   r2   r�   r’   r   r   r   r   rˆ   †  s   rˆ   c                       sä   e Zd ZdZdZdd„ Z‡ fdd„Zejdd�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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‡ fd-d.„Z‡ fd/d0„Z‡  ZS )1ÚTestFLRWz%Test :class:`astropy.cosmology.FLRW`.Tc                 C   sf   t td< t | _tdtj tj tj dtj dtj d�| _	tdtj
 dtj | jjdd	id
�| _dS )z_
        Setup for testing.
        FLRW is abstract, so tests are done on a subclass.
        r   r<   gHáz®GÑ?g\�Âõ(\ç?)r.   rJ   rS   g      @r‹   ÚaÚb)re   rŒ   ÚnameÚmetaN)r   r   ÚclsÚdictr/   rB   rC   rD   rK   r7   rf   r   r   rg   ©r   r   r   r   Úsetup_classÝ  s      ÿüzTestFLRW.setup_classc                    s   t ƒ  | ¡ t dd ¡ d S )Nr   )r   Úteardown_classr   r�   rš   r   r   r   rœ   ð  s    zTestFLRW.teardown_classÚclass)Úscopec                 C   s   t dddƒS )z/A non-flat cosmology used in equivalence tests.r<   gš™™™™™Ù?gš™™™™™é?)r   rš   r   r   r   Únonflatcosmoô  s    zTestFLRW.nonflatcosmoc                    s   t ƒ  |¡ dS )zTest initialization.N)r   Ú	test_initrT   r   r   r   r    ü  s    zTestFLRW.test_initc                 C   sÆ   d|j d< ||j|jŽ}|jdks&t‚|jdks4t‚| jsÂt | 	d¡ddddg¡sXt‚t | 	ddddg¡ddddg¡s~t‚t | 
d¡ddddg¡sœt‚t | 
ddddg¡ddddg¡sÂt‚dS )	z‹Test if setting Tcmb0 parameter to 0 influences other parameters.

        TODO: consider moving this test to ``FLRWSubclassTest``
        r^   re   g      ø?r   r*   r-   r_   N)r@   r>   r?   ÚOgamma0r1   ÚOnu0rŽ   r/   r`   ÚOgammaÚOnurE   r   r   r   Útest_init_Tcmb0_zeroing  s    
&z TestFLRW.test_init_Tcmb0_zeroingc                 C   sh   t |jtƒst‚|jjdks t‚|j|jks0t‚|jdkrJ|jdksdt‚nt |j|j	|j ¡sdt‚dS )zTest property ``Odm0``.N)
r0   ZOdm0Úpropertyr1   ÚfsetZ_Odm0rŒ   ry   r`   rJ   rN   r   r   r   Ú	test_Odm0  s    
zTestFLRW.test_Odm0c                 C   s^   t |jtƒst‚|jjdks t‚|j|jks0t‚t |jd|j|j	 |j
 |j  ¡sZt‚dS )úTest property ``Ok0``.Nr�   )r0   ÚOk0r¦   r1   r§   Ú_Ok0ry   r`   rJ   rS   r¡   r¢   rN   r   r   r   Útest_Ok0%  s     ÿzTestFLRW.test_Ok0c                 C   sV   t |jtƒst‚|jjdks t‚t |jtƒs0t‚|jt|jdkoH|jdkƒksRt‚dS )zTest property ``is_flat``.Nr^   r�   )r0   Zis_flatr¦   r1   r§   Úboolrª   ÚOtot0rN   r   r   r   Útest_is_flat1  s    zTestFLRW.test_is_flatc                 C   sb   t |jtƒst‚|jjdks t‚|j|jks0t‚|jjtjksBt‚tj	|jd|j
 dd�s^t‚dS )zTest property ``Tnu0``.NgrvÌ}+×æ?gñhãˆµøä>r‚   )r0   rs   r¦   r1   r§   Z_Tnu0r3   r/   rf   r`   re   rN   r   r   r   Ú	test_Tnu0;  s
    zTestFLRW.test_Tnu0c                 C   sN   t |jtƒst‚|jjdks t‚|jdkr:|jdksJt‚n|j|jksJt‚dS )z!Test property ``has_massive_nu``.Nr   F)r0   r{   r¦   r1   r§   rs   rt   rN   r   r   r   Útest_has_massive_nuF  s
    
zTestFLRW.test_has_massive_nuc                 C   sN   t |jtƒst‚|jjdks t‚|j|jks0t‚t |j|jj	d ¡sJt‚dS )zTest property ``h``.Ng      Y@)
r0   Úhr¦   r1   r§   Ú_hry   r`   r.   rA   rN   r   r   r   Útest_hR  s    zTestFLRW.test_hc                 C   sR   t |jtƒst‚|jjdks t‚|j|jks0t‚t |jd|j tj	> ¡sNt‚dS )zTest property ``hubble_time``.Nr*   )
r0   Zhubble_timer¦   r1   r§   Z_hubble_timer/   r`   r.   ZGyrrN   r   r   r   Útest_hubble_time\  s    zTestFLRW.test_hubble_timec                 C   sR   t |jtƒst‚|jjdks t‚|j|jks0t‚|jtj|j  	t
j¡ksNt‚dS )z"Test property ``hubble_distance``.N)r0   Zhubble_distancer¦   r1   r§   Z_hubble_distanceÚconstÚcr6   Útor/   rD   rN   r   r   r   Útest_hubble_distancef  s    zTestFLRW.test_hubble_distancec                 C   st   t |jtƒst‚|jjdks t‚|j|jks0t‚|jjtjtj	d  ksLt‚t
|jjt d  }|jj|kspt‚dS )z$Test property ``critical_density0``.Nr_   r-   )r0   Úcritical_density0r¦   r1   r§   Z_critical_density0r3   r/   ÚgÚcmr   r.   rA   r	   )r   r9   r:   Zcd0valuer   r   r   Útest_critical_density0p  s    zTestFLRW.test_critical_density0c                 C   sv   t |jtƒst‚|jjdks t‚|j|jks0t‚t|jjd  |j	j }t
 |j|¡sZt‚|jdkrr|jdksrt‚dS )zTest property ``Ogamma0``.Nr€   r   )r0   r¡   r¦   r1   r§   Ú_Ogamma0r   re   rA   rº   ry   r`   )r   r9   r:   Úexpectr   r   r   Útest_Ogamma0}  s    
zTestFLRW.test_Ogamma0c                 C   s¸   t |jtƒst‚|jjdks t‚|j|jks0t‚|jrd|j|j| d¡ ksPt‚| d¡dks´t‚nP|j	dkr~|jdks´t‚n6|jd|j
 |j ks˜t‚t | d¡d|j
 ¡s´t‚dS )zTest property ``Onu0``.Nr   r*   gCÚÍ?)r0   r¢   r¦   r1   r§   Ú_Onu0r{   r¡   r„   re   rl   ry   r`   rN   r   r   r   Ú	test_Onu0Œ  s    
 ÿzTestFLRW.test_Onu0c                 C   s,   |j |j|j |j |j |j ks(t‚dS )z*Test :attr:`astropy.cosmology.FLRW.Otot0`.N)r®   rJ   r¡   r¢   rS   rª   r1   r[   r   r   r   Ú
test_Otot0¦  s    ÿÿzTestFLRW.test_Otot0c              	   C   s(   t jtdd�� | d¡ W 5 Q R X dS )z/Test abstract :meth:`astropy.cosmology.FLRW.w`.znot implementedr#   r*   N)r%   r&   ÚNotImplementedErrorr   r[   r   r   r   Útest_w°  s    zTestFLRW.test_wc              	   C   s4   t rtnt}t |¡� | d¡s&t‚W 5 Q R X dS )ú)Test :meth:`astropy.cosmology.FLRW.Otot`.r*   N)r   rÄ   r'   r%   r&   ÚOtotr1   ©r   r:   Ú	exceptionr   r   r   Ú	test_Ototµ  s    zTestFLRW.test_Ototc              	   C   sP   t rtnt}t |¡� | d¡ W 5 Q R X t |¡� | d¡ W 5 Q R X dS )z}
        Test that efunc and inv_efunc give inverse values.
        Here they just fail b/c no ``w(z)`` or no scipy.
        ç      à?N)r   rÄ   r'   r%   r&   ÚefuncÚ	inv_efuncrÈ   r   r   r   Útest_efunc_vs_invefunc»  s
    zTestFLRW.test_efunc_vs_invefuncc              	      sT  t ƒ  |¡ |j ¡ }| dd¡ | dd¡ |jf |Ž}|j|jksJt‚||ksVt‚|jdd�}|j|jksrt‚|j|jd ks†t‚|j	j
dks–t‚t|jƒdh D ]P}t||ƒ}|dkrÐ|t||ƒksöt‚q¦tj|t||ƒdt|d	d
ƒ d�s¦t‚q¦t |j|j¡�rt‚t |j|j¡�r$t‚|jdddtdd�d�}|j|jk�sNt‚|jdk�s^t‚|j	j
dk�spt‚|jj
dk�s‚t‚|j|jtdd�–k�sžt‚t|jƒddh D ]X}t||ƒ}|dk�rÞ|t||ƒk�st‚n(tj|t||ƒdt|d	d
ƒ d��s°t‚�q°t |j|j¡�r t‚t |j|j¡�r6t‚t |jj
|jj
¡�rPt‚dS )ú7Test method ``.clone()`` changing a(many) Parameter(s).r–   Nr—   r=   )r.   ú (modified)r.   g-Cëâ6?r3   r*   )Zatolznew namegffffff@Ztops)Úzz)r–   r.   re   r—   re   )r   Útest_clone_change_paramZ_init_argumentsr|   r�   Úcloner   r1   r–   r.   rA   ÚsetÚ__parameters__Úgetattrr/   r`   r¡   r¢   r™   re   r—   )r   r:   r?   r·   ÚnÚvr   r   r   rÒ   Ë  sP    

  ÿ

  ÿz TestFLRW.test_clone_change_paramc                    sT   t ƒ  |¡ t|tƒr4| t¡s$t‚t |¡sPt‚n| t¡rBt‚t |¡rPt‚dS )ú2Test :meth:`astropy.cosmology.FLRW.is_equivalent`.N)r   Útest_is_equivalentr0   r   Úis_equivalentr   r1   r[   r   r   r   rÚ   û  s    
zTestFLRW.test_is_equivalent)r   r   r   r2   rŽ   r›   rœ   r%   ZfixturerŸ   r    r¥   r¨   r¬   r¯   r°   r±   r´   rµ   r¹   r½   rÀ   rÂ   rÃ   rÅ   rÊ   rÎ   rÒ   rÚ   r    r   r   r   r   r“   Ï  s2   







0r“   c                       s¨   e Zd ZdZdZej‡ fdd„ƒZee	ddd�Z
ejje dd�ej d	e¡ej d
e
¡dd„ ƒƒƒZej de¡ejdd„ ƒƒZej de¡dd„ ƒZdd„ Z‡  ZS )ÚFLRWSubclassTestz²
    Test subclasses of :class:`astropy.cosmology.FLRW`.
    This is broken away from ``TestFLRW``, because ``FLRW`` is an ABC and
    subclasses must override some methods.
    Fc                    s   t ƒ  | ¡ dS )zSetup for testing.N)r   r›   rš   r   r   r   r›     s    zFLRWSubclassTest.setup_classT)Zinclude_privateZ
include_z2úscipy is not installedr!   úz, excÚmethodc              	   C   s(   t  |¡� t||ƒ|ƒ W 5 Q R X dS ©z,Test all the redshift methods for bad input.N)r%   r&   rÖ   ©r   r:   rß   r   Úexcr   r   r   Útest_redshift_method_bad_input  s    z/FLRWSubclassTest.test_redshift_method_bad_inputr   c                 C   s<   |  |¡}t |¡t |¡ks"t‚t |¡jtjks8t‚dS )z€Test :meth:`astropy.cosmology.FLRW.w`.

        Since ``w`` is abstract, each test class needs to define further tests.
        N)r   ry   Úshaper1   r/   r8   r3   rK   )r   r:   r   r   r   r   r   rÅ   &  s    
zFLRWSubclassTest.test_wc                 C   sH   t  | |¡| |¡| |¡ | |¡ | |¡ | |¡ ¡sDt‚dS )rÆ   N)	ry   r`   rÇ   ZOmr£   r¤   ra   ZOkr1   ©r   r:   r   r   r   r   rÊ   4  s    0þzFLRWSubclassTest.test_Ototc                 C   sZ   d}t  ddddg¡}t  | |¡d| |¡ ¡s6t‚t  | |¡d| |¡ ¡sVt‚dS )z°Test that ``efunc`` and ``inv_efunc`` give inverse values.

        Note that the test doesn't need scipy because it doesn't need to call
        ``de_density_scale``.
        rË   r�   g       @g      @N)ry   Úarrayr`   rÌ   rÍ   r1   )r   r:   Zz0r   r   r   r   rÎ   ?  s     z'FLRWSubclassTest.test_efunc_vs_invefunc)r   r   r   r2   rŽ   ÚabcÚabstractmethodr›   r   r   Ú_FLRW_redshift_methodsr%   ÚmarkÚskipifr   Úparametrizer   rã   r   rÅ   rÊ   rÎ   r    r   r   r   r   rÜ   	  s&     ÿ

rÜ   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚParameterFlatOde0TestMixina{  Tests for `astropy.cosmology.Parameter` Ode0 on a flat Cosmology.

    This will augment or override some tests in ``ParameterOde0TestMixin``.

    Ode0 is a descriptor, which are tested by mixin, here with ``TestFLRW``.
    These tests expect dicts ``_cls_args`` and ``cls_kwargs`` which give the
    args and kwargs for the cosmology class, respectively. See ``TestFLRW``.
    c                    s&   t ƒ  |¡ |jjdtjfks"t‚dS )rR   TN)r   rU   rS   Zderivedry   ZTrue_r1   rT   r   r   r   rU   Z  s    z.ParameterFlatOde0TestMixin.test_Parameter_Ode0c                 C   s4   |j |jkst‚|j d|j|j |j  ks0t‚dS )z"Test no-longer-Parameter ``Ode0``.r�   N)rS   rZ   r1   rJ   r¡   r¢   r[   r   r   r   r\   _  s    z$ParameterFlatOde0TestMixin.test_Ode0c              	   C   sh   ||j |jŽ}|jd|j|j |j |j  ks4t‚tj	t
dd�� ||j |jddi—Ž W 5 Q R X dS )r]   r�   rS   r#   r*   N)r>   r?   rS   rJ   r¡   r¢   rª   r1   r%   r&   rX   rE   r   r   r   rb   d  s    &z)ParameterFlatOde0TestMixin.test_init_Ode0)r   r   r   r2   rU   r\   rb   r    r   r   r   r   rí   P  s   	rí   c                       sÌ   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd	„Z‡ fd
d„Ze	j
 de¡‡ fdd„ƒZe	j
je dd�e	j
 de¡e	j
 dejdh ¡‡ fdd„ƒƒƒZ‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚFlatFLRWMixinTestz²Tests for :class:`astropy.cosmology.FlatFLRWMixin` subclasses.

    E.g to use this class::

        class TestFlatSomeFLRW(FlatFLRWMixinTest, TestSomeFLRW):
            ...
    c                    s   t ƒ  | ¡ | j d¡ dS )zÒSetup for testing.

        Set up as for regular FLRW test class, but remove dark energy component
        since flat cosmologies are forbidden Ode0 as an argument,
        see ``test_init_subclass``.
        rS   N)r   r›   r7   r�   rš   r   r   r   r›   w  s    zFlatFLRWMixinTest.setup_classc              	      sH   t ƒ  |¡ tjtdd��$ G dd„ d|ƒ}t |jd¡ W 5 Q R X dS )z@Test initializing subclass, mostly that can't have Ode0 in init.zsubclasses ofr#   c                   @   s   e Zd Zdd„ ZdS )z=FlatFLRWMixinTest.test_init_subclass.<locals>.HASOde0SubClassc                 S   s   d S r   r   )r   rS   r   r   r   Ú__init__Ž  s    zFFlatFLRWMixinTest.test_init_subclass.<locals>.HASOde0SubClass.__init__N)r   r   r   rï   r   r   r   r   ÚHASOde0SubClass�  s   rð   N)r   Útest_init_subclassr%   r&   rX   r   r�   r   )r   r9   rð   r   r   r   rñ   ‡  s    z$FlatFLRWMixinTest.test_init_subclassc                    sR   t ƒ  |¡ || j| jŽ}|jdks(t‚|jd|j|j |j	 |j  ksNt‚d S )Nr^   r�   )
r   r    Úcls_argsrg   r«   r1   rZ   rL   r¾   rÁ   rN   r   r   r   r    –  s    ÿzFlatFLRWMixinTest.test_initc                    s    t ƒ  ||¡ |jdkst‚dS )r©   r^   N)r   r¬   rª   r1   rN   r   r   r   r¬   Ÿ  s    zFlatFLRWMixinTest.test_Ok0c                    s   t ƒ  |¡ |jdkst‚dS )z>Test :attr:`astropy.cosmology.FLRW.Otot0`. Should always be 1.r�   N)r   rÃ   r®   r1   r[   r   r   r   rÃ   ¦  s    zFlatFLRWMixinTest.test_Otot0r   c                    s(   t ƒ  ||¡ t | |¡d¡s$t‚dS )z=Test :meth:`astropy.cosmology.FLRW.Otot`. Should always be 1.r�   N)r   rÊ   r/   r`   rÇ   r1   rå   r   r   r   rÊ   ­  s    zFlatFLRWMixinTest.test_OtotrÝ   r!   rÞ   rß   rÇ   c                    s   t ƒ  ||||¡ dS rà   )r   rã   rá   r   r   r   rã   µ  s    z0FlatFLRWMixinTest.test_redshift_method_bad_inputc              	      s�   t ƒ  |¡ t t¡� |jdd� W 5 Q R X |jd|jd�}t||jƒsNt	‚||j
ks\t	‚|jddd�}|jdksxt	‚|j|jd ksŒt	‚dS )rÏ   r*   )rS   T)Z
to_nonflatrS   r�   rÐ   N)r   Ú"test_clone_to_nonflat_change_paramr%   r&   rX   rÓ   rS   r0   Ú__nonflatclass__r1   Únonflatr–   )r   r:   Úncr   r   r   ró   À  s    z4FlatFLRWMixinTest.test_clone_to_nonflat_change_paramc                    s®   t ƒ  |¡ | |¡rt‚| |¡r(t‚|j}|| jddi| j—Ž}| |¡rRt‚| |¡r`t‚|| jdd|j |j |j	 i| j—Ž}d|_
| |¡sœt‚| |¡sªt‚dS )rÙ   rS   gÍÌÌÌÌÌì?r�   r^   N)r   rÚ   rÛ   r1   rô   rò   rg   rJ   r¡   r¢   r«   )r   r:   rŸ   Znonflat_cosmo_clsrõ   Zflatr   r   r   rÚ   Ó  s"    ÿþýz$FlatFLRWMixinTest.test_is_equivalentc                 C   s"   t  | ||¡ dt|ƒkst‚dS )zÓ
        Test method ``.__repr__()``. Skip non-flat superclass test.
        e.g. `TestFlatLambdaCDDM` -> `FlatFLRWMixinTest`
        vs   `TestFlatLambdaCDDM` -> `TestLambdaCDDM` -> `FlatFLRWMixinTest`
        rS   N)rÜ   Ú	test_reprÚreprr1   rN   r   r   r   r÷   î  s    zFlatFLRWMixinTest.test_repr)r   r   r   r2   r›   rñ   r    r¬   rÃ   r%   rê   rì   r   rÊ   rë   r   r   rÜ   ré   rã   ró   rÚ   r÷   r    r   r   r   r   rî   n  s$   	 
ÿrî   )4r2   rç   r|   Únumpyry   r%   Zastropy.constantsÚ	constantsr¶   Zastropy.unitsZunitsr/   Zastropy.cosmologyr   r   r   r   Zastropy.cosmology.corer   Zastropy.cosmology.flrw.baser   r   r	   r
   Zastropy.cosmology.parameterr   Zastropy.cosmology.tests.helperr   Z!astropy.cosmology.tests.test_corer   ZCosmologyTestr   r   r   r   Z"astropy.utils.compat.optional_depsr   r   rê   rë   r(   r)   rH   rQ   rc   rj   rp   rˆ   r“   rÜ   rí   rî   r   r   r   r   Ú<module>   sN   

	-+3+*lI
ø  <G