
    Ng4                     h   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	 ddl
mZ d dlmZ d dlZd dlZd dlZ G d dej                  Z G d d	          Z G d
 d          Z G d dej                  Z G d dej                  Z G d d          Z G d dej                  Z G d d          Z G d dej                  Z G d dej                  Z G d dej                  Z G d d          Z G d dej                  Z G d  d!ej                  Z G d" d#          Z dS )$    N)markinnerspacesnameargspattern   )util)crackfortranc                   <    e Zd Z ej        dddd          gZd ZdS )TestNoSpacetestssrcr   z	gh15035.fc                    t          j        g dt           j                  }t          j        g dt           j                  }| j                            |           t          j        ||dz             sJ | j                            ||g           t          j        ||dz             sJ | j                            d          dk    sJ d S )N)r         )dtyper   23   2)nparrayfloat64modulesubballclosesubct0)selfkws      ^/var/www/html/ai-engine/env/lib/python3.11/site-packages/numpy/f2py/tests/test_crackfortran.pytest_modulezTestNoSpace.test_module   s    HYYYbj111HYYYbj111{1a!e$$$$$!Q   {1a!e$$$$${~~d##t++++++    N)__name__
__module____qualname__r   getpathsourcesr    r   r   r	   r	      s?         t|GUNKHHIG, , , , ,r   r	   c                   &    e Zd Zd Zd Zd Zd ZdS )TestPublicPrivatec                    t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ |d         }d|d         d	         d
         v sJ d|d         d	         d
         vsJ d|d         d         d
         v sJ d|d         d         d
         vsJ d|d         d         d
         vsJ d|d         d         d
         v sJ d S )Nr
   r   r   zprivatemod.f90r   r   privatevarsaattrspecpublicbsetar   r#   r   strlen)r   fpathmods      r   test_defaultPrivatez%TestPublicPrivate.test_defaultPrivate   s   We^=MNN'U553xx1}}}}!fCK,Z88888s6{3/
;;;;;CK,Z88888s6{3/
;;;;;FF 3J ?????3v;v.z:::::::r   c                 r   t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ |d         }d|d         d	         d
         v sJ d|d         d	         d
         vsJ d|d         d         d
         vsJ d|d         d         d
         v sJ d S )Nr
   r   r   zpublicmod.f90r   r   r)   r*   r+   r,   r-   r/   r0   r   tmp_pathr3   r4   s       r   test_defaultPublicz$TestPublicPrivate.test_defaultPublic+   s    We^_MM'U553xx1}}}}!fCK,Z88888s6{3/
;;;;;FF 3J ?????3v;v.z:::::::r   c                    t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ |d         d         }t          |d         d	                   d
dhk    sJ t          |d         d	                   ddhk    sJ t          |d         d	                   dhk    sJ d S )Nr
   r   r   zaccesstype.f90r   r   r*   r+   r,   r)   zbind(c)b_r-   c)r   r#   r   r1   r2   set)r   r8   r3   r4   tts        r   test_access_typez"TestPublicPrivate.test_access_type5   s    We^=MNN'U553xx1}}}}VF^2c7:&''Iy+AAAAA2d8J'((Xy,AAAAA2c7:&''H:555555r   c                     t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ t          j        |          }d|vsJ d S )Nr
   r   r   zgh23879.f90r   bar)r   r#   r   r1   r2   crack2fortran)r   r8   r3   r4   pyfs        r   test_nowrap_private_proceeduresz1TestPublicPrivate.test_nowrap_private_proceedures>   si    We^]KK'U553xx1}}}}(--Cr   N)r    r!   r"   r5   r9   r?   rD   r%   r   r   r'   r'      sP        
; 
; 
;; ; ;6 6 6         r   r'   c                       e Zd Zd Zd ZdS )TestModuleProcedurec                    t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ |d         }d|v rt	          |d                   dk    sJ |d         d         d	         d
k    sJ d|d         d         v sJ |d         d         d         ddgk    sJ |d         d         d	         dk    sJ d|d         d         v sJ |d         d         d         dgk    sJ |d         d         d	         dk    sJ d|d         d         v sJ |d         d         d         ddgk    sJ d S )Nr
   r   r   zoperators.f90r   r   body	   namezoperator(.item.)implementedbyitem_int	item_realr   zoperator(==)items_are_equalr   zassignment(=)get_intget_realr0   r7   s       r   test_moduleOperatorsz(TestModuleProcedure.test_moduleOperatorsF   s   We^_MM'U553xx1}}}}!f}}S[!1!1Q!6!6!6!66{1~f%);;;;;#f+a.00006{1~o.%& & & &6{1~f%7777#f+a.00006{1~o.3D2EEEEE6{1~f%8888#f+a.00006{1~o.
#$ $ $ $ $ $r   c                 T   t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ |d         }|d         d         d	         d
gk    sJ |d         d         d	         dgk    sJ |d         d         d	         dgk    sJ d S )Nr
   r   r   zpubprivmod.f90r   r   r*   r+   r,   r)   r.   r-   r/   r0   r7   s       r   test_notPublicPrivatez)TestModuleProcedure.test_notPublicPrivateX   s    We^=MNN'U553xx1}}}}!f6{3
