
    G/Phl                        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 d dlmZ d dl	Z	d dl
Z
ddlmZ d dlmZ d dlmZ d Z ed	d
          ZdRdZ e
j        d          d             Z e
j        d          d             Z e
j        d          d             Z e
j        d          d             Z e
j        d          d             Z e
j        d          d             Zd Zd Zd Zd Zd Z d Z!e
j"        #                    ej$        dk    d          d             Z%e
j"        #                     e	j&                    dk    p
ej$        dk    d           d!             Z'e
j"        j(        d"             Z)d# Z*d$ Z+d% Z,d& Z-d' Z.d( Z/d) Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6d0 Z7e
j"        8                    d1          d2             Z9d3 Z:d4 Z;d5 Z<d6 Z=d7 Z>d8 Z?d9 Z@d: ZAd; ZBe
j"        8                    d1          d<             ZCe
j"        #                     e	j&                    dk    p
ej$        dk    d=          d>             ZDe
j"        #                     e	j&                    dk    p
ej$        dk    d=          d?             ZEd@ ZFdA ZGdB ZHdC ZIdD ZJdE ZKdF ZLdG ZMdH ZNdI ZOdJ ZPdK ZQdL ZRdM ZSdN ZTdO ZUdP ZVdQ ZWdS )S    N)Path)
namedtuple   )util)main)NOGIL_BUILDc                  t    t          j                    st          j        d           d S t	                       d S )Nz$CLI command needs a Fortran compiler)r   has_fortran_compilerpytestskipf2pycli     \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numpy/f2py/tests/test_f2py2e.pycompiler_check_f2pyclir      s7    $&& :;;;;;					r   PPathsz(finp, f90inp, pyf, wrap77, wrap90, cmodfuntitledc                 @   t          |           }t          |                    d          |                    d          |                    d          |                    | d          |                    | d          |                    | d                    S )ax  Takes in a temporary file for testing and returns the expected output and input paths

    Here expected output is essentially one of any of the possible generated
    files.

    ..note::

         Since this does not actually run f2py, none of these are guaranteed to
         exist, and module names are typically incorrect

    Parameters
    ----------
    fname_inp : str
                The input filename
    mname : str, optional
                The name of the module, untitled by default

    Returns
    -------
    genp : NamedTuple PPaths
            The possible paths which are generated, not all of which exist
    z.fz.f90.pyfz-f2pywrappers.fz-f2pywrappers2.f90module.c)finpf90inppyfwrap77wrap90cmodf)r   r   with_suffix	with_name)	fname_inpmnamebpaths      r   get_io_pathsr"      s    . OOEt$$  ((f%%%88899%;;;<<oo00011   r   session)scopec                     t          j        dddd                                          }|                                 dz  }|                    |d           |S )'Generates a single f90 file for testingtestssrcclizhiworld.f90z	hello.f90asciiencodingr   getpath	read_textgetbasetemp
write_texttmpdir_factoryfdatfns      r   hello_world_f90r6   F   sV     <}==GGIID		#	#	%	%	3BMM$M)))Ir   c                     t          j        dddd                                          }|                                 dz  }|                    |d           |S )z(F90 file for testing warnings in gh23598r'   r(   crackfortranzgh23598Warn.f90r*   r+   r-   r2   s      r   gh23598_warnr9   O   sX     <8IJJTTVVD		#	#	%	%(9	9BMM$M)))Ir   c                     t          j        dddd                                          }|                                 dz  }|                    |d           |S )z8F90 file for testing disallowed CLI arguments in ghff819r'   r(   r)   zgh_22819.pyfr*   r+   r-   r2   s      r   gh22819_clir;   X   sV     <~>>HHJJD		#	#	%	%	6BMM$M)))Ir   c                     t          j        dddd                                          }|                                 dz  }|                    |d           |S )'Generates a single f77 file for testingr'   r(   r)   zhi77.fzhello.fr*   r+   r-   r2   s      r   hello_world_f77r>   a   sV     <x88BBDDD		#	#	%	%		1BMM$M)))Ir   c                     t          j        dddd                                          }|                                 dz  }|                    |d           |S )r=   r'   r(   return_realzfoo77.fzfoo.fr*   r+   r-   r2   s      r   retreal_f77rA   j   sV     <yAAKKMMD		#	#	%	%	/BMM$M)))Ir   c                 b   t          j        dddd                                          }t          j        dddd                                          }|                                 dz  }|                                 dz  }|                    |d	           |                    |d	           |S )
r&   r'   r(   f2cmapzisoFortranEnvMap.f90z.f2py_f2cmapz
f2cmap.f90mapfiler*   r+   r-   )r3   r4   rC   r5   fmaps        r   
f2cmap_f90rF   r   s     <2HIISSUUD\'5(NCCMMOOF		#	#	%	%	4B%%'')3DMM$M)))OOFWO---Ir   c                    t          |          }|                    t          dd|                                            t	          j        |j                  5  t                       d |j                            d          D             }d|vsJ d|vsJ d|v sJ d|v sJ 	 d
d
d
           d
