1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
U
P±d°*ã@sddlZddlZddlZddlZddlZddlmZddlm    Z    ddl
m Z ddl Z Gdd„de    j ƒZGdd    „d    ƒZGd
d „d ƒZGd d „d e    j ƒZGdd„de    j ƒZGdd„dƒZGdd„de    j ƒZGdd„dƒZGdd„de    j ƒZGdd„de    j ƒZGdd„de    j ƒZdS)éN)Úmarkinnerspacesé)Úutil)Ú crackfortranc@s&eZdZe dddd¡gZdd„ZdS)Ú TestNoSpaceÚtestsÚsrcrz    gh15035.fcCsˆtjdddgtjd}tjdddgtjd}|j |¡t ||d¡sLt‚|j ||g¡t ||d¡spt‚|j d¡dks„t‚dS)Nréé)ZdtypeZ23ó2)    ÚnpÚarrayÚfloat64ÚmoduleZsubbZallcloseÚAssertionErrorZsubcÚt0)ÚselfÚkÚw©rúYd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\numpy/f2py/tests/test_crackfortran.pyÚ test_modules zTestNoSpace.test_moduleN)Ú__name__Ú
__module__Ú __qualname__rÚgetpathÚsourcesrrrrrr src@s$eZdZdd„Zdd„Zdd„ZdS)ÚTestPublicPrivatecCsÌt dddd¡}t t|ƒg¡}t|ƒdks0t‚|d}d|dd    d
ksPt‚d |dd    d
ksht‚d|dd d
ks€t‚d |dd d
ks˜t‚d|dd d
ks°t‚d |dd d
ksÈt‚dS)Nrrrzprivatemod.f90rrÚprivateÚvarsÚaÚattrspecÚpublicÚbÚseta©rrrÚstrÚlenr)rÚfpathÚmodrrrÚtest_defaultPrivatesz%TestPublicPrivate.test_defaultPrivatecCsœt dddd¡}t t|ƒg¡}t|ƒdks0t‚|d}d|dd    d
ksPt‚d |dd    d
ksht‚d|dd d
ks€t‚d |dd d
ks˜t‚dS) Nrrrz publicmod.f90rrrrr r!r"r$r%©rÚtmp_pathr(r)rrrÚtest_defaultPublic(sz$TestPublicPrivate.test_defaultPubliccCs’t dddd¡}t t|ƒg¡}t|ƒdks0t‚|dd}t|dd    ƒd
d hksXt‚t|d d    ƒd d hkstt‚t|dd    ƒd hksŽt‚dS)Nrrrzaccesstype.f90rrrr r!rzbind(c)Zb_r"Úc)rrrr&r'rÚset)rr,r(r)ÚttrrrÚtest_access_type2s z"TestPublicPrivate.test_access_typeN)rrrr*r-r1rrrrrs 
rc@seZdZdd„Zdd„ZdS)ÚTestModuleProcedurecCs2t dddd¡}t t|ƒg¡}t|ƒdks0t‚|d}d|krPt|dƒdksTt‚|ddd    d
kslt‚d |ddks€t‚|ddd d d gksœt‚|ddd    dks´t‚d |ddksÈt‚|ddd dgksât‚|ddd    dksút‚d |ddkst‚|ddd ddgks.t‚dS)Nrrrz operators.f90rrÚbodyé    Únamezoperator(.item.)Z implementedbyZitem_intZ    item_realr    z operator(==)Zitems_are_equalr
z assignment(=)Zget_intZget_realr%r+rrrÚtest_moduleOperators=s$ÿÿz(TestModuleProcedure.test_moduleOperatorscCsŠt dddd¡}t t|ƒg¡}t|ƒdks0t‚|d}|ddd    d
gksRt‚|dd d    d gkslt‚|dd d    d gks†t‚dS)Nrrrzpubprivmod.f90rrrr r!rr#r"r$r%r+rrrÚtest_notPublicPrivateOsz)TestModuleProcedure.test_notPublicPrivateN)rrrr6r7rrrrr2<sr2c@s.eZdZe dddd¡gZdd„Zdd„Zd    S)
Ú TestExternalrrrz    gh17859.fcCs$dd„}|j |¡}|dks t‚dS)NcSs|dS©Né{r©ÚxrrrÚincr^sz5TestExternal.test_external_as_statement.<locals>.incrr:)rZexternal_as_statementr©rr=ÚrrrrÚtest_external_as_statement]s z'TestExternal.test_external_as_statementcCs$dd„}|j |¡}|dks t‚dS)NcSs|dSr9rr;rrrr=esz5TestExternal.test_external_as_attribute.<locals>.incrr:)rZexternal_as_attributerr>rrrÚtest_external_as_attributeds z'TestExternal.test_external_as_attributeN)rrrrrrr@rArrrrr8Ysr8c@s&eZdZe dddd¡gZdd„ZdS)ÚTestCrackFortranrrrz
gh2848.f90cCs|j dd¡}|dkst‚dS)Nrr    )rr    )rZgh2848r)rr?rrrÚ test_gh2848pszTestCrackFortran.test_gh2848N)rrrrrrrCrrrrrBlsrBc@s,eZdZdd„Zdd„Zdd„Zdd„Zd    S)
ÚTestMarkinnerspacescCs*ddddg}|D]}t|ƒ|kst‚qdS)Nza z aza b cz 'abcdefghij'©rr)rZ    test_listÚirrrÚtest_do_not_touch_normal_spacesxs z3TestMarkinnerspaces.test_do_not_touch_normal_spacescCs$tdƒdkst‚tdƒdks t‚dS)Nz a 'b c' \' \'za 'b@_@c' \' \'z a "b c" \" \"za "b@_@c" \" \"rE©rrrrÚtest_one_relevant_space}sz+TestMarkinnerspaces.test_one_relevant_spacecCs$tdƒdkst‚tdƒdks t‚dS)Nza 'b c" " d' eza 'b@_@c"@_@"@_@d' eza "b c' ' d" eza "b@_@c'@_@'@_@d" erErHrrrÚtest_ignore_inner_quotessz,TestMarkinnerspaces.test_ignore_inner_quotescCs$tdƒdkst‚tdƒdks t‚dS)Nz a 'b c' 'd e'za 'b@_@c' 'd@_@e'z a "b c" "d e"za "b@_@c" "d@_@e"rErHrrrÚtest_multiple_relevant_spaces…sz1TestMarkinnerspaces.test_multiple_relevant_spacesN)rrrrGrIrJrKrrrrrDusrDc@s°eZdZdZdZe d¡Zdddddd    d
d gZd gZ    ee    Z
d Z e e
ƒD]6\Z Zdd„e d¡DƒZe eje ed e¡d7Z qHej de
¡dd„ƒZej de
¡dd„ƒZdS)Ú 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
    Únz2*nz2:nzn/2z5 - n/2z3*n:20zn*(n+1):n*(n+5)z2*n, nz 2*n:3*n*n+2*nÚcCs&g|]}d|kr| d¡dnd‘qS)ú:rÚ1)Úsplit)Ú.0ÚdrrrÚ