+	}<<<<6{3
+|;;;;6{6":.8,>>>>>>r   N)r    r!   r"   rQ   rS   r%   r   r   rF   rF   E   s2        $ $ $$? ? ? ? ?r   rF   c                   B    e Zd Z ej        dddd          gZd Zd ZdS )TestExternalr
   r   r   z	gh17859.fc                 P    d }| j                             |          }|dk    sJ d S )Nc                     | dz   S N{   r%   xs    r   incrz5TestExternal.test_external_as_statement.<locals>.incrg       s7Nr   rY   )r   external_as_statementr   r\   rs      r   test_external_as_statementz'TestExternal.test_external_as_statementf   9    	 	 	 K--d33Cxxxxxxr   c                 P    d }| j                             |          }|dk    sJ d S )Nc                     | dz   S rX   r%   rZ   s    r   r\   z5TestExternal.test_external_as_attribute.<locals>.incrn   r]   r   rY   )r   external_as_attributer_   s      r   test_external_as_attributez'TestExternal.test_external_as_attributem   rb   r   N)r    r!   r"   r   r#   r$   ra   rf   r%   r   r   rU   rU   b   sL        t|GUNKHHIG      r   rU   c                   <    e Zd Z ej        dddd          gZd ZdS )TestCrackFortranr
   r   r   z
