
    <e	m              	          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
Z
d dlmZ d dlmZ ej        dk    r e
j        d          d dlZdZej                                                            d                                          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                    d gd! e                                D                       Zd                    d"d#g          Zd$ Zd% Zd& Z d' Z! G d( d)          Z" G d* d+          Z# G d, d-e
j$        e#          Z%dS ).    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]c                 V    g | ]&\  }}|d d                                           d| 'S )   N=)lower.0kvs      )/usr/lib/python3.11/test/test_launcher.py
<listcomp>r#   S   s:    ===A122===    z
[commands]ztest-command=TEST_EXE.exec                 `    fd|                                 D ]\  }} | ||           d S )Nc                    t          |t                    rXt          j        | |          5 }|                                D ]\  }} |||           	 d d d            d S # 1 swxY w Y   d S t          |t
                    r$t          j        | |d t          j        |           d S t          d	                    |                    )Nz&don't know how to create data for '{}')

isinstancedictwinregCreateKeyExitemsstr
SetValueExREG_SZ	TypeErrorformat)rootkeyvaluehkeyr    r!   _create_registry_datas         r"   r5   z3create_registry_data.<locals>._create_registry_data]   s   eT"" 		T#D#.. 6$!KKMM 6 6DAq))$1555566 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 s## 	TdCv}eDDDDDDKKERRSSSs   (A""A&)A&)r+   )r1   datar    r!   r5   s       @r"   create_registry_datar7   \   s`    
T 
T 
T 
T 
T 

 * *1dAq))))* *r$   c              #      K   t          j                    D ]?}	 t          j        | |          V  # t          $ r}|j        dk    rY d }~ d S  d }~ww xY wd S )Ni  )	itertoolscountr)   EnumKeyOSErrorwinerror)r1   iexs      r"   	enum_keysr@   m   s      _  	.q)))))) 	 	 	{c!!	 s   1
AAAAc                    t           j        t           j        z  }t          |          D ]c}t          j        | ||          5 }t          |t          |                     d d d            n# 1 swxY w Y   t          j        | |           dd S )Naccess)r)   	KEY_WRITEKEY_ENUMERATE_SUB_KEYSlistOpenKeydelete_registry_datar@   	DeleteKey)r1   keysACCESSr2   r4   s        r"   rH   rH   w   s     ==FDzz $ $^D#f555 	8 y777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s####$ $s   A,,A0	3A0	c           	      *   d|  d}t           j        dft           j        t           j        ft           j        t           j        ffD ]N\  }}	 t          j        t          j        ||t           j        |z                        dS # t          $ r Y Kw xY wdS )NzSoftware\Python\PythonCore\z\InstallPathr   rB   TF)	r)   HKEY_CURRENT_USERHKEY_LOCAL_MACHINEKEY_WOW64_64KEYKEY_WOW64_32KEYCloseKeyrG   KEY_READr<   )tagr2   r1   flags       r"   is_installedrU      s    
:
:
:
:C		!1%		"F$:;		"F$:; 	 	
d
	OFN4V_t=STTTUUU44 	 	 	D	5s   
6B
BBc                        e Zd Zd Zd Zd ZdS )PreservePyInic                 J    t          |          | _        || _        d | _        d S N)r   pathcontent
_preserved)selfrZ   r[   s      r"   __init__zPreservePyIni.__init__   s!    JJ	r$   c                     	 | j                                         | _        n# t          $ r
 d | _        Y nw xY w| j                             | j        d           d S )Nzutf-16encoding)rZ   
read_bytesr\   FileNotFoundError
write_textr[   r]   s    r"   	__enter__zPreservePyIni.__enter__   sg    	#"i2244DOO  	# 	# 	#"DOOO	#	T\H=====s   ! 55c                     | j         | j                                         d S | j                            | j                    d S rY   )r\   rZ   unlinkwrite_bytes)r]   exc_infos     r"   __exit__zPreservePyIni.__exit__   sB    ?"II!!$/22222r$   N)__name__
__module____qualname__r^   rf   rk    r$   r"   rW   rW      sA          
> > >3 3 3 3 3r$   rW   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dS )
RunPyMixinNc                    d }t          j                    r't          t          j                  j        t          z  }n[t          j        d          	                    d          D ]1}|r-t          |          t          z  }|
                                r n2d }|r	 t          j        |dgt          j        t          j        t          j        dd          5 }|j                                         t!          |j        d                                          d                             d	          d
         }|j                                         |                    d           d d d            n# 1 swxY w Y   t          j                            |          sd }n# t0          $ r d }Y nw xY w|s,t3          j        d                    t                              |S )NPATH;-hasciiignore)stdinstdoutstderrra   errorsr   r       
   zcannot locate '{}' for test)	sysconfigis_python_buildr   sys
