
    IR-ez                        d Z ddlZddlmZ ddlm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mZmZ dd	lmZ dd
lmZ ej                            dg dej        ej        z  fg dej        ej        z  fg dej        dz  fg dej        dz  fg dej        dz  fdg ej        ej        dz            fdg ej        ej        dz            fdgej        dz  fddg ej        ej                   fdgej!        fdg ej"        ej#        ej        z            fdgej        fdd g ej$        ej        ej        dz  z            fg          d!             Z%ej                            d"g d#          d$             Z&ej                            dg d%gej'        fd&g ej        ej(        ej        dz  z  ej        z            fd'g ej        ej(        ej        dz  z  ej        z            fd(d)gej)        ej        z  fd*gej)        ej        z  ej*        z  fd+gej)        ej        z  ej*        z  fd,g ej        d-ej+        z  ej        ej,        dz  z  z            fd.g ej        d/ej-        z  ej.        z            fd0g ej        d1ej        z            fd2g ej        d1ej        z            fd3gej        d4z  fd5gej        dz  fd6g ej        ej        d7z            fd8g ej        ej        dz            fd9gd:ej/        z  fd;gd<ej/        z  fd=gd>ej/        z  fd?gej/        fd@gej0        fdAgej1        fdBgej2        fdCgej3        fdDgej4        fdEgej5        fdFgdGej6        z  fdHgej7        fdIgdJej8        z  fdKgej9        fdLgej*        fdMgej:        fdNgej;        fdOgej;        ej        z  fdPgej'        fdQgej'        ej        z  fdRgej<        fdSg eej        ej        dz  z            fdTg eej=                  fdUg eej/                  f          dV             Z>ej                            d"g dW          dX             Z?dY Z@dZ ZAej                            dg d[ejB        ej        z  fd\d]gejC        ej        z  d4z  fg d^ejB        ej        d_z  z  ej        d4z  z  ejD        d4z  z  fg d`ej(        ej        ejE        z  ejC        z  z  fdadbgejF        dz  ejG        ejH        z  z  fg dcd/ddz  ej(        z  ej        z  fg dedfejI        z  ej        d_z  z  ejJ        d4z  z  fg dgej(        ejC        d4z  z  ej        d4z  z  ejE        d4z  z  dz  fg dhejB        ej        z  diejC        ej        z  z  z  fg	          dj             ZKej                            d"g dk          dl             ZL G dm dn          ZM G do dpeM          ZN G dq dreM          ZO G ds dteM          ZP G du dveM          ZQ G dw dxeM          ZRdy ZSdz ZTd{ ZUd| ZVd} ZWd~ ZXd ZYd ZZej                            dg d          d             Z[ej                            dg d          d             Z\ej                            dg d          d             Z]ej                            dg d          d             Z^d Z_d Z`d Zaej                            dg d          d             Zbd Zcd Zdd Zed Zfd Zgd Zhd Ziej                            d"g d          d             Zjej                            d"g d          d             Zkd Zld Zmd Znej                            dg d          d             Zoej                            dg d          ej                            dddg          d                         Zpej                            dg d          d             Zqd Zrd Zsej                            dg d          d             Ztd Zud Zvd Zwej                            dddddddddd edd          dff
          d             Zxej                            ddejy        fdejy        fdejz        d4z  fddej        z  fdej        ej        z  fdej        dz  fdej        dz  fdej        dz  fdej        d/z  fdej{        fdej{        fdej|        fdej}        fdej}        ej~        z  fdPej}        fdej}        fdej        fdej        fdNej        fdej        fdej        fdej        fdej        fdej        fdej        fdej8        fdej        fg          dۄ             Zej                            d"g dܢ          d݄             Zej                            ddߦ          d             Zd Zd Zej                            dg d          d             Zej                            dg d          d             ZdS )z/
Regression tests for the units.format package
    N)nullcontext)Fraction)assert_allclose)units)si)
PrefixUnitUnitUnitBaseUnitsWarningdexformat)is_effectively_unityzstrings, unit)zm szm*szm.s)m/szm*s**-1zm /szm / szm/ s)m**2m2zm**(2)zm**+2zm+2zm^(+2)   )zm**-3zm-3zm^(-3)z/m3)zm**(1.5)m(3/2)zm**(3/2)zm^(3/2)      ?z2.54 cmRQ@z10+8mg    חAzsqrt(m)g      ?dB(mW)zdB (mW)mag	mag(ct/s)r   dex(cm s**-2)z
dex(cm/s2)c                 |    | D ]8}t          |           t          j                            |          }||k    sJ 9d S N)printu_formatGenericparsestringsunitsunit2s       ?lib/python3.11/site-packages/astropy/units/tests/test_format.pytest_unit_grammarr(      sM    *   a &&q))}}}}}     string)sin( /pixel /s)zmag(mag)z
dB(dB(mW))zdex()c                     t          j        t                    5  t          |            t          j                            |            d d d            d S # 1 swxY w Y   d S r   )pytestraises
ValueErrorr   r   r    r!   r*   s    r'   test_unit_grammar_failr1   /   s     
z	"	" ' 'fv&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '   /AAA0.1nmzmW/m2zmW/(m2)zkm/szkm.s-1zkm/s/Mpcz
km/(s.Mpc)z10+3J/m/s/kpc2g     @@z10pix/nm
   z
