
    Kh?                        S SK r S SKrS SKrS SKrS SKJrJr  SSKJ	r	  S SK
Jr  S SKrS SKrS SKr " S S\	R                  5      r " S S	5      r " S
 S5      r " S S\	R                  5      r " S S\	R                  5      r " S S5      r " S S\	R                  5      r " S S5      r " S S\	R                  5      r " S S\	R                  5      r\R4                  R6                   " S S\	R                  5      5       r " S S5      r " S S\	R                  5      r " S  S!\	R                  5      r " S" S#5      r  " S$ S%5      r!\R4                  R6                   " S& S'\	R                  5      5       r"g)(    N)markinnerspacesnameargspattern   )util)crackfortranc                   F    \ rS rSr\R
                  " SSSS5      /rS rSrg)	TestNoSpace   testssrcr   z	gh15035.fc                    [         R                  " / SQ[         R                  S9n[         R                  " / SQ[         R                  S9nU R                  R	                  U5        [         R
                  " XS-   5      (       d   eU R                  R                  X!/5        [         R
                  " XS-   5      (       d   eU R                  R                  S5      S:X  d   eg )Nr         )dtyper   23   2)nparrayfloat64modulesubballclosesubct0)selfkws      T/var/www/html/env/lib/python3.13/site-packages/numpy/f2py/tests/test_crackfortran.pytest_moduleTestNoSpace.test_module   s    HHYbjj1HHYbjj1{{1!e$$$$! {{1!e$$$${{~~d#t+++     N)	__name__
__module____qualname____firstlineno__r   getpathsourcesr    __static_attributes__r#   r"   r   r	   r	      s      ||GUNKHIG,r"   r	   c                   ,    \ rS rSrS rS rS rS rSrg)TestPublicPrivate   c                 n   [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   eUS   nSUS   S	   S
   ;   d   eSUS   S	   S
   ;  d   eSUS   S   S
   ;   d   eSUS   S   S
   ;  d   eSUS   S   S
   ;  d   eSUS   S   S
   ;   d   eg )Nr   r   r   zprivatemod.f90r   r   privatevarsaattrspecpublicbsetar   r(   r   strlen)r   fpathmods      r   test_defaultPrivate%TestPublicPrivate.test_defaultPrivate   s    We^=MN''U53x1}}!fCK,Z8888s6{3/
;;;;CK,Z8888s6{3/
;;;;FF 3J ????3v;v.z::::r"   c                 *   [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   eUS   nSUS   S	   S
   ;   d   eSUS   S	   S
   ;  d   eSUS   S   S
   ;  d   eSUS   S   S
   ;   d   eg )Nr   r   r   zpublicmod.f90r   r   r/   r0   r1   r2   r3   r5   r6   r   tmp_pathr9   r:   s       r   test_defaultPublic$TestPublicPrivate.test_defaultPublic)   s    We^_M''U53x1}}!fCK,Z8888s6{3/
;;;;FF 3J ????3v;v.z::::r"   c                 <   [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   eUS   S   n[        US   S	   5      S
S1:X  d   e[        US   S	   5      SS1:X  d   e[        US   S	   5      S1:X  d   eg )Nr   r   r   zaccesstype.f90r   r   r0   r1   r2   r/   zbind(c)b_r3   c)r   r(   r   r7   r8   set)r   r?   r9   r:   tts        r   test_access_type"TestPublicPrivate.test_access_type3   s    We^=MN''U53x1}}VF^2c7:&'Iy+AAAA2d8J'(Xy,AAAA2c7:&'H:555r"   c                     [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   e[        R
                  " U5      nSU;  d   eg )Nr   r   r   zgh23879.f90r   bar)r   r(   r   r7   r8   crack2fortran)r   r?   r9   r:   pyfs        r   test_nowrap_private_proceedures1TestPublicPrivate.test_nowrap_private_proceedures<   sZ    We^]K''U53x1}}((-Cr"   r#   N)	r$   r%   r&   r'   r;   r@   rG   rM   r*   r#   r"   r   r,   r,      s    
;;6 r"   r,   c                        \ rS rSrS rS rSrg)TestModuleProcedureC   c                     [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   eUS   nSU;   a  [	        US   5      S:X  d   eUS   S   S	   S
:X  d   eSUS   S   ;   d   eUS   S   S   SS/:X  d   eUS   S   S	   S:X  d   eSUS   S   ;   d   eUS   S   S   S/:X  d   eUS   S   S	   S:X  d   eSUS   S   ;   d   eUS   S   S   SS/:X  d   eg )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_realr6   r>   s       r   test_moduleOperators(TestModuleProcedure.test_moduleOperatorsD   sc   We^_M''U53x1}}!f}S[!1Q!6666{1~f%);;;;#f+a.0006{1~o.%& 	& &6{1~f%777#f+a.0006{1~o.3D2EEEE6{1~f%888#f+a.0006{1~o.
#$ 	$ $r"   c                    [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   eUS   nUS   S   S	   S
/:X  d   eUS   S   S	   S/:X  d   eUS   S   S	   S/:X  d   eg )Nr   r   r   zpubprivmod.f90r   r   r0   r1   r2   r/   r4   r3   r5   r6   r>   s       r   test_notPublicPrivate)TestModuleProcedure.test_notPublicPrivateV   s    We^=MN''U53x1}}!f6{3
+	}<<<6{3
+|;;;6{6":.8,>>>r"   r#   N)r$   r%   r&   r'   r\   r_   r*   r#   r"   r   rP   rP   C   s    $$?r"   rP   c                   L    \ rS rSr\R
                  " SSSS5      /rS rS rSr	g	)
TestExternal`   r   r   r   z	gh17859.fc                 P    S nU R                   R                  U5      nUS:X  d   eg )Nc                     U S-   $ N{   r#   xs    r   incr5TestExternal.test_external_as_statement.<locals>.incre       s7Nr"   rg   )r   external_as_statementr   rj   rs      r   test_external_as_statement'TestExternal.test_external_as_statementd   (    	 KK--d3Cxxr"   c                 P    S nU R                   R                  U5      nUS:X  d   eg )Nc                     U S-   $ rf   r#   rh   s    r   rj   5TestExternal.test_external_as_attribute.<locals>.incrl   rl   r"   rg   )r   external_as_attributern   s      r   test_external_as_attribute'TestExternal.test_external_as_attributek   rr   r"   r#   N)
r$   r%   r&   r'   r   r(   r)   rp   rw   r*   r#   r"   r   rb   rb   `   s#    ||GUNKHIGr"   rb   c                   t    \ rS rSr\R
                  " SSSS5      \R
                  " SSSS5      /rS rS rS	r	g
)TestCrackFortrans   r   r   r   z
gh2848.f90zcommon_with_division.fc                 L    U R                   R                  SS5      nUS:X  d   eg )Nr   r   r   r   )r   gh2848)r   ro   s     r   test_gh2848TestCrackFortran.test_gh2848y   s$    KKq!$F{{r"   c                 b    [        U R                  R                  R                  5      S:X  d   eg )N   )r8   r   mortmpctmpr   s    r   test_common_with_division*TestCrackFortran.test_common_with_division}   s%    4;;%%**+r111r"   r#   N)
r$   r%   r&   r'   r   r(   r)   r   r   r*   r#   r"   r   rz   rz   s   s8    ||GUNLI||GUN<TUG2r"   rz   c                   ,    \ rS rSrS rS rS rS rSrg)TestMarkinnerspaces   c                 @    / SQnU H  n[        U5      U:X  a  M   e   g )N)za z aza b cz'abcdefghij'r   )r   	test_listis      r   test_do_not_touch_normal_spaces3TestMarkinnerspaces.test_do_not_touch_normal_spaces   s$    9	A"1%*** r"   c                 H    [        S5      S:X  d   e[        S5      S:X  d   eg )Nza 'b c' \' \'za 'b@_@c' \' \'za "b c" \" \"za "b@_@c" \" \"r   r   s    r   test_one_relevant_space+TestMarkinnerspaces.test_one_relevant_space   s,    015HHHH/04FFFFr"   c                 H    [        S5      S:X  d   e[        S5      S:X  d   eg )Nza 'b c" " d' eza 'b@_@c"@_@"@_@d' eza "b c' ' d" eza "b@_@c'@_@'@_@d" er   r   s    r   test_ignore_inner_quotes,TestMarkinnerspaces.test_ignore_inner_quotes   s,    126NNNN126NNNNr"   c                 H    [        S5      S:X  d   e[        S5      S:X  d   eg )Nza 'b c' 'd e'za 'b@_@c' 'd@_@e'za "b c" "d e"za "b@_@c" "d@_@e"r   r   s    r   test_multiple_relevant_spaces1TestMarkinnerspaces.test_multiple_relevant_spaces   s+    /3FFFF/04HHHHr"   r#   N)	r$   r%   r&   r'   r   r   r   r   r*   r#   r"   r   r   r      s    +
GOIr"   r   c            	          \ rS rSrSrSr\R                  " S5      r/ SQr	S/r
\	\
-   rSr\" \5       Hg  u  rr\R!                  S5       V Vs/ s H  nS	U;   a  UR!                  S	5      S
   OSPM!     snn r\\R%                  \\SR'                  \5      S9-  rMi     \R*                  R-                  S\5      \R*                  R.                  S 5       5       r\R*                  R-                  S\5      S 5       rSrgs  snn f )TestDimSpec   an  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 ,:r   1z, )countdimspecfirstr   c                     U R                   R                  U5      n[        U R                  SU 35      nS H  nU" U5      u  pVUR                  U:X  a  M   e   g )Nget_arr_size_r   r   r         )all_dimspecsindexgetattrr   size)r   r   r   get_arr_sizer   szr1   s          r   test_array_sizeTestDimSpec.test_array_size   sV     !!''0t{{mE7,CD A OEB66R<< !r"   c                 4   U R                   R                  U5      n[        U R                  SU 35      n[        U R                  SU 35      nS HE  nU" U5      u  pgXR                  ;   a	  U" Xu5      nOU" U5      nU" U5      u  pXi:X  a  M>   XXXi45       e   g )Nr   get_inv_arr_size_r   )r   r   r   r   nonlinear_dimspecs)r   r   r   r   get_inv_arr_sizer   r   r1   n1sz1_s              r   test_inv_array_sizeTestDimSpec.test_inv_array_size   s     !!''0t{{mE7,CD"4;;2CE70KL A OEB111 &a+ &a( ""%FC9.qb..9 !r"   r#   N)r$   r%   r&   r'   __doc__suffixtextwrapdedentcode_templatelinear_dimspecsr   r   code	enumerater   r   splitlstformatjoinpytestmarkparametrizeslowr   r   r*   ).0ds   00r   r   r      s   < FOO % 	M&O **"%77LD#L1w?F}}S?QR?Q!3!8Q4?QR$$))C. % 
 	
 2 [[Y5[[   6  [[Y5/ 6/' Ss   &C>r   c                       \ rS rSrS rSrg)TestModuleDeclaration   c                     [         R                  " SSSS5      n[        R                  " [        U5      /5      n[	        U5      S:X  d   eUS   S   S   S	   S
:X  d   eg )Nr   r   r   zfoo_deps.f90r   r   r0   abar=zbar('abar')r6   r>   s       r   test_dependencies'TestModuleDeclaration.test_dependencies   s\    We^^L''U53x1}}1vf~f%c*m;;;r"   r#   N)r$   r%   r&   r'   r   r*   r#   r"   r   r   r      s    <r"   r   c                       \ rS rSrS rSrg)TestEvali  c                     [         R                  nU" S0 5      S:X  d   eU" S0 5      S:X  d   eU" S[        SSS95      S:X  d   eU" S	0 5      S
:X  d   eg )N123z12 + 315za + br   r   )r1   r4   3z"123"z'123')r   _eval_scalardict)r   eval_scalars     r   test_eval_scalarTestEval.test_eval_scalar  sg    "//5"%...8R(D0007D1N3s:::7B'7222r"   r#   N)r$   r%   r&   r'   r   r*   r#   r"   r   r   r     s    3r"   r   c                   \    \ rS rSr\R
                  R                  S/ SQ5      S 5       rSrg)TestFortranReaderi  encoding)asciizutf-8zutf-16zutf-32c                     USU S3-  nUR                  SUS9 nUR                  S5        S S S 5        [        R                  " [        U5      /5      nUS   S   S:X  d   eg ! , (       d  f       N== f)	Ninput_with_z_encoding.f90r   )r   zd
                     subroutine foo()
                     end subroutine foo
                     r   rU   foo)openwriter   r7   )r   r?   r   f_pathffr:   s         r   test_input_encoding%TestFortranReader.test_input_encoding  sv     k(=AA[[x[0BHH   1
 ''V61vf~&&& 10s   A##
A1r#   N)	r$   r%   r&   r'   r   r   r   r   r*   r#   r"   r   r   r     s*    [[ZCE	'E	'r"   r   c                       \ rS rSr\R
                  " SSSS5      /r\R                  R                  \
R                  R                  S5      SL SS	9S
 5       rSrg)TestUnicodeCommenti  r   r   r   zunicode_comment.f90charset_normalizerNz7test requires charset_normalizer which is not installed)reasonc                 :    U R                   R                  S5        g )Nr   )r   r   r   s    r   test_encoding_comment(TestUnicodeComment.test_encoding_comment!  s    
 	r"   r#   )r$   r%   r&   r'   r   r(   r)   r   r   skipif	importlib	find_specr   r*   r#   r"   r   r   r     s[    ||GUN<QRSG[[		!	!"6	74	?H  	r"   r   c                   ^    \ rS rSr\R
                  R                  S// SQ5      S 5       rSrg)TestNameArgsPatternBacktrackingi)  	adversary))z
@)@bind@(@)z#@)@bind                         @(@)z@)@bind foo bar baz@(@c                    SnSnSu  pE[        XE5       H  nX-  n[        U5       H  n/ n	[        U5       HU  n[        R                  " 5       n
[        R                  " U5      nU	R                  [        R                  " 5       U
-
  5        MW     [        R                  " U	5      S:  a  M   e   W(       a   eUS-   n[        R                  " U5      (       a  M   e   g)zHaddress 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_backtrackingATestNameArgsPatternBacktracking.test_nameargspattern_backtracking*  s     %

-B!* ,-/0A**,B*112DEDLL!2!2!4r!9: 1 yy'#--- . O8 );U(B%"))*CDDDD' .r"   r#   N)	r$   r%   r&   r'   r   r   r   r  r*   r#   r"   r   r   r   )  s/    [[		
EEr"   r   c                   x    \ rS rSr\R
                  " SSSS5      /r\R                  R                  S 5       r
Srg)	TestFunctionReturniM  r   r   r   zgh23598.f90c                 H    U R                   R                  SS5      S:X  d   eg )Nr   r   r   )r   
intproductr   s    r   test_function_rettype(TestFunctionReturn.test_function_rettypeP  s#     {{%%a+r111r"   r#   N)r$   r%   r&   r'   r   r(   r)   r   r   r   r  r*   r#   r"   r   r  r  M  s5    ||GUNMJKG[[2 2r"   r  c                       \ rS rSrS rSrg)TestFortranGroupCountersiV  c                     [         R                  " SSSS5      n [        R                  " [        U5      /5        g ! [         a  n SU 35       eS nAff = f)Nr   r   r   z	gh23533.fz0'crackfortran.crackfortran' raised an exception )r   r(   r   r7   	Exception)r   r9   excs      r   test_end_if_comment,TestFortranGroupCounters.test_end_if_commentW  sT    We^[I	S%%s5zl3 	SRLSERR5	Ss    < 
A
AAr#   N)r$   r%   r&   r'   r  r*   r#   r"   r   r  r  V  s    Sr"   r  c                       \ rS rSrS rSrg)TestF77CommonBlockReaderi`  c                 (   [         R                  " SSSS5      n[        R                  " [        R
                  " 5       5       n[        R                  " [        U5      /5      nS S S 5        SWR                  5       ;  d   eg ! , (       d  f       N%= f)Nr   r   r   zgh22648.pyfMismatch)	r   r(   
contextlibredirect_stdoutioStringIOr   r7   getvalue)r   r?   r9   stdout_f2pyr:   s        r   test_gh22648%TestF77CommonBlockReader.test_gh22648a  sg    We^]K''6+++SZL9C 7!5!5!7777 76s   !B
Br#   N)r$   r%   r&   r'   r&  r*   r#   r"   r   r  r  `  s    8r"   r  c                   2    \ rS rSrS rS rS rS rS rSr	g)	TestParamEvalig  c                     Sn[        [        R                  [        R                  [        R                  S9nSSSS.SSSS	.S
.nSn[        R
                  " XX4S9nUSSS.:X  d   eg )Nz(/3.14, 4./)kindselected_int_kindselected_real_kind   r   r   r}   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_nested$TestParamEval.test_param_eval_nestedi  sr    \44"."F"F#/#H#HJ aL !aA.0%%a6K$3''''r"   c                     Sn[        [        R                  [        R                  [        R                  S9n0 nSn[        R
                  " XX4S9nUSSSS.:X  d   eg )	Nz(/ 6, 3, 1 /)r+  z(-1:1)r3     r   r   )r   r   r4  r9  s         r   !test_param_eval_nonstandard_range/TestParamEval.test_param_eval_nonstandard_ranget  s_    \44"."F"F#/#H#HJ %%a6K1q))))r"   c           	          Sn[        [        R                  [        R                  [        R                  S9n0 nSn[
        R                  " [        [        R                  XUUS9  g )N6r+  r   r3  	r   r   r5  r6  r7  r   raises
ValueErrorr8  r   r:  r;  r<  r   s        r   test_param_eval_empty_range)TestParamEval.test_param_eval_empty_range~  sU    \44"."F"F#/#H#HJ j,"9"91%	'r"   c                     Sn[        [        R                  [        R                  [        R                  S9n0 n[        R
                  " XUS S9nUS:X  d   eg )Nz3.14_dpr+  r3  r4  )r   r:  r;  r<  r=  s        r   test_param_eval_non_array_param-TestParamEval.test_param_eval_non_array_param  sU    \44"."F"F#/#H#HJ %%a64Hir"   c           	          Sn[        [        R                  [        R                  [        R                  S9n0 nSn[
        R                  " [        [        R                  XUUS9  g )Nz*reshape((/ (i, i=1, 250) /), (/5, 10, 5/))r+  z(0:4, 3:12, 5)r3  rG  rJ  s        r   test_param_eval_too_many_dims+TestParamEval.test_param_eval_too_many_dims  sU    8\44"."F"F#/#H#HJ "j,"9"91%	'r"   r#   N)
r$   r%   r&   r'   r>  rC  rK  rN  rQ  r*   r#   r"   r   r)  r)  g  s    	(*' 'r"   r)  c                   L    \ rS rSr\R
                  " SSSS5      /rS/rS rSr	g	)
TestLowerF2PYDirectivei  r   r   r   zgh27697.f90z--lowerc                     [         R                  " [        SS9 nU R                  R                  R                  S5        S S S 5        g ! , (       d  f       g = f)Nzaborting directly)match)r   rH  rI  r   utilsmy_abort)r   r  s     r   test_no_lower_fail)TestLowerF2PYDirective.test_no_lower_fail  s9    ]]:-@ASKK&&':; BAAs   &A		
Ar#   N)
r$   r%   r&   r'   r   r(   r)   optionsrY  r*   r#   r"   r   rT  rT    s%    ||GUNMJKGkG<r"   rT  )#r   r   r   numpyr   numpy.f2py.crackfortranr   r   r   r   
numpy.f2pyr   r   r   r"  F2PyTestr	   r,   rP   rb   rz   r   r   r   r   r   r   r   r   r   r  r  r  r)  rT  r#   r"   r   <module>r`     sG       D  #   	,$-- ,%  % N? ?:4== &2t}} 2I I*d/$-- d/N< <3t}} 3' '   "E "EH2 2St}} S8 82' 2'h <T]] < <r"   