executableparentPY_EXEosgetenvsplitis_file
subprocessPopenPIPErx   closenextry   
splitlines
rpartitionreadwaitversion
startswithr<   unittestSkipTestr0   )clspy_exepr   s       r"   find_pyzRunPyMixin.find_py   s   $&& 		#.))069FFYv&&,,S11   !!WWv-F~~''   	%TN$/%?%?$#    GMMOOO"18T22==??BMMcRRSTUGHMMOOOFF2JJJ               {--g66 "!F     	#-44V<<   s7   :F BE0$F 0E44F 7E48$F F,+F,c                 P    | j         s|                                 | _         | j         S rY   )r   r   re   s    r"   
get_py_exezRunPyMixin.get_py_exe   s#    { 	),,..DK{r$   Fr   c                   
 | j         s|                                 | _         h d
i 
fdt          j                                        D             ddddd |pi                                 D             }|s
| j         g|}t          j        ||| j         t
          j        t
          j        t
          j                  5 }|j        	                                 |
                    d           |j                                                            d	d
          }|j                                                            dd
          }d d d            n# 1 swxY w Y   |j        |k    rpt           j        rd|sbt%          d           t%          | j         g|           t%          d           t%          |           t%          d           t%          |           |r/|j        |k    r$t          j        |j        | j         g|||          |                     ||j                   d |                                D             }	||	d<   ||	d<   |	S )N>   r   r   r   VIRTUAL_ENVc                 l    i | ]0\  }}|                                 v|                                 |1S ro   upper)r   r    r!   rw   s      r"   
<dictcomp>z%RunPyMixin.run_py.<locals>.<dictcomp>   s9    VVV1aggiiv>U>Uqwwyy!>U>U>Ur$   1 )PYLAUNCHER_DEBUGPYLAUNCHER_DRYRUNPYLAUNCHER_LIMIT_TO_COMPANYc                 >    i | ]\  }}|                                 |S ro   r   r   s      r"   r   z%RunPyMixin.run_py.<locals>.<dictcomp>   s&    <<<1qwwyy!<<<r$   )envr   rx   ry   rz   r~   utf-8replacerv   z++ COMMAND ++z++ STDOUT ++z++ STDERR ++c                     i | ]b}|                     d           sKd|v |                    d          d         |                    d          d                                         cS )#:r   r}   )r   	partitionlstrip)r   ss     r"   r   z%RunPyMixin.run_py.<locals>.<dictcomp>   so     
 
 
<<$$
 *- KKQS!1!1!!4!;!;!=!=)1r$   ry   rz   )r   r   r   environr+   r   r   r   rx   r   r   ry   r   decoderz   
