o
    6a                     @   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mZ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)assert_assert_equalIS_PYPY   )utilc                   @   s   e Zd Zd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 )TestF77Callbacka  
       subroutine t(fun,a)
       integer a
cf2py  intent(out) a
       external fun
       call fun(a)
       end

       subroutine func(a)
cf2py  intent(in,out) a
       integer a
       a = a + 11
       end

       subroutine func0(a)
cf2py  intent(out) a
       integer a
       a = 11
       end

       subroutine t2(a)
cf2py  intent(callback) fun
       integer a
cf2py  intent(out) a
       external fun
       call fun(a)
       end

       subroutine string_callback(callback, a)
       external callback
       double precision callback
       double precision a
       character*1 r
cf2py  intent(out) a
       r = 'r'
       a = callback(r)
       end

       subroutine string_callback_array(callback, cu, lencu, a)
       external callback
       integer callback
       integer lencu
       character*8 cu(lencu)
       integer a
cf2py  intent(out) a

       a = callback(cu, lencu)
       end

       subroutine hidden_callback(a, r)
       external global_f
cf2py  intent(callback, hide) global_f
       integer a, r, global_f
cf2py  intent(out) r
       r = global_f(a)
       end

       subroutine hidden_callback2(a, r)
       external global_f
       integer a, r, global_f
cf2py  intent(out) r
       r = global_f(a)
       end
    namezt,t2,c                 C   s   |  | d S N)check_function)selfr    r   @/usr/lib/python3/dist-packages/numpy/f2py/tests/test_callback.pytest_allQ   s   zTestF77Callback.test_allz,PyPy cannot modify tp_doc after PyType_Ready)reasonc                 C   s   t d}t| jj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dedentr   modulet__doc__)r   expectedr   r   r   test_docstringU   s   
zTestF77Callback.test_docstringc                 C   s  t | j|}|dd }t|dkt| |dd dd}t|dkt| |dd dd}t|d	kt| |d
d dd}t|dkt| |dd tjfd}t|dkt| |tjtjfd}t|dkt| || jjdd}t|dkt| || jj}t|dkt| || jjj	}t|dkt| G dd d}| }||}t|dkt| ||j
}t|dkt| d S )Nc                   S      dS )N   r   r   r   r   r   <lambda>v       z0TestF77Callback.check_function.<locals>.<lambda>r   c                 S   r   N   r   ar   r   r   r   x   r   )   )fun_extra_argsr   c                 S   s   | S r
   r   r   r   r   r   r   z   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__      z2TestF77Callback.check_function.<locals>.A.__call__c                 S   r   )N	   r   r*   r   r   r   mth   r,   z-TestF77Callback.check_function.<locals>.A.mthN)__name__
__module____qualname__r+   r.   r   r   r   r   A   s    r2   r#   r-   )getattrr   r   reprr%   pir&   funcfunc0	_cpointerr.   )r   r   r   rr2   r   r   r   r   r   t   s2   
zTestF77Callback.check_functionwin32z)Fails with MinGW64 Gfortran (Issue #9673)c                 C   s2   dd }t | jd}||}t|dkt| d S )Nc                 S   s   | dkrdS dS )Nr9   r   r   r   )coder   r   r   callback   s   z6TestF77Callback.test_string_callback.<locals>.callbackstring_callbackr   )r3   r   r   r4   )r   r<   fr9   r   r   r   test_string_callback   s   z$TestF77Callback.test_string_callbackc                 C   sF   t dd}dd }t| jd}|||t|}t|dkt| d S )N)r      S1c                 S   s6   | j |dfkr	dS | jdkrdS t| dksdS dS )Nr@   r   rA             r   )shapedtypenpall)culencur   r   r   r<      s   
z<TestF77Callback.test_string_callback_array.<locals>.callbackstring_callback_arrayr   )rG   zerosr3   r   lenr   r4   )r   rI   r<   r>   resr   r   r   test_string_callback_array   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 } t| dk dS )NgMbP?c                   S   r   N{   r   r   r   r   r   r      r   z?TestF77Callback.test_threadsafety.<locals>.cb.<locals>.<lambda>rQ   *   )timesleepr   r   r   )r9   r*   r   r   cb   s   
z-TestF77Callback.test_threadsafety.<locals>.cbc                    sZ   zt dD ]}j }t|dk |  qW d S  ty,   t  Y d S w )N2   rR   )	ranger   r   r   r   	Exceptionappend	traceback
format_exc)r   jr9   )rU   errorsr   r   r   runner   s   z1TestF77Callback.test_threadsafety.<locals>.runnerc                    s*   g | ]}t d D ]
}tj |fdqqS )   )targetargs)rW   	threadingThread).0argn)r^   r   r   
<listcomp>   s
    z5TestF77Callback.test_threadsafety.<locals>.<listcomp>)r   t2z

)startjoinAssertionError)r   threadsr   r   )rU   r]   r^   r   r   test_threadsafety   s   
	


