U
    ,dC                     @   sX  d Z ddlZddlmZ ddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZ G d	d
 d
eZG dd deZG dd deeZG dd deZdddddddddddddddd d!d"d#d$d%d&gZdddddddddddddddd d!d"d'd(d)d*d&gZd+d,d-d.d/d0d1gZd2d3d4d5d6d7d8d9gZG d:d; d;eZed<krTe  dS )=z1
Test helper functions from numba.numpy_support.
    N)product)types)NumbaNotImplementedError)TestCase)ShakeRequestError)numpy_supportc                   @   sD   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S )TestFromDtypec              	      s  t j  fdd}|dtj |dtj |dtj |dtj |dtj |dtj |d	tj |d
tj |dtj |dtj |dtj	 |dtj	 |dtj
 |dtj
 |dtj |dtj |dtj |dtj |dtj |dtj |dtj |dtj |dtj |dtj dD ]"} t|tt| q8tjdkrldnd}dD ]}t t||  qtd S )!zX
        Test from_dtype() and as_dtype() with the various scalar number types.
        c                    sJ   t | } ||  t d|  | |t| d S )N=)npdtypeassertIsassertEqualr   as_dtype)Ztypechar
numba_typer   fself B/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_numpy_support.pycheck   s    
z.TestFromDtype.test_number_types.<locals>.check?r   Zf4dZf8FZc8DZc16Obi1Bu1hi2Hu2ii4IZu4qQ)
int8uint8int16uint16int32uint32int64uint64intpuintplittle><ZhHiIlLqQfdFDN)r   
from_dtyper   bool_float32float64	complex64
complex128Zpyobjectr)   r*   r+   r,   r-   r.   r/   r0   r   r   r   getattrsys	byteorderassertRaisesr   )r   r   nameZforeign_alignletterr   r   r   test_number_types   sB     zTestFromDtype.test_number_typesc                    s@    fdd}|dt d |dt d |dt d d	S )
zS
        Test from_dtype() and as_dtype() with the character string types.
        c                    s2   t | } t||  |t| d S N)r   r   r   r   r6   r   )Z
typestringr   r   r   r   r   r   N   s    
z.TestFromDtype.test_string_types.<locals>.checkZS10
   Za11   ZU12   N)r   CharSeqZUnicodeCharSeq)r   r   r   rD   r   test_string_typesJ   s    zTestFromDtype.test_string_typesc                    s&    fdd}|t ||dd d S )Nc                    sL   t | } ||  |j|  t ||   t ||  d S rC   )r   r6   r   Z	unit_coder   )r   r   codetprD   r   r   r   Y   s
    
z1TestFromDtype.check_datetime_types.<locals>.check    )r   r   )r   rA   Znb_classr   r   rD   r   check_datetime_typesX   s    z"TestFromDtype.check_datetime_typesc                 C   s   |  dtj dS )zK
        Test from_dtype() and as_dtype() with the datetime types.
        MN)rN   r   
NPDatetimerD   r   r   r   test_datetime_typesc   s    z!TestFromDtype.test_datetime_typesc                 C   s   |  dtj dS )zL
        Test from_dtype() and as_dtype() with the timedelta types.
        mN)rN   r   NPTimedeltarD   r   r   r   test_timedelta_typesi   s    z"TestFromDtype.test_timedelta_typesc                    s    fdd}t dt jfdt jfg}||tjdd d ftjdd d fddd	d
 t jdt jfdt jfgdd}||tjdd d ftjdd d fdddd
 t dt jfdg}||tjdd d ftddd d fddd	d
 d S )Nc                    sT   t | } |tj  |j|   |j|  |j|  |j	| d S rC   )
r   r6   ZassertIsInstancer   ZRecordr   r   fieldssizealigned)r   rU   rV   rW   rK   rD   r   r   r   p   s    
z.TestFromDtype.test_struct_types.<locals>.checkar   r      )rX   r      F)rU   rV   rW   T)Zalign      rR   )nZS5   )rR   r]   	   )r   r   r+   r-   r   rH   )r   r   r   r   rD   r   test_struct_typeso   s2    	   zTestFromDtype.test_struct_typesc                    sp    fdd}t jt jt jt jg}ttg}t||D ]\}}|||tj	 q2t||D ]\}}|||tj
 qTd S )Nc                    s8   t | }t|}|||}t|} || d S rC   )r   r   r   r6   r   r   )Z	base_instZenum_defZ