returncoder   verboseprintCalledProcessErrorassertEqualr   )r]   argsr   
allow_failexpect_returncodeargvr   outerrr6   rw   s             @r"   run_pyzRunPyMixin.run_py   s   { 	),,..DKIII
VVVV
(8(8(:(:VVV
 #!$+-	
 
 

 =<(9(9(;(;<<<
  	(K'$'D{/??
 
 
 	= GMMOOOFF2JJJ(--//(()<<C(--//(()<<C	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= <,,,,,/"""4;&&'''.!!!#JJJ.!!!#JJJ 	>!,*;;;/t{>RT>RTWY\]]].===
 
^^%%
 
 

 XXs   B	EEEc                     t           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   rW   r   )r]   r[   local_appdatas      r"   py_inizRunPyMixin.py_ini  sT    
~66 	8# %7 8 8 8T-008;WEEEr$   r   c              #     K   t          t          j        t          j                              dz             }|                    ||           	 |V  |                                 d S # |                                 w xY w)N)dirz.pyr`   )r   tempfilemktempr   getcwdrd   rh   )r]   r[   ra   files       r"   scriptzRunPyMixin.script  sr      HO	444u<==(333	JJJKKMMMMMDKKMMMMs   A+ +Bc              #   ^  K   t          j                    dz  }|                    dd           |t          t          j                  j        z  }|                                 	 |dt          |j                  ifV  t          j
        |           d S # t          j
        |           w xY w)NScriptsT)exist_okparentsr   )r   cwdmkdirr   r   nametouchr,   r   shutilrmtree)r]   venvvenv_exes      r"   	fake_venvzRunPyMixin.fake_venv  s      xzzI%

D$
///4//44	 ]C,<,<=====M$FM$s   &B B,)NFr   N)r   )rl   rm   rn   r   classmethodr   r   r   r   
contextlibcontextmanagerr   r   ro   r$   r"   rq   rq      s        F& & [&P  
, , , ,\F F F              r$   rq   c                   6   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-S ).TestLauncherc                     t          j        t           j        d          5 }t          |t                     d d d            n# 1 swxY w Y   t
          j        rt          j        d          }d S d S )NSoftware\Pythonz!reg query HKCU\Software\Python /s)	r)   	CreateKeyrM   r7   	TEST_DATAr   r   r   check_output)r   r2   r   s      r"   
setUpClasszTestLauncher.setUpClass  s    f68KLL 	1PS i000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 ? 	O'(MNNAAA	O 	Os   AA	Ac                     t          j        t           j        dt           j        t           j        z            5 }t          |t                     d d d            d S # 1 swxY w Y   d S )Nr   rB   )r)   rG   rM   rD   rE   rH   r   )r   r2   s     r"   tearDownClasszTestLauncher.tearDownClass(  s    ^F46IRXRbek  fC  SC  D  D  D 	1  HK i000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   AA #A c                    |                      dg          }|                     | j        t          |d                              |                     t          j                            d          d         |d                    d S )N-0argv0r|   r   r   )r   r   r   r   r   r   r   r]   r6   s     r"   test_versionzTestLauncher.test_version.  sn    {{D6""d4=&9&9:::..s33A6YHHHHHr$   c                 j    |                      dg          }|                     d|d                    d S )Nru   TruezSearchInfo.helpr   r   r   s     r"   test_help_optionzTestLauncher.test_help_option3  s7    {{D6""&7!899999r$   c                    dD ]\  }}}|                      |          5  |                     |g          }|                     ||d                    |                     ||d                    d d d            n# 1 swxY w Y   d S )N))r   r   False)-0pr   r   )--listr   r   )--list-pathsr   r   zSearchInfo.listzSearchInfo.listPaths)subTestr   r   )r]   optv1v2r6   s        r"   test_list_optionzTestLauncher.test_list_option7  s    
 		C 		CKCR c"" C C{{C5))  T*;%<===  T*@%ABBBC C C C C C C C C C C C C C C		C 		Cs   AA99A=	 A=	c                   
 |                      dg          }i }i |d                                         D ]D}t          j        d|          }|r+|                    d          ||                    d          <   Et
          D ]U}t
          |         