1.5x10+11mg   .YvABu   1.5×10+11/mz/sr   z10+21mgPKDz2.54cmz20%g?z10+9g    eAz2x10-9g&.!>---mamAUuarcminuarcseckbarnGbitGibiti   @kbytemRyMbP?mmagMpcGyr   °u   °/s   Åu   Å/sz\hz[cm/s2]z[K][-]c                 |    | D ]8}t          |           t          j                            |          }||k    sJ 9d S r   )r   r   CDSr!   r"   s       r'   test_cds_grammarrI   8   sM    X   a""1%%}}}}} r)   )z0.1 nmzsolMass(3/2)zkm / szkm s-1z
km/s.Mpc-1z/s.Mpczpix0.1nmzpix/(0.1nm)zkm*szkm**2z5x8+3mz0.1---z---mzm---z--z0.1-z-mzm-zmag(s-1)r   zdex(cm s-2)z[--]c                     t          j        t                    5  t          |            t          j                            |            d d d            d S # 1 swxY w Y   d S r   )r-   r.   r/   r   r   rH   r!   r0   s    r'   test_cds_grammar_failrK   j   s    8 
z	"	" # #f6"""# # # # # # # # # # # # # # # # # #r2   c                      t          j        dd          t           j        k    sJ t           j                            d          dk    sJ d S )Nr6   cdsr   )ur	   dimensionless_unscaled	to_string r)   r'   test_cds_dimensionlessrR      sP    6%&&&!*BBBBB#--U-;;uDDDDDDr)   c                      t          j        dd          t          j        t           j                  k    sJ t          j        t           j                                      d          dk    sJ d S )NrF   rM   r   )rN   r	   r   rO   rP   rQ   r)   r'   test_cds_log10_dimensionlessrT      sd    6%&&&!%0H*I*IIIII5)**44E4BBeKKKKKKr)   )zcount /szcount/szcount s**(-1)z	count / sz	count /s z	/pixel /sz/(pixel * s))zcount /m**2 /s /eVz"count m**(-2) * s**(-1) * eV**(-1)zcount /(m**2 * s * eV))zerg /pixel /s /GHzzerg /s /GHz /pixelzerg /pixel /(s * GHz)zkeV**2 /yr /angstromz10**(10) keV**2 /yr /m)z10**(46) erg /sz10**46 erg /sz10**(39) J /sz
10**(39) Wz10**(15) YWzYJ /fs.   )z10**(-7) J /cm**2 /MeVz10**(-9) J m**(-2) eV**(-1)znJ m**(-2) eV**(-1)znJ /m**2 /eVgHz>)zsqrt(erg /pixel /s /GHz)z(erg /pixel /s /GHz)**(0.5)z(erg /pixel /s /GHz)**(1/2)z.erg**(0.5) pixel**(-0.5) s**(-0.5) GHz**(-0.5))z(count /s) (/pixel /s)z(count /s) * (/pixel /s)zcount /pixel /s**2      ?c                 |    | D ]8}t          |           t          j                            |          }||k    sJ 9d S r   )r   r   OGIPr!   r"   s       r'   test_ogip_grammarrZ      sM    L   a##A&&}}}}} r)   )zlog(photon /m**2 /s /Hz)r+   z,log(photon /cm**2 /s /Hz) /(sin( /pixel /s))z1log(photon /cm**2 /s /Hz) (sin( /pixel /s))**(-1)r   zdex(cm/s**2)c                     t          j        t                    5  t          |            t          j                            |            d d d            d S # 1 swxY w Y   d S r   )r-   r.   r/   r   r   rY   r!   r0   s    r'   test_ogip_grammar_failr\      s     
z	"	" $ $fF###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $r2   c                   0    e Zd Z e            ZddZd ZdS )RoundtripBaseNc                 <   || j         }t          j                    5  t          j        d           |                    |          }d d d            n# 1 swxY w Y   || j        v r_t          j        t          d          5 }t          || j                   }d d d            n# 1 swxY w Y   t          |          dk    sJ nt          || j                   }t          |                                j        |                                j        d           d S )Nignore
deprecatedmatchr      &.>rtol)format_warningscatch_warningssimplefilterrP   deprecated_unitsr-   warnsr   r	   lenr   	decomposescale)selfr$   output_formatr%   was         r'   check_roundtripzRoundtripBase.check_roundtrip   s|     LM$&& 	. 	.!(+++}--A	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. %%%l,??? 114<0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1q66Q;;;;;Qt|,,,A+T^^-=-=-C$OOOOOOs#   *AAAB%%B),B)c                     |                                 }|                    | j                  }d|vsJ t          || j                  }t	          |                                 j        |j        d           d S )Nz  r   gh㈵>rf   )ro   rP   rh   r	   r   rp   )rq   r$   udr%   rt   s        r'   check_roundtrip_decomposez'RoundtripBase.check_roundtrip_decompose  sm    ^^LL&&1}}}}4<(((+RXDAAAAAAr)   r   )__name__
__module____qualname__setrl   ru   rx   rQ   r)   r'   r^   r^      sL        suuP P P P B B B B Br)   r^   c                       e Zd ZdZej                            dd ej        	                                D                       d             Z
dS )TestRoundtripGenericgenericr$   c                 f    g | ].}t          |t                    t          |t                    ,|/S rQ   
isinstancer
   r   .0r$   s     r'   
<listcomp>zTestRoundtripGeneric.<listcomp>  L     	
 	
 	
4**	
 4>dJ3O3O	
	
 	
 	
