o
    1&id                     @   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 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rJe  dS dS )    N)jitnjit)types)TestCasec                 C   s   | rd }|S d}|S Ng333333? )xretr   r   DC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_optional.pyreturn_double_or_none   s
   r   c                 C   s   | r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 )NF   T   r   )r   yzr   r   r
   return_bool_optional_or_none   s   r   c                 C   s2   | rd }n| }|d u r| d S |d ur| d S d S Nr   r   )r   Zval_or_noner   r   r
   is_this_a_none*   s   r   c                 C   s   | |u 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_b7   s   r   c                 C   s   | |uS )z 
    This is `not (a is b)`
    r   r   r   r   r
   
a_is_not_b@   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   6   t }ttjf|}dD ]}| |||| qd S N)TF)r   r   r   booleanassertPreciseEqualselfpyfunccfuncvr   r   r
   test_return_double_or_noneK   
   z'TestOptional.test_return_double_or_nonec                 C   r   r   )r   r   r   r   r   r   r   r   r
   test_return_different_statementR   r%   z,TestOptional.test_return_different_statementc                 C   sJ   t }ttjtjf|}tddD ]\}}| |||||| qd S )N)r   r   r   )r   r   )r   r   r   int32	itertoolsproductr   )r    r!   r"   r   r   r   r   r
   !test_return_bool_optional_or_noneY   s
   z.TestOptional.test_return_bool_optional_or_nonec                 C   r   )Nr   r   r   )r   r   r   intpr   r   r   r   r
   test_is_this_a_none`   r%   z TestOptional.test_is_this_a_nonec                 C   sR   t }ttjfdd|}| |j|jd  j dD ]}| |||| qd S )NT)Zforceobjr   r+   )	r   r   r   r-   
assertTrueZ	overloadsZ
signaturesZ
objectmoder   r   r   r   r
   test_is_this_a_none_objmodeg   s   z(TestOptional.test_is_this_a_none_objmodec                 C   <   t }ttjtjf|}| |dd | |dd d S Nr   r   )r   r   r   r-   r/   assertFalser    r!   r"   r   r   r
   test_a_is_b_intpn      zTestOptional.test_a_is_b_intpc                 C   r1   r2   )r   r   r   r-   r3   r/   r4   r   r   r
   test_a_is_not_b_intpu   r6   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 u r| S | | S Nr   r   r   r   r   r
   r!   }   s   z0TestOptional.test_optional_float.<locals>.pyfuncz(float64, optional(float64))      ?皙(@)r   assertAlmostEqualr4   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 u r| S |d  | 7  < |d S Nr   r   r9   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   s   dd }t d|}| t}|d  W d    n1 sw   Y  | dt|j tjdgtjd}| 	|||| d S )Nc                 S   s   | d S r>   r   )r   r   r   r
   r!      s   z6TestOptional.test_optional_array_error.<locals>.pyfuncz(optional(int32[:]),)z&expected array(int32, 1d, A), got Noneiͫ  r?   )
r   assertRaises	TypeErrorZassertInstr	exceptionr@   rA   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 r>   )shape)arrZdo_itoptr   r   r
   r!      s   
z:TestOptional.test_optional_array_attribute.<locals>.pyfunc   TN)r   r@   ZarangerK   )r    r!   r"   rO   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 }|S | }|S r8   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   )rS   Z
run_secondr   rT   r   r
   foo   s   

z1TestOptional.test_assign_to_optional.<locals>.foo{   F   TN)r   ZassertIsNonerK   )r    rV   r   rU   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 u rd} | S r   r   r   r   r   r
   r!      s   z;TestOptional.test_optional_thru_omitted_arg.<locals>.pyfunc   r8   )r   rK   r4   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 u rd S | \}}||fS r8   r   )r   r   r   r   r   r
   r!      s   z1TestOptional.test_optional_unpack.<locals>.pyfuncr   N)r   r   )r   Tupler-   Optionalr   rK   )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
   rV      s   z9TestOptional.test_many_optional_none_returns.<locals>.fooc                     s"   g } t dD ]}d} |}qd S )Ni N  F)range)tmp_rb   rV   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*   r.   r0   r5   r7   r=   rF   rM   rR   rY   r[   r`   ri   r   r   r   r
   r   G   s"    r   __main__)r(   numpyr@   ZunittestZnumbar   r   Z
numba.corer   Znumba.tests.supportr   r   r   r   r   r   r   r   rj   mainr   r   r   r
   <module>   s"    	 7