U
    e                     @   s   d dl Z d dlZd dlZd dl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 G dd dejZG dd deZG d	d
 d
ejZG dd dejZdS )    N)IS_PYPY   )utilc                   @   s   e Zd ZeddddgZejdd	ddd	 Z
ejjed
ddd Zdd Zejjejdkdddd Zejjejdkdddd Zdd Zdd ZdS )TestF77Callbacktestssrccallbackzfoo.fnamezt,t2,c                 C   s   |  | d S N)check_function)selfr	    r   _/var/www/html/assets/scripts/venv/lib/python3.8/site-packages/numpy/f2py/tests/test_callback.pytest_all   s    zTestF77Callback.test_allz,PyPy cannot modify tp_doc after PyType_Ready)reasonc                 C   s    t d}| jjj|kstd S )Na          a = t(fun,[fun_extra_args])

        Wrapper for ``t``.

        Parameters
        ----------
        fun : call-back function

        Other Parameters
        ----------------
        fun_extra_args : input tuple, optional
            Default: ()

        Returns
        -------
        a : int

        Notes
        -----
        Call-back functions::

            def fun(): return a
            Return objects:
                a : int
        )textwrapdedentmodulet__doc__AssertionError)r   expectedr   r   r   test_docstring   s    
zTestF77Callback.test_docstringc                 C   sL  t | j|}|dd }|dks$t|dd dd}|dks@t|dd dd}|d	ks\t|d
d dd}|dksxt|dd tjfd}|dkst|tjtjfd}|dkst|| jjdd}|dkst|| jj}|dkst|| jjj}|dkstG dd d}| }||}|dks0t||j	}|dksHtd S )Nc                   S   s   dS )N   r   r   r   r   r   <lambda>6       z0TestF77Callback.check_function.<locals>.<lambda>r   c                 S   s   dS N   r   ar   r   r   r   8   r   )   )Zfun_extra_argsr   c                 S   s   | S r   r   r   r   r   r   r   :   r   r!   c                 S   s   d|  S r   r   r   r   r   r   r   <   r   )      c                 S   s
   t | S r   )mathdegreesr   r   r   r   r   >   r            c                   @   s   e Zd Zdd Zdd ZdS )z)TestF77Callback.check_function.<locals>.Ac                 S   s   dS )Nr"   r   r   r   r   r   __call__K   s    z2TestF77Callback.check_function.<locals>.A.__call__c                 S   s   dS )N	   r   r)   r   r   r   mthN   s    z-TestF77Callback.check_function.<locals>.A.mthN)__name__
__module____qualname__r*   r,   r   r   r   r   AJ   s   r0   r"   r+   )
getattrr   r   r$   pir%   funcZfunc0Z	_cpointerr,   )r   r	   r   rr0   r    r   r   r   r   4   s2    
zTestF77Callback.check_functionwin32z)Fails with MinGW64 Gfortran (Issue #9673)c                 C   s,   dd }t | jd}||}|dks(td S )Nc                 S   s   | dkrdS dS d S )Nr4   r   r   r   )coder   r   r   r   Z   s    z6TestF77Callback.test_string_callback.<locals>.callbackZstring_callbackr   )r1   r   r   )r   r   fr4   r   r   r   test_string_callbackW   s    z$TestF77Callback.test_string_callbackc                 C   sh   t dd}t dd}t dgd}dd }t| jd}|||fD ]}||||j}|d	ksDtqDd S )
N)r   S8)r      c c                 S   s4   | j |fkrdS | jdkrdS t| dks0dS dS )Nr   r9      r      r   )shapedtypenpall)cuZlencur   r   r   r   l   s    
z<TestF77Callback.test_string_callback_array.<locals>.callbackZstring_callback_arrayr   )rA   Zzerosarrayr1   r   sizer   )r   Zcu1Zcu2Zcu3r   r7   rC   resr   r   r   test_string_callback_arrayd   s    	z*TestF77Callback.test_string_callback_arrayc                    sp   g fdd  fddfdddD }|D ]}|   q6|D ]}|  qHdrltd S )	Nc                     s*   t d  jdd } | dks&tdS )NgMbP?c                   S   s   dS N{   r   r   r   r   r   r      r   z?TestF77Callback.test_threadsafety.<locals>.cb.<locals>.<lambda>rI   *   )timesleepr   r   r   )r4   r)   r   r   cb   s    
z-TestF77Callback.test_threadsafety.<locals>.cbc                    s\   z4t dD ]&}j }|dks&t|  q
W n" tk
rV   t  Y nX d S )N2   rJ   )	ranger   r   r   r   	Exceptionappend	traceback
format_exc)r	   jr4   )rM   errorsr   r   r   runner   s    z1TestF77Callback.test_threadsafety.<locals>.runnerc                    s*   g | ]"}t d D ]}tj |fdqqS )   )targetargs)rO   	threadingThread).0argn)rV   r   r   
<listcomp>   s    
 z5TestF77Callback.test_threadsafety.<locals>.<listcomp>)r   t2z

)startjoinr   )r   threadsr   r   )rM   rU   rV   r   r   test_threadsafetyz   s    	