S # 1 swxY w Y   d
S )zCheck that module names are handled correctly
    gh-22819
    Essentially, the -m name cannot be used to import the module, so the module
    named in the .pyf needs to be used instead

    CLI :: -m and a .pyf file
    argvf2py -m blah c                 D    g | ]}|                                 |j        S r   )is_filename).0items     r   
<listcomp>z$test_gh22819_cli.<locals>.<listcomp>   s'    UUU4dllnnUTYUUUr   *zblahmodule.czblah-f2pywrappers.fztest_22819-f2pywrappers.fztest_22819module.czIgnoring blahN)	r   setattrsyssplitr   	switchdirparentr   rglob)capfdr;   monkeypatchipath	gen_pathss        r   test_gh22819_clir[      s'    EV%<U%<%<%B%B%D%DEEE		%	%  			UU5<+=+=c+B+BUUU	Y....$I5555*i7777#y0000                 s   AB33B7:B7c                 n   t          |          }|                    t          dd| d                                           t	          j        |j                  5  t          j        t          d          5  t                       ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zBOnly one .pyf file allowed
    gh-22819
    CLI :: .pyf files
    rH   rI   z
 hello.pyfzOnly one .pyf file per call)matchN)r   rQ   rR   rS   r   rT   rU   r   raises
ValueErrorr   )rW   r;   rX   rY   s       r   test_gh22819_many_pyfr`      s+   
 EV%FU%F%F%F%L%L%N%NOOO		%	%  ]:-JKKK 	 	III	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                 s6   B*7BB*B	B*B	B**B.1B.c                 Z   t          |d          }|j        }|                    t          dd| d                                           t          j        |j                  5  t                       |j	        
                                }d|vsJ 	 d d d            d S # 1 swxY w Y   d S )Ntestr    rH   f2py z -m testzintproductf2pywrap, intpr)r"   r   rQ   rR   rS   r   rT   rU   r   r   r/   )rW   r9   rX   foutlrY   wrappers         r   test_gh23598_warnrg      s    V444ELEV%%'') ) ) 
	%	% : :			,((***'99999: : : : : : : : : : : : : : : : : :s   $.B  B$'B$c                    t          |          }t          |          j        dz   }|                    t          dd| d|                                            t          j        |j                  5  t                       | 	                                \  }}d|v sJ t          |           
                                sJ 	 ddd           dS # 1 swxY w Y   dS )zIEnsures that a signature file is generated via the CLI
    CLI :: -h
    r   rH   zf2py -h  Saving signatures to fileN)r   stemrQ   rR   rS   r   rT   rU   r   
readouterrexists)rW   r6   rX   rY   opathout_s          r   test_gen_pyfrq      s%    !!E!!&/EV%?%?%?%?%?%E%E%G%GHHH		%	% ) )			!!##Q*c1111uJ&&((((((	) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )s   4ACCCc                 N   t          |          }|                    t          dd|                                            t	          j        |j                  5  t                       |                                 \  }}d|v sJ d|v sJ 	 ddd           dS # 1 swxY w Y   dS )zHEnsures that a signature file can be dumped to stdout
    CLI :: -h
    rH   zf2py -h stdout rj   zfunction hi() ! in N	r   rQ   rR   rS   r   rT   rU   r   rl   rW   r6   rX   rY   ro   rp   s         r   test_gen_pyf_stdoutru      s     !!EV%>u%>%>%D%D%F%FGGG		%	% , ,			!!##Q*c1111$+++++	, , , , , , , , , , , , , , , , , ,s   2BB!Bc                    t          |          }|                    t          dd|                                            t	          j        |j                  5  t          d                              dd           t          j	        t                    5  t                       |                                 \  }}d|v sJ 	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	zjEnsures that the CLI refuses to overwrite signature files
    CLI :: -h without --overwrite-signature
    rH   f2py -h faker.pyf 	faker.pyf	Fake newsr*   r+   z&Use --overwrite-signature to overwriteN)r   rQ   rR   rS   r   rT   rU   r1   r   r^   
SystemExitr   rl   )rW   r6   rX   rY   rp   errs         r   test_gen_pyf_no_overwriter|      s    !!EV%A%%A%A%G%G%I%IJJJ		%	% C C[$$[7$CCC]:&& 	C 	CIII%%''FAs;sBBBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	CC C C C C C C C C C C C C C C C C Cs6   >C),CC)C	C)C	C))C-0C-)      zPython 3.12 required)reasonc                 B   t          |          }|                    t          dd|                                            t	          j        |j                  5  t                       |                                 \  }}d|v sJ 	 ddd           dS # 1 swxY w Y   dS )z@Check that modules are named correctly

    CLI :: defaults
    rH   zf2py --backend meson -c zuntitledmodule.cN)	r   rQ   rR   rS   r   rT   rU   r   rl   rt   s         r   test_untitled_clir      s     !!EV%G%G%G%M%M%O%OPPP		%	% ) )   !!##Q!S((((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )s   ,BBBLinuxzCompiler and 3.12 requiredc           	         d}t          ||          }|j        }|                    t          dd| d|                                            t          j        |j                  5  t                       | 	                                \  }}d|v sJ 	 ddd           n# 1 swxY w Y   |                    t          dd                                           t          j        |j                  5  t                       | 	                                \  }}d	|v sJ 	 ddd           n# 1 swxY w Y   d
}|                    t          dd| d| d                                           t          j        |j                  5  t                       | 	                                \  }}d|v sJ 	 ddd           dS # 1 swxY w Y   dS )zqCheck that no distutils imports are performed on 3.12
    CLI :: --fcompiler --help-link --backend distutils
    hirc   rH   rd   z -c --fcompiler=gfortran -m z%--fcompiler cannot be used with mesonNzf2py --help-linkzUse --dep for meson buildshi2z -c -m z --backend distutilsz.Cannot use distutils backend with Python>=3.12)r"   r   rQ   rR   rS   r   rT   rU   r   rl   r   )rW   r6   rX   MNAMEre   rY   ro   rp   s           r   !test_no_py312_distutils_fcompilerr      s   
 E666ELEVGUGGGGMMOO   
	%	% > >   !!##Q6#=====> > > > > > > > > > > > > > > V(..00   
	%	% 3 3			!!##Q+s222223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 EVFUFF5FFFLLNN   
	%	% G G			!!##Q?3FFFFFG G G G G G G G G G G G G G G G G Gs6   (,B!!B%(B%3,D,,D03D0,GGGc                    t          |d          }|j        }d}d}|                    t          dd| d|                                            t          j        |j                  5  t                       | 	                                \  }}|                                D ]}	d|	 d	|v sJ |                                D ]}
d
|
 d|v sJ 	 ddd           dS # 1 swxY w Y   dS )z9Tests that functions can be skipped
    CLI :: skip:
    rb   rc   t0 t4 t8 sd s8 s4td s0rH   rd   z -m test skip: z=buildmodule: Could not found the body of interfaced routine "". Skipping.Constructing wrapper function ""N
r"   r   rQ   rR   rS   r   rT   rU   r   rl   )rW   rA   rX   re   rY   toskip	remainingro   r{   skeyrkeys              r   test_f2py_skipr     s   
 F333EJE FIV...f..44668 8 8 
	%	% D D			##%%SLLNN 	 	DbPTbbb    OO%% 	D 	DD<T<<<CCCCC	DD D D D D D D D D D D D D D D D D D   *A(C  C$'C$c                    t          |d          }|j        }d}d}|                    t          dd| d|                                            t          j        |j                  5  t                       | 	                                \  }}|                                D ]}	d|	 d	|v sJ |                                D ]}
d
|
 d|v sJ 	 ddd           dS # 1 swxY w Y   dS )z>Test that functions can be kept by only:
    CLI :: only:
    rb   rc   r   r   rH   rd   z -m test only: <buildmodule: Could not find the body of interfaced routine "r   r   r   Nr   )rW   rA   rX   re   rY   r   tokeepro   r{   r   r   s              r   test_f2py_onlyr     s    F333EJE FFV...f..44668 8 8 
	%	% D D			##%%SLLNN 	 	Dataaa    LLNN 	D 	DD<T<<<CCCCC	DD D D D D D D D D D D D D D D D D Dr   c                    t          |d          }|j        }d}t          |          }d}d}	|                    t          dd| d|	 d	| d
|                                            t          j        |j                  5  t                       | 
                                \  }
}|                                D ]}d| d|v sJ |                                D ]}d| d|
v sJ 	 ddd           dS # 1 swxY w Y   dS )zfTests that it is possible to return to file processing mode
    CLI :: :
    BUG: numpy-gh #20520
    rb   rc   r   ztd s0 hiblahrH   rd    -m z only: z : r   r   r   r   N)r"   r   r   rQ   rR   rS   r   rT   rU   r   rl   )rW   r6   rA   rX   re   rY   r   ipath2r   r    ro   r{   r   r   s                 r   test_file_processing_switchr   6  s    F333EJE F/""FFE<<<5<<<<F<<BB 	
 	
   
	%	% D D			##%%SLLNN 	 	Dataaa    LLNN 	D 	DD<T<<<CCCCC	DD D D D D D D D D D D D D D D D D Ds   A(C77C;>C;c                    d}t          ||          }|j        }|                    t          dd| d|                                            t          j        |j                  5  t                       ddd           n# 1 swxY w Y   t          j
        |j                  sJ t          j
        |j                  sJ dS )zHChecks the generation of files based on a module name
    CLI :: -m
    r   rc   rH   rd   r   N)r"   r   rQ   rR   rS   r   rT   rU   r   r   rm   r   r   )rW   r6   rX   r   re   rY   s         r   test_mod_gen_f77r   T  s     E666ELEV%?U%?%?%?%?%E%E%G%GHHH		%	%  			               ;u{#####;u|$$$$$$$s   (BB
Bc           	         d}t          ||          }|j        }|                    t          dd| d| d                                           t          j        |j                  5  t                       t          d          
                                5 }|                                }d|v sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
zCheck that pyf files are correctly generated with module structure
    CLI :: -m <name> -h pyf_file
    BUG: numpy-gh #20520
    r   rc   rH   rd   r   z
 -h hi.pyfzhi.pyfzpython module hiN)r"   r   rQ   rR   rS   r   rT   rU   r   r   openread)rW   r>   rX   r   re   rY   hipyfpyfdats           r   test_mod_gen_gh25263r   e  sd   
 E666EJEV%IU%I%I%I%I%I%O%O%Q%QRRR		%	% 0 0			(^^  "" 	0eZZ\\F%/////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s6   )0CC5CC	CC		CC Cc                 d   t          |d          }|j        }t          j        d          }t          j        d          }|                    t
          dd| d                                           t          j        |j	                  5  t                       |                                 \  }}|                    |          J |                    |          J 	 ddd           n# 1 swxY w Y   |                    t
          dd| d	                                           t          j        |j	                  5  t                       |                                 \  }}|                    |          J |                    |          J 	 ddd           dS # 1 swxY w Y   dS )
zHLowers cases by flag or when -h is present

    CLI :: --[no-]lower
    rb   rc   zHI\(\)zhi\(\)rH   rd   z -m test --lowerNz -m test --no-lower)r"   r   recompilerQ   rR   rS   r   rT   rU   r   rl   search	rW   r>   rX   re   rY   capshicapsloro   rp   s	            r   test_lower_cmodr   u  s%   
 777EJEZ	""FZ	""FV%DU%D%D%D%J%J%L%LMMM		%	% * *			!!##Q}}S!!---}}S!!))))	* * * * * * * * * * * * * * * V::::@@BBD D D		%	% . .			!!##Q}}S!!)))}}S!!----	. . . . . . . . . . . . . . . . . .s&   AC--C14C1AF%%F),F)c           	         t          |d          }|j        }t          j        d          }t          j        d          }|                    t
          dd| d|j         d                                           t          j	        |j
                  5  t                       |                                 \  }}|                    |          J |                    |          J 	 d	d	d	           n# 1 swxY w Y   |                    t
          dd| d|j         d
                                           t          j	        |j
                  5  t                       |                                 \  }}|                    |          J |                    |          J 	 d	d	d	           d	S # 1 swxY w Y   d	S )z^Lowers cases in signature files by flag or when -h is present

    CLI :: --[no-]lower -h
    rb   rc   z	Block: HIz	Block: hirH   rd   z -h z -m test --overwrite-signatureNz) -m test --overwrite-signature --no-lower)r"   r   r   r   rQ   rR   r   rS   r   rT   rU   r   rl   r   r   s	            r   test_lower_sigr     sC   
 777EJEZ%%FZ%%F DDD59DDDJJLL   
	%	% * *			!!##Q}}S!!---}}S!!))))	* * * * * * * * * * * * * * * OOO59OOO		   
	%	% . .			!!##Q}}S!!)))}}S!!----	. . . . . . . . . . . . . . . . . .s&   AC55C9<C9AF55F9<F9c           
      ^   t          |          }d}d}|                    t          dd| d| d|                                            t	          j        |j                  5  t                       |                                 \  }}d| d|v sJ 	 d	d	d	           d	S # 1 swxY w Y   d	S )
zNEnsures that the build directory can be specified

    CLI :: --build-dir
    r   tttmprH   f2py -m ri   z --build-dir zWrote C/API module "r   Nrs   )rW   r6   rX   rY   r    odirro   rp   s           r   test_build_dirr     s   
 !!EEDVE5EE5EEtEEKKMMO O O 
	%	% 8 8			!!##Q0u000C777778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   $0B""B&)B&c                    t          |          }|                    t          dd| d                                           t	          j        |j                  5  t          d                              dd           t                       | 	                                \  }}d|v sJ 	 d	d	d	           d	S # 1 swxY w Y   d	S )
zXEnsures that the build directory can be specified

    CLI :: --overwrite-signature
    rH   rw   z --overwrite-signaturerx   ry   r*   r+   rj   N)
r   rQ   rR   rS   r   rT   rU   r1   r   rl   rt   s         r   test_overwriter     s   
 !!EV:U:::@@BBD D D 
	%	% 2 2[$$[7$CCC			!!##Q*c11111	2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   AB99B= B=c           	         t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|v sJ t          | d          	                                5 }d|
                                v sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
zJEnsures that TeX documentation is written out

    CLI :: --latex-doc
    r   rH   r   ri   z --latex-docDocumentation is saved to file
module.tex\documentclassNr   rQ   rR   rS   r   rT   rU   r   rl   r   r   rW   r6   rX   rY   r    ro   rp   otexs           r   test_latexdocr     s   
 !!EEV>5>>5>>>DDFFH H H 
	%	% 4 4			!!##Q/36666U&&&'',,.. 	4$$		33333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4	4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4s7    AC.0C
C.C	C.C	C..C25C2c           	      N   t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|vsJ 	 ddd           dS # 1 swxY w Y   dS )zMEnsures that TeX documentation is written out

    CLI :: --no-latex-doc
    r   rH   r   ri   z --no-latex-docr   Nrs   rW   r6   rX   rY   r    ro   rp   s          r   test_nolatexdocr     s   
 !!EEVA5AA5AAAGGIIK K K 
	%	% ; ;			!!##Q/s:::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;    ,BB!Bc           	         t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|v sJ t          d| d          	                                5 }d	|
                                vsJ 	 d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )zEnsures that truncated documentation is written out

    TODO: Test to ensure this has no effect without --latex-doc
    CLI :: --latex-doc --short-latex
    r   rH   r   ri   z --latex-doc --short-latexr   ./r   r   Nr   r   s           r   test_shortlatexr     s    !!EE<5<<5<<<BBDD   
	%	% 8 8			!!##Q/36666(u((())..00 	8D$DIIKK77777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8	8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 87    AC/1CC/C	C/C	C//C36C3c           	         t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|v sJ t          d| d          	                                5 }d	|
                                v sJ 	 d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )zIEnsures that RsT documentation is written out

    CLI :: --rest-doc
    r   rH   r   ri   z --rest-doc#ReST Documentation is saved to filer   zmodule.restz.. -*- rest -*-Nr   )rW   r6   rX   rY   r    ro   rp   orsts           r   test_restdocr     s   
 !!EEV=5==5===CCEEG G G 
	%	% 5 5			!!##Q4;;;;)u)))**//11 	5T%44444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5	5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5r   c           	      N   t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|vsJ 	 ddd           dS # 1 swxY w Y   dS )zLEnsures that TeX documentation is written out

    CLI :: --no-rest-doc
    r   rH   r   ri   z --no-rest-docr   Nrs   r   s          r   test_norestexdocr   "  s   
 !!EEV@5@@5@@@FFHHJ J J 
	%	% @ @			!!##Q4C?????@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @r   c           	         t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       t          d| d                                          5 }d|	                                v sJ 	 d	d	d	           n# 1 swxY w Y   d	d	d	           d	S # 1 swxY w Y   d	S )
zIEnsures that debugging wrappers are written

    CLI :: --debug-capi
    r   rH   r   ri   z --debug-capir   r   z#define DEBUGCFUNCSN
r   rQ   rR   rS   r   rT   rU   r   r   r   )rW   r6   rX   rY   r    ocmods         r   test_debugcapir   2  sl   
 !!EEV?5??5???EEGGI I I 
	%	% : :			&u&&&'',,.. 	:%)UZZ\\99999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:: : : : : : : : : : : : : : : : : :s6    4CB:.C:B>	>CB>	CCCz2Consistently fails on CI; noisy so skip not xfail.c           	         t          |           }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       t          j        t          j	         d          }t          j        |dd	          }d
}t          j        d          }|j        |k    sJ |j        |k    sJ 	 ddd           dS # 1 swxY w Y   dS )zEEnsures that debugging wrappers work

    CLI :: --debug-capi -c
    r   rH   r   ri   z -c --debug-capi -c "import blah; blah.hi()"TUTF-8capture_outputr,    Hello World
a   debug-capi:Python C/API function blah.hi()
debug-capi:float hi=:output,hidden,scalar
debug-capi:hi=0
debug-capi:Fortran subroutine `f2pywraphi(&hi)'
debug-capi:hi=0
debug-capi:Building return value.
debug-capi:Python C/API function blah.hi: successful.
debug-capi:Freeing memory.
        N)r   rQ   rR   rS   r   rT   rU   r   shlex
