U
    e»{j�  ã                   @   sr  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 ddlmZ ejejejgZejejejgZejejejgZejejejejd  ejfZ G dd	„ d	ƒZ!d
d„ Z"dd„ Z#dd„ Z$dd„ Z%G dd„ dƒZ&G dd„ dƒZ'G dd„ dƒZ(dd„ Z)dd„ Z*G dd„ dƒZ+dd„ Z,d d!„ Z-G d"d#„ d#ƒZ.G d$d%„ d%ƒZ/G d&d'„ d'ƒZ0G d(d)„ d)ƒZ1G d*d+„ d+ƒZ2dS ),z/
    Test the Logarithmic Units and Quantities
é    N)Úassert_allclose)Ú	constants)Úunits)Úassert_quantity_allcloseé   c                   @   sª   e Zd Zdd„ Zej deee	ƒ¡dd„ ƒZ
ej de¡dd„ ƒZej d	e ee¡¡d
d„ ƒZdd„ Zej de e	ejg e¡¡dd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚTestLogUnitCreationc                 C   sF   t j t j¡dkst‚t j t j¡dks,t‚t j t j¡dksBt‚dS )z-Check logarithmic units are set up correctly.gš™™™™™¹?g      ÀéüÿÿÿN)ÚuÚdBÚtoÚdexÚAssertionErrorÚmag©Úself© r   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/units/tests/test_logarithmic.pyÚtest_logarithmic_units   s    z*TestLogUnitCreation.test_logarithmic_unitszlu_unit, lu_clsc                 C   s.   t |tjƒst‚t|ƒst‚|j|ks*t‚d S ©N)Ú
isinstancer	   ZUnitBaser   ÚcallableZ_function_unit_class)r   Úlu_unitÚlu_clsr   r   r   Útest_callable_units!   s    z'TestLogUnitCreation.test_callable_unitsr   c                 C   s&   |ƒ }||j kst‚|j |ks"t‚d S r   )Ú_default_function_unitr   )r   r   Úlur   r   r   Ú.test_equality_to_normal_unit_for_dimensionless'   s    zBTestLogUnitCreation.test_equality_to_normal_unit_for_dimensionlessúlu_unit, physical_unitc                 C   s*   ||ƒ}|j |kst‚|j|jks&t‚dS )zuCreate a LogUnit subclass using the callable unit and physical unit,
        and do basic check that output is right.N)Úphysical_unitr   Úfunction_unitr   )r   r   r   Úlu1r   r   r   Útest_call_units-   s    z#TestLogUnitCreation.test_call_unitsc              	   C   sH   t  t¡� t g ¡ W 5 Q R X t  t¡� t t ¡ ¡ W 5 Q R X d S r   )ÚpytestÚraisesÚ	TypeErrorr	   r   Ú
