U
    ,d	!                     @   s   d dl mZ d dlZd dlmZmZmZ d dlZd dlZd dl	m
Z
mZmZ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lZdd	 Zd
d Zdd Zdd ZG dd deeZedkre  dS )    )partialN)chainproductstarmap)jit	literallynjittypeofTypingError)utilstypes)TestCaseMemoryLeakMixin)_header_leadc                 C   s   | j | j| jfS N)startstopstep)sl r   ;/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_slices.pyslice_passing   s    r   c                  G   s   t |  }|j|j|jfS r   )slicer   r   r   )argsr   r   r   r   slice_constructor   s    r   c                 C   s   t |  }|| S r   )r   )r   lr   r   r   r   slice_construct_and_use   s    r   c                 G   s
   | j | S r   )indices)sZindargsr   r   r   slice_indices   s    r   c                   @   s\   e 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S )
TestSlicesc              	      s
   fdd}t j}| d }tddt dddg}d	|fd
dg}ddg}t|||D ](\\}}\}	}
\}}|||	|||
| qZd	|fddg}d	|fd
dg}ddg}t|||D ](\\}}\}	}
\}}|||	|||
| qt  tddd W 5 Q R X d	S )zC
        Check passing a slice object to a Numba function.
        c                    s*   t | ||} |}||||f d S r   )r   assertPreciseEqual)abcdefr   gotcfuncselfr   r   check$   s    z,TestSlices.test_slice_passing.<locals>.check   TZnopython)Nr   )*   r/   )r0   N)	   r1   )r2   Nr-   )   r4   )r5   g      ?)	sysmaxsizer   r   	itertoolsr   assertRaises	TypeErrorr   )r+   r,   	maxposint	maxnegintZstart_casesZ
stop_casesZ
step_casesr"   r%   r#   r&   r$   r'   r   r)   r   test_slice_passing   s,    

zTestSlices.test_slice_passingc                 C   s   t j}| d }td}tddt}tddt}dd|dffddd|dffd	d|dffd
ddd|dffddd|dffdd||dffdd|dffd|ddffdfD ]<\}}|| }| || t||}	|||}
| |	|
 qdS )zQ
        Test the 'happy path' for slice() constructor in nopython mode.
        r-   
   Tr.   r   r   ))   )r   r?   r-   )NN)r-   N))N   )r   r@   r-   ))r-   r@   )r-   r@   r-   )NN   rA   ))Nr@   rA   )r   r@   rA   )r-   NrA   )r-   r@   rA   rB   )NNr0   r0   )r>   Nr0   )Nr?   r0   r?   )r>   r?   r0   rC   N)r6   r7   nparanger   r   r   r!   )r+   r;   r<   r"   r*   Z	cfunc_user   expectedr(   usageZcusager   r   r   test_slice_constructorC   s2    



z!TestSlices.test_slice_constructorc           
         sb  d t  fddtdD }td}tddt}|   |D ]}zt||}W n tk
r } zvt	|}| 
t|d| | t}||| W 5 Q R X | tt|j | d	d
d |D t|j W 5 d}~X Y qD tk
rH }	 z>| t|	}||| W 5 Q R X | t|	t|j W 5 d}	~	X Y qDX | |||| qDdS )zW
        Test that slice constructor behaves same in python and compiled code.
        )Nr0   r   r-   c                 3   s   | ]}t  |d V  qdS ))repeatN)r   ).0noptionsr   r   	<genexpr>g   s    z:TestSlices.test_slice_constructor_cases.<locals>.<genexpr>r?   r>   Tr.   z7slice expected at (most|least) (3|1) arguments?, got {}z, c                 s   s   | ]}t t|V  qd S r   )strr	   )rJ   argr   r   r   rN      s     N)r   from_iterablerangerD   rE   r   r   Zdisable_leak_checkr:   lenZassertRegexpMatchesrO   formatr9   r
   assertInr   	exceptionjoin	Exceptiontyper!   )
