
    dafn              
       H   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ ej                  dk7  r e	j                  d      d dlZdZej$                  j'                         j)                  dj'                               rdZd	d
dej*                  ddddej*                  ddddej*                  ddddddej*                  iddddej*                  ej$                  ddddZ eddd      Zdj3                  d gej5                         D  cg c]  \  } }| d!d j7                          d"|  c}}       Zdj3                  d#d$g      Zd% Zd& Zd' Z d( Z! G d) d*      Z" G d+ d,      Z# G d- d.e	jH                  e#      Z%yc c}} w )/    N)Path)supportwin32ztest only applies to Windowspy.exez_d.exezpy_d.exezPython Test Suitezhttps://www.python.org/zX.Y versionX.Y.exe)NExecutablePath)DisplayNameInstallPathzX.Y-32 version
X.Y-32.exezX.Y-arm64 versionzX.Y-arm64.exez-X fake_arg_for_test)Nr   ExecutableArgumentsz!Ignored because no ExecutablePath)r	   
SupportUrl3.1003.100-323.100-arm64ignoredzPython Test Suite SinglezSingle Interpreter)r	   r   )PythonTestSuitePythonTestSuite1PythonTestSuite/3.100zPythonTestSuite/3.100-32zPythonTestSuite/3.100-arm64)	PY_PYTHON
PY_PYTHON2
PY_PYTHON3

[defaults]   =z
[commands]ztest-command=TEST_EXE.exec                 T    fd|j                         D ]  \  }} | ||        y )Nc                 f   t        |t              rCt        j                  | |      5 }|j	                         D ]  \  }} |||        	 d d d        y t        |t
              r(t        j                  | |d t        j                  |       y t        dj                  |            # 1 sw Y   y xY w)Nz&don't know how to create data for '{}')

isinstancedictwinregCreateKeyExitemsstr
SetValueExREG_SZ	TypeErrorformat)rootkeyvaluehkeykv_create_registry_datas         -/root/Python-3.12.4/Lib/test/test_launcher.pyr.   z3create_registry_data.<locals>._create_registry_data\   s    eT"##D#. 6$!KKM 6DAq)$1566 6 s#dCv}}eDDKKERSS6 6s   #B''B0)r"   )r(   datar,   r-   r.   s       @r/   create_registry_datar1   [   s0    
T 

 *1dAq)*    c              #      K   t        j                         D ]  }	 t        j                  | |        y # t        $ r}|j
                  dk(  rY d }~ y  d }~ww xY ww)Ni  )	itertoolscountr    EnumKeyOSErrorwinerror)r(   iexs      r/   	enum_keysr;   l   sU     __ 	..q))  	{{c!	s0   A6A	AAAAAAc                    t         j                  t         j                  z  }t        |      D ]N  }t        j                  | ||      5 }t        |t        |             d d d        t        j                  | |       P y # 1 sw Y   "xY w)Naccess)r    	KEY_WRITEKEY_ENUMERATE_SUB_KEYSlistOpenKeydelete_registry_datar;   	DeleteKey)r(   keysACCESSr)   r+   s        r/   rC   rC   v   sp     = ==FDz $^^D#f5 	8 y7	8s#$	8 	8s   A??B	c           	      \   d|  d}t         j                  dft         j                  t         j                  ft         j                  t         j                  ffD ]C  \  }}	 t        j
                  t        j                  ||t         j                  |z                y y# t        $ r Y Rw xY w)NzSoftware\Python\PythonCore\z\InstallPathr   r=   TF)	r    HKEY_CURRENT_USERHKEY_LOCAL_MACHINEKEY_WOW64_64KEYKEY_WOW64_32KEYCloseKeyrB   KEY_READr7   )tagr)   r(   flags       r/   is_installedrP   ~   s    (\
:C		!	!1%		"	"F$:$:;		"	"F$:$:; 	
d
	OOFNN4V__t=STU	   		s   <B	B+*B+c                       e Zd Zd Zd Zd Zy)PreservePyInic                 @    t        |      | _        || _        d | _        y N)r   pathcontent
_preserved)selfrU   rV   s      r/   __init__zPreservePyIni.__init__   s    J	r2   c                     	 | j                   j                         | _        | j                   j	                  | j
                  d       y # t        $ r
 d | _        Y :w xY w)Nzutf-16encoding)rU   
