U
    ,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re  dS )    N)compile_isolatedFlags)typeofnjit)typeslowering)TestCasec                 C   s   | r
d }nd}|S Ng333333? )xretr
   r
   =/tmp/pip-unpacked-wheel-eu7e0c37/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>   Z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&   Z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arangerM   )r#   r$   r&   rP   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
   )rT   Z
run_secondr   rU   r
   r   foo   s    

z1TestOptional.test_assign_to_optional.<locals>.foo{   F   TN)r   ZassertIsNonerM   )r#   rW   r
   rV   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   rM   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   rM   )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
   )maybeZlxr
   r
   r   rW      s    z9TestOptional.test_many_optional_none_returns.<locals>.fooc                     s"   g } t dD ]}d} |}qd S )Ni N  F)range)tmp_rc   rW   r
   r   work   s    z:TestOptional.test_many_optional_none_returns.<locals>.workN)r   )r#   rh   r
   rg   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@   rH   rN   rS   rZ   r\   ra   ri   r
   r
   r
   r   r   H   s    
r   __main__)r+   Z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   rj   mainr
   r
   r
   r   <module>   s    	 @