type_classZnp_dtZnb_tyinstZ	recoveredrD   r   r   r      s
    



z+TestFromDtype.test_enum_type.<locals>.check)r   r9   r-   r;   r7   r   r   r   r   Z
EnumMemberZIntEnumMember)r   r   Zdtsenumsdtenumr   rD   r   test_enum_type   s    zTestFromDtype.test_enum_typeN)
__name__
__module____qualname__rB   rI   rN   rQ   rT   r`   re   r   r   r   r   r	      s   5r	   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ValueTypingTestBasezL
    Common tests for the typing of values.  Also used by test_special.
    c                 C   s   |}|  |dtjtjf |  |dtjtjf |  |dtjtjf | |dtj | |dtj | |dtj | |dtj dD ]&}tt	| }| ||tt| qd	S )
z;
        Test *func*() with scalar numeric values.
           ii   g      ?y              ?TF)r)   r*   r+   r,   r-   r.   r/   r0   ZintcZuintcr1   r2   r8   r9   r:   r;   r7   N)
assertInr   r-   r/   r   r9   r;   r7   r<   r   )r   funcr   r@   valr   r   r   check_number_values   s    z'ValueTypingTestBase.check_number_valuesc                 C   sB   |}dD ]4}|r|d|}n|d}||}|  ||| qd S )N)rL   YrO   r   r    rR   smsusnsZpsfsas   ZNat)r   )r   rl   Znp_typeZnb_typer   unittrK   r   r   r   _base_check_datetime_values   s    z/ValueTypingTestBase._base_check_datetime_valuesc                 C   s   |  |tjtj dS )z:
        Test *func*() with np.datetime64 values.
        N)ry   r   
datetime64r   rP   r   rl   r   r   r   check_datetime_values   s    z)ValueTypingTestBase.check_datetime_valuesc                 C   s   |  |tjtj dS )z;
        Test *func*() with np.timedelta64 values.
        N)ry   r   timedelta64r   rS   r{   r   r   r   check_timedelta_values   s    
z*ValueTypingTestBase.check_timedelta_valuesN)rf   rg   rh   __doc__rn   ry   r|   r~   r   r   r   r   ri      s
   ri   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestArrayScalarsc                 C   s   |  tj dS )zH
        Test map_arrayscalar_type() with scalar number values.
        N)rn   r   map_arrayscalar_typerD   r   r   r   test_number_values   s    z#TestArrayScalars.test_number_valuesc              	   C   s>   t j}| | tdd}| t || W 5 Q R X dS )zH
        Test map_arrayscalar_type() with np.datetime64 values.
        Z201410YN)r   r   r|   r   rz   r?   NotImplementedErrorr   r   rx   r   r   r   test_datetime_values   s
    
z%TestArrayScalars.test_datetime_valuesc              	   C   s>   t j}| | tdd}| t || W 5 Q R X dS )zI
        Test map_arrayscalar_type() with np.timedelta64 values.
        rE   r   N)r   r   r~   r   r}   r?   r   r   r   r   r   test_timedelta_values   s
    
z&TestArrayScalars.test_timedelta_valuesN)rf   rg   rh   r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZ dd ZdS )	FakeUFunc)ninnoutr   ntypesz
fake ufuncc                 C   s~   || _ | j d d\}}t|| _t|| _t|| _|D ]<}| j d d\}}t|| jksftt|| jks<tq<d S )Nr   z->)r   splitlenr   r   r   AssertionError)r   r   Zin_outrK   r   r   r   __init__   s    


zFakeUFunc.__init__N)rf   rg   rh   	__slots__r   r   r   r   r   r      s   r   ??->?bb->bBB->Bzhh->hzHH->Hii->izII->Ill->lLL->Lqq->qQQ->Qzee->eff->fdd->dzgg->gFF->FDD->DzGG->GMm->Mmm->mmM->MzOO->Omq->mzqm->mmd->mdm->mze->?zf->?d->?zg->?zF->?zD->?zG->?ze->ezf->fd->dzg->gzF->FzD->DzG->GzO->Oc                   @   s    e Zd ZdZdd Zdd ZdS )
TestUFuncsz
    Test ufunc helpers.
    c           	         s   t jtt}tt}tt}tt}dfdd	 d  fdd	}fdd}||tjtjfd ||tj	tj	fd	 ||tj
tj
fd
 ||tjtjfd ||tjtjfd ||tjtjfd ||tjtjfd ||tjtjfd ||tjtjfd ||tdtdfdtdfd ||tdtdfdtdfd ||tdtdfdtdfd ||tdtdfdtdfd ||tdtdfdtdfd ||tdtdfdtdfd ||tdtdfdtdfd ||tdtjfdtdfd ||tjtdfdtdfd  |tjtj	fd	  |tj
tjfd
  |tjtjfd  |tjtjfd  |tjtjfd tjtjtjtjg}|D ]N} |tj|fd  |tj|fd  |tj|fd  |tj|fd q|D ]"} ||fd  ||fd q8 |tdtjfdtdfd  |tdtjfdtdfd  |tdtjfdtdfd  |tjtdfdtdfd ||tdtdf ||tdtjf d S )!Nr   c              	      s    | || } | t|tr(|f}|j|d||||jf  t|jt|j t|j	t|j
 |s | t||j
 }|| n|j
t|  | |j|j
 }|| |S )z
            Check that ufunc_find_matching_loop() finds one of the given
            *sigs* for *ufunc*, *input_types* and optional *output_types*.
            z?inputs=%s and outputs=%s should have selected one of %s, got %s)
assertTrue
isinstancestrrk   Z	ufunc_sigr   r   Znumpy_inputsinputsZnumpy_outputsoutputslist)ufuncinput_typessigsoutput_typesloopZloop_explicitZloop_rtr   r   r   r      s$    


z7TestUFuncs.test_ufunc_find_matching_loop.<locals>.checkc                    s$    | |||} |jt| dS )zV
            Like check(), but also ensure no casting of inputs occurred.
            N)r   r   r   )r   r   r   r   r   )r   r   r   r   check_exact:  s    z=TestUFuncs.test_ufunc_find_matching_loop.<locals>.check_exactc                    s    | |} |d  d S rC   )r   )r   r   r   r   r   r   check_no_matchA  s    
z@TestUFuncs.test_ufunc_find_matching_loop.<locals>.check_no_matchr   r   r   )r   r   )r   r   r   r   r   r   rp   r   )r   rq   r   r   rL   rs   r   r   r   r   r   r   )r   )r   )r   Zufunc_find_matching_loopr   
_add_types
_mul_types_isnan_types_sqrt_typesr   r7   r)   r*   r/   r0   r8   r9   r:   r;   rS   rP   r+   r,   r-   r.   )	r   Znp_addZnp_mulZnp_isnanZnp_sqrtr   r   	int_typesZinttyr   )r   r   r   r   test_ufunc_find_matching_loop  s     
 
 
 
 
 
 
 
 
 
 
 
 
z(TestUFuncs.test_ufunc_find_matching_loopc                    sR   fdd}t d}|| ||d ||dj ||dd d d  ||d ||dj ||dd d d d df  ||djd d d d df  ||dd d d  ||djd d d d d d df  ||dd d dd d df  ||djd d d d dd d df  ||dd d dd d dd d df  ||djd d dd d dd d df  ||d	d d dd d dd d df  ||d	jd d d d dd d dd d df  ||d	d d d
d d dd d df  ||d	jd d d d dd d dd d d
f  d S )Nc                    s`   | j }| j}| jj}t|||}t|||}| jd }| jd } ||  || d S )NZC_CONTIGUOUSZF_CONTIGUOUS)	shapestridesr   itemsizer   Zis_contiguousZ
is_fortranflagsr   )arrZdimsr   r   Zis_cZis_fZexpect_cZexpect_frD   r   r   	check_arr  s    

z1TestUFuncs.test_layout_checker.<locals>.check_arr   )rv   r\   rY   )rY   rv   r[   rv   r[   )rY   rY   rv   rY   r^   )r   ZarangeZreshapeT)r   r   r   r   rD   r   test_layout_checker  s(    
 "("**,*2*zTestUFuncs.test_layout_checkerN)rf   rg   rh   r   r   r   r   r   r   r   r     s   pr   __main__)r   r=   	itertoolsr   Znumpyr   ZunittestZ
numba.corer   Znumba.core.errorsr   Znumba.tests.supportr   Znumba.tests.enum_usecasesr   r   Znumba.npr   r	   objectri   r   r   r   r   r   r   r   rf   mainr   r   r   r   <module>   sn    7                          !