r)   c                     |                      |           |                      |d           |                     |           d S )Nunicode)rr   )ru   rx   rq   r$   s     r'   test_roundtripz#TestRoundtripGeneric.test_roundtrip  sK     	T"""T;;;&&t,,,,,r)   N)ry   rz   r{   rh   r-   markparametrizerN   __dict__valuesr   rQ   r)   r'   r~   r~     st        G[	
 	

))++	
 	
 	
 - - - - -r)   r~   c                       e Zd ZdZej        j        Zej	        
                    dd ej        j                                        D                       d             ZdS )TestRoundtripVOUnitvounitr$   c                 f    g | ].}t          |t                    t          |t                    ,|/S rQ   r   r   s     r'   r   zTestRoundtripVOUnit.<listcomp>&  r   r)   c                     |                      |           |t          j        t          j        fvr|                     |           d S d S r   )ru   rN   r   dBrx   r   s     r'   r   z"TestRoundtripVOUnit.test_roundtrip$  sM     	T"""qt}$$**400000 %$r)   N)ry   rz   r{   rh   r   VOUnit_deprecated_unitsrl   r-   r   r   _unitsr   r   rQ   r)   r'   r   r      s        G8[	
 	
 .5577	
 	
 	
 1 1 1 1 1r)   r   c                       e Zd ZdZej        j        Zej	        
                    dd ej        j                                        D                       d             ZdS )TestRoundtripFITSfitsr$   c                 f    g | ].}t          |t                    t          |t                    ,|/S rQ   r   r   s     r'   r   zTestRoundtripFITS.<listcomp>8  r   r)   c                 0    |                      |           d S r   )ru   r   s     r'   r   z TestRoundtripFITS.test_roundtrip6  s     	T"""""r)   N)ry   rz   r{   rh   r   Fitsr   rl   r-   r   r   r   r   r   rQ   r)   r'   r   r   2  s        G}6[	
 	
 ,3355	
 	
 	
 # # # # #r)   r   c                   <   e Zd ZdZej                            dd ej        j	        
                                D                       d             Zej                            dd ej        ej        dz  z  ej        ej        fD                       d             ZdS )	TestRoundtripCDSrM   r$   c                 f    g | ].}t          |t                    t          |t                    ,|/S rQ   r   r   s     r'   r   zTestRoundtripCDS.<listcomp>G  r   r)   c                 ~    |                      |           |t          j        k    rd S |                     |           d S r   )ru   rN   r   rx   r   s     r'   r   zTestRoundtripCDS.test_roundtripE  sB     	T"""15==F&&t,,,,,r)   c                 6    g | ]}t          j        |          S rQ   )rN   r   r   s     r'   r   zTestRoundtripCDS.<listcomp>V  s     FFFtFFFr)   r   c                 n    |                     d          }t          j        |d          }||k    sJ d S )NrM   r   )rP   rN   r	   )rq   r$   r*   	recovereds       r'   test_roundtrip_dexz#TestRoundtripCDS.test_roundtrip_dexU  sB     u--F6%000	D      r)   N)ry   rz   r{   rh   r-   r   r   r   rH   r   r   r   rN   cmr%   KLsunr   rQ   r)   r'   r   r   B  s        G[	
 	
 +2244	
 	
 	
 - - - [FF!$a-af)EFFF ! ! ! ! !r)   r   c                       e Zd ZdZej        j        dhz  Zej	        
                    dd ej        j                                        D                       d             ZdS )TestRoundtripOGIPogipdr$   c                 f    g | ].}t          |t                    t          |t                    ,|/S rQ   r   r   s     r'   r   zTestRoundtripOGIP.<listcomp>d  r   r)   c                 j   t          |          dv rt          j        t                    5  |                    | j                  }t          || j                  }d d d            n# 1 swxY w Y   t          |                                j	        |                                j	        d           n| 
                    |           t          |          dv rd S t          j        |                                j	                  }t          |t          |          z
            dk    rt          j        t          d          }n=t          |          d	k    rt          j        t          d
          }nt                      }|5  |                     |           d d d            d S # 1 swxY w Y   d S )N)r   
0.001 Crabr   re   rf   )r   byteCrabr@   zpower of 10rb   r   ra   )strr-   rm   r   rP   rh   r	   r   ro   rp   ru   nplog10absroundr   rx   )rq   r$   r%   rt   power_of_tenctxs         r'   r   z TestRoundtripOGIP.test_roundtripb  s    t99+++ l++ 1 1NN4<004<0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 AKKMM/1A1A1GdSSSSS  &&&t99/// Fx 0 0 677|eL11122T99,|=AAACCYY,&&,|<@@@CC--C 	1 	1**4000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s#   1A((A,/A,F((F,/F,N)ry   rz   r{   rh   r   rY   r   rl   r-   r   r   r   r   r   rQ   r)   r'   r   r   ^  s        G}6#>[	
 	
 ,3355	
 	
 	
 1 1 1 1 1r)   r   c                  (    t           j        j         d S r   )r   r   r   rQ   r)   r'   test_fits_units_availabler     s    Mr)   c                  (    t           j        j         d S r   )r   r   r   rQ   r)   r'   test_vo_units_availabler     s    Or)   c                  (    t           j        j         d S r   )r   rH   r   rQ   r)   r'   test_cds_units_availabler     s    Lr)   c                      ddl m}  |                                 5  t          j                            d           ddd           dS # 1 swxY w Y   dS )ul   Regression test for #5350.  This failed with a decoding error as
    μas could not be represented in ascii.r   rM   T)include_prefix_unitsN)astropy.unitsrM   enablerN   radianfind_equivalent_unitsr   s    r'   test_cds_non_ascii_unitr     s     "!!!!!	 B B	&&D&AAAB B B B B B B B B B B B B B B B B Bs   !A		AAc                      t           j        t           j        dz  t           j        z  z  } |                     d          dk    sJ d S Nr   latexz $\mathrm{\frac{erg}{s\,cm^{2}}}$)rN   ergr   r%   rP   fluxunits    r'   
