U
    iâË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rÊe ¡  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   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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||ƒ}	|||ƒ}
|  |	|
¡ q¦d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   Ú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