r+   Z	arg_casesarrayr*   r   rF   Z	py_type_eZn_argsnumba_epy_er   rL   r   test_slice_constructor_casesb   sH    

z'TestSlices.test_slice_constructor_casesc           	      C   s   t ttttdddttdddttddd}tdd}tddt}t||D ]\}}zt||}W n\ tk
r } z>| t	|}||| W 5 Q R X | 
t|t|j W 5 d}~X Y qXX | |||| qXdS )	zITest that a numba slice returns same result for .indices as a python one.r?   r   rA   Tr.   N)r   r   r   r   rR   r   r   rX   r9   rY   rU   rO   rV   r!   )	r+   sliceslengthsr*   r   r   rF   r\   r[   r   r   r   test_slice_indices   s*    
zTestSlices.test_slice_indicesc              	   C   s   t ddt}| t}|tdddd W 5 Q R X | dt|j | t}|tdddd	 W 5 Q R X | d
td	 t|j dS )zTests for specific error cases.Tr.   Nr-   r@   rA   z.indices() takes exactly one argument (3 given)r   g333333?z/'%s' object cannot be interpreted as an integer)	r   r   r9   r
   r   rU   rO   rV   r	   )r+   Zcslice_indicesr&   r   r   r   test_slice_indices_examples   s    
z&TestSlices.test_slice_indices_examplesc              	      sh   d t d dddgd dddgd ddddgD ]6t tdd fd	d
}| | |  q,d S )N)r-   r@   rA      r-   r@   rA   r0   r_   Tr.   c                      s     S r   r   r   Z
test_tupletsr   r   test_fn   s    z4TestSlices.test_slice_from_constant.<locals>.test_fn)r8   r   r   r   assertEqualZpy_func)r+   rg   r   re   r   test_slice_from_constant   s    
 
 z#TestSlices.test_slice_from_constantc                 C   sX   t jtdd d }t jtd d d }t jtdd d }| || | || d S r3   )r   miscZSliceLiteralr   ZassertNotEqualrh   )r+   Zsl1Zsl2Zsl3r   r   r   test_literal_slice_distinct   s
    z&TestSlices.test_literal_slice_distinctc                 C   st   t dd }tdddtddtdtd ddtdd dtd d dtd td d d f}|D ]}| ||| qZd S )Nc                 S   s   t | S r   r   )xr   r   r   r'      s    z/TestSlices.test_literal_slice_boxing.<locals>.fr-   rd   r@   )r   r   rh   )r+   r'   r`   r   r   r   r   test_literal_slice_boxing   s    






z$TestSlices.test_literal_slice_boxingc                    s.   t ddd t fdd}|  |  d S )Nr-   r@   rA   c                      s    S r   r   r   zr   r   foo   s    z2TestSlices.test_literal_slice_freevar.<locals>.foo)r   r   rh   )r+   rq   r   ro   r   test_literal_slice_freevar   s    z%TestSlices.test_literal_slice_freevarc              	   C   sX   t  dd }td}| t}|td d | d  W 5 Q R X | dt|j d S )Nc                 S   s   t | S r   rl   ro   r   r   r   rq      s    z1TestSlices.test_literal_slice_maxint.<locals>.fool            r-   zInt value is too large)r   intr9   
ValueErrorr   rU   rO   rV   )r+   rq   maxvalr&   r   r   r   test_literal_slice_maxint   s    
 z$TestSlices.test_literal_slice_maxintN)__name__
__module____qualname__r=   rH   r]   rb   rc   ri   rk   rn   rr   rv   r   r   r   r   r       s   $-
r    __main__)	functoolsr   r8   r   r   r   r6   ZnumpyrD   Znumbar   r   r   r	   r
   Z
numba.corer   r   Znumba.tests.supportr   r   Znumba.core.types.functionsr   Zunittestr   r   r   r   r    rw   mainr   r   r   r   <module>   s"    f