test_latexr     s@    ua!#&Hg&&*MMMMMMMr)   c                  l    t           j        t           j        dz  t           j        z  z  } | ddk    sJ d S r   )rN   r   r   r%   r   s    r'   test_new_style_latexr     s8    ua!#&H"EEEEEEEr)   c                      t          j        dt           j        z  t           j        dz  t           j        z  t           j        z  z            } d}|                     d          |k    sJ d S )N秎W:r   z7$\mathrm{1 \times 10^{-24}\,\frac{erg}{Hz\,s\,cm^{2}}}$r   rN   r	   r   r   r%   HzrP   )r   r   s     r'   test_latex_scaler     sY    vgoq13)=>??HFEg&&%//////r)   c                      t          j        dt           j        z  t           j        dz  t           j        z  t           j        z  z            } d}|                     d          |k    sJ d S )Nr   r   z;$\mathrm{1 \times 10^{-24}\,erg\,Hz^{-1}\,s^{-1}\,cm^{-2}}$latex_inliner   )r   r   s     r'   test_latex_inline_scaler     sY    vgoq13)=>??HQLn--======r)   zformat_spec, string, decomposed))r   erg / (Angstrom s cm2)1e+07 kg / (m s3))r%   r   r   )consolezerg Angstrom^-1 s^-1 cm^-2z10000000 kg m^-1 s^-3)r   z.$\mathrm{\frac{erg}{\mathring{A}\,s\,cm^{2}}}$z($\mathrm{10000000\,\frac{kg}{m\,s^{3}}}$)r   z2$\mathrm{erg\,\mathring{A}^{-1}\,s^{-1}\,cm^{-2}}$z'$\mathrm{10000000\,kg\,m^{-1}\,s^{-3}}$)r   u   erg Å⁻¹ s⁻¹ cm⁻²u   10000000 kg m⁻¹ s⁻³)z>25sz   erg / (Angstrom s cm2)z        1e+07 kg / (m s3))rM   zerg.Angstrom-1.s-1.cm-2z10000000kg.m-1.s-3)r   z10 erg / (nm s cm**2)z1e+07 kg / (m s**3))r   zerg Angstrom-1 s-1 cm-2z10**7 kg m-1 s-3)r   erg.Angstrom**-1.s**-1.cm**-2z10000000kg.m**-1.s**-3c                    t           j        t           j        dz  t           j        z  t           j        z  z  }| dk    rDt          j        t          d          5  t          ||           }d d d            n# 1 swxY w Y   nt          ||           }||k    sJ t          |	                                |           |k    sJ d S )Nr   r   ra   rb   )
rN   r   r   r%   Angstromr-   rm   r   r   ro   )format_specr*   
decomposedr   	formatteds        r'   test_format_stylesr     s    4 ua!#
23Hh\,l;;; 	6 	6x55I	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 8[11	 ($$&&44
BBBBBBs   A55A9<A9z)format_spec, fraction, string, decomposed))r   Fzerg s-1 cm-2z0.001 kg s-3)r   	multilinez erg  
------
s cm^2z      kg 
0.001 ---
      s^3)r   inlinezerg / (s cm^2)z0.001 kg / s^3)r   r   u    erg 
─────
s cm²u         kg
0.001 ──
      s³)r   r   u   erg / (s cm²)u   0.001 kg / s³)r   Fz$\mathrm{erg\,s^{-1}\,cm^{-2}}$z$\mathrm{0.001\,kg\,s^{-3}}$)r   r   z$\mathrm{erg / (s\,cm^{2})}$z$\mathrm{0.001\,kg / s^{3}}$c                     t           j        t           j        dz  t           j        z  z  }|                    | |          |k    sJ |                                                    | |          |k    sJ d S )Nr   fraction)rN   r   r   r%   rP   ro   )r   r   r*   r   r   s        r'   'test_format_styles_non_default_fractionr     sv    : ua!#&HkH==GGGG))+)IIZWWWWWWr)   r   )r   rM   r   r   r   c                     t           j        t           j        dz  z  }t          j        t
          d          5  |                    | d           d d d            d S # 1 swxY w Y   d S )Nr   z'only supports.*not fraction='multiline'rb   r   r   rN   Wmr-   r.   r/   rP   r   r   s     r'   test_no_multiline_fractionr     s    sQS!V|H	z)R	S	S	S > >;===> > > > > > > > > > > > > > > > > >   AA!$A!)r   rM   r   r   r   r   r   r   c                     t           j        t           j        dz  z  }t          j        t
          d          5  |                    | d           d d d            d S # 1 swxY w Y   d S )Nr   zonly supports.*parrotrb   parrotr   r   r   s     r'   test_unknown_fraction_styler      s    
 sQS!V|H	z)@	A	A	A ; ;;:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;r   c                      t          j        dt           j        t           j        z            } |                     d          dk    sJ | t           j        dz  z  }|                    d          dk    sJ d S )N
FOOBAR_Oner   zerg Hz-1   zbit3 erg Hz-1)rN   def_unitr   r   rP   bit)myunitmyunit2s     r'   test_flatten_to_knownr   
  so    Zaeadl33FF##z1111quaxGV$$777777r)   c                     t          j        d          } t          j        |           5  t          j        t
                    5  |                     d           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )N