ValueErrorr   r   r   r   Útest_call_invalid_unit7   s    z*TestLogUnitCreation.test_call_invalid_unitzlu_cls, physical_unitc              	   C   s†   ||ƒ}|j |kst‚|j|jks&t‚||d|j d�}|j |ksFt‚|jt d|j ¡ks`t‚t t¡� ||tj	ƒ W 5 Q R X dS )zjCreate a LogUnit subclass object for given physical unit,
        and do basic check that output is right.r   ©r   N)
r   r   r   r   r	   ÚUnitr"   r#   r%   Úm)r   r   r   r    Úlu2r   r   r   Útest_subclass_creation=   s    z*TestLogUnitCreation.test_subclass_creationc                 C   sØ   dt j> }t|t jƒst‚|jt jks*t‚|jdks8t‚t d¡}|t j> }t|t jƒs\t‚|jt jkslt‚t 	|j|k¡s€t‚d|d< t 	|j|k¡sœt‚dt j
> }t|t jƒs¶t‚|jt j
ksÆt‚|jdksÔt‚d S )Nç      ð?ç      $@ç        é	   )r	   ÚABmagr   Ú	Magnituder   ÚunitÚvalueÚnpÚarangeÚallÚSTmag)r   r   Za2Úq2r   r   r   Útest_lshift_magnitudeO   s    



z)TestLogUnitCreation.test_lshift_magnitudec              	   C   sþ   t  t jt j t jd  t j ¡}t d¡t  t j¡ }|j	}||> }t 
|| |¡k¡s^t‚|}||K }||ksvt‚t 
|j|jk¡sŒt‚|j|ksšt‚t  t  dt j ¡¡� | t j¡}|t jK }W 5 Q R X ||ksÞt‚t|j	|ƒ |jt jksút‚d S )Nr   r-   i|  )r	   r   ÚergÚsÚcmÚHzr4   r5   ÚJyÚphysicalr6   r   r   r3   r2   Zadd_enabled_equivalenciesÚspectral_densityÚAAÚSTr7   r   )r   Zmag_fnu_cgsr)   ÚjyÚm2Ústr   r   r   Útest_ilshift_magnitudeb   s     "z*TestLogUnitCreation.test_ilshift_magnitudec              	   C   s¢   t  d¡t tj¡ }t tj¡� |tj>  W 5 Q R X t tj¡� |tj>  W 5 Q R X t tj¡� |tjK }W 5 Q R X t tj¡� |tjK }W 5 Q R X d S ©Nr-   )	r4   r5   r	   r   r>   r"   r#   Ú
UnitsErrorr7   )r   r)   r   r   r   Útest_lshift_errorsw   s    z&TestLogUnitCreation.test_lshift_errorsN)Ú__name__Ú
__module__Ú__qualname__r   r"   ÚmarkÚparametrizeÚzipÚlu_unitsÚlu_subclassesr   r   Ú	itertoolsÚproductÚ	pu_sampler!   r&   r	   ÚLogUnitr+   r9   rF   rI   r   r   r   r   r      s&   

 
ÿ
þ
r   c                   C   s    t dtj jdtj tjd  tj tj ƒ t dtj jdtj tjd  tj tj	 ƒ t dtj
 jtjƒ t dtj jtjdtj dtj d   ƒ d S )Ngš™™™™5Àr,   r   gÍÌÌÌÌLHÀr   ç      @r-   )r   r	   r7   r?   r:   r<   r;   rA   r0   r=   ÚM_bolÚcZL_bol0Úm_bolr4   ÚpiÚpcr   r   r   r   Útest_predefined_magnitudes†   s    
 ÿ
 ÿ
 ÿr\   c                   C   s|   t  d¡t jkst‚t  d¡t jks(t‚t  d¡t jks<t‚t  d¡t jksPt‚t  d¡t jksdt‚t  d¡t jksxt‚d S )NZSTfluxZABfluxZBolZbolrB   ZAB)r	   r   r7   r   r0   rW   rY   r   r   r   r   Ú test_predefined_reinitialisation”   s    r]   c                   C   sl   t  t j ¡ ¡t jkst‚t  t j ¡ ¡t jks4t‚t  t j ¡ ¡t jksNt‚t  t j ¡ ¡t jksht‚dS )z Ensure round-tripping; see #5015N)r	   r(   r7   Ú	to_stringr   r0   rW   rY   r   r   r   r   Ú test_predefined_string_roundtripŸ   s    r_   c                  C   sX   t  t j¡} t  t j¡}t  t jd ¡}||  }| |ks<t‚| |ksHt‚| |ksTt‚dS )z*Check __ne__ works (regression for #5342).r   N)r	   r   r>   r   r   )r    r*   Úlu3Úlu4r   r   r   Útest_inequality§   s    rb   c                   @   s   e Zd Zdd„ ZdS )ÚTestLogUnitStringsc              	   C   sž  t  t j¡}t|ƒdkst‚t|ƒdks,t‚| d¡dks>t‚t t	¡� | d¡ W 5 Q R X t t	¡� |jdd� W 5 Q R X t  
¡ }t|ƒdks˜t‚t|ƒdks¨t‚| ¡ d	ks¸t‚t jt jd
t j d�}t|ƒdksÞt‚t|ƒdksît‚| ¡ dksþt‚t  t j¡}| d¡dk�st‚d}| d¡|k�s6t‚| d¡|k�sJt‚| ¡ |k�s\t‚t  t jt j ¡}| d¡dk�s‚t‚d}| d¡|k�sšt‚dS )z:Do some spot checks that str, repr, etc. work as expected.zmag(Jy)zUnit("mag(Jy)")ZgenericZfitsZcds)Úformatr   zUnit("dex(1)")zdex(1)r   r'   z	2 mag(Jy)zMagUnit("Jy", unit="2 mag")zmag(ct)z3$\mathrm{mag}$$\mathrm{\left( \mathrm{ct} \right)}$ÚlatexZlatex_inlinez=$\mathrm{mag}$$\mathrm{\left( \mathrm{\frac{ct}{s}} \right)}$z;$\mathrm{mag}$$\mathrm{\left( \mathrm{ct\,s^{-1}} \right)}$N)r	   r   r>   Ústrr   Úreprr^   r"   r#   r%   r   ÚMagUnitÚctZ_repr_latex_r;   )r   r    r*   r`   ra   Z	latex_strZlu5r   r   r   Útest_str³   s8    ÿ
zTestLogUnitStrings.test_strN)rJ   rK   rL   rj   r   r   r   r   rc   ²   s   rc   c                   @   sx   e Zd Zej de ee	¡¡dd„ ƒZ
ej de¡dd„ ƒZej de eee	¡¡dd	„ ƒZd
d„ Zdd„ Zdd„ ZdS )ÚTestLogUnitConversionr   c              	   C   s8  ||ƒ}|  |¡st‚| |d¡dks*t‚|  |¡s8t‚| |d¡dksLt‚t d| ¡}|  |¡sht‚| |d¡dks|t‚|  |¡sŠt‚t| |d¡ddd� t ddd¡}t| || ||¡¡|dd� tj}|  |¡ràt‚t	 
tj¡� | |¡ W 5 Q R X |  |¡�rt‚t	 
tj¡� | |¡ W 5 Q R X d	S )
zfCheck various LogUnit subclasses are equivalent and convertible
        to their non-log counterparts.r.   r,   g       @g      À?çVçž¯Ò<©Zatolr-   é   N)Úis_equivalentr   r   r	   r(   r   r4   ÚlinspaceÚgr"   r#   rH   )r   r   r   r    Zpur3   Zpu2r   r   r   Útest_physical_unit_conversionØ   s&    z3TestLogUnitConversion.test_physical_unit_conversionr   c              	   C   s€   t  ddd¡}|tjƒ}| |j¡s(t‚t| |j|¡|ƒ |tj	ƒ}| |j¡rVt‚t
 tj¡� | |j|¡ W 5 Q R X dS )z�Check that conversion to logarithmic units (u.mag, u.dB, u.dex)
        is only possible when the physical unit is dimensionless.r.   r-   rn   N)r4   rp   r	   Údimensionless_unscaledro   r   r   r   r   r>   r"   r#   rH   )r   r   Úvaluesr    r*   r   r   r   Útest_container_unit_conversionù   s    

