a
    ߙfby*                     @   s>  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 dd Zejje
 ddG d	d
 d
Zejje
dddd Zejdejejfdgdd Zejdejejfdgdd Zejdejdgdd Zejdejejfdgdd Zejdejejfdgdd Zejdejejfdgdd Zdd  Zejdejejfdgd!d" Zejdejejfdgd#d$ Zejd%ejejfdgd&d' Zejdejejfdgd(d) Zejdejejfdgd*d+ Z ejdejejfdgd,d- Z!d.d/ Z"d0d1 Z#d2d3 Z$d4d5 Z%dS )6    N)units)Quantity)HAS_ANNOTATED	Annotatedc                  C   sR   t jt jtddd} dt j d }}| ||\}}||ksBJ ||ksNJ dS )ziTest annotations that are not unit related are ignored.

    This test passes if the function works.
    xyc                 S   s   | |fS N r   r
   r
   Llib/python3.9/site-packages/astropy/units/tests/test_quantity_annotations.pyfunc   s    z2test_ignore_generic_type_annotations.<locals>.func   cool stringN)uquantity_inputmstr)r   i_qi_stro_qo_strr
   r
   r   $test_ignore_generic_type_annotations   s    r   need `Annotated`reasonc                   @   s\   e Zd ZdZdd Zdd Zejje	 dddd	 Z
ejje	 ddd
d Zdd ZdS )TestQuantityUnitAnnotationsz$Test Quantity[Unit] type annotation.c                 C   s   t jtt j tddd}dt j d }}|||\}}||ksFJ ||ksRJ tt j  |dt j | W d    n1 s0    Y  ||ddi\}}||ksJ ||ksJ d S )	Nr   c                 S   s   | |fS r	   r
   r   r
   r
   r   r   &   s    z@TestQuantityUnitAnnotations.test_simple_annotation.<locals>.funcr   r      notza string)	r   r   r   r   r   pytestraises
UnitsErrors)selfr   r   r   r   r   r
   r
   r   test_simple_annotation%   s    .z2TestQuantityUnitAnnotations.test_simple_annotationc                 C   sT   t jtt j tt j ddd}dt j }||}||ks@J |jt jksPJ d S )N)areturnc                 S   s   | S r	   r
   )r$   r
   r
   r   
multi_func9   s    zHTestQuantityUnitAnnotations.test_multiple_annotation.<locals>.multi_funcr   )r   r   r   kmr   unit)r"   r&   r   r   r
   r
   r   test_multiple_annotation8   s    
z4TestQuantityUnitAnnotations.test_multiple_annotationr   r   c                 C   sz   t jdtjtt j  tt j ddd}dt j }||}|jt jksLJ ||ksXJ d }||}|dt j ksvJ d S )N)r   r%   c                 S   s   | d u rdt j S | S )Nr   )r   r'   r   r
   r
   r   opt_funcD   s    
zITestQuantityUnitAnnotations.test_optional_and_annotated.<locals>.opt_func   r   )N)r   r   TOptionalr   r   r'   r(   )r"   r+   r   r   r
   r
   r   test_optional_and_annotatedB   s    &
z7TestQuantityUnitAnnotations.test_optional_and_annotatedc                 C   s   t jtjtt j tt j d f ddd}dt j }||}|d| ksNJ dt j }||}|d| kspJ d }||}|d u sJ d S )Nr*   c                 S   s   | d u rd S d|  S d S )Nr   r
   r*   r
   r
   r   
union_funcV   s    zHTestQuantityUnitAnnotations.test_union_and_annotated.<locals>.union_funcr   r   )r   r   r-   Unionr   r   r!   )r"   r0   r   r   r
   r
   r   test_union_and_annotatedS   s    (

z4TestQuantityUnitAnnotations.test_union_and_annotatedc                 C   s:   t jtdd td  W d    n1 s,0    Y  d S )Nzunit annotation is not)matchzdefinitely not a unit)r   r   	TypeErrorr   )r"   r
   r
   r   test_not_unit_or_ptypei   s    z2TestQuantityUnitAnnotations.test_not_unit_or_ptypeN)__name__
__module____qualname____doc__r#   r)   r   markskipifr   r/   r2   r5   r
   r
   r
   r   r   !   s   