FOOBAR_Twor   )rN   r   add_enabled_unitsr-   r.   r/   rP   )r   s    r'   test_flatten_impossibler     s    Z%%F	
	V	$	$ ! !fmJ&?&? ! !   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !s5   A=A%A=%A)	)A=,A)	-A==BBc                  h    t           j                                                            d           dS )z
    Issue #436.
    r   N)rN   Jyro   rP   rQ   r)   r'   test_console_outr     s*     DNNy)))))r)   zformat,string))r   10)r   r  )r   r  )rM   r  )r   z$\mathrm{10}$c                 d    t          j        d          }|                    |           |k    sJ d S )Nr4   rN   r	   rP   )r   r*   r$   s      r'   test_scale_onlyr    s4     6"::D>>&!!V++++++r)   c                  Z    t           j        j                            d          dk    sJ d S )Nr   z$\mathrm{60\,s}$)rN   min_representsrP   rQ   r)   r'   test_flexible_floatr  -  s-    5&&w//3FFFFFFFr)   c                      t          j        t          d          5  t          j                            d           ddd           dS # 1 swxY w Y   dS )zdTest function raises TypeError on bad input.

    This instead of returning None, see gh-11825.
    zunit argument must berb   N)r-   r.   	TypeErrorr   r   rP   rQ   r)   r'   "test_fits_to_string_function_errorr  1  s     
y(?	@	@	@ & &%%%& & & & & & & & & & & & & & & & & &s    A		AAc                      t           j        dz  } d|                     d          vsJ t           j        dz  }d|                    d          v sJ |                    d          dk    sJ d S )N       @.r   g      @z5/2r   u
   cm⁵⸍²)rN   r   rP   )area
fractionals     r'   test_fraction_reprr  ;  sy    49DdnnW------sJJ((111111	**l::::::r)   c                      dt           j        z  j        } t          | j        j                  sJ t          |                                                                           dk    sJ dS )z[Scale just off unity at machine precision level is OK.
    Ensures #748 does not recur
    g      @r   N)	rN   Ncgsr   r$   rp   rn   __repr__split)rt   s    r'   test_scale_effectively_unityr  E  s\     
qsA-----qzz||!!##$$))))))r)   c                  X   t          j        d          t           j        cxk    rt          j        d          k    sn J t          j        dd          t          j        d          k    sJ t          j        d                              d          dk    sJ t	          j        t                    5  t          j        dd           ddd           n# 1 swxY w Y   t	          j        t                    5  t          j        dd           ddd           dS # 1 swxY w Y   dS )zTest that the % unit is properly recognized.  Since % is a special
    symbol, this goes slightly beyond the round-tripping tested above.%{Gz?rM   r   r   Nr   )rN   r	   percentrP   r-   r.   r/   rQ   r)   r'   test_percentr  N  s    6#;;!)3333qvd||3333336#e$$$t44446$<<!!%((C////	z	"	" # #	s6""""# # # # # # # # # # # # # # # 