fd
D             }|D ]}d| d| }
|         d	         |<                       d| d
d            Vfd|                                D             }		 |                     |	           d S #  t          j
        r$t          d           t          |d                     xY w)Nr   ry   \s*(.+?)\s+?(\*\s+)?(.+)$r      c                 J    g | ]}t          |         t                    | S ro   r'   r(   r   tcompany_datas     r"   r#   z*TestLauncher.test_list.<locals>.<listcomp>M  ,    QQQ!z,q/4/P/PQAQQQr$   -V:/r	   /ignoredc                 $    i | ]\  }}|v 	||S ro   ro   r   r    r!   expects      r"   r   z*TestLauncher.test_list.<locals>.<dictcomp>S  $    @@@41aAKK!QKKKr$   *** STDOUT ***)r   r   rematchgroupr   popr+   assertDictEqualr   r   r   )r]   r6   foundlinemcompanytagsrS   argactualr   r  s             @@r"   	test_listzTestLauncher.test_listC  s   {{H:&&N--// 	/ 	/D5t<<A /$%GGAJJaggajj!  	6 	6G$W-LQQQQ|QQQD ? ?+G++c++*3/>sJJ.W...5555@@@@5;;==@@@	  00000	 &&'''d8n%%%s   :D 3Ec           	         |                      dg          }i }i |d                                         D ]D}t          j        d|          }|r+|                    d          ||                    d          <   Et
          D ]}t
          |         fdD             }|D ]}d| d| }|         d	         }		 |	d
         |<   	 |xx         d|	d         z   z  cc<   n# t          $ r Y nw xY wP# t          $ rG t          t          |	d                    t          t          j
                  j        z            |<   Y w xY w                    d| dd            ވfd|                                D             }
	 |                     |
           d S #  t          j        r$t#          d           t#          |d                     xY w)Nr   ry   r   r   r   c                 J    g | ]}t          |         t                    | S ro   r   r   s     r"   r#   z0TestLauncher.test_list_paths.<locals>.<listcomp>f  r   r$   r  r  r
   r   r|   r   r  c                 $    i | ]\  }}|v 	||S ro   ro   r  s      r"   r   z0TestLauncher.test_list_paths.<locals>.<dictcomp>u  r  r$   r  )r   r   r	  r
  r  r   KeyErrorr,   r   r   r   r   r  r+   r  r   r   r   )r]   r6   r  r  r  r  r  rS   r  installr  r   r  s              @@r"   test_list_pathszTestLauncher.test_list_paths\  s/   {{N+,,N--// 	/ 	/D5t<<A /$%GGAJJaggajj!  	6 	6G$W-LQQQQ|QQQD 
W 
W+G++c++&s+M:W")*:";F3KssW5J-K'KK#    W W W"%d74=&9&9D<P<P<U&U"V"VF3KKKW JJ.W...5555@@@@5;;==@@@	  00000	 &&'''d8n%%%sC   ;C2C! C2!
C.+C2-C..C22AEEF 3Gc                     d}|                      d| dg          }|                     d|d                    |                     ||d                    |                     d|d                    d S )	Nr   r  r  r   LaunchCommandenv.companyr   env.tagr   r]   r  r6   s      r"   test_filter_to_companyz#TestLauncher.test_filter_to_company~  s}    #{{,',,,-..D$9:::$}"5666$y/22222r$   c                    d}|                      d| dgt          d                    }|                     d|d                    |                     ||d	                    |                     d
|d                    d S )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  s    #{{,',,,-4%3H3H3H{IID$9:::$}"5666$y/22222r$   c                    d}|                      dg          }|                     d|d                    |                     ||d                    |                     d|d                    |                      dg          }|                     d	|d                    |                     ||d                    |                     d
|d                    |                      dg          }|                     d|d                    |                     ||d                    |                     d|d                    d S )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:   #{{K=))D$9:::$}"5666$y/222{{N+,,tO'<===$}"5666T)_555{{-.//=tO?TUUU$}"5666Y88888r$   c                    d}|                      d| dgd          }|                      d| dg          }|                     d|d                    |                     ||d	                    |                     d
|d                    d S )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    #{{/'///0C{HH{{1'111233D$9:::$}"5666$y/22222r$   c                 @    d}|                      dgd|id          }d S )Nr   z-V:Nonexistentr   r(  r   r   )r   r   s      r"   test_filter_with_single_installz,TestLauncher.test_filter_with_single_install  s4    ${{.8!  
 
r$   c                 *   	 |                      dgd          }n'# t          j        $ r t          j        d          w xY w|                     d|d                    |                     |d                             d          |d                    d S )	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$;77DD, 	P 	P 	P#$NOOO	PtM':;;;Y22488$y/JJJJJs    $?c                    	 |                      dgd          }nO# t          j        $ r= t          d t	          dd          D                       st          j        d           w xY w|                     d|d	                    |                     |d
         	                    d          |d
                    |                     |d
         
                    d          |d
                    d S )Nz-3-32Tr/  c              3   <   K   | ]}t          d | d          V  dS )r1  -32N)rU   )r   r>   s     r"   	<genexpr>z6TestLauncher.test_search_major_3_32.<locals>.<genexpr>  s2      GGQ|KKKK00GGGGGGr$         z/requires at least one 32-bit Python 3.x installr0  r  r  r1  r6  )r   r   r   anyranger   r   r   r2  r   endswithr   s     r"   test_search_major_3_32z#TestLauncher.test_search_major_3_32  s    	;;yT;::DD, 	 	 	GG%2,,GGGGG ['(YZZZ	 	tM':;;;Y22488$y/JJJY0077iIIIIIs
    AA'c                 L   	 |                      dgd          }n8# t          j        $ r& t          d          st	          j        d          Y nw xY w|                     d|d                    |                     |d                             d	          |d                    d S )
