a
    hÝEbõ  ã                   @   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
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   ú^/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/numpy/f2py/tests/test_callback.pyÚtest_allP   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_docstringT   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   s   dS )Né   r   r   r   r   r   Ú<lambda>u   ó    z0TestF77Callback.check_function.<locals>.<lambda>r   c                 S   s   dS ©Né   r   ©Úar   r   r   r   w   r   )é   )Zfun_extra_argsr   c                 S   s   | S r
   r   r   r   r   r   r   y   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__‹   s    z2TestF77Callback.check_function.<locals>.A.__call__c                 S   s   dS )Né	   r   r'   r   r   r   ÚmthŽ   s    z-TestF77Callback.check_function.<locals>.A.mthN)Ú__name__Ú
__module__Ú__qualname__r(   r*   r   r   r   r   ÚA‰   s   r.   r    r)   )Úgetattrr   r   Úreprr"   Úpir#   ÚfuncZfunc0Z	_cpointerr*   )r   r   r   Úrr.   r   r   r   r   r   s   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 d S )Nr3   r   r   r   )Úcoder   r   r   Úcallbackš   s    z6TestF77Callback.test_string_callback.<locals>.callbackZstring_callbackr   )r/   r   r   r0   )r   r6   Úfr3   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¡s2dS dS )Nr9   r   r:   é   r   é   r   )ÚshapeÚdtypeÚnpÚall)ÚcuZlencur   r   r   r6   ª   s    
z<TestF77Callback.test_string_callback_array.<locals>.callbackZstring_callback_arrayr   )r?   Zzerosr/   r   Úlenr   r0   )r   rA   r6   r7   Ú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 ]}|  ¡  q6|D ]}| ¡  qHd ˆ¡‰ˆrltˆƒ‚d S )	Nc                     s*   t  d¡ ˆ j dd„ ¡} t| dkƒ dS )Ngü©ñÒMbP?c                   S   s   dS ©Né{   r   r   r   r   r   r   Â   r   z?TestF77Callback.test_threadsafety.<locals>.cb.<locals>.<lambda>rF   é*   )ÚtimeÚsleepr   r   r   )r3   r'   r   r   Úcb¼   s    
z-TestF77Callback.test_threadsafety.<locals>.cbc                    sZ   z4t dƒD ]&}ˆj ˆ ¡}t|dkƒ ˆ | ¡ q
W n  tyT   ˆ t ¡ ¡ Y n0 d S )Né2   rG   )	Úranger   r   r   r   Ú	ExceptionÚappendÚ	tracebackÚ
format_exc)r   Újr3   )rJ   Úerrorsr   r   r   ÚrunnerÇ   s    z1TestF77Callback.test_threadsafety.<locals>.runnerc                    s*   g | ]"}t d ƒD ]}tjˆ |fd�‘qqS )é   )ÚtargetÚargs)rL   Ú	threadingÚThread)Ú.0ÚargÚn)rS   r   r   Ú
<listcomp>Ð   s   ÿz5TestF77Callback.test_threadsafety.<locals>.<listcomp>)r   Út2z

)ÚstartÚjoinÚAssertionError)r   Úthreadsr   r   )rJ   rR   rS   r   r   Útest_threadsafety·   s    	
ÿ


z!TestF77Callback.test_threadsafetyc              
   C   sj  z| j  d¡ W n6 tyF } ztt|ƒ d¡ƒ W Y d }~n
d }~0 0 z| j  d¡ W n6 tyŽ } ztt|ƒ d¡ƒ W Y d }~n
d }~0 0 dd„ | j _| j  d¡}t|dkƒ dd„ | j _| j  d¡}t|dkƒ | j `z| j  d¡ W n8 t�y& } ztt|ƒ d¡ƒ W Y d }~n
d }~0 0 dd
d„| j _| j  d¡}t|dkƒ | j  d¡}t|dkƒ 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   rc   r   r   r   r   ì   r   r   r   c                 S   s   | d S )Nr<   r   rc   r   r   r   r   ö   r   r   )r   )r   Zhidden_callbackrM   r   ÚstrÚ
startswithZhidden_callback2Zglobal_f)r   Úmsgr3   r   r   r   Útest_hidden_callbackÝ   s0    (((z$TestF77Callback.test_hidden_callbackN)r+   r,   r-   r5   ÚpytestÚmarkZparametrizeÚsplitr   Zxfailr   r   r   ZskipifÚsysÚplatformr8   rD   rb   rh   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+   r,   r-   r   Úoptionsr   r   r   r   rn   ÿ   s   rn   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s6J ‚d S )Nc                 S   s   | d S rE   r   rc   r   r   r   Úincr  s    z*TestF90Callback.test_gh17797.<locals>.incr©r   r;   r<   ©r>   é�   )r?   ÚarrayZint64r   Zgh17797)r   rr   Úyr3   r   r   r   Útest_gh17797  s    zTestF90Callback.test_gh17797N)r+   r,   r-   Úsuffixr   r   r5   rx   r   r   r   r   rp     s
   ÿrp   c                   @   s&   e Zd ZdZdZe d¡Zdd„ ZdS )ÚTestGH18335zäThe 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!
    rq   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s4J ‚d S )Nc                 S   s   | d  d7  < d S )Nr   r   r   rc   r   r   r   Úfoo@  s    z%TestGH18335.test_gh18335.<locals>.foors   rt   é|   )r?   rv   Zint8r   Zgh18335)r   r{   rw   r3   r   r   r   Útest_gh18335>  s    zTestGH18335.test_gh18335N)	r+   r,   r-   r   ry   r   r   r5   r}   r   r   r   r   rz      s   ÿrz   )r"   r   rl   ri   rW   rO   rH   Únumpyr?   Znumpy.testingr   r   r   Ú r   ZF2PyTestr   rn   rp   rz   r   r   r   r   Ú<module>   s    r