o
    0 i'                     @   s   d dl Z d dlZd dlmZ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  mZ d dlZddiZddiZeG dd	 d	eZed
krUe  dS dS )    N)jitnjit)typeserrors)TestCaseskip_unless_cffiZforceobjTnopythonc                   @   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   a/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/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ffi ||}dD ]}| |||| qd S )N)g333333r   g?gQ	@)r   r   r   ZassertPreciseEqual)r   pyfuncflagscfuncxr   r   r   _test_function"   s   zTestCFFI._test_functionc                 C      |  tj d S r
   )r!   r   use_cffi_sinr   r   r   r   test_sin_function(      zTestCFFI.test_sin_functionc                 C   s2   t j}td|}| | d | | d d S )Nr   T)r   Zuse_cffi_boolean_truer   r   r   r   r   r   r   r   test_bool_function_ool+   s   zTestCFFI.test_bool_function_oolc                 C      | j tjtd d S N)r   )r!   r   r#   no_pyobj_flagsr   r   r   r   test_sin_function_npm1      zTestCFFI.test_sin_function_npmc                 C   r"   r
   )r!   r   use_cffi_sin_ool)r   r   r   r   r   test_sin_function_ool4   r%   zTestCFFI.test_sin_function_oolc                 C   r(   r)   )r!   r   r-   r*   r   r   r   r   test_sin_function_npm_ool7   r,   z"TestCFFI.test_sin_function_npm_oolc                 C   r"   r
   )r!   r   Zuse_two_funcsr   r   r   r   test_two_funcs:   s   zTestCFFI.test_two_funcsc                 C   r"   r
   )r!   r   Zuse_two_funcs_oolr   r   r   r   test_two_funcs_ool>   r%   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 ]\}}}||||}||||}| || qT| t|j	d|j	 d S )NTr   g      ?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_pointerA   s&   zTestCFFI.test_function_pointerc                 C   s(   t j}tdd|}| | |  d S )NTr2   )r   Zuse_user_defined_symbolsr   r   r&   r   r   r   test_user_defined_symbolsW   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_sin\   s   
zTestCFFI.check_vector_sinc                 C   s:   t d|}t |}tdd|}| ||| d S )N
   Tr2   )r8   arangeastype
zeros_liker   r=   )r   r   dtyper    r<   r   r   r   r   _test_from_buffer_numpy_array`   s   
z&TestCFFI._test_from_buffer_numpy_arrayc                 C      |  tjtj d S r
   )rC   r   vector_sin_float32r8   float32r   r   r   r   test_from_buffer_float32f   r,   z!TestCFFI.test_from_buffer_float32c                 C   rD   r
   )rC   r   Zvector_sin_float64r8   Zfloat64r   r   r   r   test_from_buffer_float64i   r,   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              ?Tr2   )r8   r?   Zzerosr   r   Zvector_extract_realr9   Zassert_equalrealZvector_extract_imagimag)r   nr    r<   Z
real_cfuncZ
imag_cfuncr   r   r   test_from_buffer_structl   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 )NTr2   fr>   r   )r   rE   r   arrayranger   r=   )r   r   r   r    r<   r   r   r   test_from_buffer_pyarrayw   s
   z!TestCFFI.test_from_buffer_pyarrayc                 C   s   t j}tdd|}tdtjd d d }t|}| t	j
}||| W d    n1 s3w   Y  | dt|j d S )NTr2   r>   rI   z3from_buffer() unsupported on non-contiguous buffers)r   rE   r   r8   r?   r@   rF   rA   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   sR  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 d    n1 sw   Y  t j
||	 | dt|j d S )Nr   rI   C)orderrB   rJ      FKTr2   r   zAfrom_buffer() only supports multidimensional arrays with C layout)r8   rP   rF   rA   copyr   rE   r   r=   r;   r9   r:   rS   r   rT   rU   rV   rW   )r   c1Zc1_zerosc2Zc2_zerosf1Zf1_zerosf2Zf2_zerosZf2_copyr   r   Zsin_c2rX   r   r   r   "test_from_buffer_numpy_multi_array   s0   






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.
        Tr2   c                    s    | S r
   r   r    )my_sinr   r   inner   s   z2TestCFFI.test_indirect_multiple_use.<locals>.innerc                    s    | | d  S )Nr   r   re   rg   rf   r   r   foo   s   z0TestCFFI.test_indirect_multiple_use.<locals>.foog+?r   N)r   r   r   r   )r   ri   r    r   rh   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/   r0   r1   r6   r7   r=   rC   rG   rH   rN   rR   rY   rd   rj   r   r   r   r   r	      s.    r	   __main__)rP   numpyr8   Znumbar   r   Znumba.core.typing.cffi_utilscoretypingZ
cffi_utilsr   Z
numba.corer   r   Znumba.tests.supportr   r   Znumba.tests.cffi_usecasestestsZcffi_usecasesr   Zunittestrn   r*   r	   rk   mainr   r   r   r   <module>   s      *