r   zrequires py3.8 behaviorc                  C   sF   t t ttj } W d   n1 s*0    Y  | tjksBJ dS )zm
    Same as above test, but different behavior for python 3.8 b/c it passes
    Quantity right through.
    N)r   ZwarnsWarningr   r   r'   )Zannotr
   r
   r   r5   n   s    (r5   zsolarx_unit,solary_unit)angler=   c                 C   sp   t j| |ddd}|dt j dt j \}}t|ts>J t|tsLJ |jt jks\J |jt jkslJ d S )Nsolarxsolaryc                 S   s   | |fS r	   r
   r>   r
   r
   r   myfunc_args~   s    ztest_args3.<locals>.myfunc_argsr   )r   r   arcsec
isinstancer   r(   solarx_unitsolary_unitrA   r?   r@   r
   r
   r   
test_args3z   s    rG   c                 C   sr   t  | |ddd}|dt j dt j \}}t|ts@J t|tsNJ |jt jks^J |jt jksnJ d S )Nr>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA      s    z)test_args_noconvert3.<locals>.myfunc_argsr   )r   r   degZarcminrC   r   r(   rD   r
   r
   r   test_args_noconvert3   s    rI   rE   r=   c                 C   sX   t j| ddd}|dt j d\}}t|ts6J t|tsDJ |jt jksTJ d S )Nr?   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA      s    z+test_args_nonquantity3.<locals>.myfunc_argsr   d   )r   r   rB   rC   r   intr(   )rE   rA   r?   r@   r
   r
   r   test_args_nonquantity3   s    rM   )r=   energyc                 C   sz   t jt  d| |ddd}|dt j dt j \}}t|tsHJ t|tsVJ |jt jksfJ |jt jksvJ d S )NZequivalenciesr>   c                 S   s   | |dt j  fS N
   r   Jr>   r
   r
   r   rA      s    z,test_arg_equivalencies3.<locals>.myfunc_argsr   rK   )r   r   mass_energyrB   gramrC   r   r(   rD   r
   r
   r   test_arg_equivalencies3   s    rV   c                 C   s   t j| |ddd}tt j*}|dt j dt j \}}W d    n1 sR0    Y  t|}t|jd| dks~J d S )Nr>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA      s    z%test_wrong_unit3.<locals>.myfunc_argsr   rK   MArgument 'solary' to function 'myfunc_args' must be in units convertible to ''.)	r   r   r   r   r    rB   r'   r   valuerE   rF   rA   er?   r@   Zstr_tor
   r
   r   test_wrong_unit3   s    8r\   c                 C   sj   t j| |ddd}tt$}|dt j d\}}W d    n1 sJ0    Y  t|jdksfJ d S )Nr>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA      s    z'test_not_quantity3.<locals>.myfunc_argsr   rK   tArgument 'solary' to function 'myfunc_args' has no 'unit' attribute. You should pass in an astropy Quantity instead.)r   r   r   r   r4   rB   r   rY   rE   rF   rA   r[   r?   r@   r
   r
   r   test_not_quantity3   s
    2r_   c                  C   s|   t jt jdt jt jddd} | dt j dt j \}}t|tsJJ t|tsXJ |jt jkshJ |jt jksxJ d S )NrJ   r>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA      s    z,test_decorator_override.<locals>.myfunc_argsr   )r   r   rB   r'   rC   r   r(   )rA   r?   r@   r
   r
   r   test_decorator_override   s    r`   c                 C   s~   t jdt j f| |ddd}|dt j ddt j d\}}}t|tsNJ t|ts\J t|tsjJ |jt jkszJ d S )Nr   r?   mykc                 S   s
   | ||fS r	   r
   )r?   r@   rb   r
   r
   r   rA      s    z!test_kwargs3.<locals>.myfunc_argsrK   )rb   r   r   rB   rH   rC   r   rL   r(   )rE   rF   rA   r?   r@   rb   r
   r
   r   test_kwargs3   s     rd   c                 C   s   t jdt j df| |ddd}|dt j ddt j dd\}}}}t|tsTJ t|tsbJ t|tspJ t|ts~J |jt jksJ |dksJ d S )	Nr   i  ra   c                 S   s   | |||fS r	   r
   )r?   r@   rb   myk2r
   r
   r   rA      s    z(test_unused_kwargs3.<locals>.myfunc_argsrK   rQ   )rb   re   rc   )rE   rF   rA   r?   r@   rb   re   r
   r
   r   test_unused_kwargs3   s    $rf   zsolarx_unit,energyc                 C   s   t jt  ddt j f| |ddd}|dt j dt j \}}t|tsRJ t|ts`J |jt jkspJ |jt jksJ d S )NrO   rQ   r?   rN   c                 S   s   | |dt j  fS rP   rR   rg   r
   r
   r   rA     s    z.test_kwarg_equivalencies3.<locals>.myfunc_argsr   rK   )	r   r   rT   eVrB   rU   rC   r   r(   )rE   rN   rA   r?   r
   r
   r   test_kwarg_equivalencies3
  s    ri   c                 C   s   t jdt j f| |ddd}tt j,}|dt j dt j d\}}W d    n1 s^0    Y  t|}t|j	d| d	ksJ d S )