z	"	" % %	s8$$$$% % % % % % % % % % % % % % % % % %s$   4CCC;DD#&D#c                  T   t          j        d          t          j        d          cxk    rdt           j        z  k    sn J t          j        d          t          j        d          k    sJ t          j        dd          t          j        d          k    sJ t          j        d                              d          dk    sJ t	          j        t                    5  t          j        d	                              d
           ddd           n# 1 swxY w Y   t          j        d                              d
          dk    sJ t	          j        t                    5  t          j        d                              d           ddd           dS # 1 swxY w Y   dS )zpTest that scaled dimensionless units are properly recognized in generic
    and CDS, but not in fits and vounit.0.1皙?z1.e-4g-C6?z10-4rM   r   z10+8g333333?r   Nz10**-1r   )rN   r	   rO   rP   r-   r.   r/   rQ   r)   r'   test_scaled_dimensionlessr   ]  s    6%==AF3KKIIII31I+IIIIIII6'??afVnn,,,,6&'''16&>>99996&>>##E**f4444	z	"	" ' '	tv&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 6#;;  ((H4444	z	"	" ( (	sh'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s$   #(DDD((FF!$F!c                     t          j        t                    5 } t          j        dd           d d d            n# 1 swxY w Y   dt          | j                  v sJ t          j        t                    5 } t          j        dd           d d d            n# 1 swxY w Y   dt          | j                  v sJ dt          | j                  v sJ t          j        t          d	
          5 }t          j        dd           d d d            n# 1 swxY w Y   t          |          dk    sJ t          |d         j
                                      d          dk    sJ t          j        t          d
          5 }t          j        dd           d d d            n# 1 swxY w Y   t          |          dk    sJ d S )NANGSTROMr   r   z"Did you mean Angstrom or angstrom?crabr   zCrab (deprecated)zmCrab (deprecated)zL.* Did you mean 0\.1nm, Angstrom \(deprecated\) or angstrom \(deprecated\)\?rb   r   rd   r   r3   z.* 0\.1nm\.angstrom)r-   r.   r/   rN   r	   r   valuerm   r   rn   messagecount)exc_infors   s     r'   "test_deprecated_did_you_mean_unitsr)  o  s   	z	"	" *h	z&))))* * * * * * * * * * * * * * */3x~3F3FFFFF	z	"	" &h	vf%%%%& & & & & & & & & & & & & & &#hn"5"555553x~#6#66666	7
 
 
 , 
	z(++++, , , , , , , , , , , , , , , q66Q;;;;qt|""7++q0000	l.	9	9	9 ,Q	z(++++, , , , , , , , , , , , , , ,q66Q;;;;;;sE   =AA9BB #B 2DDDF&&F*-F*)r   r   r   c                     t          j        t                    5  t          |            t	          j                                        |            d d d            d S # 1 swxY w Y   d S r   )r-   r.   r/   r   r   r   r!   r0   s    r'   test_fits_functionr+    s     
z	"	" & &ff%%%& & & & & & & & & & & & & & & & & &s   6AA!$A!c                 4   t          j        t                    5  t          j                    5  t          j        d           t          j                                        |            d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr`   )	r-   r.   r/   ri   rj   rk   r   r   r!   r0   s    r'   test_vounit_functionr-    s    
z	"	" ( (H$;$=$= ( (h''''''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s4   B;A5)B5A9	9B<A9	=BBBc                     t          j        dd          t          j        d          k    sJ t          j        dd          t          j        d          k    sJ t          j        dd          t          j        d          k    sJ t          j        t                    5 } t          j        dd           d d d            n# 1 swxY w Y   t          |           d	k    sJ d S )
NKiBr   r   z1024 BKibyteKibitz128 Bkibibyterd   )rN   r	   r-   rm   r   rn   )rs   s    r'   test_vounit_binary_prefixr3    s   6%)))QVH-=-=====6(8,,,x0@0@@@@@6'(+++qvg>>>>	l	#	# ,q	z(++++, , , , , , , , , , , , , , ,q66Q;;;;;;s   $CCCc                      t          j        dd          J t          j        dd          J t          j        dd          t           j        u sJ d S )Nunknownr   r   UNKNOWN )rN   r	   rO   rQ   r)   r'   test_vounit_unknownr8    sa    6)H---5556)H---5556"X&&&!*BBBBBBBr)   c                  H   t          j        dd          t           j        u sJ t          j        dd          t          j        d          k    sJ t          j        dd          t          j        dd          k    sJ t           j                            d          dk    sJ t          j        d	                              d          d
k    sJ t          j        t          d          5  t           j        t           j	        z  t           j	        z  t           j
        z  t           j        z  } t           j        j                            |           }|dk    sJ t           j        j                            |          }|| k    sJ 	 d d d            d S # 1 swxY w Y   d S )NPar   r   kaz1000 yrpixpixel10mzdam dagz100g.mra   rb   r   )rN   r	   PascaldamrP   r-   rm   r   r   r   r%   AAr   r   r!   )flamxnew_flams      r'   test_vounit_detailsrE    s   6$x(((AH44446$x(((AF9,=,=====6%)))QVGH-M-M-MMMMM 5??8$$----6)&&x00H<<<< 
l,	7	7	7    uqt|ad"QS(14/HO%%d++333338?((++4                                   s   0BFFFz$unit, vounit, number, scale, voscale))nmrF  r  z10^-1r  )fmrG        Y@10+2100)m^2r   rH  z100.0rJ  )r   r   r   2.54rL  )kgrM  gZW^Ez1.898124597E27z1.8981246e+27)r   zm.s**-1g   JxޱA	299792458z2.9979246e+08)cm2zcm**2#B;10^(-20)z1e-20c                     t          j        | d|            }||t          j        |           z  k    sJ |                    d          ||z   k    sJ d S )N r   r   r  )r$   r   numberrp   voscalerC  s         r'   test_vounit_scale_factorrV    si     	
%  $  !!A%%%%%;;h;''7V+;;;;;;;r)   zunit, vounit))zm s^-1r   )s^-1z1/s)z100 s^-2z100/s**2)z
kg m-1 s-2zkg/(m.s**2)r   Tr   c                 h    t          j        |           }|                    d|          |k    sJ d S )Nr   )r   r   r  )r$   r   r   rC  s       r'   test_vounit_fractionrY    s8     	
tA;;h;::fDDDDDDr)   ))rK  r   )rW  zs**-1)zs(0.333)z
s**(0.333))z	s(-0.333)zs**(-0.333))zs(1/3)zs**(1/3))zs(-1/3)z	s**(-1/3)c                 f    t          j        |           }|                    d          |k    sJ d S )Nr   r   r  )r$   r   rC  s      r'   test_vounit_powerr[    s6     	
tA;;h;''6111111r)   c                  |   t          j        dd          } |                     d          }|dk    sJ |                                 }|dk    sJ t          j        dd          } | j        d         j        j        dk    sJ |                     d          }|d	k    sJ |                                 }|d
k    sJ d S )Nz'foo' mr   r   z'foo'.mzfoo mzm'foo' mrd   r@   zm.m'foo'zm mfoo)rN   r	   rP   basesr  rp   )rC  x_vounitx_strings      r'   test_vounit_customr`    s    	y***A{{8$$Hy    {{}}Hw	z(+++A71:!'50000{{8$$Hz!!!!{{}}Hxr)   c                     t          j        t                    5 } t          j        dd          }d d d            n# 1 swxY w Y   |j        d         j        j        dk    sJ |j        d         j        j        d         j        dk    sJ t          |           dk    sJ dt          | d         j                  v sJ d	t          | d
         j                  v sJ d S )Nzfurlong/weekr   r   r   gV瞯<urlongr   furlongweekrd   )r-   rm   r   rN   r	   r]  r  rp   namern   r   r&  )rs   rC  s     r'   test_vounit_implicit_customrf    s   	l	#	# 4qF>(3334 4 4 4 4 4 4 4 4 4 4 4 4 4 471:!'5000071:!'*/8;;;;q66Q;;;;AaDL))))))S1&&&&&&&&s   =AAzscale, number, string))rI  d   10**2)z10(+2)rg  rh  )z10**+2rg  rh  )z10**(+2)rg  rh  )z10^+2rg  rh  )z10^(+2)rg  rh  )rh  rg  rh  )z10**(2)rg  rh  )z10^2rg  rh  )z10^(2)rg  rh  )z10-20rP  10**-20)z10(-20)rP  ri  )ri  rP  ri  )z	10**(-20)rP  ri  )z10^-20rP  ri  )rQ  rP  ri  c                    t          j        | dz   d          }||t           j        t           j        z  t           j        dz  z  t           j        z  z  k    sJ |                    d          |dz   k    sJ t          j        | dz   d          }||t           j        t           j        z  t           j        dz  z  t           j        z  z  k    sJ |                    d          |dz   k    sJ d S )Nz erg/(s cm**2 Angstrom)r   r   r   z erg Angstrom-1 s-1 cm-2z*erg/(s cm**2 Angstrom))rN   r	   r   r%   r   r   rP   )rp   rT  r*   rC  s       r'   test_fits_scale_factorrk    s    , 	
u00@@@A!%!#+a/!*<=====;;f;%%2L)LLLLL	u00@@@A!%!#+a/!*<=====;;f;%%2L)LLLLLLLr)   c                  l   t          j        t                    5  t          j        dd          } d d d            n# 1 swxY w Y   t          j        t                    5  t          j        dd          } d d d            n# 1 swxY w Y   t          j        dt          j        z            } t          j        t                    5  |                     d           d d d            n# 1 swxY w Y   t          j        dt          j        z            } |                     d          dk    sJ d S )Nz1000 erg/(s cm**2 Angstrom)r   r   z12 erg/(s cm**2 Angstrom)g333333?rH  z	10**2 erg)r-   r.   r/   rN   r	   r   rP   )rC  s    r'   test_fits_scale_factor_errorsrm  #  s   	z	"	" A AF0@@@A A A A A A A A A A A A A A A 
z	"	" ? ?F.v>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 	
sQU{A	z	"	" # #	6"""# # # # # # # # # # # # # # # 	
uqu}A;;f;%%444444s3   =AA!BBB	C,,C03C0c                     t           j                            d          dk    sJ t           j        dz                      d          dk    sJ t           j                            d          dk    sJ t           j        dz                      d          dk    sJ t           j                            d          dk    sJ t           j        dz                      d          dk    sJ t           j                            d          d	k    sJ t           j        dz                      d          d
k    sJ t           j                            d          dk    sJ t           j        dz                      d          dk    sJ dS )zCRegression test for #5870, #8699, #9218; avoid double superscripts.r   z$\mathrm{{}^{\circ}}$r   z$\mathrm{deg^{2}}$z$\mathrm{{}^{\prime}}$z$\mathrm{arcmin^{2}}$z$\mathrm{{}^{\prime\prime}}$z$\mathrm{arcsec^{2}}$z$\mathrm{{}^{h}}$z$\mathrm{hourangle^{2}}$z$\mathrm{e^{-}}$z$\mathrm{electron^{2}}$N)rN   degrP   arcminarcsec	hourangleelectronrQ   r)   r'   test_double_superscriptrt  2  sp   EW%%)AAAAAE1H((,AAAAAH((,EEEEEHaK""7++/GGGGGH((,KKKKKHaK""7++/GGGGGK""7++/CCCCCKN%%g..2MMMMMJ!!'**.AAAAAJM$$W--1KKKKKKKr)   c                     t           j                            d          dk    sJ t           j                            d          dk    sJ t           j                            d          dk    sJ t           j                            d          dk    sJ t           j                            d          dk    sJ t           j                            d          dk    sJ d	S )
z&Regression test for gh-911 and #14419.r   z$\mathrm{mdeg}$z$\mathrm{narcmin}$z$\mathrm{parcsec}$r   mdegnarcminparcsecN)rN   rv  rP   rw  rx  rQ   r)   r'   test_no_prefix_superscriptry  @  s    6G$$(:::::9w''+@@@@@9w''+@@@@@6I&&&00009y))Y66669y))Y666666r)   zpower,expected)rW   r   )r  r   )iz1 / m10)r   r   )gUUUUUU?zm(2/3))g]tE]?zm(7/11))g      z1 / m(1/64))r  zm(1/100))gbeF?zm(0.019801980198019802)e   zm(2/101)c                 l    t           j        | z  }|                                }||k    sJ ||k    sJ dS )z@Regression test for #9279 - powers should not be oversimplified.N)rN   r   rP   )powerexpectedr$   r%   s       r'   test_powersr~  J  s<    " 3:DA====1999999r)   zstring,unitu   µgu   μgu   g−1u   m⁻¹rd   u   m s⁻¹u   m²u   m⁺²u   m³r   u   m¹⁰u   Ωu   Ωu   µΩu   Åu   Å Ωu   Åu   mÅu   °Cu   M⊙u   L☉u   M⊕u   M♁u   R♃u   ′u   R∞u   Mₚc                     t           j                            |           |k    sJ t          j        |           |k    sJ d S r   )r   r    r!   rN   r	   )r*   r$   s     r'   test_unicoder  a  sF    B !!&))T11116&>>T!!!!!!r)   )u   gµu   g−u   m⁻1u   m+¹u   m−¹u   kÅc                     t          j        t                    5  t          j        |            d d d            d S # 1 swxY w Y   d S r   r-   r.   r/   rN   r	   r0   s    r'   test_unicode_failuresr    s     
z	"	"  	v                 s   <A A rh   )r   r   r   c                     t          j        t          d          5  t          j        d|            d d d            d S # 1 swxY w Y   d S )Nz	not parserb   r   r   )r-   r.   NotImplementedErrorrN   r	   )rh   s    r'   /test_parse_error_message_for_output_only_formatr    s    	*+	>	>	> $ $	s7####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $   A  AAc                      t          j        t          d          5  t          j        dd           d d d            d S # 1 swxY w Y   d S )Nz#Unknown.*unicode'\] for output onlyrb   r   foor   r  rQ   r)   r'   test_unknown_parserr    s    	z)O	P	P	P " "	s5!!!!" " " " " " " " " " " " " " " " " "r  c                     t          j        dd          t           j        k    sJ t          j        dd          t           j        k    sJ t          j        dd          t           j        t           j        z  t           j        z  k    sJ t          j        dd          t           j        t           j        z  k    sJ t           j                            d          dk    sJ d S )NCelsiusr   r   zdeg Cz
deg C kg-1zCelsius kg-1)rN   r	   deg_CCro  rM  rP   rQ   r)   r'   test_celsius_fitsr    s    6)F+++qw66666'&)))QW4444 6,v...!#+2DDDDD6.000AGadNBBBB7V$$	111111r)   zformat_spec, string))r   	dB(1 / m))r   z;$\mathrm{dB}$$\mathrm{\left( \mathrm{\frac{1}{m}} \right)}$)r   6$\mathrm{dB}$$\mathrm{\left( \mathrm{m^{-1}} \right)}$)r   zdB(m^-1))r   u
   dB(m⁻¹)c                     t          j        t           j        dz            }|                    |           |k    sJ ||  |k    sJ d S )Nr5   rN   decibelr   rP   )r   r*   dbunits      r'   test_function_format_stylesr    sW     YqsBwFK((F2222k$$......r)   zformat_spec, fraction, string))r   r   z   1
dB(-)
   m)r   r   r  )r   r   u      1
dB(─)
   m)r   r   r  )r   Fr  )r   r   z5$\mathrm{dB}$$\mathrm{\left( \mathrm{1 / m} \right)}$c                     t          j        t           j        dz            }|                    | |          |k    sJ d S )Nr5   r   r  )r   r   r*   r  s       r'   0test_function_format_styles_non_default_fractionr    sC     YqsBwFK(;;vEEEEEEr)   )__doc__ri   
contextlibr   	fractionsr   numpyr   r-   numpy.testingr   astropyr   rN   astropy.constantsr   r   r   r	   r
   r   r   r   r   astropy.units.utilsr   r   r   r   r%   r   DecibelUnitmWr   MagUnitctDexUnitr(   r1   rA  r   kmrB   r   kpcr<  rF  rO   r7   r8   r9   r:   r;   r<   r   r>   RyrA   rC   degreehr   rI   rK   rR   rT   r'  r=  eVGHzkeVyrr$  JMeVrZ   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  r  r  r  r   r)  r+  r-  r3  r8  rE  rV  rY  r[  r`  rf  rk  rm  rt  ry  r~  	microgramgohmmicroOhmr   OhmmilliAngstromr  ro  Msunr   MearthRjuprp  M_pr  r  r  r  r  r  r  rQ   r)   r'   <module>r     s     " " " " " "            ) ) ) ) ) )                   G G G G G G G G G G G G G G , , , , , , 4 4 4 4 4 4 			ac	*	4	4	4acACi@	;	;	;QS!VD	*	*	*ACG4	6	6	6SA
fafQTD[))*
FAF139%%& ac3h
I	ad 3 34
!%
		!$*--.
!%
<	()!)AD136M*B*BC ( ) ( DDD ' ' ' '
AD'
FAF15147?QS0112' fafQUQT1W_qs2334' (	QTACZ(	'
 qtaczAE)*' ae+,' 	VQVC!#Iquax$@AAB' vqvb15j14/001' --.' 	616&13,//0' b' a' VQVAC$J''(' VQVAD4K(()' $112'  51334!'" Va667#'$ !*+%'& ''( !%)'* ai +', ai -'. AG/'0 161'2 EAEM"3'4 AG5'6 %!$,7'8 169': !%;'< !%='> ?'@ 18ac>"A'B C'D 14!#:E'F "$G'H cc!$a-(()I'J ##ac((K'L ##a.//0M'* *V W* *V    6# #7 6#E E E
L L L  ONNGacM	

 .)Wqs]r!	

  
 Gac2gR'!$(2	
 RQQEQS15[17*+	

 $%=> E1Hqz)*	
   FQUNQS 
	
   QSL148#aeRi/	
   UQWb[ 137*QUBY63>	
  
 Wqs]sagm45	
sAD DJ KD DJ   
 
$ $
 
$B B B B B B B B6- - - - -= - - -"1 1 1 1 1- 1 1 1$# # # # # # # # ! ! ! ! !} ! ! !8$1 $1 $1 $1 $1 $1 $1 $1N      B B BN N N
F F F
0 0 0> > > %   2C C3 2C /   8X X9 8X (T(T(TUU> > VU> OOO ; ;	 ;8 8 8! ! !* * *   	 	, ,	 	,
G G G& & &; ; ;* * *% % %( ( ($  0 #K#K#KLL& & ML& #K#K#KLL( ( ML(  C C C     $ *   < < <     dH%566E E 76 E
   
 
2 2
 
2
     ' ' '    *M M+ *M5 5 5L L L7 7 7  ,	!S		:&    	AK(	%q{3	QSR[)	4a!#g>	6ac	B	a(	8!#q&A	!136*	3QS"W=	)151		7D	aj)	)1:+=>	5qzB	=qzJ	q/		qu								7 @" "A @"
   
 
 
 

 $HII$ $ JI$
" " "
2 2 2   	 	/ /	 	/ #  
 
F F
 
F F Fr)   