
    ܙd                         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 Zd Zd Zd	 Zd
 Zd Z G d de          Zedk    r ej                     dS dS )    N)compile_isolatedFlags)typeofnjit)typeslowering)TestCasec                     | rd }nd}|S Ng333333? )xrets     9lib/python3.11/site-packages/numba/tests/test_optional.pyreturn_double_or_noner      s     J    c                     | rd S dS r   r   r   s    r   return_different_statementr      s     tsr   c                 4    |rd}nd }| dk    rdS | dk    r|S d S )NF   T   r   )r   yzs      r   return_bool_optional_or_noner      s9     Avvt	
a tr   c                 0    | rd }n| }|| dz
  S || dz   S d S Nr   r   )r   val_or_nones     r   is_this_a_noner   +   s<     1u1u r   c                 
    | |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bs     r   a_is_br#   8   s     6Mr   c                 
    | |uS )z 
    This is `not (a is b)`
    r   r    s     r   
a_is_not_br%   A   s     A:r   c                   l    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd ZdS )TestOptionalFc                     t           }t          |t          j        g          }|j        }dD ]*}|                      ||           ||                     +d S N)TF)r   r   r   booleanentry_pointassertPreciseEqualselfpyfunccrescfuncvs        r   test_return_double_or_nonez'TestOptional.test_return_double_or_noneL   sd    &88  	9 	9A##FF1IIuuQxx8888	9 	9r   c                     t           }t          |t          j        g          }|j        }dD ]*}|                      ||           ||                     +d S r)   )r   r   r   r*   r+   r,   r-   s        r   test_return_different_statementz,TestOptional.test_return_different_statementT   sd    +88  	9 	9A##FF1IIuuQxx8888	9 	9r   c                     t           }t          |t          j        t          j        g          }|j        }t          j        dd          D ]/\  }}|                      |||           |||                     0d S )N)r   r   r   )r   r   )r   r   r   int32r+   	itertoolsproductr,   )r.   r/   r0   r1   r   r   s         r   !test_return_bool_optional_or_nonez.TestOptional.test_return_bool_optional_or_none\   s~    -ek(BCC %i88 	? 	?DAq##FF1aLL%%1++>>>>	? 	?r   c                     t           }t          |t          j        g          }|j        }dD ]*}|                      ||           ||                     +d S )Nr   r   r   )r   r   r   intpr+   r,   r-   s        r   test_is_this_a_nonez TestOptional.test_is_this_a_noned   sd    55  	9 	9A##FF1IIuuQxx8888	9 	9r   c                    t           }t                      }d|_        t          |t          j        g|          }|j        }|                     |j                   dD ]*}| 	                     ||           ||                     +d S )NT)flagsr<   )
r   r   force_pyobjectr   r   r>   r+   
assertTrue
objectmoder,   )r.   r/   rA   r0   r1   r2   s         r   test_is_this_a_none_objmodez(TestOptional.test_is_this_a_none_objmodel   s    #EBBB ((( 	9 	9A##FF1IIuuQxx8888	9 	9r   c                     t           }t          |t          j        t          j        g          }|j        }|                      |dd                     |                      |dd                     d S Nr   r   )r#   r   r   r>   r+   rC   assertFalser.   r/   r0   r1   s       r   test_a_is_b_intpzTestOptional.test_a_is_b_intpv   sg    UZ(@AA a$$$q!%%%%%r   c                     t           }t          |t          j        t          j        g          }|j        }|                      |dd                     |                      |dd                     d S rG   )r%   r   r   r>   r+   rH   rC   rI   s       r   test_a_is_not_b_intpz!TestOptional.test_a_is_not_b_intp~   sg    UZ(@AA q!%%%a$$$$$r   c                     d } t          d          |          }|                      |dd           |dd                     |                      |dd            |dd                      d S )Nc                     || S | |z   S Nr   r   r   s     r   r/   z0TestOptional.test_optional_float.<locals>.pyfunc   s    y1ur   z(float64, optional(float64))      ?皙(@)r   assertAlmostEqualr.   r/   r1   s      r   test_optional_floatz TestOptional.test_optional_float   s    	 	 	 5344V<<vvb$//r4AAAvvb$//r4AAAAAr   c                    d } t          d          |          }t          j        dgt          j                  }|                                }|                      |d|           |d|                     t          j                            ||           |                      |dd            |dd                      d S )Nc                 :    || S |dxx         | z  cc<   |d         S Nr   r   rP   s     r   r/   z0TestOptional.test_optional_array.<locals>.pyfunc   s*    y!	tr   z(float32, optional(float32[:]))rR   dtyperQ   )r   nparrayfloat32copyrS   testingassert_almost_equal)r.   r/   r1   cypys        r   test_optional_arrayz TestOptional.test_optional_array   s    	 	 	 8677??XtfBJ///WWYYvvb"~~uuR}}===

&&r2...vvb$//r4AAAAAr   c                    d } t          d          |          }|                     t                    5 } |d            d d d            n# 1 swxY w Y   |                     dt	          |j                             t          j        dgt          j                  }| 	                     ||           ||                     d S )Nc                     | d         S rX   r   )r   s    r   r/   z6TestOptional.test_optional_array_error.<locals>.pyfunc   s    Q4Kr   z(optional(int32[:]),)z&expected array(int32, 1d, A), got Noneiͫ  rY   )
r   assertRaises	TypeErrorassertInstr	exceptionr[   r\   r7   assertEqual)r.   r/   r1   raisedr   s        r   test_optional_array_errorz&TestOptional.test_optional_array_error   s   	 	 	 .,--f55y)) 	VE$KKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	>&*++	- 	- 	- HfXRX...q66!99-----s   AAAc                     d }t          |          }t          j        d          }|                      ||d           ||d                     dS )zC
        Check that we can access attribute of an optional
        c                 (    d }|r| }|j         d         S rX   )shape)arrdo_itopts      r   r/   z:TestOptional.test_optional_array_attribute.<locals>.pyfunc   s     C 9Q<r      TN)r   r[   arangerk   )r.   r/   r1   rq   s       r   test_optional_array_attributez*TestOptional.test_optional_array_attribute   s_    	  	  	  VillT**EE#t,<,<=====r   c                     t           d             t           fd            }|                      |dd                     |                      |dd          d           dS )zI
        Check that we can assign to a variable of optional type
        c                     |rd }n| }|S rO   r   )valget_noner   s      r   make_optionalz;TestOptional.test_assign_to_optional.<locals>.make_optional   s     Jr   c                 <     | d          }|r | d          }|S )NTFr   )ry   
