o
    k)h                     @   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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G dd dejZejjejje  dkddd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ejj
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   >lib/python3.10/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J 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__)r   Zexpectedr   r   r   test_docstring   s   
zTestF77Callback.test_docstringc                 C   sF  t | j|}|dd }|dksJ |dd dd}|dks J |dd dd}|d	ks.J |d
d dd}|dks<J |dd tjfd}|dksLJ |tjtjfd}|dks[J || jjdd}|dksiJ || jj}|dksuJ || jjj}|dksJ G dd d}| }||}|dksJ ||j}|dksJ d S )Nc                   S      dS )N   r   r   r   r   r   <lambda>8       z0TestF77Callback.check_function.<locals>.<lambda>r   c                 S   r   N   r   ar   r   r   r   :   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   >       )      c                 S   s
   t | S r   )mathdegreesr   r   r   r   r   @   s   
          c                   @   s   e Zd Zdd Zdd ZdS )z)TestF77Callback.check_function.<locals>.Ac                 S   r   )Nr"   r   r   r   r   r   __call__M      z2TestF77Callback.check_function.<locals>.A.__call__c                 S   r   )N	   r   r)   r   r   r   mthP   r+   z-TestF77Callback.check_function.<locals>.A.mthN)__name__
__module____qualname__r*   r-   r   r   r   r   AL   s    r1   r"   r,   )	getattrr   r$   Zpir%   funcZfunc0Z	_cpointerr-   )r   r	   r   rr1   r   r   r   r   r   6   s2   
zTestF77Callback.check_functionwin32z)Fails with MinGW64 Gfortran (Issue #9673)c                 C   s(   dd }| j j}||}|dksJ d S )Nc                 S   s   | dkrdS dS )Nr4   r   r   r   )coder   r   r   r   \   s   z6TestF77Callback.test_string_callback.<locals>.callbackr   )r   Zstring_callback)r   r   fr4   r   r   r   test_string_callbackY   s   z$TestF77Callback.test_string_callbackc                 C   sd   t dd}t dd}t dgd}dd }| jj}|||fD ]}||||j}|dks/J q d S )	N)r   S8)r      c c                 S   s4   | j |fkrdS | jdkrdS t| dksdS dS )Nr   r9             r   )shapedtypenpall)cuZlencur   r   r   r   n   s   
z<TestF77Callback.test_string_callback_array.<locals>.callbackr   )rB   Zzerosarrayr   Zstring_callback_arraysize)r   Zcu1Zcu2Zcu3r   r7   rD   resr   r   r   test_string_callback_arrayf   s   	z*TestF77Callback.test_string_callback_arrayc                    sp   g fdd  fddfdddD }|D ]}|   q|D ]}|  q$dr6td S )	Nc                     s*   t d  jdd } | dksJ dS )NgMbP?c                   S   r   N{   r   r   r   r   r   r      r   z?TestF77Callback.test_threadsafety.<locals>.cb.<locals>.<lambda>rJ   *   )timesleepr   r   )r4   r)   r   r   cb   s   
z-TestF77Callback.test_threadsafety.<locals>.cbc                    sZ   zt dD ]}j }|dksJ |  qW d S  ty,   t  Y d S w )N2   rK   )ranger   r   r   	Exceptionappend	traceback
format_exc)r	   jr4   )rN   errorsr   r   r   runner   s   z1TestF77Callback.test_threadsafety.<locals>.runnerc                    s*   g | ]}t d D ]
}tj |fdqqS )   )targetargs)rP   	threadingZThread).0argn)rW   r   r   
<listcomp>   s    z5TestF77Callback.test_threadsafety.<locals>.<listcomp>)r   t2z

)startjoinAssertionError)r   Zthreadsr   r   )rN   rV   rW   r   r   test_threadsafety|   s   
	


z!TestF77Callback.test_threadsafetyc              
   C   sh  z| j d W n ty# } zt|dsJ W Y d }~nd }~ww z| j d W n tyG } zt|ds=J W Y d }~nd }~ww dd | j _| j d}|dksZJ dd | j _| j d}|dkslJ | j `z| j d W n ty } zt|dsJ W Y d }~nd }~ww dd
d| j _| j d}|dksJ | j d}|dksJ d S )Nr=   zCallback global_f not definedz!cb: Callback global_f not definedc                 S      | d S )Nr   r   xr   r   r   r      r!   z6TestF77Callback.test_hidden_callback.<locals>.<lambda>r?   c                 S   re   )Nr=   r   rf   r   r   r   r      r!   r   r   c                 S   re   )Nr?   r   rf   r   r   r   r      r!   r   )r   )r   Zhidden_callbackrQ   str
startswithZhidden_callback2Zglobal_f)r   msgr4   r   r   r   test_hidden_callback   s<   z$TestF77Callback.test_hidden_callbackN)r.   r/   r0   r   getpathsourcespytestmarkZparametrizesplitslowr   xfailr   r   r   Zskipifsysplatformr8   rH   rd   rk   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/   r0   r   optionsr   r   r   r   ru      s    
ru   c                   @   s.   e Zd ZeddddgZejjdd Z	dS )TestF90Callbackr   r   r   zgh17797.f90c                 C   s:   dd }t jg dt jd}| j||}|dksJ d S )Nc                 S   re   rI   r   rf   r   r   r   incr      z*TestF90Callback.test_gh17797.<locals>.incr)r   r=   r?   )rA      )rB   rE   Zint64r   Zgh17797)r   rx   yr4   r   r   r   test_gh17797   s   zTestF90Callback.test_gh17797N)
r.   r/   r0   r   rl   rm   rn   ro   rq   r|   r   r   r   r   rw      s    rw   c                   @   s2   e Zd ZdZeddddgZejj	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   $   dd }| j |}|dksJ d S )Nc                 S   s   | d  d7  < d S )Nr   r   r   rf   r   r   r   foo   s   z%TestGH18335.test_gh18335.<locals>.foo|   )r   Zgh18335)r   r   r4   r   r   r   test_gh18335   s   zTestGH18335.test_gh18335N)r.   r/   r0   r   r   rl   rm   rn   ro   rq   r   r   r   r   r   r}      s
    r}   c                   @   s8   e Zd ZeddddeddddgZdZdd Zd	S )
TestGH25211r   r   r   z	gh25211.fzgh25211.pyfZ	callback2c                 C   r~   )Nc                 S   s   | |  S r   r   rf   r   r   r   bar   ry   z%TestGH25211.test_gh25211.<locals>.barn   )r   r   )r   r   rG   r   r   r   test_gh25211   s   zTestGH25211.test_gh25211N)r.   r/   r0   r   rl   rm   Zmodule_namer   r   r   r   r   r      s    r   darwinFz*Callback aborts cause CI failures on macOS)Z	conditionrunr   c                   @   s,   e Zd ZeddddgZdgZdd ZdS )	TestCBFortranCallstatementr   r   r   zgh26681.f90z--lowerc                 C   sP   t jtdd}| jjj| j_| jjd W d    d S 1 s!w   Y  d S )NZhelpme)match)rn   Zraises
ValueErrorr   ZutilsZmy_abortZ
mypy_abortZdo_something)r   excr   r   r   test_callstatement_fortran  s   "z5TestCBFortranCallstatement.test_callstatement_fortranN)r.   r/   r0   r   rl   rm   rv   r   r   r   r   r   r      s    r   )r$   r   rs   rn   r[   rS   rL   rt   ZnumpyrB   Znumpy.testingr   r<   r   ZF2PyTestr   ru   rw   r}   r   ro   rq   rr   systemlowerr   r   r   r   r   <module>   s.     8	