U
    iâËdõ  ã                   @   s¨   d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZ dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZedkr¤e ¡  dS )é    N)Úcompile_isolatedÚFlags)ÚtypeofÚnjit)ÚtypesÚlowering)ÚTestCasec                 C   s   | r
d }nd}|S ©Ng333333ó?© )ÚxÚretr
   r
   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_optional.pyÚreturn_double_or_none   s    r   c                 C   s   | rd S dS d S r	   r
   ©r   r
   r
   r   Úreturn_different_statement   s    r   c                 C   s.   |r
d}nd }| dkrdS | dkr&|S d S d S )NFé   Té   r
   )r   ÚyÚzr
   r
   r   Úreturn_bool_optional_or_none   s    r   c                 C   s2   | r
d }n| }|d kr| d S |d k	r.| d S d S ©Nr   r
   )r   Zval_or_noner
   r
   r   Úis_this_a_none+   s    r   c                 C   s   | |kS )z¼
    Note in nopython mode, this operation does not make much sense.
    Because we don't have objects anymore.
    `a is b` is always False if not operating on None and Optional type
    r
   ©ÚaÚbr
   r
   r   Úa_is_b8   s    r   c                 C   s   | |k	S )z 
    This is `not (a is b)`
    r
   r   r
   r
   r   Ú
a_is_not_bA   s    r   c                   @   sˆ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd S )!ÚTestOptionalFc                 C   s:   t }t|tjgƒ}|j}dD ]}|  ||ƒ||ƒ¡ qd S ©N)TF)r   r   r   ÚbooleanÚentry_pointÚassertPreciseEqual©ÚselfÚpyfuncÚcresÚcfuncÚvr
   r
   r   Útest_return_double_or_noneL   s
    z'TestOptional.test_return_double_or_nonec                 C   s:   t }t|tjgƒ}|j}dD ]}|  ||ƒ||ƒ¡ qd S r   )r   r   r   r   r    r!   r"   r
   r
   r   Útest_return_different_statementT   s
    z,TestOptional.test_return_different_statementc                 C   sN   t }t|tjtjgƒ}|j}t dd¡D ] \}}|  |||ƒ|||ƒ¡ q(d S )N)r   r   r   )r   r   )r   r   r   Úint32r    Ú	itertoolsÚproductr!   )r#   r$   r%   r&   r   r   r
   r
   r   Ú!test_return_bool_optional_or_none\   s
    z.TestOptional.test_return_bool_optional_or_nonec                 C   s:   t }t|tjgƒ}|j}dD ]}|  ||ƒ||ƒ¡ qd S )N©éÿÿÿÿr   r   r   )r   r   r   Úintpr    r!   r"   r
   r
   r   Útest_is_this_a_noned   s
    z TestOptional.test_is_this_a_nonec                 C   sV   t }tƒ }d|_t|tjg|d�}|j}|  |j¡ dD ]}|  	||ƒ||ƒ¡ q8d S )NT)Úflagsr.   )
r   r   Zforce_pyobjectr   r   r0   r    Ú
assertTrueZ
objectmoder!   )r#   r$   r2   r%   r&   r'   r
   r
   r   Útest_is_this_a_none_objmodel   s    z(TestOptional.test_is_this_a_none_objmodec                 C   s@   t }t|tjtjgƒ}|j}|  |ddƒ¡ |  |ddƒ¡ d S ©Nr   r   )r   r   r   r0   r    r3   ÚassertFalse©r#   r$   r%   r&   r
   r
   r   Útest_a_is_b_intpv   s
    zTestOptional.test_a_is_b_intpc                 C   s@   t }t|tjtjgƒ}|j}|  |ddƒ¡ |  |ddƒ¡ d S r5   )r   r   r   r0   r    r6   r3   r7   r
   r
   r   Útest_a_is_not_b_intp~   s
    z!TestOptional.test_a_is_not_b_intpc                 C   sH   dd„ }t dƒ|ƒ}|  |ddƒ|ddƒ¡ |  |dd ƒ|dd ƒ¡ d S )Nc                 S   s   |d kr| S | | S d S ©Nr
   ©r   r   r
   r
   r   r$   ‡   s    z0TestOptional.test_optional_float.<locals>.pyfuncz(float64, optional(float64))ç      ð?çš™™™™™(@)r   ÚassertAlmostEqual©r#   r$   r&   r
   r
   r   Útest_optional_float†   s    z TestOptional.test_optional_floatc                 C   sp   dd„ }t dƒ|ƒ}tjdgtjd�}| ¡ }|  |d|ƒ|d|ƒ¡ tj ||¡ |  |dd ƒ|dd ƒ¡ d S )Nc                 S   s(   |d kr| S |d  | 7  < |d S d S ©Nr   r
   r;   r
   r
   r   r$   ’   s    z0TestOptional.test_optional_array.<locals>.pyfuncz(float32, optional(float32[:]))r=   ©Zdtyper<   )r   ÚnpÚarrayZfloat32Úcopyr>   ÚtestingZassert_almost_equal)r#   r$   r&   ÚcyÚpyr
   r
   r   Útest_optional_array‘   s    z TestOptional.test_optional_arrayc              	   C   sn   dd„ }t dƒ|ƒ}|  t¡�}|d ƒ W 5 Q R X |  dt|jƒ¡ tjdgtjd�}|  	||ƒ||ƒ¡ d S )Nc                 S   s   | d S rA   r
   )r   r
   r
   r   r$   ¡   s    z6TestOptional.test_optional_array_error.<locals>.pyfuncz(optional(int32[:]),)z&expected array(int32, 1d, A), got NoneiÍ«  rB   )