read_bytesrW   FileNotFoundError
write_textrV   rX   s    r/   	__enter__zPreservePyIni.__enter__   sP    	#"ii224DO 			T\\H= ! 	#"DO	#s   A	 	AAc                     | j                   | j                  j                          y | j                  j                  | j                          y rT   )rW   rU   unlinkwrite_bytes)rX   exc_infos     r/   __exit__zPreservePyIni.__exit__   s2    ??"IIII!!$//2r2   N)__name__
__module____qualname__rY   ra   rf    r2   r/   rR   rR      s    
>3r2   rR   c                   ~    e Zd ZdZed        Zd ZddZd Ze	j                  d	d       Ze	j                  d        Zy)

RunPyMixinNc                    d }t        j                         r+t        t        j                        j
                  t        z  }nRt        j                  d      j                  d      D ])  }|st        |      t        z  }|j                         s) n d }|r	 t        j                  |dgt        j                  t        j                  t        j                  dd      5 }|j                  j                          t!        |j"                  d      j%                         d   j'                  d	      d
   }|j"                  j)                          |j+                  d       d d d        t        j,                  j/                        sd }|s(t3        j4                  dj7                  t                    |S # 1 sw Y   VxY w# t0        $ r d }Y Ew xY w)NPATH;-hasciiignore)stdinstdoutstderrr\   errorsr   r       
   zcannot locate '{}' for test)	sysconfigis_python_buildr   sys
executableparentPY_EXEosgetenvsplitis_file
subprocessPopenPIPErs   closenextrt   
splitlines
rpartitionreadwaitversion
startswithr7   unittestSkipTestr'   )clspy_exepr   s       r/   find_pyzRunPyMixin.find_py   sw   $$&#..)0069FYYv&,,S1 !!Wv-F~~'	  %%TN$//%??%??$#  GGMMO"188T2==?BMMcRSTUGHHMMOFF2J {{--g6!F ##-44V<  +   s,   AF> A?F2)F> 2F;7F> >GGc                 \    | j                   s| j                         | _         | j                   S rT   )r   r   r`   s    r/   
get_py_exezRunPyMixin.get_py_exe   s     {{,,.DK{{r2   c                    | j                   s| j                         | _         h d}i t        j                  j	                         D ci c])  \  }}|j                         |vs|j                         |+ c}}dddd|xs i j	                         D ci c]  \  }}|j                         | c}}}|s| j                   g|}t        j                  ||| j                   t        j                  t        j                  t        j                        5 }	|	j                  j                          |	j                  d       |	j                  j                         j                  dd      }
|	j                  j                         j                  d	d      j!                  d
d      }d d d        	j"                  |k7  rat$        j&                  rQ|sOt)        d       t)        | j                   g|       t)        d       t)        
       t)        d       t)               |r>|	j"                  |k7  r/t        j*                  |	j"                  | j                   g|
      | j-                  ||	j"                         j/                         D ci c]L  }|j1                  d      s9d|v r5|j3                  d      d   |j3                  d      d   j5                         N }}