z4TestLogUnitConversion.test_container_unit_conversionz!flu_unit, tlu_unit, physical_unitc           
   	   C   s$  t  ddd¡}||ƒ}||ƒ}| |¡s,t‚t| |¡|j |j¡ƒ t| ||¡||j |j¡ ƒ |t d| ¡ƒ}| |¡s†t‚t| || ||¡¡|dd� || 	tj
¡d ƒ}| |¡sÆt‚t| || ||¡¡|dd� |tjƒ}	| |	¡rüt‚t tj¡� | |	|¡ W 5 Q R X dS )	z†Check various LogUnit subclasses are equivalent and convertible
        to each other if they correspond to equivalent physical units.r.   r-   rn   ç      Y@rl   rm   r   N)r4   rp   ro   r   r   r   r   r	   r(   Z	to_systemÚsirq   r"   r#   rH   )
r   Zflu_unitZtlu_unitr   rt   ZfluZtluZtlu2Ztlu3Ztlu4r   r   r   Útest_subclass_conversion  s&    
 ÿ
z.TestLogUnitConversion.test_subclass_conversionc                 C   s¬   t  t j¡}| ¡ t  t j ¡ ¡ks(t‚| ¡ jjt jt jgksDt‚|j	t  t jj	¡ks\t‚|j	jjt jt jgksvt‚|j
t  t jj
¡ksŽt‚|j
jjt jt jgks¨t‚d S r   )r	   r   r>   Ú	decomposer   r   ÚbasesÚkgr;   rw   Úcgsrq   ©r   r   r   r   r   Útest_unit_decomposition&  s    z-TestLogUnitConversion.test_unit_decompositionc                 C   s   t  t j¡}| t¡st‚d S r   )r	   r   r>   ro   rT   r   r}   r   r   r   Ú)test_unit_multiple_possible_equivalencies/  s    z?TestLogUnitConversion.test_unit_multiple_possible_equivalenciesc              	   C   s<   t jtjdd��" dtj dtj   tj¡ W 5 Q R X dS )z‘Check that "dimensionless" magnitude units include a message in their
        exception text suggesting a possible cause of the problem.
        z9Did you perhaps subtract magnitudes so the unit got lost?)Úmatché
   r   N)r"   r#   r	   ZUnitConversionErrorr0   r   ZnJyr   r   r   r   Ú'test_magnitude_conversion_fails_message3  s
    þz=TestLogUnitConversion.test_magnitude_conversion_fails_messageN)rJ   rK   rL   r"   rM   rN   rR   rS   rP   rT   rr   ru   rx   r~   r   r‚   r   r   r   r   rk   ×   s    
ÿ

þ
	rk   c                   @   sª   e Zd Zdd„ Zej dd¡dd„ ƒZej de¡dd	„ ƒZ	d
d„ Z
ej deje ¡ e ej¡e ej¡e dej ¡e ddej ¡f¡dd„ ƒZdd„ Zdd„ ZdS )ÚTestLogUnitArithmeticc           	      C   sÖ  t  t j¡}t t j¡� |t j  W 5 Q R X t t j¡� t j|  W 5 Q R X t t j¡� ||  W 5 Q R X t jt jt jt jfD ]$}t t j¡� ||  W 5 Q R X q„t  t j¡}t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X || t jk�s
t	‚|t j }t j| }||fD ]n}t
|t|ƒƒ�r>t	‚||jt j k�sTt	‚t  t  ¡ ¡�* t t j¡� | |j¡ W 5 Q R X W 5 Q R X �q&|t j }t  t  ¡ ¡�F | |j¡�sÂt	‚t| t jt d¡d ¡| |jt d¡¡ƒ W 5 Q R X || }t
|t|ƒƒ�rt	‚|t jk�s&t	‚||j }t
|t|ƒƒ�rDt	‚|t jk�sTt	‚t t¡� |tƒ   W 5 Q R X t t¡� tdƒ|  W 5 Q R X t t¡� |g   W 5 Q R X t t¡� d|  W 5 Q R X dS )z­Check that multiplication/division with other units is only
        possible when the physical unit is dimensionless, and that this
        turns the unit into a normal one.ç      @rv   Né   )r	   r   r>   r"   r#   rH   r)   rs   r   r   r   Útyper   Úset_enabled_equivalenciesÚlogarithmicr   r   r<   ro   r   r4   r5   r$   ÚobjectÚslice)	r   r    r2   r*   ÚtfÚtrÚtÚt2Zt3r   r   r   Útest_multiplication_division?  sZ    