r   ÚassertRaisesÚ	TypeErrorZassertInÚstrÚ	exceptionrC   rD   r*   ÚassertEqual)r#   r$   r&   Úraisedr   r
   r
   r   Útest_optional_array_error    s    ÿz&TestOptional.test_optional_array_errorc                 C   s6   dd„ }t |ƒ}t d¡}|  ||dƒ||dƒ¡ dS )zC
        Check that we can access attribute of an optional
        c                 S   s   d }|r| }|j d S rA   )Úshape)ÚarrZdo_itÚoptr
   r
   r   r$   ±   s    z:TestOptional.test_optional_array_attribute.<locals>.pyfuncé   TN)r   rC   ZarangerN   )r#   r$   r&   rR   r
   r
   r   Útest_optional_array_attribute­   s    
z*TestOptional.test_optional_array_attributec                    sB   t dd„ ƒ‰ t ‡ fdd„ƒ}|  |ddƒ¡ |  |ddƒd¡ d	S )
zI
        Check that we can assign to a variable of optional type
        c                 S   s   |r
d }n| }|S r:   r
   )ÚvalZget_noner   r
   r
   r   Úmake_optional¿   s    z;TestOptional.test_assign_to_optional.<locals>.make_optionalc                    s   ˆ | dƒ}|rˆ | dƒ}|S )NTFr
   )rV   Z
run_secondr   ©rW   r
   r   ÚfooÇ   s    

z1TestOptional.test_assign_to_optional.<locals>.fooé{   Féç   TN)r   ZassertIsNonerN   )r#   rY   r
   rX   r   Útest_assign_to_optional»   s    
z$TestOptional.test_assign_to_optionalc                 C   s:   ddd„}t |ƒ}|  |ƒ |ƒ ¡ |  |dƒ|dƒ¡ dS )z
        Issue 1868
        Nc                 S   s   | d krd} | S r   r
   r   r
   r
   r   r$   Ö   s    z;TestOptional.test_optional_thru_omitted_arg.<locals>.pyfuncé   )N)r   rN   r?   r
   r
   r   Útest_optional_thru_omitted_argÑ   s    
z+TestOptional.test_optional_thru_omitted_argc                 C   sb   dd„ }t  t jgd ¡}t  |¡}|f}t|ƒ|ƒ}|  |dƒ|dƒ¡ |  |dƒ|dƒ¡ dS )z
        Issue 2171
        c                 S   s    | d krd S | \}}||fS d S r:   r
   )r   r   r   r
   r
   r   r$   ã   s    z1TestOptional.test_optional_unpack.<locals>.pyfuncr   N)r   r   )r   ÚTupler0   ÚOptionalr   rN   )r#   r$   ÚtupZopt_tupÚsigr&   r
   r
   r   Útest_optional_unpackß   s    
z!TestOptional.test_optional_unpackc                    s"   t dd„ ƒ‰ ‡ fdd„}|ƒ  dS )z
        Issue #4058
        c                 S   s   d }| rd}d|fS )Né
   r   r
   )ÚmaybeÚlxr
   r
   r   rY   õ   s    z9TestOptional.test_many_optional_none_returns.<locals>.fooc                     s"   g } t dƒD ]}d}ˆ |ƒ}qd S )Ni N  F)Úrange)ÚtmpÚ_re   ©rY   r
   r   Úworkü   s    z:TestOptional.test_many_optional_none_returns.<locals>.workN)r   )r#   rk   r
   rj   r   Útest_many_optional_none_returnsñ   s    
z,TestOptional.test_many_optional_none_returnsN)Ú__name__Ú
__module__Ú__qualname__Z_numba_parallel_test_r(   r)   r-   r1   r4   r8   r9   r@   rI   rP   rU   r\   r^   rc   rl   r
   r
   r
   r   r   H   s    
r   Ú__main__)r+   ÚnumpyrC   ZunittestZnumba.core.compilerr   r   Znumbar   r   Z
numba.corer   r   Znumba.tests.supportr   r   r   r   r   r   r   r   rm   Úmainr
   r
   r
   r   Ú<module>   s    	 @