|d<   ||d<   |S c c}}w c c}}w # 1 sw Y   SxY wc c}w )N>   r   r   r   VIRTUAL_ENV1 )PYLAUNCHER_DEBUGPYLAUNCHER_DRYRUNPYLAUNCHER_LIMIT_TO_COMPANY)envr}   rs   rt   ru   ry   utf-8replacerq   u   �?z++ COMMAND ++z++ STDOUT ++z++ STDERR ++#:r   rx   rt   ru   )r   r   r   environr"   upperr   r   r   rs   r   r   rt   r   decoderu   r   
returncoder   verboseprintCalledProcessErrorassertEqualr   r   	partitionlstrip)rX   argsr   
allow_failexpect_returncodeargvrr   r,   r-   r   outerrsr0   s                 r/   run_pyzRunPyMixin.run_py   s   {{,,.DKI
(*

(8(8(:V1aggiv>Uqwwy!|V
 #!$+-	

 *-(9(9(;<1qwwy!|<
 KK'$'D{{//????
 	T GGMMOFF2J((--/(()<C((--/(()<DDXsSC	T <<,,/"4;;&&'.!#J.!#J!,,*;;//t{{>RT>RTWY\]].= ^^%
<<$ KKQS!1!!4!;!;!==
 

 XXM W =	T 	T.
s&   K,#K,K2BK8AL8Lc                     t         j                  j                  d      }|st        j                  d      t        t        |      dz  |      S )NLOCALAPPDATAz5LOCALAPPDATA environment variable is missing or emptyzpy.ini)r   r   getr   r   rR   r   )rX   rV   local_appdatas      r/   py_inizRunPyMixin.py_ini   sF    

~6## %7 8 8T-08;WEEr2   c              #      K   t        t        j                  t        j                               dz         }|j                  ||       	 | |j                          y # |j                          w xY ww)N)dirz.pyr[   )r   tempfilemktempr   getcwdr_   rc   )rX   rV   r\   files       r/   scriptzRunPyMixin.script  sP     HOO		4u<=(3	JKKMDKKMs   AA5A  A5 A22A5c              #   b  K   t        j                         dz  }|j                  dd       |t        t        j                        j
                  z  }|j                          	 |dt        |j                        if t        j                  |       y # t        j                  |       w xY ww)NScriptsT)exist_okparentsr   )r   cwdmkdirr|   r}   nametouchr#   r~   shutilrmtree)rX   venvvenv_exes      r/   	fake_venvzRunPyMixin.fake_venv  s     xxzI%

D$
/4/444	 ]C,<===MM$FMM$s   A!B/$B ?B/B,,B/)NFr   N)r   )rg   rh   ri   r   classmethodr   r   r   r   
contextlibcontextmanagerr   r   rj   r2   r/   rl   rl      s_    F& &P
,\F      r2   rl   c                   .   e Zd Zed        Zed        Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0y.)/TestLauncherc                     t        j                  t         j                  d      5 }t        |t               d d d        t
        j                  rt        j                  d      }y y # 1 sw Y   0xY w)NSoftware\Pythonz!reg query HKCU\Software\Python /s)	r    	CreateKeyrH   r1   	TEST_DATAr   r   r   check_output)r   r)   r   s      r/   
setUpClasszTestLauncher.setUpClass  sY    f66?L 	1PS i0	1 ??''(MNA 	1 	1s   A%%A.c                     t        j                  t         j                  dt         j                  t         j                  z        5 }t        |t               d d d        y # 1 sw Y   y xY w)Nr   r=   )r    rB   rH   r?   r@   rC   r   )r   r)   s     r/   tearDownClasszTestLauncher.tearDownClass'  s`    ^^F44RXRbRbek  fC  fC  SC  D 	1  HK i0	1 	1 	1s   A  A)c                     | j                  dg      }| j                  | j                  t        |d                | j                  t        j
                  j                  d      d   |d          y )N-0argv0rw   r   r   )r   r   r   r   r|   r   r   rX   r0   s     r/   test_versionzTestLauncher.test_version-  sW    {{D6"d4=&9:..s3A6YHr2   c                 R    | j                  dg      }| j                  d|d          y )Nrp   TruezSearchInfo.helpr   r   r   s     r/   test_help_optionzTestLauncher.test_help_option2  s(    {{D6"&7!89r2   c                     dD ]\  \  }}}| j                  |      5  | j                  |g      }| j                  ||d          | j                  ||d          d d d        ^ y # 1 sw Y   ixY w)N))r   r   False)-0pr   r   )--listr   r   )--list-pathsr   r   zSearchInfo.listzSearchInfo.listPaths)subTestr   r   )rX   optv1v2r0   s        r/   test_list_optionzTestLauncher.test_list_option6  s    
 		CKCR c" C{{C5)  T*;%<=  T*@%ABC C		CC Cs   =A##A,	c                    | j                  dg      }i }i }|d   j                         D ]>  }t        j                  d|      }|s|j	                  d      ||j	                  d      <   @ t
        D ]^  }t
        |   }|D cg c]  }t        ||   t              s| }	}|	D ]  }
