U
    »mœ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 z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)ÚLowLevelCallableTFç       @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   úX/home/sam/Atlas/atlas_env/lib/python3.8/site-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voidpÚ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   ó    r(   c                   C   s   t  ¡ S r'   )r   Útest_get_plus1_capsuler   r   r   r   r(   C   r)   c                   C   s   t  td¡S )NZplus1_cython©r   Zfrom_cythonÚ_test_ccallback_cythonr   r   r   r   r(   D   r)   c                   C   s   t jS r'   )r,   Úplus1_ctypesr   r   r   r   r(   E   r)   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  ¡ S r'   )r   Ztest_get_plus1b_capsuler   r   r   r   r(   H   r)   c                   C   s   t  td¡S )NZplus1b_cythonr+   r   r   r   r   r(   I   r)   c                   C   s   t jS r'   )r,   Úplus1b_ctypesr   r   r   r   r(   J   r)   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  ¡ S r'   )r   Ztest_get_plus1bc_capsuler   r   r   r   r(   Q   r)   c                   C   s   t  td¡S )NZplus1bc_cythonr+   r   r   r   r   r(   R   r)   c                   C   s   t jS r'   )r,   Úplus1bc_ctypesr   r   r   r   r(   S   r)   c                   C   s   t tjdƒS )Nz1double (*)(double, double, double, int *, void *))r   r,   r1   r   r   r   r   r(   T   s   ÿ)Z
capsule_bcZ	cython_bcZ	ctypes_bcZcffi_bc)r   r   r0   c                  C   sN   dd„ } t t ¡ ƒD ]4}t t ¡ ƒD ]"}t t ¡ ƒD ]}| |||ƒ q4q$q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 r    r   ©Úx©r   r   r   r(   f   r)   z/test_callbacks.<locals>.check.<locals>.<lambda>ç      ð?r   g      @)	ÚCALLERSÚFUNCSÚ
USER_DATASr   r   r   Úassert_raisesr   r
   )Úcallerr   r   Úfunc2r   r4   r   Úcheck`   s    


ztest_callbacks.<locals>.check)Úsortedr6   Úkeysr7   r8   ©r<   r:   r   r   r   r   r   Útest_callbacks_   s
    r@   c                  C   sN   dd„ } t t ¡ ƒD ]4}t t ¡ ƒD ]"}t t ¡ ƒD ]}| |||ƒ q4q$qd S )Nc              
      sÈ   t |  } t| ƒ }tˆ  ƒ ‰ ˆ tkr2‡ fdd„}ntˆ |ƒ}tˆ ƒ‰ tt| tˆ ƒdƒ tt| |dƒ tˆ ƒ}z| |dƒ W nH tk
rÂ } z*t|ƒ}t|j	|k|ƒ td|k|ƒ W 5 d }~X Y nX d S )Nc                    s
   ˆ | dƒS r    r   r2   r4   r   r   r(   �   r)   z3test_bad_callbacks.<locals>.check.<locals>.<lambda>r5   z&double (double, double, int *, void *))
r6   r8   Ú	BAD_FUNCSr   r   r9   r   Ústrr   r   )r:   r   r   r;   ZllfuncÚerrÚmsgr   r4   r   r<   {   s     


z!test_bad_callbacks.<locals>.check)r=   r6   r>   rA   r8   r?   r   r   r   Útest_bad_callbacksz   s
    rE   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   r9   r   )r:   r   Z
llcallabler   r   r   Útest_signature_override›   s    rI   c                     s2   ‡ fdd„‰ ‡ fdd„} t  ¡ D ]}| |ƒ q d S )Nc                    s0   | dkrdS ˆ ‡‡ fdd„| d ƒ}d| S d S )Nr   r	   c                    s
   ˆ | ˆƒS r'   r   r2   ©Úcallbackr:   r   r   r(   ­   r)   z5test_threadsafety.<locals>.callback.<locals>.<lambda>é   r   )r   r:   Úres©rK   )r:   r   rK   ©   s    z#test_threadsafety.<locals>.callbackc                    sx   t ˆ  ‰ g ‰d‰‡‡ ‡‡fdd„‰‡fdd„tdƒD ƒ}|D ]}| ¡  q<|D ]}| ¡  qNtˆdˆ gt|ƒ ƒ d S )Né
   c                     s,   t  d¡ ˆ‡ ‡fdd„ˆƒ} ˆ | ¡ d S )Ng{®Gáz„?c                    s
   ˆ | ˆƒS r'   r   r2   rJ   r   r   r(   ¹   r)   z?test_threadsafety.<locals>.check.<locals>.run.<locals>.<lambda>)ÚtimeÚsleepÚappend)Úr)rK   r:   ÚcountÚresultsr   r   Úrun·   s    
z-test_threadsafety.<locals>.check.<locals>.runc                    s   g | ]}t jˆ d �‘qS ))Útarget)Ú	threadingÚThread)Ú.0Új)rV   r   r   Ú
<listcomp>¼   s     z4test_threadsafety.<locals>.check.<locals>.<listcomp>é   r   )r6   ÚrangeÚstartÚjoinr   Úlen)r:   ÚthreadsÚthreadrN   )r:   rT   rU   rV   r   r<   °   s    

z test_threadsafety.<locals>.check)r6   r>   )r<   r:   r   rN   r   Útest_threadsafety¨   s    rd   )N)$Znumpy.testingr   r   r   r   r9   rP   r   rX   Z
scipy._libr   r,   r   Zscipy._lib._ccallbackr   r   r   ÚImportErrorr
   r   r   r!   r#   rH   Ztest_call_nodataZtest_call_nonlocalZtest_call_cythonr6   r7   rA   Ztest_get_data_capsuler8   r@   rE   rI   rd   r   r   r   r   Ú<module>   s\   

	ü	öü	ý!