$
þ
z2TestLogUnitArithmetic.test_multiplication_divisionÚpower©r   ç      à?r…   r   c              	   C   s*  t  t j¡}|dkr(|| t jksbt‚n:|dkrB|| |ksbt‚n t t j¡� ||  W 5 Q R X t  t j¡}|| }|dkrŽ|t jksŒt‚n˜|dkr¤||ks¢t‚n‚t|t	|ƒƒr¶t‚||j
| ksÈt‚|d|  }||j
ksât‚t  t  ¡ ¡�0 t| t jt d¡¡| |jt d¡¡ƒ W 5 Q R X dS )zÛCheck that raising LogUnits to some power is only possible when the
        physical unit is dimensionless, and that conversion is turned off when
        the resulting logarithmic unit (such as mag**2) is incompatible.r   r…   r,   r„   N)r	   r   r>   rs   r   r"   r#   rH   r   r†   r   r‡   rˆ   r   r   r4   r5   r   )r   r�   r    r*   r�   rŽ   r   r   r   Útest_raise_to_power‚  s,    þz)TestLogUnitArithmetic.test_raise_to_powerÚotherc              	   C   sp   t  t j¡}t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X d S r   )r	   r   r>   r"   r#   rH   )r   r”   r    r   r   r   Ú/test_addition_subtraction_to_normal_units_fails¥  s    zETestLogUnitArithmetic.test_addition_subtraction_to_normal_units_failsc              	   C   sR   t  t j¡}t t¡� |d  W 5 Q R X t t¡� |dddg  W 5 Q R X d S )Nr,   ç       @r„   )r	   r   r>   r"   r#   r$   )r   r    r   r   r   Ú,test_addition_subtraction_to_non_units_fails±  s
    zBTestLogUnitArithmetic.test_addition_subtraction_to_non_units_failsr   Ú r–   c                 C   sŽ   t  t j¡}t|dt jƒ}|| }| |j| ¡s6t‚|| }| |j| ¡sRt‚|| }| |j| ¡snt‚|| }| ||j ¡sŠt‚dS )z.Check physical units are changed appropriatelyr   N)r	   r   r>   Úgetattrrs   ro   r   r   )r   r”   r    Zother_puZlu_sfZlu_srZlu_dfZlu_drr   r   r   Útest_addition_subtraction¹  s    z/TestLogUnitArithmetic.test_addition_subtractionc                 C   sX   t  dddtj dt j d   ¡}t  |¡}t j| }| t jt j	 t j
 ¡sTt‚dS )z?for fun, a more complicated example of addition and subtractionÚDMr,   rV   r-   r   N)r	   r(   r4   rZ   r[   r   r7   ro   r:   r;   rA   r   )r   Údm0Zlu_dmZlu_absSTr   r   r   Ú%test_complicated_addition_subtractionÕ  s    $

z;TestLogUnitArithmetic.test_complicated_addition_subtractionc                 C   sb   t  t j¡}| }||kst‚|jt jd ks2t‚| |ks@t‚|
 }||k	sRt‚||ks^t‚d S )Néÿÿÿÿ)r	   r   r>   r   r   )r   r    Zneg_luZpos_lur   r   r   Útest_neg_posÜ  s    z"TestLogUnitArithmetic.test_neg_posN)rJ   rK   rL   r�   r"   rM   rN   r“   rT   r•   r—   r	   r   r>   r)   r(   rh   rš   r�   rŸ   r   r   r   r   rƒ   >  s&   C
"


úþ
rƒ   c                  C   s:   t  t jt jd  ¡} t | ¡}t |¡}| |ks6t‚d S ©Nr   )r	   r   r<   r;   ÚpickleÚdumpsÚloadsr   )r    r;   r*   r   r   r   Útest_pickleç  s    

