
    G/Ph>                        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ej        j         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" 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      b/var/www/html/test/jupyter/venv/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.   r0   r1   r   tmp_pathr4   r5   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   r2   r3   set)r   r9   r4   r5   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   r2   r3   crack2fortran)r   r9   r4   r5   pyfs        r   test_nowrap_private_proceeduresz1TestPublicPrivate.test_nowrap_private_proceedures>   si    We^]KK'U553xx1}}}}(--Cr    N)r!   r"   r#   r6   r:   r@   rE   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_realr1   r8   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.   r0   r1   r8   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#   rR   rT   r&   r    r   rG   rG   E   s2        $ $ $$? ? ? ? ?r    rG   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    rZ   )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 rY   r&   r[   s    r   r]   z5TestExternal.test_external_as_attribute.<locals>.incrn   r^   r    rZ   )r   external_as_attributer`   s      r   test_external_as_attributez'TestExternal.test_external_as_attributem   rc   r    N)r!   r"   r#   r   r$   r%   rb   rg   r&   r    r   rV   rV   b   sL        t|GUNKHHIG      r    rV   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   ra   s     r   test_gh2848zTestCrackFortran.test_gh2848y   s*    Kq!$$F{{{{{{r    N)r!   r"   r#   r   r$   r%   rm   r&   r    r   ri   ri   u   s=        t|GUNLIIJG    r    ri   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" \" \"rq   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" erq   rv   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"rq   rv   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#   rt   rw   ry   r{   r&   r    r   ro   ro   ~   s[        + + +
G G GO O OI I I I Ir    ro   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
          ej        j        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
        if (a({first}).gt.0) then
          ! print*, "a=", a
        endif
      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parametrizeslowr   r   r&   r    r   r}   r}      sG        < 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')r1   r8   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   rK   foo)openwriter   r2   )r   r9   r   f_pathffr5   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   rv   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ej        j        d             Z	dS )TestFunctionReturnr
   r   r   zgh23598.f90c                 H    | j                             dd          dk    sJ d S )Nr   r   r   )r   
intproductrv   s    r   test_function_rettypez(TestFunctionReturn.test_function_rettypeN  s-     {%%a++r111111r    N)
r!   r"   r#   r   r$   r%   r   r   r   r   r&   r    r   r   r   K  sM        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   r2   	Exception)r   r4   excs      r   test_end_if_commentz,TestFortranGroupCounters.test_end_if_commentU  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   T  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   r2   getvalue)r   r9   r4   stdout_f2pyr5   s        r   test_gh22648z%TestF77CommonBlockReader.test_gh22648_  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   ^  s#        8 8 8 8 8r    r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )TestParamEvalc                     d}t          t          j        t          j        t          j                  }dddddddd	d
}d}t          j        ||||          }|dddk    sJ d S )Nz(/3.14, 4./)kindselected_int_kindselected_real_kind   r   r   rk   r   r   r   )dpintparamarraynestedz(2)r   gQ	@g      @r   r   
_kind_func_selected_int_kind_func_selected_real_kind_func
param_evalr   vg_paramsparamsr   rets         r   test_param_eval_nestedz$TestParamEval.test_param_eval_nestedg  s    \4"."F#/#HJ J J aLL !aA..0 0%a67KKK$3''''''''r    c                     d}t          t          j        t          j        t          j                  }i }d}t          j        ||||          }|ddddk    sJ d S )	Nz(/ 6, 3, 1 /)r  z(-1:1)r     r   r   )r   r   r  r  s         r   !test_param_eval_nonstandard_rangez/TestParamEval.test_param_eval_nonstandard_ranger  su    \4"."F#/#HJ J J %a67KKK1q))))))))r    c                     d}t          t          j        t          j        t          j                  }i }d}t          j        t          t          j        ||||           d S )N6r  r   r  	r   r   r  r  r  r   raises
ValueErrorr  r   r  r  r  r   s        r   test_param_eval_empty_rangez)TestParamEval.test_param_eval_empty_range|  sn    \4"."F#/#HJ J J j,"91h%	' 	' 	' 	' 	' 	'r    c                     d}t          t          j        t          j        t          j                  }i }t          j        |||d           }|dk    sJ d S )Nz3.14_dpr  r  r  )r   r  r  r  r  s        r   test_param_eval_non_array_paramz-TestParamEval.test_param_eval_non_array_param  sf    \4"."F#/#HJ J J %a64HHHir    c                     d}t          t          j        t          j        t          j                  }i }d}t          j        t          t          j        ||||           d S )Nz*reshape((/ (i, i=1, 250) /), (/5, 10, 5/))r  z(0:4, 3:12, 5)r  r  r   s        r   test_param_eval_too_many_dimsz+TestParamEval.test_param_eval_too_many_dims  sn    8\4"."F#/#HJ J J "j,"91h%	' 	' 	' 	' 	' 	'r    N)r!   r"   r#   r  r  r!  r#  r%  r&   r    r   r  r  e  s_        	( 	( 	(* * *' ' '     ' ' ' ' 'r    r  )$r   codecsr   unicodedatar   numpyr   numpy.f2py.crackfortranr   r   r   r   
numpy.f2pyr   r   r   r   F2PyTestr	   r(   rG   rV   ri   ro   r}   r   r   r   r   r   r   r   r   r   r   r  r&   r    r   <module>r,     s                  D D D D D D D D       # # # # # #      				, , , , ,$- , , ,%  %  %  %  %  %  %  % N? ? ? ? ? ? ? ?:    4=   &    t}   I I I I I I I I*d/ d/ d/ d/ d/$- d/ d/ d/N< < < < < < < <3 3 3 3 3t} 3 3 3' ' ' ' ' ' ' '        "E "E "E "E "E "E "E "EH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2' 2' 2' 2' 2' 2' 2' 2' 2' 2'r    