z!TestF77Callback.test_threadsafetyc              
   C   sj  z| j d W n4 tk
rD } zt|ds4tW 5 d }~X Y nX z| j d W n4 tk
r } zt|dsztW 5 d }~X Y nX dd | j _| j d}|dkstdd | j _| j d}|dkst| j `z| j d W n8 tk
r" } zt|dstW 5 d }~X Y nX dd
d| j _| j d}|dksLt| j d}|dksftd S )Nr=   zCallback global_f not definedz!cb: Callback global_f not definedc                 S   s   | d S )Nr   r   xr   r   r   r      r   z6TestF77Callback.test_hidden_callback.<locals>.<lambda>r>   c                 S   s   | d S )Nr=   r   re   r   r   r   r      r   r   r   c                 S   s   | d S )Nr>   r   re   r   r   r   r      r   r   )r   )r   Zhidden_callbackrP   str
startswithr   Zhidden_callback2Zglobal_f)r   msgr4   r   r   r   test_hidden_callback   s0    $$&z$TestF77Callback.test_hidden_callbackN)r-   r.   r/   r   getpathsourcespytestmarkZparametrizesplitr   Zxfailr   r   r   Zskipifsysplatformr8   rG   rd   rj   r   r   r   r   r      s$   

#

(r   c                   @   s   e Zd ZdZdgZdS )TestF77CallbackPythonTLSz[
    Callback tests using Python thread-local storage instead of
    compiler-provided
    z-DF2PY_USE_PYTHON_TLSN)r-   r.   r/   r   optionsr   r   r   r   rr      s   rr   c                   @   s&   e Zd ZeddddgZdd ZdS )TestF90Callbackr   r   r   zgh17797.f90c                 C   s<   dd }t jdddgt jd}| j||}|dks8td S )Nc                 S   s   | d S rH   r   re   r   r   r   incr   s    z*TestF90Callback.test_gh17797.<locals>.incrr   r=   r>   )r@      )rA   rD   Zint64r   Zgh17797r   )r   ru   yr4   r   r   r   test_gh17797   s    zTestF90Callback.test_gh17797N)r-   r.   r/   r   rk   rl   rx   r   r   r   r   rt      s   rt   c                   @   s*   e Zd ZdZeddddgZdd ZdS )	TestGH18335zThe reproduction of the reported issue requires specific input that
    extensions may break the issue conditions, so the reproducer is
    implemented as a separate test class. Do not extend this test with
    other tests!
    r   r   r   zgh18335.f90c                 C   s$   dd }| j |}|dks td S )Nc                 S   s   | d  d7  < d S )Nr   r   r   re   r   r   r   foo   s    z%TestGH18335.test_gh18335.<locals>.foo|   )r   Zgh18335r   )r   rz   r4   r   r   r   test_gh18335   s    zTestGH18335.test_gh18335N)r-   r.   r/   r   r   rk   rl   r|   r   r   r   r   ry      s   ry   )r$   r   rp   rm   rZ   rR   rK   numpyrA   Znumpy.testingr   r<   r   ZF2PyTestr   rr   rt   ry   r   r   r   r   <module>   s    7	