<listcomp>ÆszTestDimSpec.<listcomp>ú,z, )ÚcountÚdimspecÚfirstrWcCsF|j |¡}t|jd|›ƒ}dD]}||ƒ\}}|j|ks"t‚q"dS)NÚ get_arr_size_©rr    r
éé)Ú all_dimspecsÚindexÚgetattrrÚsizer)rrWrVÚ get_arr_sizerMÚszr rrrÚtest_array_sizeÍs
  zTestDimSpec.test_array_sizec CsŒ|j |¡}t|jd|›ƒ}t|jd|›ƒ}dD]R}||ƒ\}}||jkrZ|||ƒ}n||ƒ}||ƒ\}    }
||    ks4t||||    fƒ‚q4dS)NrYZget_inv_arr_size_rZ)r]r^r_rÚnonlinear_dimspecsr) rrWrVraZget_inv_arr_sizerMrbr Zn1Zsz1Ú_rrrÚtest_inv_array_size×s  
  zTestDimSpec.test_inv_array_sizeN)rrrÚ__doc__ÚsuffixÚtextwrapÚdedentZ code_templateZlinear_dimspecsrdr]ÚcodeÚ    enumeraterVrWrQÚlstÚformatÚjoinÚpytestÚmarkÚ parametrizercrfrrrrrL‰s4
þý
 
     rLc@seZdZdd„ZdS)ÚTestModuleDeclarationcCsPt dddd¡}t t|ƒg¡}t|ƒdks0t‚|dddd    d
ksLt‚dS) Nrrrz foo_deps.f90rrrZabarú=z bar('abar')r%r+rrrÚtest_dependenciesðsz'TestModuleDeclaration.test_dependenciesN)rrrrurrrrrsïsrsc@seZdZdd„ZdS)ÚTestEvalcCsZtj}|diƒdkst‚|diƒdks*t‚|dtdddƒdksDt‚|d    iƒd
ksVt‚dS) NZ123z12 + 3Z15za + brr    )r r#Ú3z"123"z'123')rZ _eval_scalarrÚdict)rZ eval_scalarrrrÚtest_eval_scalar÷s
zTestEval.test_eval_scalarN)rrrryrrrrrvösrvc@s*eZdZej dddddg¡dd„ƒZdS)    ÚTestFortranReaderÚencodingÚasciizutf-8zutf-16zutf-32c    Cs\|d|›d}|jd|d}| d¡W5QRXt t|ƒg¡}|dddksXt‚dS)    NZ input_with_z _encoding.f90r)r{zd
                     subroutine foo()
                     end subroutine foo
                     rr5Úfoo)ÚopenÚwriterr&r)rr,r{Zf_pathÚffr)rrrÚtest_input_encodings
z%TestFortranReader.test_input_encodingN)rrrrprqrrrrrrrrzs
ÿrzc@sBeZdZe dddd¡gZejje    j 
d¡dkddd    d
„ƒZ dS) ÚTestUnicodeCommentrrrzunicode_comment.f90Zcharset_normalizerNz7test requires charset_normalizer which is not installed)ÚreasoncCs|j d¡dS)Nr
)rr}rHrrrÚtest_encoding_commentsz(TestUnicodeComment.test_encoding_comment) rrrrrrrprqZskipifÚ    importlibÚ    find_specr„rrrrr‚s þr‚)r…ÚcodecsÚ unicodedatarpÚnumpyr Znumpy.f2py.crackfortranrrNrZ
numpy.f2pyrriZF2PyTestrrr2r8rBrDrLrsrvrzr‚rrrrÚ<module>s&   !    f