gh2848.f90c                 L    | j                             dd          }|dk    sJ d S )Nr   r   )r   r   )r   gh2848)r   r`   s     r   test_gh2848zTestCrackFortran.test_gh2848y   s*    Kq!$$F{{{{{{r   N)r    r!   r"   r   r#   r$   rk   r%   r   r   rh   rh   u   s=        t|GUNLIIJG    r   rh   c                   &    e Zd Zd Zd Zd Zd ZdS )TestMarkinnerspacesc                 B    g d}|D ]}t          |          |k    sJ d S )N)za z aza b cz'abcdefghij'r   )r   	test_listis      r   test_do_not_touch_normal_spacesz3TestMarkinnerspaces.test_do_not_touch_normal_spaces   sB    999	 	+ 	+A"1%%*****	+ 	+r   c                 Z    t          d          dk    sJ t          d          dk    sJ d S )Nza 'b c' \' \'za 'b@_@c' \' \'za "b c" \" \"za "b@_@c" \" \"ro   r   s    r   test_one_relevant_spacez+TestMarkinnerspaces.test_one_relevant_space   s>    0115HHHHH/004FFFFFFFr   c                 Z    t          d          dk    sJ t          d          dk    sJ d S )Nza 'b c" " d' eza 'b@_@c"@_@"@_@d' eza "b c' ' d" eza "b@_@c'@_@'@_@d" ero   rt   s    r   test_ignore_inner_quotesz,TestMarkinnerspaces.test_ignore_inner_quotes   s>    1226NNNNN1226NNNNNNNr   c                 Z    t          d          dk    sJ t          d          dk    sJ d S )Nza 'b c' 'd e'za 'b@_@c' 'd@_@e'za "b c" "d e"za "b@_@c" "d@_@e"ro   rt   s    r   test_multiple_relevant_spacesz1TestMarkinnerspaces.test_multiple_relevant_spaces   s=    //3FFFFF/004HHHHHHHr   N)r    r!   r"   rr   ru   rw   ry   r%   r   r   rm   rm   ~   s[        + + +
G G GO O OI I I I Ir   rm   c            	          e Zd ZdZdZ ej        d          Zg dZdgZ	ee	z   Z
dZ ee
          D ]R\  ZZd e                    d          D             Zee                    eed	                    e          
          z  ZSej                            de
          d             Zej                            de
          d             ZdS )TestDimSpeca  This test suite tests various expressions that are used as dimension
    specifications.

    There exists two usage cases where analyzing dimensions
    specifications are important.

    In the first case, the size of output arrays must be defined based
    on the inputs to a Fortran function. Because Fortran supports
    arbitrary bases for indexing, for instance, `arr(lower:upper)`,
    f2py has to evaluate an expression `upper - lower + 1` where
    `lower` and `upper` are arbitrary expressions of input parameters.
    The evaluation is performed in C, so f2py has to translate Fortran
    expressions to valid C expressions (an alternative approach is
    that a developer specifies the corresponding C expressions in a
    .pyf file).

    In the second case, when user provides an input array with a given
    size but some hidden parameters used in dimensions specifications
    need to be determined based on the input array size. This is a
    harder problem because f2py has to solve the inverse problem: find
    a parameter `p` such that `upper(p) - lower(p) + 1` equals to the
    size of input array. In the case when this equation cannot be
    solved (e.g. because the input array size is wrong), raise an
    error before calling the Fortran function (that otherwise would
    likely crash Python process when the size of input arrays is
    wrong). f2py currently supports this case only when the equation
    is linear with respect to unknown parameter.

    z.f90a  
      function get_arr_size_{count}(a, n) result (length)
        integer, intent(in) :: n
        integer, dimension({dimspec}), intent(out) :: a
        integer length
        length = size(a)
      end function

      subroutine get_inv_arr_size_{count}(a, n)
        integer :: n
        ! the value of n is computed in f2py wrapper
        !f2py intent(out) n
        integer, dimension({dimspec}), intent(in) :: a
      end subroutine
    )nz2*nz2:nzn/2z5 - n/2z3*n:20zn*(n+1):n*(n+5)z2*n, nz2*n:3*n*n+2*n c                 P    g | ]#}d |v r|                     d           d         nd$S ):r   1)split).0ds     r   
<listcomp>zTestDimSpec.<listcomp>   s2    RRR!3!88QRRRr   ,z, )countdimspecfirstr   c                     | j                             |          }t          | j        d|           }dD ]} ||          \  }}|j        |k    sJ d S )Nget_arr_size_r   r   r         )all_dimspecsindexgetattrr   size)r   r   r   get_arr_sizer|   szr+   s          r   test_array_sizezTestDimSpec.test_array_size   so     !''00t{,CE,C,CDD  	  	 A LOOEB6R<<<<<	  	 r   c                 F   | j                             |          }t          | j        d|           }t          | j        d|           }dD ]S} ||          \  }}|| j        v r |||          }n ||          } ||          \  }	}
||	k    sJ ||||	f            Td S )Nr   get_inv_arr_size_r   )r   r   r   r   nonlinear_dimspecs)r   r   r   r   get_inv_arr_sizer|   r   r+   n1sz1_s              r   test_inv_array_sizezTestDimSpec.test_inv_array_size   s     !''00t{,CE,C,CDD"4;0KE0K0KLL  	/ 	/A LOOEB$111 &%a++ &%a(( "\"%%FC999q"b#.9999	/ 	/r   N)r    r!   r"   __doc__suffixtextwrapdedentcode_templatelinear_dimspecsr   r   code	enumerater   r   r   lstformatjoinpytestmarkparametrizer   r   r%   r   r   r{   r{      s7        < F#HO % 	 	M   O **"%77LD#)L11 
 
wRRw}}S?Q?QRRR$$))C.. % 
 
 	
 [Y55    65  [Y55/ / 65/ / /r   r{   c                       e Zd Zd ZdS )TestModuleDeclarationc                     t          j        dddd          }t          j        t          |          g          }t	          |          dk    sJ |d         d         d         d	         d
k    sJ d S )Nr
   r   r   zfoo_deps.f90r   r   r*   abar=zbar('abar')r0   r7   s       r   test_dependenciesz'TestModuleDeclaration.test_dependencies   sk    We^^LL'U553xx1}}}}1vf~f%c*m;;;;;;r   N)r    r!   r"   r   r%   r   r   r   r      s#        < < < < <r   r   c                       e Zd Zd ZdS )TestEvalc                     t           j        } |di           dk    sJ  |di           dk    sJ  |dt          dd                    dk    sJ  |d	i           d
k    sJ d S )N123z12 + 315za + br   r   )r+   r.   3z"123"z'123')r   _eval_scalardict)r   eval_scalars     r   test_eval_scalarzTestEval.test_eval_scalar   s    "/{5"%%....{8R((D0000{7D1NNN33s::::{7B''7222222r   N)r    r!   r"   r   r%   r   r   r   r      s#        3 3 3 3 3r   r   c                   Z    e Zd Zej                            dg d          d             ZdS )TestFortranReaderencoding)asciizutf-8zutf-16zutf-32c                    |d| dz  }|                     d|          5 }|                    d           d d d            n# 1 swxY w Y   t          j        t          |          g          }|d         d         dk    sJ d S )	Ninput_with_z_encoding.f90r   )r   zd
                     subroutine foo()
                     end subroutine foo
                     r   rJ   foo)openwriter   r1   )r   r8   r   f_pathffr4   s         r   test_input_encodingz%TestFortranReader.test_input_encoding	  s     A(AAAA[[x[00 	BHH    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 'V661vf~&&&&&&s   AA
AN)r    r!   r"   r   r   r   r   r%   r   r   r   r     sQ        [ZCCCE E	' 	'E E	' 	' 	'r   r   c                       e Zd Z ej        dddd          gZej                            e	j        
                    d          du d          d	             ZdS )
TestUnicodeCommentr
   r   r   zunicode_comment.f90charset_normalizerNz7test requires charset_normalizer which is not installed)reasonc                 :    | j                             d           d S )Nr   )r   r   rt   s    r   test_encoding_commentz(TestUnicodeComment.test_encoding_comment  s    
 	r   )r    r!   r"   r   r#   r$   r   r   skipif	importlib	find_specr   r%   r   r   r   r     s~        t|GUN<QRRSG[		!	!"6	7	74	?H    	   r   r   c                   \    e Zd Zej                            dgg d          d             ZdS )TestNameArgsPatternBacktracking	adversary))z
@)@bind@(@)z#@)@bind                         @(@)z@)@bind foo bar baz@(@c                    d}d}d\  }}t          ||          D ]}||z  }t          |          D ]}g }	t          |          D ]R}t          j                    }
t          j        |          }|	                    t          j                    |
z
             St          j        |	          dk     sJ |rJ |dz   }t          j        |          sJ dS )zPaddress ReDOS vulnerability:
        https://github.com/numpy/numpy/issues/23338   r   )      g?z@)@N)rangetimeperf_counterr   searchappendr   median)r   r   trials_per_batchbatches_per_regex
start_repsend_repsiirepeated_adversaryr   timesr   mtchgood_version_of_adversarys                r   !test_nameargspattern_backtrackingzATestNameArgsPatternBacktracking.test_nameargspattern_backtracking#  s    %
H
H-- 	E 	EB!*R ,-- . ./00 ; ;A*,,B*12DEEDLL!2!4!4r!9:::: y''#-----OOO );U(B%")*CDDDDDD'	E 	Er   N)r    r!   r"   r   r   r   r   r%   r   r   r   r   "  s[        [		
 	
 	
 E E E E Er   r   c                   <    e Zd Z ej        dddd          gZd ZdS )TestFunctionReturnr
   r   r   zgh23598.f90c                 H    | j                             dd          dk    sJ d S )Nr   r   r   )r   
intproductrt   s    r   test_function_rettypez(TestFunctionReturn.test_function_rettypeJ  s+    {%%a++r111111r   N)r    r!   r"   r   r#   r$   r   r%   r   r   r   r   G  s=        t|GUNMJJKG2 2 2 2 2r   r   c                       e Zd Zd ZdS )TestFortranGroupCountersc                     t          j        dddd          }	 t          j        t          |          g           d S # t          $ r}J d|             d }~ww xY w)Nr
   r   r   z	gh23533.fFz0'crackfortran.crackfortran' raised an exception )r   r#   r   r1   	Exception)r   r3   excs      r   test_end_if_commentz,TestFortranGroupCounters.test_end_if_commentP  sv    We^[II	S%s5zzl33333 	S 	S 	SRRSRRRRR	Ss   "= 
AAAN)r    r!   r"   r   r%   r   r   r   r   O  s(        S S S S Sr   r   c                       e Zd Zd ZdS )TestF77CommonBlockReaderc                 "   t          j        dddd          }t          j        t	          j                              5 }t          j        t          |          g          }d d d            n# 1 swxY w Y   d|                                vsJ d S )Nr
   r   r   zgh22648.pyfMismatch)	r   r#   
contextlibredirect_stdoutioStringIOr   r1   getvalue)r   r8   r3   stdout_f2pyr4   s        r   test_gh22648z%TestF77CommonBlockReader.test_gh22648Z  s    We^]KK'66 	:++SZZL99C	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:!5!5!7!7777777s   #A,,A03A0N)r    r!   r"   r   r%   r   r   r   r   Y  s#        8 8 8 8 8r   r   )!r   codecsr   unicodedatar   numpyr   numpy.f2py.crackfortranr   r   r}   r   
numpy.f2pyr   r   r   r   F2PyTestr	   r'   rF   rU   rh   rm   r{   r   r   r   r   r   r   r   r   r%   r   r   <module>r     sG                  D D D D D D D D       # # # # # #      				, , , , ,$- , , ,%  %  %  %  %  %  %  % N? ? ? ? ? ? ? ?:    4=   &    t}   I I I I I I I I*`/ `/ `/ `/ `/$- `/ `/ `/F< < < < < < < <3 3 3 3 3t} 3 3 3' ' ' ' ' ' ' '       "E "E "E "E "E "E "E "EJ2 2 2 2 2 2 2 2S S S S St} S S S8 8 8 8 8 8 8 8 8 8r   