NrQ   r>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA     s    z+test_kwarg_wrong_unit3.<locals>.myfunc_argsr   rK   r@   rW   rX   )
r   r   rH   r   r   r    rB   r'   r   rY   rZ   r
   r
   r   test_kwarg_wrong_unit3  s    :rk   c                 C   sv   t jdt j f| |ddd}tt&}|dt j dd\}}W d    n1 sV0    Y  t|jdksrJ d S )	NrQ   r>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA   .  s    z-test_kwarg_not_quantity3.<locals>.myfunc_argsr   rK   rj   r]   )	r   r   rH   r   r   r4   rB   r   rY   r^   r
   r
   r   test_kwarg_not_quantity3*  s
    4rl   c                 C   s6   t jdt j f| |ddd}|dt j \}}d S )NrQ   r>   c                 S   s   | |fS r	   r
   r>   r
   r
   r   rA   ;  s    z(test_kwarg_default3.<locals>.myfunc_argsr   )r   r   rH   rB   rD   r
   r
   r   test_kwarg_default37  s    rm   c                  C   s<   t jt jt jddd} | dt j }|jt ju s8J d S )Nr?   r%   c                 S   s   | S r	   r
   rJ   r
   r
   r   rA   C  s    z+test_return_annotation.<locals>.myfunc_argsr   )r   r   rB   rH   r(   rA   r?   r
   r
   r   test_return_annotationB  s    rp   c                  C   s6   t jt jd ddd} | dt j }|d u s2J d S )Nrn   c                 S   s   d S r	   r
   rJ   r
   r
   r   rA   L  s    z0test_return_annotation_none.<locals>.myfunc_argsr   )r   r   rB   ro   r
   r
   r   test_return_annotation_noneK  s    rq   c                  C   s6   t jt jtddd} | dt j }|dks2J d S )Nrn   c                 S   s   dS )Nr   r
   rJ   r
   r
   r   rA   U  s    z3test_return_annotation_notUnit.<locals>.myfunc_argsr   r   )r   r   rB   rL   ro   r
   r
   r   test_return_annotation_notUnitT  s    rr   c                     sT   ddl m} m  G  fddd| }tj|tjd ddd}||jdtj  d S )	Nr   )Enumautoc                       s   e Zd Z  ZdS )z'test_enum_annotation.<locals>.BasicEnumN)r6   r7   r8   AnOptionr
   rt   r
   r   	BasicEnuma  s   rw   )r$   br%   c                 S   s   d S r	   r
   )r$   rx   r
   r
   r   rA   d  s    z)test_enum_annotation.<locals>.myfunc_argsr   )enumrs   rt   r   r   rB   ru   )rs   rw   rA   r
   rv   r   test_enum_annotation]  s
    rz   )&systypingr-   r   Zastropyr   r   Zastropy.unitsr   Zastropy.units._typingr   r   r   r:   r;   r   r5   ZparametrizerB   rG   rI   rM   rh   rV   rH   r\   r_   r`   rd   rf   ri   rk   rl   rm   rp   rq   rr   rz   r
   r
   r
   r   <module>   s   L

























			