run_secondr!   r{   s      r   fooz1TestOptional.test_assign_to_optional.<locals>.foo   s2    c4((A .!M#u--Hr   {   F   TN)r   assertIsNonerk   )r.   r~   r{   s     @r   test_assign_to_optionalz$TestOptional.test_assign_to_optional   s     
	 	 
	 
	 	 	 	 
	 	##c5//***S$-----r   c                     dd}t          |          }|                      |             |                       |                      |d           |d                     dS )z
        Issue 1868
        Nc                     | d} | S r   r   r   s    r   r/   z;TestOptional.test_optional_thru_omitted_arg.<locals>.pyfunc   s    yHr      rO   )r   rk   rT   s      r   test_optional_thru_omitted_argz+TestOptional.test_optional_thru_omitted_arg   sq    
	 	 	 	
 V5577+++EE!HH-----r   c                 N   d }t          j        t           j        gdz            }t          j        |          }|f} t	          |          |          }|                      |d           |d                     |                      |d           |d                     dS )z
        Issue 2171
        c                     | d S | \  }}||fS rO   r   )r   r!   r"   s      r   r/   z1TestOptional.test_optional_unpack.<locals>.pyfunc   s    y1!tr   r   N)r   r   )r   Tupler>   Optionalr   rk   )r.   r/   tupopt_tupsigr1   s         r   test_optional_unpackz!TestOptional.test_optional_unpack   s    	 	 	 k5:,*++.%%jS		&!!uuT{{333v77777r   c                 F    t           d             fd} |             dS )z
        Issue #4058
        c                     d }| rd}d|fS )N
   r   r   )maybelxs     r   r~   z9TestOptional.test_many_optional_none_returns.<locals>.foo   s    B b5Lr   c                  J    g } t          d          D ]}d} |          }d S )Ni N  F)range)tmp_r   r~   s      r   workz:TestOptional.test_many_optional_none_returns.<locals>.work   s;    C5\\  CJJ r   N)r   )r.   r   r~   s     @r   test_many_optional_none_returnsz,TestOptional.test_many_optional_none_returns   sH     
	 	 
		 	 	 	 	 	r   N)__name__
__module____qualname___numba_parallel_test_r3   r5   r:   r?   rE   rJ   rL   rU   rc   rm   rv   r   r   r   r   r   r   r   r'   r'   H   s       !9 9 99 9 9? ? ?9 9 99 9 9& & &% % %	B 	B 	BB B B. . .> > >. . .,. . .8 8 8$    r   r'   __main__)r8   numpyr[   unittestnumba.core.compilerr   r   numbar   r   
numba.corer   r   numba.tests.supportr	   r   r   r   r   r#   r%   r'   r   mainr   r   r   <module>r      s3            7 7 7 7 7 7 7 7         & & & & & & & & ( ( ( ( ( (       
 
 
    | | | | |8 | | |~ zHMOOOOO r   