o
    Ebk                  
   @   sP  d dl mZmZ d dlmZ d dlZd dlZd dlZd dlZd dl	m
Z d dl	mZ d dlmZ zd dlZdZW n eyC   dZY nw d	Zd,d
dZdd Zdd Zdd ZejejejejdZdd dd dd dd dd dd dd dd dd d	Zdd dd d d d!d d"Zeeejd#Zd$d% Z d&d' Z!d(d) Z"d*d+ Z#dS )-    )assert_equalassert_)raisesN)_ccallback_c)_test_ccallback)LowLevelCallableTF       @c                 C   s(   | t krtd|d u r| d S | | S )Nz	bad value   )ERROR_VALUE
ValueError)a	user_data r   A/usr/lib/python3/dist-packages/scipy/_lib/tests/test_ccallback.pycallback_python   s
   r   c                 C   s:   t std t| tj}|j}t }|||}|S )Ncffi not installed)		HAVE_CFFIpytestskipctypescastZc_void_pvaluecffiFFI)base	signatureZvoidpZaddressffifuncr   r   r   _get_cffi_func   s   
r   c                  C   s   t d} t t | t jS Nr   )r   Zc_doubler   ZpointerZc_voidp)r   r   r   r   _get_ctypes_data-   s   
r    c                  C   s"   t std t } | ddS )Nr   zdouble *r   )r   r   r   r   r   new)r   r   r   r   _get_cffi_data2   s   
r"   )simpleZnodatanonlocalcythonc                   C   s   t S N)r   r   r   r   r   <lambda>B   s    r'   c                   C      t  S r&   )r   test_get_plus1_capsuler   r   r   r   r'   C       c                   C      t tdS )NZplus1_cythonr   Zfrom_cython_test_ccallback_cythonr   r   r   r   r'   D       c                   C      t jS r&   )r-   plus1_ctypesr   r   r   r   r'   E       c                   C      t tjdS )Nz!double (*)(double, int *, void *))r   r-   r0   r   r   r   r   r'   F       c                   C   r(   r&   )r   Ztest_get_plus1b_capsuler   r   r   r   r'   H   r*   c                   C   r+   )NZplus1b_cythonr,   r   r   r   r   r'   I   r.   c                   C   r/   r&   )r-   plus1b_ctypesr   r   r   r   r'   J   r1   c                   C   r2   )Nz)double (*)(double, double, int *, void *))r   r-   r4   r   r   r   r   r'   K   r3   )	Zpythoncapsuler%   r   r   Z	capsule_bZcython_bZctypes_bZcffi_bc                   C   r(   r&   )r   Ztest_get_plus1bc_capsuler   r   r   r   r'   Q   r*   c                   C   r+   )NZplus1bc_cythonr,   r   r   r   r   r'   R   r.   c                   C   r/   r&   )r-   plus1bc_ctypesr   r   r   r   r'   S   r1   c                   C   r2   )Nz1double (*)(double, double, double, int *, void *))r   r-   r6   r   r   r   r   r'   T   r3   )Z
capsule_bcZ	cython_bcZ	ctypes_bcZcffi_bc)r   r   r5   c                  C   N   dd } t t D ]}t t D ]}t t D ]}| ||| qqq
d S )Nc                    sv   t |  } t    t|  } tu r fdd}n	t |}t  t|  dd tt|  t t| |dd d S )Nc                    
    | dS r   r   xr   r   r   r'   f      
 z/test_callbacks.<locals>.check.<locals>.<lambda>      ?r   g      @)	CALLERSFUNCS
USER_DATASr   r   r   assert_raisesr   r
   )callerr   r   func2r   r;   r   check`   s   


ztest_callbacks.<locals>.check)sortedr>   keysr?   r@   rD   rB   r   r   r   r   r   test_callbacks_   s   rH   c                  C   r7   )Nc              
      s   t |  } t|  }t     tu r fdd}n	t |}t  tt| t d tt| |d t }z| |d W d S  tyd } zt|}t|j	|v | td|v | W Y d }~d S d }~ww )Nc                    r8   r   r   r9   r;   r   r   r'      r<   z3test_bad_callbacks.<locals>.check.<locals>.<lambda>r=   z&double (double, double, int *, void *))
r>   r@   	BAD_FUNCSr   r   rA   r   strr   r   )rB   r   r   rC   Zllfuncerrmsgr   r;   r   rD   {   s$   


z!test_bad_callbacks.<locals>.check)rE   r>   rF   rI   r@   rG   r   r   r   test_bad_callbacksz   s   rM   c                  C   s`   t j} t  }t|dd}t|jd tt| |d t|dd}t|jd t| |dd d S )Nzbad signature)r      zdouble (double, int *, void *)   )r   test_call_simpler)   r   r   r   rA   r   )rB   r   Z
llcallabler   r   r   test_signature_override   s   rQ   c                     s2    fdd  fdd} t  D ]}| | qd S )Nc                    s,   | dkrdS   fdd| d }d| S )Nr   r	   c                    
    | S r&   r   r9   callbackrB   r   r   r'      r<   z5test_threadsafety.<locals>.callback.<locals>.<lambda>   r   )r   rB   resrT   )rB   r   rT      s   z#test_threadsafety.<locals>.callbackc                    sx   t    g d fddfddtdD }|D ]}|  q|D ]}|  q'td gt|  d S )N
   c                     s,   t d  fdd} |  d S )Ng{Gz?c                    rR   r&   r   r9   rS   r   r   r'      r<   z?test_threadsafety.<locals>.check.<locals>.run.<locals>.<lambda>)timesleepappend)r)rT   rB   countresultsr   r   run   s   
z-test_threadsafety.<locals>.check.<locals>.runc                    s   g | ]}t j d qS ))target)	threadingZThread).0j)r_   r   r   
<listcomp>   s    z4test_threadsafety.<locals>.check.<locals>.<listcomp>   r   )r>   rangestartjoinr   len)rB   ZthreadsthreadrW   )rB   r]   r^   r_   r   rD      s   

z test_threadsafety.<locals>.check)r>   rF   )rD   rB   r   rW   r   test_threadsafety   s
   
rk   r&   )$Znumpy.testingr   r   r   r   rA   rY   r   ra   Z
scipy._libr   r-   r   Zscipy._lib._ccallbackr   r   r   ImportErrorr
   r   r   r    r"   rP   Ztest_call_nodataZtest_call_nonlocalZtest_call_cythonr>   r?   rI   Ztest_get_data_capsuler@   rH   rM   rQ   rk   r   r   r   r   <module>   s`    
			!