d| d|
 }||
   d   ||<    |j                  d| d	d        ` |j                         D ci c]  \  }}||v s|| }}}	 | j                  ||       y c c}w c c}}w #  t        j                  rt        d
       t        |d           xY w)Nr   rt   \s*(.+?)\s+?(\*\s+)?(.+)$r      -V:/r	   /ignored*** STDOUT ***)r   r   rematchgroupr   r   r   popr"   assertDictEqualr   r   r   )rX   r0   foundexpectlinemcompanycompany_datattagsrN   argr,   r-   actuals                  r/   	test_listzTestLauncher.test_listB  s^   {{H:&N--/ 	/D5t<A$%GGAJaggaj!	/ ! 	6G$W-L+Q!z,q/4/PAQDQ ?G9AcU+*3/>s? JJWIX.5	6 $);;=@41aAK!Q$@@	  0 R A	&'d8n%s$   DD%D2D;D ,Ec           	      |   | j                  dg      }i }i }|d   j                         D ]>  }t        j                  d|      }|s|j	                  d      ||j	                  d      <   @ t
        D ]x  }t
        |   }|D cg c]  }t        ||   t              s| }	}|	D ]/  }
d| d|
 }||
   d   }	 |d	   ||<   	 ||xx   d
|d   z   z  cc<   1 |j                  d| dd        z |j                         D ci c]  \  }}||v s|| }}}	 | j!                  ||       y c c}w # t        $ r Y fw xY w# t        $ rA t        t        |d          t        t        j                        j                  z        ||<   Y w xY wc c}}w #  t"        j$                  rt'        d       t'        |d           xY w)Nr   rt   r   r   r   r   r   r
   r   rw   r   r   r   )r   r   r   r   r   r   r   r   KeyErrorr#   r   r|   r}   r   r   r"   r   r   r   r   )rX   r0   r   r   r   r   r   r   r  r  rN   r  installr,   r-   r  s                   r/   test_list_pathszTestLauncher.test_list_paths[  s   {{N+,N--/ 	/D5t<A$%GGAJaggaj!	/ ! 	6G$W-L+Q!z,q/4/PAQDQ 
WG9AcU+&s+M:W")*:";F3KssW5J-K'KK
W JJWIX.5	6" $);;=@41aAK!Q$@@	  0# R $  W"%d74=&9D<P<U<U&U"VF3KW
 A	&'d8n%sU   D(D(6D<?D-?F	F	F -	D96D<8D99D<<AFF,F;c                     d}| j                  d| dg      }| j                  d|d          | j                  ||d          | j                  d|d          y )	Nr   r   r   r   LaunchCommandenv.companyr   env.tagr   rX   r   r0   s      r/   test_filter_to_companyz#TestLauncher.test_filter_to_company}  s_    #{{c'!,-.D$9:$}"56$y/2r2   c                     d}| j                  d| dgt        d            }| j                  d|d          | j                  ||d	          | j                  d
|d          y )Nr   r   r   z3.0)r   r   r   r  r  r   r  )r   r   r   r  s      r/   #test_filter_to_company_with_defaultz0TestLauncher.test_filter_to_company_with_default  sh    #{{c'!,-4%3H{ID$9:$}"56$y/2r2   c                    d}| j                  dg      }| j                  d|d          | j                  ||d          | j                  d|d          | j                  dg      }| j                  d	|d          | j                  ||d          | j                  d
|d          | j                  dg      }| j                  d|d          | j                  ||d          | j                  d|d          y )Nr   z-V:3.100r   r  r  r   r  z-V:3.100-32r   r   z-V:3.100-arm64z"X.Y-arm64.exe -X fake_arg_for_testr   r   r  s      r/   test_filter_to_tagzTestLauncher.test_filter_to_tag  s    #{{J<(D$9:$}"56$y/2{{M?+tO'<=$}"56T)_5{{,-.=tO?TU$}"56Y8r2   c                     d}| j                  d| dgd      }| j                  d| dg      }| j                  d|d          | j                  ||d	          | j                  d
|d          y )Nr   r   z/3.1g   r   z/3.100r   r  r  r   r  r   r  s      r/   test_filter_to_company_and_tagz+TestLauncher.test_filter_to_company_and_tag  s}    #{{c'$/0C{H{{c'&123D$9:$}"56$y/2r2   c                 6    d}| j                  dgd|id      }y )Nr   z-V:Nonexistentr   r  r   r   )r   r  s      r/   test_filter_with_single_installz,TestLauncher.test_filter_with_single_install  s+    ${{.8!  
r2   c                     	 | j                  dgd      }| j                  d|d          | j                  |d   j                  d      |d          y # t        j                  $ r t        j                  d      w xY w)	N-3Tr   z(requires at least one Python 3.x install
PythonCorer  r  3.)r   r   r   r   r   r   
assertTruer   r   s     r/   test_search_major_3z TestLauncher.test_search_major_3  s    	P;;v$;7D 	tM':;Y2248$y/J ,, 	P##$NOO	Ps   A )A<c                    	 | j                  dgd      }| j                  d|d	          | j                  |d
   j                  d      |d
          | j                  |d
   j                  d      |d
          y # t        j                  $ r3 t        d t	        dd      D              st        j                  d       w xY w)Nz-3-32Tr  c              3   :   K   | ]  }t        d | d        yw)r   -32N)rP   ).0r9   s     r/   	<genexpr>z6TestLauncher.test_search_major_3_32.<locals>.<genexpr>  s     GQ|b3K0Gs         z/requires at least one 32-bit Python 3.x installr  r  r  r   r%  )r   r   r   anyranger   r   r   r!  r   endswithr   s     r/   test_search_major_3_32z#TestLauncher.test_search_major_3_32  s    	;;yT;:D
 	tM':;Y2248$y/JY007iI ,, 	G%2,GG''(YZZ	s   A: :AC c                    	 | j                  dgd      }| j                  dd          | j                  |d   j                  d	      |d          y # t        j                  $ r# t        d      st	        j
                  d      Y rw xY w)
N-2Tr  z2.7z(requires at least one Python 2.x installr  r  r  z2.)	r   r   r   rP   r   r   r   r!  r   r   s     r/   test_search_major_2z TestLauncher.test_search_major_2  s    	T;;v$;7D 	tM':;Y2248$y/J	 ,, 	T&''(RSS '	Ts   A 3B	B	c                    | j                  t              5  | j                  dg      }d d d        | j                  dd          | j                  d|d          | j                  d|d   j	                                y # 1 sw Y   WxY w)N-argr   SearchInfo.companyr   SearchInfo.tagX.Y.exe -argrt   r   TEST_PY_DEFAULTSr   r   stripr   s     r/   test_py_defaultzTestLauncher.test_py_default  s~    [[)* 	);;x(D	)*D1E,FG$'7"89h)=)=)?@		) 	)s   A??Bc                    | j                  t              5  | j                  ddg      }d d d        | j                  dd          | j                  d|d          | j                  d|d   j	                                y # 1 sw Y   WxY w)	Nr/  r2  r   r3  r   r4  X.Y-32.exe -argrt   r6  r   s     r/   test_py2_defaultzTestLauncher.test_py2_default  s    [[)* 	/;;f~.D	/*D1E,FGT*:%;<*DN,@,@,BC		/ 	/   B  B	c                    | j                  t              5  | j                  ddg      }d d d        | j                  dd          | j                  d|d          | j                  d|d   j	                                y # 1 sw Y   WxY w)	Nr  r2  r   r3  r   r4  'X.Y-arm64.exe -X fake_arg_for_test -argrt   r6  r   s     r/   test_py3_defaultzTestLauncher.test_py3_default  s    [[)* 	/;;f~.D	/*D1E,FG-=(>?BDNDXDXDZ[		/ 	/r=  c                     | j                  dgt              }| j                  d|d          | j                  d|d          | j                  d|d   j                                y )	Nr2  r  r   r3  r   r4  r5  rt   r   TEST_PY_ENVr   r8  r   s     r/   test_py_default_envz TestLauncher.test_py_default_env  s`    {{F8{5*D1E,FG$'7"89h)=)=)?@r2   c                     | j                  ddgt              }| j                  d|d          | j                  d|d          | j                  d|d	   j                                y )
Nr/  r2  r  r   r3  r   r4  r;  rt   rB  r   s     r/   test_py2_default_envz!TestLauncher.test_py2_default_env  sc    {{D&>{{;*D1E,FGT*:%;<*DN,@,@,BCr2   c                     | j                  ddgt              }| j                  d|d          | j                  d|d          | j                  d|d	   j                                y )
Nr  r2  r  r   r3  r   r4  r?  rt   rB  r   s     r/   test_py3_default_envz!TestLauncher.test_py3_default_env  sc    {{D&>{{;*D1E,FG-=(>?BDNDXDXDZ[r2   c                 |   | j                  t              5  dD ]  }| j                  |      5  | j                  dg| d      }| j	                  d|d          | j	                  d|d          | j	                  d	|d
   j                                d d d         	 d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N)z"py.exe"r   z"py"py	--versionz
 --versionr   r   r3  r   r4  zX.Y.exe --versionrt   )r   r7  r   r   r   r8  )rX   r   r0   s      r/   test_py_default_short_argv0z(TestLauncher.test_py_default_short_argv0  s    [[)* 	R= R\\%( R;;}eWJ;O;PD$$%6=Q8RS$$Wd3C.DE$$%8$x.:N:N:PQ	R RR	R 	RR R	R 	Rs#   B2A%B&
B2&B/+B22B;c                     | j                  dgt              }d }|d   j                         D ]-  }t        j                  d|      }|s|j                  d      } n | j                  d|       y )Nr   r  rt   z\s*-V:(.+?)\s+?\*\s+(.+)$r   r   )r   rC  r   r   r   r   r   )rX   r0   defaultr   r   s        r/   test_py_default_in_listz$TestLauncher.test_py_default_in_list  sn    {{D6{{3N--/ 	D5t<A''!*		
 	0':r2   c                 F   | j                         5 \  }}| j                  dg|      }|d   j                         D ]F  }t        j                  d|      }|s| j                  t        |      |j                  d              n | j                  d       | j                  dg|      }|d   j                         D ]=  }t        j                  d|      }|s| j                  d|j                  d              n | j                  d	       d d d        y # 1 sw Y   y xY w)
Nr   r  rt   z\s*\*\s+(.+)$r   zdid not find active venv pathr   zActive venvzdid not find active venv entry)	r   r   r   r   r   r   r#   r   fail)rX   r   r   r0   r   r   s         r/   test_virtualenv_in_listz$TestLauncher.test_virtualenv_in_list  s   ^^ 	<(C;;wC;0DX113 ;HH-t4$$S]AGGAJ?	; 		9:;;v3;/DX113 <HH-t4$$]AGGAJ?	< 		:;#	< 	< 	<s   ADB D5DD c                    | j                         5 \  }}| j                  g i |ddi      }| j                  dgi |ddi      }d d d        | j                  d   j                         t	                     | j                  |d   d       | j                  d   j                         t	        |             | j                  |d   d       y # 1 sw Y   xY w)Nr   zPythonTestSuite/3r  z-V:PythonTestSuite/3rt   zSearchInfo.lowPriorityTagr   )r   r   r   r8  r#   assertNotEqual)rX   r   r   data1data2s        r/   test_virtualenv_with_envz%TestLauncher.test_virtualenv_with_env  s    ^^ 	i(CKK(Q3(Q=P(QKREKK!7 8>g>gkSf>gKhE	i 	x..0#h-@:;VDE(O113S]CE"=>G	i 	is   7CCc                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
N#! /usr/bin/python -prearg-postargr   r3  r   r4  X.Y.exe -prearg 	 -postargrt   r   r7  r   r   r   r8  rX   r   r0   s      r/   test_py_shebangzTestLauncher.test_py_shebang"  s    [[)* 	99: 9f{{FJ#789	9 	*D1E,FG$'7"89+F89=tH~?S?S?UV	9 9	9 	9!   B*BB*B'	#B**B3c                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
Nz#! python -preargr[  r   r3  r   r4  r\  r]  rt   r^  r_  s      r/   test_python_shebangz TestLauncher.test_python_shebang*  s    [[)* 	901 9V{{FJ#789	9 	*D1E,FG$'7"89+F89=tH~?S?S?UV	9 9	9 	9ra  c                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
Nz#! /usr/bin/python2 -preargr[  r   r3  r   r4  X.Y-32.exe -prearg r]  rt   r^  r_  s      r/   test_py2_shebangzTestLauncher.test_py2_shebang2  s    [[)* 	9:; 9v{{FJ#789	9 	*D1E,FGT*:%;<.vhi@$x.BVBVBXY	9 9	9 	9ra  c                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
Nz#! /usr/bin/python3 -preargr[  r   r3  r   r4  +X.Y-arm64.exe -X fake_arg_for_test -prearg r]  rt   r^  r_  s      r/   test_py3_shebangzTestLauncher.test_py3_shebang:  s    [[)* 	9:; 9v{{FJ#789	9 	*D1E,FG-=(>?FvhiXZ^_gZhZnZnZpq	9 9	9 	9ra  c                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
Nz#! /usr/bin/python -prearg
r[  r   r3  r   r4  r\  r]  rt   r^  r_  s      r/   test_py_shebang_nlzTestLauncher.test_py_shebang_nlB  s    [[)* 	9;< 9{{FJ#789	9 	*D1E,FG$'7"89+F89=tH~?S?S?UV	9 9	9 	9ra  c                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
Nz#! /usr/bin/python2 -prearg
r[  r   r3  r   r4  re  r]  rt   r^  r_  s      r/   test_py2_shebang_nlz TestLauncher.test_py2_shebang_nlJ  s    [[)* 	9<= 9{{FJ#789	9 	*D1E,FGT*:%;<.vhi@$x.BVBVBXY	9 9	9 	9ra  c                 l   | j                  t              5  | j                  d      5 }| j                  |dg      }d d d        d d d        | j	                  dd          | j	                  d|d          | j	                  d d|d	   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)
Nz#! /usr/bin/python3 -prearg
r[  r   r3  r   r4  rh  r]  rt   r^  r_  s      r/   test_py3_shebang_nlz TestLauncher.test_py3_shebang_nlR  s    [[)* 	9<= 9{{FJ#789	9 	*D1E,FG-=(>?FvhiXZ^_gZhZnZnZpq	9 9	9 	9ra  c                 x   | j                  t              5  | j                  d      5 }| j                  |dgd| d      }d d d        d d d        | j	                  dd          | j	                  d|d	          | j	                  d
 d|d   j                                y # 1 sw Y   cxY w# 1 sw Y   gxY w)NrZ  r[  z
"py.exe" "z
" -postargrL  r   r3  r   r4  zX.Y.exe -prearg "rt   r^  r_  s      r/   test_py_shebang_short_argv0z(TestLauncher.test_py_shebang_short_argv0Z  s    [[)* 	_9: _f{{FJ#7
6(R\>]{^_	_ 	*D1E,FG$'7"89,VHJ?hAUAUAWX_ _	_ 	_s"   B0B$B0$B-	)B00B9c                     | j                  dj                  ddg            5  | j                  g dd      }d d d        | j                  dd          | j                  d	|d
          y # 1 sw Y   4xY w)Nr   r   zpython=3.999-64Tr  )r   r   z3.999-64r4  r   zSearchInfo.oldStyleTag)r   joinr   r   r   s     r/   test_py_handle_64_in_iniz%TestLauncher.test_py_handle_64_in_inic  sx    [[L2C#DEF 	K;;rdc;JD	K 	T*:%;<&>!?@		K 	Ks   A++A4c                     t        t        j                        j                  }| j	                  t
              5  | j                  d| d      5 }| j                  |dgdt        t        j                        j                   dt        j                  d       i      }d d d        d d d        | j                  t        j                   d dd	   j                                y # 1 sw Y   IxY w# 1 sw Y   MxY w
N#! /usr/bin/env z -preargr[  rn   ro   r  z	 -prearg r]  rt   )r   r|   r}   stemr   r7  r   r   r~   r   r   r   r8  rX   rx  r   r0   s       r/   test_search_pathzTestLauncher.test_search_pathj  s    CNN#(([[)* 	/vX>? 6{{Z(D$8$?$?#@"))FBSAT!UV # 	 	CNN+9VHIFXH\H\H^_ 	 	$   C4AC( C4(C1	-C44C=c                     t        t        j                        j                  }| j	                  t
              5  | j                  d| d      5 }| j                  |dgdt        t        j                        j                   dt        j                  d       i      }d d d        d d d        | j                  t        j                   d dd	   j                                y # 1 sw Y   IxY w# 1 sw Y   MxY wrv  )r   r|   r}   r   r   r7  r   r   r~   r   r   r   r8  )rX   r   r   r0   s       r/   test_search_path_exez!TestLauncher.test_search_path_exet  s    CNN#(([[)* 	/vX>? 6{{Z(D$8$?$?#@"))FBSAT!UV # 	 	CNN+9VHIFXH\H\H^_ 	 	r{  c                    | j                         j                  }| j                  t              5  | j	                  d|       5 }| j                  |gd| j                         j                   dt        j                  d       i      }d d d        d d d        | j                  d d   j                                y # 1 sw Y   8xY w# 1 sw Y   <xY w)Nrw  rn   ro   r  zX.Y.exe rt   )r   rx  r   r7  r   r   r~   r   r   r   r8  ry  s       r/   test_recursive_search_pathz'TestLauncher.test_recursive_search_path  s     %%[[)* 	/v67 6{{HDOO$5$<$<#=Qryy?P>Q!RS # 	 	8F8,d8n.B.B.DE 	 	s$   CACCC	CCc                 P   | j                  dgddid      }|d   j                         }	 t        j                  ddgt        j                  t        j
                  	       | j                  d|       | j                  d|       y # t        $ r | j                  d
|       Y 0w xY w)Nz-V:3.10PYLAUNCHER_ALWAYS_INSTALLr   o   r  rt   z
winget.exerK  )rt   ru   zms-windows-store://9PJPW5LDXLZ5)r   r8  r   
check_callr   STDOUTassertInr^   )rX   r0   cmds      r/   test_installzTestLauncher.test_install  s    {{I;-H#,Nbe{f8n""$	-!!<"=joo^h^o^op MM,,nc* ! 	6MM/5	6s   6B B%$B%c                     | j                  d      5 }| j                  |g      }d d d        | j                  d d   j                                y # 1 sw Y   0xY w)Nz#! C:/some_random_app -withargzC:\some_random_app -witharg rt   )r   r   r   r8  r_  s      r/   test_literal_shebang_absolutez*TestLauncher.test_literal_shebang_absolute  s^    [[9: 	)f;;x(D	)+F84N  "	
	) 	)s   AAc                     | j                  d      5 }| j                  |g      }d d d        | j                  j                  j                   d| d   j	                                y # 1 sw Y   FxY w)Nz#! ..\some_random_app -withargz\some_random_app -witharg rt   r   r   r   r~   r8  r_  s      r/   test_literal_shebang_relativez*TestLauncher.test_literal_shebang_relative  sn    [[:; 	)v;;x(D	)}}##$$?xHN  "	
	) 	)s   A**A3c                    | j                  d      5 }| j                  |g      }d d d        | j                  dj                   d| d   j	                                | j                  d      5 }| j                  |g      }d d d        | j                  d|j                   d| |d   j	                                y # 1 sw Y   xY w# 1 sw Y   IxY w)Nz#! "some random app" -witharg"z\some random app" -witharg rt   z#! some" random "app -withargr  r_  s      r/   test_literal_shebang_quotedz(TestLauncher.test_literal_shebang_quoted  s    [[89 	)V;;x(D	):6(CN  "	

 [[89 	)V;;x(D	):6(CN  "	
	) 	)	) 	)s   C 1C C	Cc                     | j                  d      5 }| j                  |g      }d d d        | j                  dj                   d| d   j	                                y # 1 sw Y   =xY w)Nz#! some\" random "app -withargr  z\some\ random app" -witharg rt   r  r_  s      r/   "test_literal_shebang_quoted_escapez/TestLauncher.test_literal_shebang_quoted_escape  si    [[:; 	)v;;x(D	)<VHEN  "	
	) 	)s   A!!A*c                    | j                  t              5  | j                  d      5 }| j                  |g      }d d d        d d d        | j	                  d d   j                                y # 1 sw Y   8xY w# 1 sw Y   <xY w)Nz#! test-command arg1zTEST_EXE.exe arg1 rt   )r   TEST_PY_COMMANDSr   r   r   r8  r_  s      r/   test_literal_shebang_commandz)TestLauncher.test_literal_shebang_command  s    [[)* 	-34 -{{F8,-	- 	 )N  "	