r¤   c                  C   sj   t  t j¡} t  t j¡}t  t j¡}t| ƒt|ƒks8t‚t| ƒt|ƒksLt‚| ||h}t|ƒdksft‚d S r    )r	   r
   ZmWr)   Úhashr   Úlen)r    r*   r`   Zlusetr   r   r   Útest_hashableî  s    
r§   c                   @   sÎ  e Zd Zej deeej	g e
ejg ƒ¡dd„ ƒZej de ee¡¡dd„ ƒZej deje ¡ e ej¡e ej¡e dej ¡e d	d
ej ¡e ejdej ¡e ejdej ¡f¡dd„ ƒZej dde ej¡ dfde ej¡ dfde ejejd  ej ¡ e ej¡fde ejejd  ej ¡ e ej¡ff¡dd„ ƒZej de ¡ e ej¡e ej¡e d	d
ej ¡e ejdej ¡e ejdej ¡f¡dd„ ƒZdd„ Zdd„ ZdS )ÚTestLogQuantityCreationzlq, luc                 C   s*   |j |kst‚t|ƒ  d¡ƒ|ks&t‚dS )z5Check logarithmic quantities are all set up correctlyr,   N)Z_unit_classr   r†   Ú_quantity_class)r   Úlqr   r   r   r   Útest_logarithmic_quantitiesù  s    z3TestLogQuantityCreation.test_logarithmic_quantitieszlq_cls, physical_unitc              	   C   sn   t  dd¡}||| ƒ}|jj|ks(t‚|jj|jjks<t‚t|jj	|ƒ t
 t¡� |||ƒ W 5 Q R X dS )zgCreate LogQuantity subclass objects for some physical units,
        and basic check on transformationsr,   r-   N)r4   r5   r2   r   r   r   r   r   r?   r3   r"   r#   r%   )r   Zlq_clsr   r3   Zlog_qr   r   r   r+     s    z.TestLogQuantityCreation.test_subclass_creationr2   r   r˜   r–   rž   ç       Àc                 C   sB   t  d|¡}|jjt|d|ƒks$t‚|jjt|dt jƒks>t‚d S )Nç®Gáz®ó?r   r   )r	   r1   r2   r   r™   r   r   rs   )r   r2   Úqr   r   r   Útest_different_units  s      ÿz,TestLogQuantityCreation.test_different_unitszvalue, unitr,   Nc                 C   sJ   t  ||¡}||kst‚|jjt jks*t‚|jjt|d|jjƒksFt‚d S )Nr   )r	   r1   r   r2   r   r   r   r™   )r   r3   r2   rª   r   r   r   Útest_function_values#  s    
  ÿz,TestLogQuantityCreation.test_function_valuesc                 C   s¬   d| }t |tjƒst‚|jdks&t‚|j|ks4t‚d|j }|| }|j|ksTt‚|jj|jksft‚| |j¡dkszt‚|jtj	  d¡dks”t‚|d }||ks¨t‚d S )Ng      @rv   r…   g      Àçš™™™™™Ù?)
r   r	   r1   r   r3   r2   r   Zto_valueÚ_function_viewr   )r   r2   Úq1Úpvr8   Zq3r   r   r   Útest_indirect_creation4  s    
z.TestLogQuantityCreation.test_indirect_creationc              	   C   sŒ   ddgt j t jd  }t t¡� | t j¡ W 5 Q R X ddgt j }| t j¡}t	|t jƒsdt
‚|jjt jksvt
‚t ||k¡sˆt
‚d S )Nrv   g     @�@r   r–   r„   )r	   r<   r;   r"   r#   r$   ÚviewÚDexr   r   r   r2   r   rs   r4   r6   )r   r®   rª   r   r   r   Útest_from_viewM  s    z&TestLogQuantityCreation.test_from_viewc              	   C   sV   t  t j¡}t t j¡� t  d|¡ W 5 Q R X t jd|dd�}t|ƒ|jksRt	‚dS )z4Check that we can use Quantity if we have subok=Truer,   T)ZsubokN)
r	   r   rA   r"   r#   ZUnitTypeErrorÚQuantityr†   r©   r   )r   r   r®   r   r   r   Útest_using_quantity_classZ  s
    z1TestLogQuantityCreation.test_using_quantity_class)rJ   rK   rL   r"   rM   rN   rO   Úlq_subclassesr	   ZLogQuantityrQ   rU   r«   rR   rS   rT   r+   r   r>   r)   r(   rh   r¯   r   ÚWr=   r°   rµ   r¸   rº   r   r   r   r   r¨   ø  sZ    ÿ
 
ÿ


øþ
**üþ	


úþ
r¨   c                  C   s¼   dddgt j } | j}| t j¡}t|t jƒs2t‚|j| jksBt‚t|j	| j	ƒ dddgt j
 }| jt jt  |¡d�}| t jt  |¡¡}t|t jƒsšt‚|j| jksªt‚t|j	| j	ƒ dS )	z/Ensures we can convert from regular quantities.r-   g      (@g      ,@gÍÌÌÌÌ\³@gÍÌÌÌŒ_³@gÍÌÌÌLb³@©ZequivalenciesN)r	   r7   r?   r   r   r1   r   r2   r   r3   rA   r>   r@   )ZmstZflux_lambdaZmst_roundtripÚwaveZflux_nuZmst_roundtrip2r   r   r   Ú/test_conversion_to_and_from_physical_quantitiesd  s    r¿   c                  C   s–   dt  t j¡ } |  ¡ | ks t‚|  ¡ jjjt jt j	gks>t‚| j
| ksLt‚| j
jjjt jt j	gksht‚| j| ksvt‚| jjjjt jt j	gks’t‚d S rG   )r	   r   r>   ry   r   r2   r   rz   r{   r;   rw   r|   rq   )rª   r   r   r   Útest_quantity_decompositionu  s    rÀ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestLogQuantityViewsc                 C   s2   t  t dd¡t j ¡| _t  t dd¡¡| _d S )Nr,   r-   ç      @)r	   r1   r4   r5   r>   rª   Úlq2r   r   r   r   Úsetup_method€  s    z!TestLogQuantityViews.setup_methodc                 C   s<   | j j}t|ƒtjkst‚d|d< t | j j|k¡s8t‚d S )Ng      ð¿r   )rª   r3   r†   r4   Zndarrayr   r6   )r   Zlq_valuer   r   r   Útest_value_view„  s    z$TestLogQuantityViews.test_value_viewc                 C   sX   | j j}t|ƒtjkst‚|j| j jjks.t‚d|j |d< t 	| j j
|j
k¡sTt‚d S )Nr¬   é   )rª   r²   r†   r	   r¹   r   r2   r   r4   r6   r3   )r   Zlq_fvr   r   r   Útest_function_viewŠ  s
    z'TestLogQuantityViews.test_function_viewc              	   C   s¤   t  t¡� | j tj¡ W 5 Q R X | j tj¡}|jtj	ksBt
‚t |j| jjk¡sZt
‚| tj¡}t|jƒtjkszt
‚|jjtjksŒt
‚t || jk¡s t
‚d S r   )r"   r#   r$   rª   r¶   r	   r¹   rÃ   r2   r   r   r4   r6   r3   r1   r†   rh   r   rs   )r   r8   Úlq3r   r   r   Útest_quantity_view‘  s    z'TestLogQuantityViews.test_quantity_viewN)rJ   rK   rL   rÄ   rÅ   rÇ   rÉ   r   r   r   r   rÁ     s   rÁ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestLogQuantitySlicingc              	   C   sö   t  t dd¡t j ¡}|d t  dt j ¡ks4t‚dt j |d< |d t  dt j ¡ks^t‚t t j¡� dt j	 |d< W 5 Q R X t t j¡� dt j
 |d< W 5 Q R X t t j¡� t  dt j	 ¡|d< W 5 Q R X |d t  dt j ¡ksòt‚d S )Nr,   ç      &@r/   r-   rv   r   )r	   r1   r4   r5   r>   r   r"   r#   rH   r)   r   ©r   Úlq1r   r   r   Útest_item_get_and_set   s    z,TestLogQuantitySlicing.test_item_get_and_setc              	   C   sú   t  t dd¡t j ¡}dt j |dd…< t |dd… t  dt j ¡k¡sPt‚t t j	¡� dt j
 |dd…< W 5 Q R X t t j	¡� dt j |dd…< W 5 Q R X t t j	¡� t  dt j
 ¡|dd…< W 5 Q R X t |d t  dt j ¡k¡söt‚d S )Nr,   r-   rv   r   é   )r	   r1   r4   r5   r>   r6   r   r"   r#   rH   r)   r   rÌ   r   r   r   Útest_slice_get_and_set­  s    &"z-TestLogQuantitySlicing.test_slice_get_and_setN)rJ   rK   rL   rÎ   rÐ   r   r   r   r   rÊ   Ÿ  s   rÊ   c                   @   s¬  e Zd Zej dde ¡  dej e 	dej
 ¡e d¡e e ddd¡ej ¡e 	d	d
ej ¡g¡ej ddddg¡dd„ ƒƒZdd„ Zej dd¡dd„ ƒZdd„ Zej de¡dd„ ƒZej ddej de ¡  e 	dej
 ¡e 	dej ¡de dej ¡ e 	d	d
ej ¡f¡dd „ ƒZej de¡d!d"„ ƒZej ddej de ¡  e 	dej
 ¡e 	dej ¡de dej ¡ e 	d	d
ej ¡f¡d#d$„ ƒZd%d&„ Zd'S )(ÚTestLogQuantityArithmeticr”   g333333@g®Gáz®(@gš™™™™™@r„   i¸  iˆ  r�   g…ëQ¸@r–   Úfacr,   r   r±   c                 C   s  || }|j j|j j| ks t‚t|j|j| ƒ || }|j j|j j| ksRt‚t|j|j| ƒ || }|j j| |j jks„t‚t|j| |jƒ | ¡ }||9 }|j j|j j| ks¾t‚t|j|j| ƒ | ¡ }|| }|j j| |j jksøt‚t|j| |jƒ dS )z8Check that multiplication and division works as expectesN)r2   r   r   r   r?   Úcopy)r   r”   rÒ   Úlq_sfr   r   r   r�   »  s"    z6TestLogQuantityArithmetic.test_multiplication_divisionc           
      C   sè  t  t dd¡t j ¡}t t j¡� |dt j   W 5 Q R X t t j¡� dt j |  W 5 Q R X t t j¡� ||  W 5 Q R X t jt j	t j
fD ]$}t t j¡� ||  W 5 Q R X q”t  t dd¡¡}t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X | ¡ }t t j¡� ||9 }W 5 Q R X ||k ¡ �sft‚t t j¡� || }W 5 Q R X ||k ¡ �s˜t‚|t  d¡ }|jt jk�s¸t‚t |j|jd k¡�sÔt‚|t d¡ }t|t jƒ�sôt‚t ||jt d¡ k¡�st‚|t j }t j| }||fD ]t}	t|	t|ƒƒ�rHt‚|	j|jjt j k�sbt‚t  t  ¡ ¡�, t t j¡� |	 |jj¡ W 5 Q R X W 5 Q R X �q0|dt j  }	|	j |jj¡�sÊt‚t|	 |jj¡|jd ƒ dS )	z¿Check that multiplication/division with other quantities is only
        possible when the physical unit is dimensionless, and that this keeps
        the result as a LogQuantity if possible.r,   rË   r…   r–   r-   g      I@r   N)r	   r1   r4   r5   r>   r"   r#   rH   r)   r   r   rÓ   r6   r   r2   rs   r3   r   r²   r†   r   r‡   rˆ   r   r   r<   ro   r   )
r   rª   r2   rÃ   rÔ   ÚrÚr2r‹   rŒ   r�   r   r   r   Ú!test_more_multiplication_divisionà  sR     

&z;TestLogQuantityArithmetic.test_more_multiplication_divisionr�   r‘   c              
   C   sF  t  t dd¡t j ¡}|dkr8t || dk¡sxt‚n@|dkrXt || |k¡sxt‚n t t j	¡� ||  W 5 Q R X t  t d¡¡}|| }|dkr¾|j
t jks¨t‚t |jdk¡s¼t‚n„|dkrÚt ||k¡sØt‚nht|t|ƒƒrìt‚|j
|j
j| k�st‚t  t  ¡ ¡�* t t j	¡� | t j¡ W 5 Q R X W 5 Q R X dS )zÝCheck that raising LogQuantities to some power is only possible when
        the physical unit is dimensionless, and that conversion is turned off
        when the resulting logarithmic unit (say, mag**2) is incompatible.r,   rV   r   r…   r-   N)r	   r1   r4   r5   r>   r6   r   r"   r#   rH   r2   rs   r3   r   r†   r   r‡   rˆ   r   )r   r�   rª   rÃ   r�   r   r   r   r“   $  s&    z-TestLogQuantityArithmetic.test_raise_to_powerc              	   C   s:   t  t dd¡t j ¡}t t¡� ||  W 5 Q R X d S )Nr,   rV   )r	   r1   r4   r5   r>   r"   r#   r$   ©r   rª   r   r   r   Útest_error_on_lq_as_powerD  s    z3TestLogQuantityArithmetic.test_error_on_lq_as_powerc              	   C   s„   t  t dd¡t j ¡}d| }t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X t t j¡� ||  W 5 Q R X d S )Nr,   r-   r­   )r	   r1   r4   r5   r>   r"   r#   rH   )r   r”   rª   r®   r   r   r   r•   I  s    zITestLogQuantityArithmetic.test_addition_subtraction_to_normal_units_failsr­   g¸…ëQ¸@g=
×£p=@g®Gáz®@c                 C   s¢   t  t dd¡t j ¡}|jt|jdt jƒt  	¡ d�}|| }t
|j|j| ƒ || }t
|j|j| ƒ || }t
|j|j| ƒ || }t
|j||j ƒ dS )zœCheck that addition/subtraction with quantities with magnitude or
        MagUnit units works, and that it changes the physical units
        appropriately.r,   r-   r   r½   N)r	   r1   r4   r5   r>   r   r™   r2   rs   rˆ   r   r?   )r   r”   rª   Úother_physicalrÔ   Zlq_srÚlq_dfZlq_drr   r   r   rš   V  s    þz3TestLogQuantityArithmetic.test_addition_subtractionc              	   C   s¸   t  t j¡}t  t dd¡|¡}t t j¡� ||7 }W 5 Q R X t 	|j
t dd¡k¡s\t‚|j|ksjt‚t t j¡� ||8 }W 5 Q R X t 	|j
t dd¡k¡s¦t‚|j|ks´t‚d S )Nr,   r-   )r	   r   r>   r1   r4   r5   r"   r#   rH   r6   r3   r   r2   )r   r”   r    rÍ   r   r   r   Ú-test_inplace_addition_subtraction_unit_checksw  s    zGTestLogQuantityArithmetic.test_inplace_addition_subtraction_unit_checksc                 C   s~   t  t dd¡t j ¡}|jt|jdt jƒt  	¡ d�}| 
¡ }||7 }t|j|j| ƒ | 
¡ }||8 }t|j|j| ƒ dS )z¤Check that inplace addition/subtraction with quantities with
        magnitude or MagUnit units works, and that it changes the physical
        units appropriately.r,   r-   r   r½   N)r	   r1   r4   r5   r>   r   r™   r2   rs   rˆ   rÓ   r   r?   )r   r”   rª   rÚ   rÔ   rÛ   r   r   r   Ú!test_inplace_addition_subtraction‡  s    þz;TestLogQuantityArithmetic.test_inplace_addition_subtractionc                 C   s¤   t  dddtj dt j d   ¡}t  |¡}dt j }d| }|| }|j t j	t j
 t j ¡sft‚|j|jd tj dt j d   }t |d ¡dk s t‚d	S )
z@For fun, a more complicated example of addition and subtraction.r›   r,   rV   r-   r   rÂ   rv   rl   N)r	   r(   r4   rZ   r[   r   r7   r2   ro   r:   r;   rA   r   r?   Úabs)r   rœ   ZDMmagZm_stÚdmZM_stÚratior   r   r   r�   £  s    $

$z?TestLogQuantityArithmetic.test_complicated_addition_subtractionN)rJ   rK   rL   r"   rM   rN   r	   r   r0   r1   r>   r·   r4   rp   ZAngstromr�   r×   r“   rÙ   rT   r•   r)   r(   rš   rÜ   rÝ   r�   r   r   r   r   rÑ   º  sV   
úþD


úþ


úþ
rÑ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestLogQuantityComparisonsc              	   C   sR   t  t dd¡t j ¡}t t¡� |dk W 5 Q R X |dkrBt‚|dksNt‚d S )Nr,   r-   Úa)	r	   r1   r4   r5   r>   r"   r#   r$   r   rØ   r   r   r   Ú'test_comparison_to_non_quantities_fails°  s
    zBTestLogQuantityComparisons.test_comparison_to_non_quantities_failsc              	   C   s  t  t dd¡t j ¡}t  dt j ¡}t ||kt dddg¡k¡sJt‚t ||kt dddg¡k¡slt‚t  dt j ¡}t ||kt dddg¡k¡sžt‚t ||kt dddg¡k¡sÀt‚t  dt j	 ¡}||krÜt‚||ksèt‚t
 t j¡� ||k  W 5 Q R X dt j }t ||kt dddg¡k¡�s6t‚t ||k t dddg¡k¡�sZt‚t
 t j¡� |dt j	 k W 5 Q R X t
 t j¡� ||jt j k W 5 Q R X t  t dd¡¡}|jt j }t ||k¡�sÚt‚t
 t j¡� |dt j	 k  W 5 Q R X d S )Nr,   rV   r–   TFg      ø?)r	   r1   r4   r5   r>   r6   Úarrayr   r·   r)   r"   r#   rH   r3   r   )r   rÍ   rÃ   rÈ   Zlq4Zq5Zlq6Zfv6r   r   r   Útest_comparison¸  s0    """"
$$z*TestLogQuantityComparisons.test_comparisonN)rJ   rK   rL   rã   rå   r   r   r   r   rá   ¯  s   rá   c                   @   sf   e Zd Zdd„ Zej dd¡dd„ ƒZdd„ Zej dd	¡d
d„ ƒZ	dd„ Z
ej dd¡dd„ ƒZdS )ÚTestLogQuantityMethodsc                 C   sT   t  dd¡ dd¡t tj¡ | _t  ddd¡ dd¡t ¡  | _| j| jf| _d S )Nr,   rÂ   r   g      @r’   rÆ   )	r4   r5   Zreshaper	   r   r>   ÚmJyÚm1Úmagsr   r   r   r   rÄ   Ö  s    " z#TestLogQuantityMethods.setup_methodÚmethod)
ZmeanÚminÚmaxÚroundÚtraceÚstdÚvarÚptpÚdiffÚediff1dc                 C   s†   | j D ]z}t||ƒƒ }t |jt|j|ƒƒ jk¡s6t‚|dkrR|jt 	¡ ks€t‚q|dkrp|jtj	d ks€t‚q|j|jkst‚qd S )N)rï   rñ   rò   ró   rð   r   )
ré   r™   r4   r6   r3   r²   r   r2   r	   r   )r   rê   r   Úresr   r   r   Útest_always_okÛ  s    
 z%TestLogQuantityMethods.test_always_okc                 C   sB   | j D ]6}t | d|j d|j ¡j|j dd¡k¡st‚qd S )Nr–   rV   )ré   r4   r6   Zclipr2   r3   r   )r   r   r   r   r   Ú	test_clipõ  s    
ÿÿz TestLogQuantityMethods.test_clip)ÚsumZcumsumZnansumc              	   C   sj   t | j|ƒƒ }t |jt | jj|ƒƒ jk¡s0t‚|j| jjksBt‚t 	t
¡� t | j|ƒƒ  W 5 Q R X d S r   )r™   rè   r4   r6   r3   r²   r   r2   r"   r#   r$   rç   )r   rê   rô   r   r   r   Útest_only_ok_if_dimensionlessü  s
    "z4TestLogQuantityMethods.test_only_ok_if_dimensionlessc                 C   s0   t  | j | j¡j| jj | jj¡k¡s,t‚d S r   )r4   r6   rè   Údotr3   r   r   r   r   r   Útest_dot  s    zTestLogQuantityMethods.test_dot)ÚprodZcumprodc              	   C   sL   t  t¡� t| j|ƒƒ  W 5 Q R X t  t¡� t| j|ƒƒ  W 5 Q R X d S r   )r"   r#   r$   r™   rç   rè   )r   rê   r   r   r   Útest_never_ok  s    z$TestLogQuantityMethods.test_never_okN)rJ   rK   rL   rÄ   r"   rM   rN   rõ   rö   rø   rú   rü   r   r   r   r   ræ   Õ  s   þ

ræ   )3Ú__doc__rR   r¡   Únumpyr4   r"   Znumpy.testingr   Zastropyr   rX   r   r	   Zastropy.tests.helperr   r   r   ZdecibelrP   ZDexUnitrh   ZDecibelUnitrQ   r·   r1   ZDecibelr»   rs   r)   rq   r;   r>   rT   r   r\   r]   r_   rb   rc   rk   rƒ   r¤   r§   r¨   r¿   rÀ   rÁ   rÊ   rÑ   rá   ræ   r   r   r   r   Ú<module>   s@   l%g *
l
  v&