N-2Tr/  z2.7z(requires at least one Python 2.x installr0  r  r  z2.)	r   r   r   rU   r   r   r   r2  r   r   s     r"   test_search_major_2z TestLauncher.test_search_major_2  s    	T;;v$;77DD, 	T 	T 	T&& T'(RSSST T	T 	tM':;;;Y22488$y/JJJJJs    2AAc                 b   |                      t                    5  |                     dg          }d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d|d                                                    d S )N-argr   SearchInfo.companyr   SearchInfo.tagX.Y.exe -argry   r   TEST_PY_DEFAULTSr   r   stripr   s     r"   test_py_defaultzTestLauncher.test_py_default  s    [[)** 	) 	);;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)*D1E,FGGG$'7"8999h)=)=)?)?@@@@@s   >AAc                 d   |                      t                    5  |                     ddg          }d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d|d                                                    d S )	Nr?  rB  r   rC  r   rD  X.Y-32.exe -argry   rF  r   s     r"   test_py2_defaultzTestLauncher.test_py2_default  s    [[)** 	/ 	/;;f~..D	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/*D1E,FGGGT*:%;<<<*DN,@,@,B,BCCCCC   ?AAc                 d   |                      t                    5  |                     ddg          }d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d|d                                                    d S )	Nr.  rB  r   rC  r   rD  'X.Y-arm64.exe -X fake_arg_for_test -argry   rF  r   s     r"   test_py3_defaultzTestLauncher.test_py3_default  s    [[)** 	/ 	/;;f~..D	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/*D1E,FGGG-=(>???BDNDXDXDZDZ[[[[[rM  c                    |                      dgt                    }|                     d|d                    |                     d|d                    |                     d|d                                                    d S )	NrB  r#  r   rC  r   rD  rE  ry   r   TEST_PY_ENVr   rH  r   s     r"   test_py_default_envz TestLauncher.test_py_default_env  s~    {{F8{55*D1E,FGGG$'7"8999h)=)=)?)?@@@@@r$   c                    |                      ddgt                    }|                     d|d                    |                     d|d                    |                     d|d	                                                    d S )
Nr?  rB  r#  r   rC  r   rD  rK  ry   rR  r   s     r"   test_py2_default_envz!TestLauncher.test_py2_default_env  s    {{D&>{{;;*D1E,FGGGT*:%;<<<*DN,@,@,B,BCCCCCr$   c                    |                      ddgt                    }|                     d|d                    |                     d|d                    |                     d|d	                                                    d S )
Nr.  rB  r#  r   rC  r   rD  rO  ry   rR  r   s     r"   test_py3_default_envz!TestLauncher.test_py3_default_env  s    {{D&>{{;;*D1E,FGGG-=(>???BDNDXDXDZDZ[[[[[r$   c                    |                      t                    5  dD ]}|                     |          5  |                     dg| d          }|                     d|d                    |                     d|d                    |                     d	|d
                                                    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 )N)z"py.exe"r   z"py"py	--versionz
 --versionr   r   rC  r   rD  zX.Y.exe --versionry   )r   rG  r   r   r   rH  )r]   r   r6   s      r"   test_py_default_short_argv0z(TestLauncher.test_py_default_short_argv0  s   [[)** 	S 	S= S S\\%(( S S;;}e;O;O;O;PPD$$%6=Q8RSSS$$Wd3C.DEEE$$%94>;O;O;Q;QRRR	S S S S S S S S S S S S S S SS	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	Ss5   CBC7CCC
CCC!$C!c                    |                      dgt                    }d }|d                                         D ]0}t          j        d|          }|r|                    d          } n1|                     d|           d S )Nr   r#  ry   z\s*-V:(.+?)\s+?\*\s+(.+)$r   r   )r   rS  r   r	  r
  r  r   )r]   r6   defaultr  r  s        r"   test_py_default_in_listz$TestLauncher.test_py_default_in_list  s    {{D6{{33N--// 	 	D5t<<A ''!** 	0':::::r$   c                    |                                  5 \  }}|                     dg|          }|d                                         D ]Q}t          j        d|          }|r8|                     t          |          |                    d                      nR|                     d           |                     dg|          }|d                                         D ]D}t          j        d|          }|r+|                     d|                    d                      nE|                     d	           d d d            d S # 1 swxY w Y   d S )
