3
Odk                 @   sR  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 yd dlZdZW n ek
r   dZY nX 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)LowLevelCallableTFg       @c             C   s,   | t krtd|d kr | d S | | S d S )Nz	bad value   )ERROR_VALUE
ValueError)a	user_data r   S/var/www/html/virt/lib64/python3.6/site-packages/scipy/_lib/tests/test_ccallback.pycallback_python   s
    r   c             C   s:   t stjd tj| tj}|j}tj }|j||}|S )Nzcffi not installed)		HAVE_CFFIpytestskipctypescastc_void_pvaluecffiFFI)base	signatureZvoidpaddressffifuncr   r   r   _get_cffi_func   s    
r   c              C   s   t jd} t jt j| t jS )Ng       @)r   c_doubler   pointerc_voidp)r   r   r   r   _get_ctypes_data-   s    
r"   c              C   s"   t stjd tj } | jddS )Nzcffi not installedzdouble *g       @)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   s   t j S )N)r   test_get_plus1_capsuler   r   r   r   r(   C   s    c               C   s   t jtdS )NZplus1_cython)r   from_cython_test_ccallback_cythonr   r   r   r   r(   D   s    c               C   s   t jS )N)r+   plus1_ctypesr   r   r   r   r(   E   s    c               C   s   t tjdS )Nz!double (*)(double, int *, void *))r   r+   r,   r   r   r   r   r(   F   s   c               C   s   t j S )N)r   Ztest_get_plus1b_capsuler   r   r   r   r(   H   s    c               C   s   t jtdS )NZplus1b_cython)r   r*   r+   r   r   r   r   r(   I   s    c               C   s   t jS )N)r+   plus1b_ctypesr   r   r   r   r(   J   s    c               C   s   t tjdS )Nz)double (*)(double, double, int *, void *))r   r+   r-   r   r   r   r   r(   K   s   )	pythoncapsuler'   r   r   Z	capsule_bZcython_bZctypes_bZcffi_bc               C   s   t j S )N)r   Ztest_get_plus1bc_capsuler   r   r   r   r(   Q   s    c               C   s   t jtdS )NZplus1bc_cython)r   r*   r+   r   r   r   r   r(   R   s    c               C   s   t jS )N)r+   plus1bc_ctypesr   r   r   r   r(   S   s    c               C   s   t tjdS )Nz1double (*)(double, double, double, int *, void *))r   r+   r0   r   r   r   r   r(   T   s   )Z
capsule_bcZ	cython_bcZ	ctypes_bcZcffi_bc)r   r   r/   c              C   sZ   dd } xLt tj D ]<}x6t tj D ]&}x t tj D ]}| ||| q:W q(W qW d S )Nc                sv   t |  } t    t|  } tkr2 fdd}nt |}t  t|  dd tt|  t t| |dd d S )Nc                s
    | dS )Ng       @r   )x)r   r   r   r(   f   s    z/test_callbacks.<locals>.check.<locals>.<lambda>g      ?g       @g      @)	CALLERSFUNCS
USER_DATASr   r   r   assert_raisesr
   r	   )callerr   r   func2r   )r   r   check`   s    


ztest_callbacks.<locals>.check)sortedr2   keysr3   r4   )r8   r6   r   r   r   r   r   test_callbacks_   s
    r;   c              C   sZ   dd } xLt tj D ]<}x6t tj D ]&}x t tj D ]}| ||| q:W q(W qW d S )Nc                s   t |  } t|  }t     tkr2 fdd}nt |}t  tt| t d tt| |d t }y| |d W nH tk
r } z,t|}t|j	|k| td|k| W Y d d }~X nX d S )Nc                s
    | dS )Ng       @r   )r1   )r   r   r   r(      s    z3test_bad_callbacks.<locals>.check.<locals>.<lambda>g      ?z&double (double, double, int *, void *))
r2   r4   	BAD_FUNCSr   r   r5   r
   strr   r   )r6   r   r   r7   Zllfuncerrmsgr   )r   r   r8   {   s     


z!test_bad_callbacks.<locals>.check)r9   r2   r:   r<   r4   )r8   r6   r   r   r   r   r   test_bad_callbacksz   s
    r@   c              C   s`   t j} t j }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   r5   r
   )r6   r   Z
llcallabler   r   r   test_signature_override   s    rD   c                 s6    fdd  fdd} xt j D ]}| | q"W d S )Nc                s0   | dkrdS   fdd| d }d| S d S )Nr   r   c                s
    | S )Nr   )r1   )callbackr6   r   r   r(      s    z5test_threadsafety.<locals>.callback.<locals>.<lambda>   r   )r   r6   res)rE   )r6   r   rE      s    z#test_threadsafety.<locals>.callbackc                s   t    g d fddfddtdD }x|D ]}|j  q>W x|D ]}|j  qTW td gt|  d S )N
   c                 s,   t jd  fdd} j|  d S )Ng{Gz?c                s
    | S )Nr   )r1   )rE   r6   r   r   r(      s    z?test_threadsafety.<locals>.check.<locals>.run.<locals>.<lambda>)timesleepappend)r)rE   r6   countresultsr   r   run   s    
z-test_threadsafety.<locals>.check.<locals>.runc                s   g | ]}t j d qS ))target)	threadingThread).0j)rO   r   r   
<listcomp>   s    z4test_threadsafety.<locals>.check.<locals>.<listcomp>   g       @)r2   rangestartjoinr   len)r6   threadsthread)rE   )r6   rM   rN   rO   r   r8      s    

z test_threadsafety.<locals>.check)r2   r:   )r8   r6   r   )rE   r   test_threadsafety   s    r]   )N)$Znumpy.testingr   r   r   r   r5   rI   r   rQ   Z
scipy._libr   r+   r   Zscipy._lib._ccallbackr   r   r   ImportErrorr	   r   r   r"   r$   rC   Ztest_call_nodataZtest_call_nonlocalZtest_call_cythonr2   r3   r<   Ztest_get_data_capsuler4   r;   r@   rD   r]   r   r   r   r   <module>   sT   

	

!