z!TestF77Callback.test_threadsafetyc              
   C   sh  z| j d W n ty# } ztt|d W Y d }~nd }~ww z| j d W n tyG } ztt|d W Y d }~nd }~ww dd | j _| j d}t|dk dd | j _| j d}t|dk | j `z| j d W n ty } ztt|d W Y d }~nd }~ww dd
d| j _| j d}t|dk | j d}t|dk d S )NrB   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>rD   c                 S   rn   )NrB   r   ro   r   r   r   r      r"   r   r   c                 S   rn   )NrD   r   ro   r   r   r   r      r"   r   )r   )r   hidden_callbackrX   r   str
startswithhidden_callback2global_f)r   msgr9   r   r   r   test_hidden_callback   s<   z$TestF77Callback.test_hidden_callbackN)r/   r0   r1   r;   pytestmarkparametrizesplitr   xfailr   r   r   skipifsysplatformr?   rO   rm   rw   r   r   r   r   r      s&    A

#

&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/   r0   r1   r   optionsr   r   r   r   r      s    
r   c                   @   s"   e Zd ZdZedZdd ZdS )TestF90Callback.f90z
        function gh17797(f, y) result(r)
          external f
          integer(8) :: r, f
          integer(8), dimension(:) :: y
          r = f(0)
          r = r + sum(y)
        end function gh17797
        c                 C   s:   dd }t jg dt jd}| j||}|dksJ d S )Nc                 S   rn   rP   r   ro   r   r   r   incr  s   z*TestF90Callback.test_gh17797.<locals>.incrr   rB   rD   rF      )rG   arrayint64r   gh17797)r   r   yr9   r   r   r   test_gh17797  s   zTestF90Callback.test_gh17797N)r/   r0   r1   suffixr   r   r;   r   r   r   r   r   r     s    r   c                   @   s&   e Zd ZdZdZed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   a  
        ! When gh18335_workaround is defined as an extension,
        ! the issue cannot be reproduced.
        !subroutine gh18335_workaround(f, y)
        !  implicit none
        !  external f
        !  integer(kind=1) :: y(1)
        !  call f(y)
        !end subroutine gh18335_workaround

        function gh18335(f) result (r)
          implicit none
          external f
          integer(kind=1) :: y(1), r
          y(1) = 123
          call f(y)
          r = y(1)
        end function gh18335
        c                 C   s8   dd }t jg dt jd}| j|}|dksJ d S )Nc                 S   s   | d  d7  < d S )Nr   r   r   ro   r   r   r   fooA  s   z%TestGH18335.test_gh18335.<locals>.foor   r   |   )rG   r   int8r   gh18335)r   r   r   r9   r   r   r   test_gh18335?  s   zTestGH18335.test_gh18335N)	r/   r0   r1   r   r   r   r   r;   r   r   r   r   r   r   !  s    r   )r%   r   r~   rx   rb   rZ   rS   randomnumpyrG   numpy.testingr   r   r    r   F2PyTestr   r   r   r   r   r   r   r   <module>   s      r