Nr   r#  ry   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)r]   r   r   r6   r  r  s         r"   test_virtualenv_in_listz$TestLauncher.test_virtualenv_in_list  s   ^^ 	<(C;;wC;00DX1133 ; ;H-t44 $$S]]AGGAJJ???E 		9:::;;v3;//DX1133 < <H-t44 $$]AGGAJJ???E 		:;;;#	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s   D)EEEc                 6   |                                  5 \  }}|                     g i |ddi          }|                     dgi |ddi          }d d d            n# 1 swxY w Y   |                     |d                                         t	          |                     |                     |d         d           |                     |d                                         t	          |                     |                     |d         d           d S )Nr   zPythonTestSuite/3r#  z-V:PythonTestSuite/3ry   zSearchInfo.lowPriorityTagr   )r   r   r   rH  r,   assertNotEqual)r]   r   r   data1data2s        r"   test_virtualenv_with_envz%TestLauncher.test_virtualenv_with_env  s`   ^^ 	i(CKK(Q3(Q=P(Q(QKRREKK!7 8>g>gkSf>g>gKhhE	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	i 	x..00#h--@@@:;VDDDE(O1133S]]CCCE"=>GGGGGs   ?A  A$'A$c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
N#! /usr/bin/python -prearg-postargr   rC  r   rD  X.Y.exe -prearg 	 -postargry   r   rG  r   r   r   rH  r]   r   r6   s      r"   test_py_shebangzTestLauncher.test_py_shebang#  sX   [[)** 	9 	99:: 9f{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGG$'7"8999=F===tH~?S?S?U?UVVVVV4   A,A	A,A	A,A	A,,A03A0c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
Nz#! python -preargrk  r   rC  r   rD  rl  rm  ry   rn  ro  s      r"   test_python_shebangz TestLauncher.test_python_shebang+  sX   [[)** 	9 	9011 9V{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGG$'7"8999=F===tH~?S?S?U?UVVVVVrq  c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
Nz#! /usr/bin/python2 -preargrk  r   rC  r   rD  X.Y-32.exe -prearg rm  ry   rn  ro  s      r"   test_py2_shebangzTestLauncher.test_py2_shebang3  sX   [[)** 	9 	9:;; 9v{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGGT*:%;<<<@v@@@$x.BVBVBXBXYYYYYrq  c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
Nz#! /usr/bin/python3 -preargrk  r   rC  r   rD  +X.Y-arm64.exe -X fake_arg_for_test -prearg rm  ry   rn  ro  s      r"   test_py3_shebangzTestLauncher.test_py3_shebang;  s[   [[)** 	9 	9:;; 9v{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGG-=(>???XvXXXZ^_gZhZnZnZpZpqqqqqrq  c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
Nz#! /usr/bin/python -prearg
rk  r   rC  r   rD  rl  rm  ry   rn  ro  s      r"   test_py_shebang_nlzTestLauncher.test_py_shebang_nlC  sX   [[)** 	9 	9;<< 9{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGG$'7"8999=F===tH~?S?S?U?UVVVVVrq  c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
Nz#! /usr/bin/python2 -prearg
rk  r   rC  r   rD  ru  rm  ry   rn  ro  s      r"   test_py2_shebang_nlz TestLauncher.test_py2_shebang_nlK  sX   [[)** 	9 	9<== 9{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGGT*:%;<<<@v@@@$x.BVBVBXBXYYYYYrq  c                    |                      t                    5  |                     d          5 }|                     |dg          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d                    |                     d| d|d	                                                    d S )
Nz#! /usr/bin/python3 -prearg
rk  r   rC  r   rD  rx  rm  ry   rn  ro  s      r"   test_py3_shebang_nlz TestLauncher.test_py3_shebang_nlS  s[   [[)** 	9 	9<== 9{{FJ#7889 9 9 9 9 9 9 9 9 9 9 9 9 9 9	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	*D1E,FGGG-=(>???XvXXXZ^_gZhZnZnZpZpqqqqqrq  c                    |                      t                    5  |                     d          5 }|                     |dgd| d          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d|d                    |                     d|d	                    |                     d
| d|d                                                    d S )Nrj  rk  z
"py.exe" "z
" -postargr\  r   rC  r   rD  zX.Y.exe -prearg "ry   rn  ro  s      r"   test_py_shebang_short_argv0z(TestLauncher.test_py_shebang_short_argv0[  s   [[)** 	_ 	_9:: _f{{FJ#7>]6>]>]>]{^^_ _ _ _ _ _ _ _ _ _ _ _ _ _ _	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	*D1E,FGGG$'7"8999?V???hAUAUAWAWXXXXXs4   A2AA2A	A2"A	#A22A69A6c                 *   |                      d                    ddg                    5  |                     g dd          }d d d            n# 1 swxY w Y   |                     d|d                    |                     d	|d
                    d S )Nr   r   zpython=3.999-64Tr(  )r   r   z3.999-64rD  r   zSearchInfo.oldStyleTag)r   joinr   r   r   s     r"   test_py_handle_64_in_iniz%TestLauncher.test_py_handle_64_in_inid  s    [[L2C#DEEFF 	K 	K;;rdc;JJD	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	T*:%;<<<&>!?@@@@@s   AAAc                     t          t          j                  j        }|                     t
                    5  |                     d| d          5 }|                     |dgdt          t          j                  j         dt          j
        d           i          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     t          j         d| d|d	                                                    d S 
