B
     \9                 @   s   d dl mZmZ d dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ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re  dS )    )print_functionabsolute_importN)compile_isolatedFlags)typestypeofnjit)lowering   )TestCasec             C   s   | r
d }nd}|S )Ng333333? )xretr   r   8lib/python3.7/site-packages/numba/tests/test_optional.pyreturn_double_or_none   s    r   c             C   s   | rd S dS d S )Ng333333?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   Tr
   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_b:   s    r   c             C   s   | |k	S )z 
    This is `not (a is b)`
    r   )r   r   r   r   r   
a_is_not_bC   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S )TestOptionalFc             C   s>   t }t|tjg}|j}x dD ]}| |||| qW d S )N)TF)r   r   r   booleanentry_pointassertPreciseEqual)selfpyfunccrescfuncvr   r   r   test_return_double_or_noneN   s
    
z'TestOptional.test_return_double_or_nonec             C   s>   t }t|tjg}|j}x dD ]}| |||| qW d S )N)TF)r   r   r   r   r   r   )r   r    r!   r"   r#   r   r   r   test_return_different_statementV   s
    
z,TestOptional.test_return_different_statementc             C   sR   t }t|tjtjg}|j}x0tddD ] \}}| |||||| q*W 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}x dD ]}| |||| qW d S )N)r   r
   r   )r   r   r   intpr   r   )r   r    r!   r"   r#   r   r   r   test_is_this_a_nonef   s
    
z TestOptional.test_is_this_a_nonec             C   s^   t }t }|d t|tjg|d}|j}| |j x dD ]}| 	|||| q>W d S )NZforce_pyobject)flags)r*   r   r
   r   )
r   r   setr   r   r+   r   
assertTrueZ
objectmoder   )r   r    r-   r!   r"   r#   r   r   r   test_is_this_a_none_objmoden   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   r+   r   r/   assertFalse)r   r    r!   r"   r   r   r   test_a_is_b_intpx   s
    zTestOptional.test_a_is_b_intpc             C   s@   t }t|tjtjg}|j}| |dd | |dd d S )Nr
   r   )r   r   r   r+   r   r1   r/   )r   r    r!   r"   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))g      ?g(@)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   r       s    z0TestOptional.test_optional_array.<locals>.pyfuncz(float32, optional(float32[:]))g(@)dtypeg      ?)r   nparrayZfloat32copyr4   ZtestingZassert_almost_equal)r   r    r"   Zcypyr   r   r   test_optional_array   s    z TestOptional.test_optional_arrayc          	   C   sn   dd }t d|}| t}|d  W d Q R X | dt|j tjdgtjd}| 	|||| d S )Nc             S   s   | d S )Nr   r   )r   r   r   r   r       s    z6TestOptional.test_optional_array_error.<locals>.pyfuncz(optional(int32[:]),)z&expected array(int32, 1d, A), got Noneiͫ  )r6   )
r   ZassertRaises	TypeErrorZassertInstrZ	exceptionr7   r8   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 )Nr   )shape)arrZdo_itZoptr   r   r   r       s    z:TestOptional.test_optional_array_attribute.<locals>.pyfunc   TN)r   r7   Zaranger>   )r   r    r"   rA   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 )Nr   )valZget_noner   r   r   r   make_optional   s    z;TestOptional.test_assign_to_optional.<locals>.make_optionalc                s    | d}|r | d}|S )NTFr   )rD   Z
run_secondr   )rE   r   r   foo   s    

z1TestOptional.test_assign_to_optional.<locals>.foo{   F   TN)r   ZassertIsNoner>   )r   rF   r   )rE   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 )Nr
   r   )r   r   r   r   r       s    z;TestOptional.test_optional_thru_omitted_arg.<locals>.pyfunc   )N)r   r>   )r   r    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 )Nr   )r   r   r   r   r   r   r       s    z1TestOptional.test_optional_unpack.<locals>.pyfuncr   N)r
   r   )r   ZTupler+   ZOptionalr   r>   )r   r    tupZopt_tupZsigr"   r   r   r   test_optional_unpack   s    
z!TestOptional.test_optional_unpackN)__name__
__module____qualname__Z_numba_parallel_test_r$   r%   r)   r,   r0   r2   r3   r5   r;   r?   rC   rI   rK   rM   r   r   r   r   r   J   s   
r   __main__)Z
__future__r   r   r'   Znumpyr7   Znumba.unittest_supportZunittest_supportZunittestZnumba.compilerr   r   Znumbar   r   r   r	   Zsupportr   r   r   r   r   r   r   r   rN   mainr   r   r   r   <module>   s"   	 +