U
    ,d9                     @   s   d dl Z d dlZd dlmZ d dlm  m  m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  mZ d dlZe Zde_e Zee	jdG dd	 d	eZed
kre  dS )    N)jit)typeserrors)compile_isolatedFlags)TestCasetagTz4CFFI not supported -- please install the cffi modulec                   @   s   e Zd ZdZdd Zdd ZefddZdd	 Zd
d Z	dd Z
ef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*d+ Zd,S )-TestCFFIFc                 C   s   t   t   d S N)modinitZinit_oolself r   9/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_cffi.pysetUp   s    zTestCFFI.setUpc                 C   s>   t tjtj}| t|jd | |jd t	j
 d S )N   r   )cffi_supportZmap_typer   ffiZtypeofcffi_sinassertEquallenargsr   double)r   	signaturer   r   r   test_type_map    s    zTestCFFI.test_type_mapc                 C   s:   t |tjg|d}|j}dD ]}| |||| qd S )Nflags)g333333r   g?gQ	@)r   r   r   entry_pointZassertPreciseEqual)r   pyfuncr   crescfuncxr   r   r   _test_function%   s    zTestCFFI._test_functionc                 C   s   |  tj d S r
   )r$   r   use_cffi_sinr   r   r   r   test_sin_function,   s    zTestCFFI.test_sin_functionc                 C   s:   t j}t|dtd}|j}| | d | | d d S )Nr   r   T)r   Zuse_cffi_boolean_truer   no_pyobj_flagsr   r   )r   r    r!   r"   r   r   r   test_bool_function_ool/   s
    zTestCFFI.test_bool_function_oolc                 C   s   | j tjtd d S Nr   )r$   r   r%   r'   r   r   r   r   test_sin_function_npm6   s    zTestCFFI.test_sin_function_npmc                 C   s   |  tj d S r
   )r$   r   use_cffi_sin_ool)r   r   r   r   r   test_sin_function_ool9   s    zTestCFFI.test_sin_function_oolc                 C   s   | j tjtd d S r)   )r$   r   r+   r'   r   r   r   r   test_sin_function_npm_ool<   s    z"TestCFFI.test_sin_function_npm_oolc                 C   s   |  tj d S r
   )r$   r   Zuse_two_funcsr   r   r   r   test_two_funcs?   s    zTestCFFI.test_two_funcsc                 C   s   |  tj d S r
   )r$   r   Zuse_two_funcs_oolr   r   r   r   test_two_funcs_oolC   s    zTestCFFI.test_two_funcs_oolc                 C   s   t j}tdd|}t jt jdft jt jdft jt jdft jt jdft jt jdft jt jdft jt jdft jt jdft jt jdft jt jdft jt jdft jt jdffD ].\}}}||||}||||}| || q| t|j	d|j	 d S )NTZnopythong      ?g      r   )
r   Zuse_func_pointerr   r   Zcffi_cosZcffi_sin_oolZcffi_cos_oolr   r   Z	overloads)r   r    r"   faZfbr#   expectedgotr   r   r   test_function_pointerF   s&    zTestCFFI.test_function_pointerc                 C   s(   t j}tdd|}| | |  d S )NTr0   )r   Zuse_user_defined_symbolsr   r   )r   r    r"   r   r   r   test_user_defined_symbols\   s    z"TestCFFI.test_user_defined_symbolsc                 C   s"   ||| t j|t | d S r
   )nptestingassert_allclosesin)r   r"   r#   yr   r   r   check_vector_sina   s    
zTestCFFI.check_vector_sinc                 C   s:   t d|}t |}tdd|}| ||| d S )N
   Tr0   )r6   arangeastype