N#! /usr/bin/env z -preargrk  rs   rt   r#  z	 -prearg rm  ry   )r   r   r   stemr   rG  r   r   r   r   r   r   rH  r]   r  r   r6   s       r"   test_search_pathzTestLauncher.test_search_pathk  sz   CN##([[)** 	 	>>>>?? 6{{Z(D$8$8$?!U!U")FBSBS!U!UV #                	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	CNFFVFFFXH\H\H^H^_____6   CAB."C.B2	2C5B2	6CC	C	c                     t          t          j                  j        }|                     t
                    5  |                     d| d          5 }|                     |dgdt          t          j                  j         dt          j
        d           i          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     t          j         d| d|d	                                                    d S r  )r   r   r   r   r   rG  r   r   r   r   r   r   rH  )r]   r   r   r6   s       r"   test_search_path_exez!TestLauncher.test_search_path_exeu  sz   CN##([[)** 	 	>>>>?? 6{{Z(D$8$8$?!U!U")FBSBS!U!UV #                	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	CNFFVFFFXH\H\H^H^_____r  c                    |                                  j        }|                     t                    5  |                     d|           5 }|                     |gd|                                  j         dt          j        d           i          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   | 	                    d| |d         
                                           d S )Nr  rs   rt   r#  zX.Y.exe ry   )r   r  r   rG  r   r   r   r   r   r   rH  r  s       r"   test_recursive_search_pathz'TestLauncher.test_recursive_search_path  sj     %[[)** 	 	66677 6{{HDOO$5$5$<!R!Rry?P?P!R!RS #                	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	,F,,d8n.B.B.D.DEEEEEs6   B9A	B"B9"B&	&B9)B&	*B99B= B=c                 r   |                      dgddid          }|d                                         }	 t          j        ddgt          j        t          j        	           |                     d|           n&# t          $ r |                     d
|           Y nw xY w|                     d|           d S )Nz-V:3.10PYLAUNCHER_ALWAYS_INSTALLr   o   r+  ry   z
winget.exer[  )ry   rz   zms-windows-store://9PJPW5LDXLZ5)r   rH  r   
check_callr   STDOUTassertInrc   )r]   r6   cmds      r"   test_installzTestLauncher.test_install  s    {{I;-H#,Nbe{ff8n""$$	-!<"=jo^h^opppp MM,,,,, ! 	6 	6 	6MM/55555	6
 	nc*****s   -A; ; BBc                     |                      d          5 }|                     |g          }d d d            n# 1 swxY w Y   |                     d| |d                                                    d S )Nz#! C:/some_random_app -withargzC:\some_random_app -witharg ry   )r   r   r   rH  ro  s      r"   test_literal_shebang_absolutez*TestLauncher.test_literal_shebang_absolute  s    [[:;; 	)v;;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)4F44N  ""	
 	
 	
 	
 	
   9= =c                    |                      d          5 }|                     |g          }d d d            n# 1 swxY w Y   |                     |j        j         d| |d                                                    d S )Nz#! ..\some_random_app -withargz\some_random_app -witharg ry   r   r   r   r   rH  ro  s      r"   test_literal_shebang_relativez*TestLauncher.test_literal_shebang_relative  s    [[;<< 	);;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)}#HHHHN  ""	
 	
 	
 	
 	