- -	- 	-s!   A>A2A>2A;	7A>>Bc                     | j                  d      5 }| j                  |g      }d d d        j                  dz  }| j                  | d| d   j	                                y # 1 sw Y   AxY w)Nz#! /usr/bin/not-python arg1z/usr/bin/not-pythonz arg1 rt   )r   r   r~   r   r8  )rX   r   r0   r   s       r/   %test_literal_shebang_invalid_templatez2TestLauncher.test_literal_shebang_invalid_template  sq    [[67 	)6;;x(D	)!66hfVH%N  "	
	) 	)s   A%%A.c                 *   | j                  d      5 }| j                  |gd      }d d d        d}d   j                         D cg c]#  }|j                  d      r|j	                         % }}| j                  |g|       y # 1 sw Y   ^xY wc c}w )Nz#! /usr/bin/env python3.99r  r  z # Search PATH for python3.99.exeru   z# Search PATH)r   r   r   r   r8  r   )rX   r   r0   r   r   r  s         r/   !test_shebang_executable_extensionz.TestLauncher.test_shebang_executable_extension  s    [[56 	@&;;x3;?D	@3+/>+D+D+F 74___5 **, 7 7&6*	@ 	@7s   B(BBN)1rg   rh   ri   r   r   r   r   r   r   r  r	  r  r  r  r  r  r"  r-  r0  r9  r<  r@  rD  rF  rH  rM  rP  rS  rX  r`  rc  rf  ri  rk  rm  ro  rq  rt  rz  r}  r  r  r  r  r  r  r  r  r  rj   r2   r/   r   r     s   O O 1 1
I
:
C2 D339"3
K	JKAD\AD\R;<(	HWWZrWZrYA`	`	F+





+r2   r   )&r   r4   r   r   r   r   r|   rz   r   r   pathlibr   testr   platformr   r    r   r}   casefoldr,  prefixr   r   rC  rs  r"   lowerr7  r  r1   r;   rC   rP   rR   rl   TestCaser   )r,   r-   s   00r/   <module>r     s     	 	   
     <<7
(

:
;;  
>>%%h&7&7&9:F +/(jj"+
 ,jj".
 /jj"1'=
 ?cjj
3B 2/jj"%..
	C+	\ %), 99)4):):)<=A12q=   99  
*"$3 3(x  x v{+8$$j {+U >s   )"F