zeros_liker   r;   )r   r    dtyper#   r:   r"   r   r   r   _test_from_buffer_numpy_arraye   s    
z&TestCFFI._test_from_buffer_numpy_arrayc                 C   s   |  tjtj d S r
   )rA   r   vector_sin_float32r6   float32r   r   r   r   test_from_buffer_float32k   s    z!TestCFFI.test_from_buffer_float32c                 C   s   |  tjtj d S r
   )rA   r   Zvector_sin_float64r6   Zfloat64r   r   r   r   test_from_buffer_float64n   s    z!TestCFFI.test_from_buffer_float64c                 C   s   d}t |t |d |d d  }t |}tddtj}||| t j|j| tddtj	}||| t j|j
| d S )Nr<         y              ?Tr0   )r6   r=   zerosr   r   Zvector_extract_realr7   Zassert_equalrealZvector_extract_imagimag)r   nr#   r:   Z
real_cfuncZ
imag_cfuncr   r   r   test_from_buffer_structq   s    "


z TestCFFI.test_from_buffer_structc                 C   sL   t j}tdd|}tdtd}tddgt| }| ||| d S )NTr0   fr<   r   )r   rB   r   arrayranger   r;   )r   r    r"   r#   r:   r   r   r   test_from_buffer_pyarray|   s
    z!TestCFFI.test_from_buffer_pyarrayc              	   C   sr   t j}tdd|}tdtjd d d }t|}| t	j
}||| W 5 Q R X | dt|j d S )NTr0   r<   rF   z3from_buffer() unsupported on non-contiguous buffers)r   rB   r   r6   r=   r>   rC   r?   assertRaisesr   TypingErrorassertInstr	exception)r   r    r"   r#   r:   raisesr   r   r   test_from_buffer_error   s    
zTestCFFI.test_from_buffer_errorc              	   C   s>  t jddgdt jd}t |}t jddgddggdt jd}t |}t jddgdt jd}t |}t jddgddggdt jd}t |}|d}	tj}
td	d
|
}| ||| ||| t 	|}ddg|d< t j
|| | ||| | tj}||| W 5 Q R X t j
||	 | dt|j d S )Nr   rF   C)orderr@   rG      FKTr0   r   zAfrom_buffer() only supports multidimensional arrays with C layout)r6   rN   rC   r?   copyr   rB   r   r;   r9   r7   r8   rQ   r   rR   rS   rT   rU   )r   Zc1Zc1_zerosc2Zc2_zerosf1Zf1_zerosf2Zf2_zerosZf2_copyr    r"   Zsin_c2rV   r   r   r   "test_from_buffer_numpy_multi_array   s.    






z+TestCFFI.test_from_buffer_numpy_multi_arrayc                    s\   t jtddfdd tdd fdd}d}| ||||d   d	S )
zj
        Issue #2263

        Linkage error due to multiple definition of global tracking symbol.
        Tr0   c                    s    | S r
   r   r#   )my_sinr   r   inner   s    z2TestCFFI.test_indirect_multiple_use.<locals>.innerc                    s    | | d  S )Nr   r   rb   rd   rc   r   r   foo   s    z0TestCFFI.test_indirect_multiple_use.<locals>.foog+?r   N)r   r   r   r   )r   rf   r#   r   re   r   test_indirect_multiple_use   s    z#TestCFFI.test_indirect_multiple_useN)__name__
__module____qualname__Z_numba_parallel_test_r   r   enable_pyobj_flagsr$   r&   r(   r*   r,   r-   r.   r/   r4   r5   r;   rA   rD   rE   rL   rP   rW   ra   rg   r   r   r   r   r	      s,   r	   __main__) rN   Znumpyr6   Znumbar   Znumba.core.typing.cffi_utilscoretypingZ
cffi_utilsr   Z
numba.corer   r   Znumba.core.compilerr   r   Znumba.tests.supportr   r   Znumba.tests.cffi_usecasestestsZcffi_usecasesr   Zunittestrk   Zenable_pyobjectr'   Z
skipUnlessZ	SUPPORTEDr	   rh   mainr   r   r   r   <module>   s$    ,