r  c                    |                      d          5 }|                     |g          }d d d            n# 1 swxY w Y   |                     d|j         d| |d                                                    |                      d          5 }|                     |g          }d d d            n# 1 swxY w Y   |                     d|j         d| |d                                                    d S )Nz#! "some random app" -witharg"z\some random app" -witharg ry   z#! some" random "app -withargr  ro  s      r"   test_literal_shebang_quotedz(TestLauncher.test_literal_shebang_quoted  s~   [[9:: 	)f;;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)CCC6CCN  ""	
 	
 	

 [[9:: 	)f;;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)CCC6CCN  ""	
 	
 	
 	
 	
s   9= =B55B9<B9c                     |                      d          5 }|                     |g          }d d d            n# 1 swxY w Y   |                     d|j         d| |d                                                    d S )Nz#! some\" random "app -withargr  z\some\ random app" -witharg ry   r  ro  s      r"   "test_literal_shebang_quoted_escapez/TestLauncher.test_literal_shebang_quoted_escape  s    [[;<< 	);;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)EEEVEEN  ""	
 	
 	
 	
 	
r  c                 R   |                      t                    5  |                     d          5 }|                     |g          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     d| |d                                                    d S )Nz#! test-command arg1zTEST_EXE.exe arg1 ry   )r   TEST_PY_COMMANDSr   r   r   rH  ro  s      r"   test_literal_shebang_commandz)TestLauncher.test_literal_shebang_command  s$   [[)** 	- 	-344 -{{F8,,- - - - - - - - - - - - - - -	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	)))N  ""	
 	
 	
 	
 	
s4   A+AA+A	A+A	A++A/2A/c                    |                      d          5 }|                     |g          }d d d            n# 1 swxY w Y   |j        dz  }|                     | d| |d                                                    d S )Nz#! /usr/bin/not-python arg1z/usr/bin/not-pythonz arg1 ry   )r   r   r   r   rH  )r]   r   r6   r  s       r"   %test_literal_shebang_invalid_templatez2TestLauncher.test_literal_shebang_invalid_template  s    [[677 	)6;;x((D	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)!66%%V%%N  ""	
 	
 	
 	
 	
r  N)0rl   rm   rn   r   r   r   r   r   r   r  r  r!  r$  r&  r)  r,  r3  r=  r@  rI  rL  rP  rT  rV  rX  r]  r`  rc  rh  rp  rs  rv  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  ro   r$   r"   r   r     s       O O [O 1 1 [1
I I I
: : :
C 
C 
C  2     D3 3 33 3 39 9 9"3 3 3
 
 
K K K	J 	J 	JK K KA A AD D D\ \ \A A AD D D\ \ \S S S; ; ;< < <(	H 	H 	HW W WW W WZ Z Zr r rW W WZ Z Zr r rY Y YA A A` ` `	` 	` 	`	F 	F 	F+ + +
 
 

 
 

 
 

 
 

 
 

 
 
 
 
r$   r   )&r   r9   r   r	  r   r   r   r   r   textwrapr   pathlibr   testr   platformr   r)   r   r   casefoldr<  prefixr   r(   rS  r  r+   rG  r  r7   r@   rH   rU   rW   rq   TestCaser   ro   r$   r"   <module>r     s*           				 				      



                   <7
(
:
;
;;  
>%%h&7&7&9&9:: F +/(j"+ 
 
 ,j". 
 
 /j"1'= 
 
 ?cj
 
3 B 2/j"%. 
 
	 	C+ +	\ d%),   99==):):)<)<===    99   
* * *"  $ $ $  3 3 3 3 3 3 3 3(x  x  x  x  x  x  x  x vs
 s
 s
 s
 s
8$j s
 s
 s
 s
 s
r$   