executable
subprocessruntextwrapdedentstdoutstderr)r6   rX   rY   r    cmd_runrouteouteerrs           r   test_debugcapi_bldr   B  sN    !!EEVB5BB5BBBHHJJL L L 
	%	% # #			+OOOPP~gdWMMM 	  	 	 {d""""{d"""""!# # # # # # # # # # # # # # # # # #s    A7C%%C),C)c           	      n   t          |          }d}|                    t          dd| d|                                            t	          j        |j                  5  t                       ddd           n# 1 swxY w Y   |                                 \  }}d|v sJ |                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|v sJ 	 ddd           dS # 1 swxY w Y   dS )zoEnsures that fortran subroutine wrappers for F77 are included by default

    CLI :: --[no]-wrap-functions
    r   rH   r   ri   N Fortran 77 wrappers are saved toz --wrap-functionsrs   r   s          r   test_wrapfunc_defr   `  s    !!EEV%?%?%?%?%?%E%E%G%GHHH		%	%  			              FC.#5555 VC5CC5CCCIIKKM M M 
	%	% : :			!!##Q2c99999: : : : : : : : : : : : : : : : : :s$   A::A>A>0,D**D.1D.c           	      N   t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       |                                 \  }}d|vsJ 	 ddd           dS # 1 swxY w Y   dS )zeEnsures that fortran subroutine wrappers for F77 can be disabled

    CLI :: --no-wrap-functions
    r   rH   r   ri   z --no-wrap-functionsr   Nrs   r   s          r   test_nowrapfuncr   y  s   
 !!EEVF5FF5FFFLLNNP P P 
	%	% > >			!!##Q2#=====> > > > > > > > > > > > > > > > > >r   c           	         t          |          }d}|                    t          dd| d| d                                           t	          j        |j                  5  t                       t          d| d                                          5 }|	                                }d|v sJ d	|v sJ 	 d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )zcAdd to the include directories

    CLI :: -include
    TODO: Document this in the help string
    r   rH   r   ri   z' -include<stdbool.h> -include<stdio.h> r   r   z#include <stdbool.h>z#include <stdio.h>Nr   )rW   r6   rX   rY   r    r   ocmrs          r   test_inclheaderr     s~    !!EEI5II5III	   
	%	% 0 0			&u&&&'',,.. 	0%::<<D)T1111'4/////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s6    4C!C6CC	C	C	
CC!Cc                      dS )z?Add to the include directories

    CLI :: --include-paths
    Nr   r   r   r   test_inclpathr     	     	Dr   c                      dS )z;Add to the include directories

    CLI :: --help-link
    Nr   r   r   r   
test_hlinkr     r   r   c                 t   t          |          }|                    t          dd| d                                           t	          j        |j                  5  t                       |                                 \  }}d|v sJ d|v sJ d|v sJ d|v sJ d|v sJ 	 d	d	d	           d	S # 1 swxY w Y   d	S )
zOCheck that Fortran-to-Python KIND specs can be passed

    CLI :: --f2cmap
    rH   rI   z --f2cmap mapfilez!Reading f2cmap from 'mapfile' ...z&Mapping "real(kind=real32)" to "float"z'Mapping "real(kind=real64)" to "double"z,Mapping "integer(kind=int64)" to "long_long"z0Successfully applied user defined f2cmap changesNrs   )rW   rF   rX   rY   ro   rp   s         r   test_f2cmapr     sA   
 EV%MU%M%M%M%S%S%U%UVVV		%	% I I			!!##Q2c9999;sBBBB<CCCCASHHHHASHHHHHI I I I I I I I I I I I I I I I I Is   AB--B14B1c                 b   t          |          }|                    t          dd| d                                           t	          j        |j                  5  t                       |                                 \  }}t          |          dk    sJ 	 ddd           dS # 1 swxY w Y   dS )z)Reduce verbosity

    CLI :: --quiet
    rH   rI   z --quietr   N)
r   rQ   rR   rS   r   rT   rU   r   rl   lenrt   s         r   
test_quietr     s    
 !!EV%DU%D%D%D%J%J%L%LMMM		%	%  			!!##Q3xx1}}}}}                 s   ;B$$B(+B(c                 D   t          |          }|                    t          dd| d                                           t	          j        |j                  5  t                       |                                 \  }}d|v sJ 	 ddd           dS # 1 swxY w Y   dS )z-Increase verbosity

    CLI :: --verbose
    rH   rI   z
 --verboseanalyzelineNrs   rt   s         r   test_verboser     s    
 !!EV%FU%F%F%F%L%L%N%NOOO		%	% $ $			!!##Q#####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   ,BBBc                 X   |                     t          dd                                           t          j        t
                    5  t                       |                                 \  }}ddl}|j	        |
                                k    sJ 	 ddd           dS # 1 swxY w Y   dS )z"Ensure version

    CLI :: -v
    rH   zf2py -vr   N)rQ   rR   rS   r   r^   rz   r   rl   numpy__version__strip)rW   rX   ro   rp   nps        r   test_versionr     s    
 VY__%6%6777	z	"	" - -			!!##Q~,,,,,	- - - - - - - - - - - - - - - - - -s   A	BB#&B#c                    t          |           }|                    t          dd| d                                           t	          j        |j                  5  t                       t          j        t          j	         d          }t          j        |dd          }d}|j        |k    sJ 	 d	d	d	           d	S # 1 swxY w Y   d	S )
z
    CLI :: -c
    rH   rI   z -cr   Tr   r   r   N)r   rQ   rR   rS   r   rT   rU   r   r   r   r   r   r   )r6   rX   rY   r   r   r   s         r   test_npdistopr     s   
 !!EV%?U%?%?%?%E%E%G%GHHH		%	% # #			+OOOPP~gdWMMM{d"""""# # # # # # # # # # # # # # # # # #s   AB??CCz*Compiler and Python 3.12 or newer requiredc                    t          |           }|                    t          dd| d                                           t	          j        |j                  5  t                       t          j         d}t          r|dz  }n|dz  }t          j        |          }t          j        |dd	          }d
}|j        |k    sJ t          rd|j        v sJ |j        dk    sJ 	 ddd           dS # 1 swxY w Y   dS )z.
    CLI :: --no-freethreading-compatible
    rH   rI   z! -c --no-freethreading-compatible -c "import blah; blah.hi();z1import sys; assert sys._is_gil_enabled() is True"r   Tr   r   r   zHThe global interpreter lock (GIL) has been enabled to load module 'blah'r   Nr   rQ   rR   rS   r   rT   rU   r   r   r   r   r   r   r   r   
returncoder6   rX   rY   cmdr   r   r   s          r    test_no_freethreading_compatibler    sb    !!EV%]U%]%]%]%c%c%e%efff		%	% $ $   >>> 	GGCC4KC+c""~gdWMMM{d"""" 	m]aealllll!#####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   B	C22C69C6c                    t          |           }|                    t          dd| d                                           t	          j        |j                  5  t                       t          j         d}t          r|dz  }n|dz  }t          j        |          }t          j        |dd	          }d
}|j        |k    sJ |j        dk    sJ |j        dk    sJ 	 ddd           dS # 1 swxY w Y   dS )z+
    CLI :: --freethreading_compatible
    rH   rI   z -c --freethreading-compatibler  z2import sys; assert sys._is_gil_enabled() is False"r   Tr   r   r    r   Nr  r  s          r   test_freethreading_compatibler
    sW    !!EV%ZU%Z%Z%Z%`%`%b%bccc		%	% $ $   >>> 	HHCC4KC+c""~gdWMMM{d""""{b    !#####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   BC--C14C1c                      dS )z
    CLI :: -c --fcompiler
    Nr   r   r   r   test_npd_fcompilerr  2  	    
 	Dr   c                      dS )z
    CLI :: -c --compiler
    Nr   r   r   r   test_npd_compilerr  :  r  r   c                      dS )z$
    CLI :: -c --help-fcompiler
    Nr   r   r   r   test_npd_help_fcompilerr  B  r  r   c                      dS )z
    CLI :: -c --f77exec
    Nr   r   r   r   test_npd_f77execr  J  r  r   c                      dS )z
    CLI :: -c --f90exec
    Nr   r   r   r   test_npd_f90execr  R  r  r   c                      dS )z
    CLI :: -c --f77flags
    Nr   r   r   r   test_npd_f77flagsr  Z  r  r   c                      dS )z
    CLI :: -c --f90flags
    Nr   r   r   r   test_npd_f90flagsr  b  r  r   c                      dS )z
    CLI :: -c --opt
    Nr   r   r   r   test_npd_optr  j  r  r   c                      dS )z
    CLI :: -c --arch
    Nr   r   r   r   test_npd_archr  r  r  r   c                      dS )z
    CLI :: -c --noopt
    Nr   r   r   r   test_npd_nooptr  z  r  r   c                      dS )z
    CLI :: -c --noarch
    Nr   r   r   r   test_npd_noarchr!    r  r   c                      dS )z
    CLI :: -c --debug
    Nr   r   r   r   test_npd_debugr#    r  r   c                      dS )z%
    CLI :: -c --link-<resource>
    Nr   r   r   r   test_npd_link_autor%    r  r   c                      dS )z/
    CLI :: -c -L/path/to/lib/ -l<libname>
    Nr   r   r   r   test_npd_libr'    r  r   c                      dS )z
    CLI :: -D<define>
    Nr   r   r   r   test_npd_definer)    r  r   c                      dS )z
    CLI :: -U<name>
    Nr   r   r   r   test_npd_undefiner+    r  r   c                      dS )z$
    CLI :: -I/path/to/include/
    Nr   r   r   r   test_npd_inclr-    r  r   c                      dS )z8
    CLI :: <filename>.o <filename>.so <filename>.a
    Nr   r   r   r   test_npd_linkerr/    r  r   )r   )Xr   r   rR   r   r   pathlibr   collectionsr   platformr   r	  r   numpy.f2py.f2py2er   r   numpy.testing._private.utilsr   r   r   r"   fixturer6   r9   r;   r>   rA   rF   r[   r`   rg   rq   ru   r|   markskipifversion_infor   systemr   xfailr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r  r  r  r  r  r  r!  r#  r%  r'  r)  r+  r-  r/  r   r   r   <module>r;     s   + + + + + + + + + + + + + + + + + + + +       " " " " " "         - - - - - - 4 4 4 4 4 4   
HH	I	I   N i     !  i     !  i     !  i     !  i     !  i     !   (	 	 	
: 
: 
:) ) )
, 
, 
,C C C C$/8NOO
) 
) PO
) _X_&&'1Ss7G77R\xyyG G zyG> D D D.D D D.D D D<% % %"0 0 0 . . .4$. $. $.N8 8 8"2 2 2"4 4 4$; ; ; 8 8 8,5 5 5$@ @ @ : : :  MNN# # ON#:: : :2> > > 0 0 0.	 	 		 	 	I I I$  $ $ $- - - MNN# # ON# _X_&&'1Qc6F'6QG  I I$ $I I$. _X_&&'1Qc6F'6QG  I I$ $I I$2	 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 		 	 	 	 	r   