
    7bhs              
       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         </opt/python-3.12.12/usr/lib/python3.12/test/test_launcher.pyr.   z3create_registry_data.<locals>._create_registry_data\   s    eT"##D#.$!KKMDAq)$15 * /. s#dCv}}eDDKKERSS /.s   #B''B0)r"   )r(   datar,   r-   r.   s       @r/   create_registry_datar1   [   s+    
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   sP     __	..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   sb     = ==FDz^^D#f5 y7 6s# 55s   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   sm   $$&#..)0069FYYv&,,S1!!Wv-F~~'	 2  %%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{{//????
 GGMMOFF2J((--/(()<C((--/(()<DDXsSC
 <<,,/"4;;&&'.!#J.!#J!,,*;;//t{{>RT>RTWY\]].= ^^%
%<<$ KKQS!1!!4!;!;!==% 	 

 XXM W =
 
.
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              #   2  K   t        t        j                  t        j                               dz         }t        |t              r|j                  |       n|j                  ||       	 | |j                          y # |j                          w xY ww)N)dirz.pyr[   )
r   tempfilemktempr   getcwdr   bytesrd   r_   rc   )rX   rV   r\   files       r/   scriptzRunPyMixin.script  sh     HOO		4u<=gu%W%OOGhO7	JKKMDKKMs   A*B-B 1BBB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- Z0d. Z1d/ Z2y0)1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   sT    f66?LPS i0 M ??''(MNA  MLs   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  HK i0 D  D  Ds   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_version0  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_option5  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_option9  so    
KCR c"{{C5)  T*;%<=  T*@%AB #"
 #"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_listE  sQ   {{H:&N--/D5t<A$%GGAJaggaj! 0 !G$W-L+Q|!z,q/4/PA|DQG9AcU+*3/>s  JJWIX.5 ! $);;=@=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! 0 !G$W-L+Q|!z,q/4/PA|DQG9AcU+&s+M:W")*:";F3KssW5J-K'KK  JJWIX.5 !" $);;=@=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     G,Q|b3K0,s         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  sw    [[)*;;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)	Nr0  r3  r   r4  r   r5  X.Y-32.exe -argrt   r7  r   s     r/   test_py2_defaultzTestLauncher.test_py2_default  sz    [[)*;;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  r3  r   r4  r   r5  'X.Y-arm64.exe -X fake_arg_for_test -argrt   r7  r   s     r/   test_py3_defaultzTestLauncher.test_py3_default  sz    [[)*;;f~.D +*D1E,FG-=(>?BDNDXDXDZ[	 +*r>  c                     | j                  dgt              }| j                  d|d          | j                  d|d          | j                  d|d   j                                y )	Nr3  r  r   r4  r   r5  r6  rt   r   TEST_PY_ENVr   r9  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 )
Nr0  r3  r  r   r4  r   r5  r<  rt   rC  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  r3  r  r   r4  r   r5  r@  rt   rC  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   r4  r   r5  zX.Y.exe --versionrt   )r   r8  r   r   r   r9  )rX   r   r0   s      r/   test_py_default_short_argv0z(TestLauncher.test_py_default_short_argv0  s    [[)*=\\%(;;}eWJ;O;PD$$%6=Q8RS$$Wd3C.DE$$%8$x.:N:N:PQ	 )( > +*(( +*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   rD  r   r   r   r   r   )rX   r0   defaultr   r   s        r/   test_py_default_in_listz$TestLauncher.test_py_default_in_list  si    {{D6{{3N--/D5t<A''!*	 0
 	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?	 4 		9:;;v3;/DX113HH-t4$$]AGGAJ?	 4 		:;# 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   r9  r#   assertNotEqual)rX   r   r   data1data2s        r/   test_virtualenv_with_envz%TestLauncher.test_virtualenv_with_env  s    ^^(CKK(Q3(Q=P(QKREKK!7 8>g>gkSf>gKhE  	x..0#h-@:;VDE(O113S]CE"=>G 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   r4  r   r5  X.Y.exe -prearg 	 -postargrt   r   r8  r   r   r   r9  rX   r   r0   s      r/   test_py_shebangzTestLauncher.test_py_shebang%  s    [[)*9:f{{FJ#78 ; + 	*D1E,FG$'7"89+F89=tH~?S?S?UV	 ;: +*!   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   r4  r   r5  r]  r^  rt   r_  r`  s      r/   test_python_shebangz TestLauncher.test_python_shebang-  s    [[)*01V{{FJ#78 2 + 	*D1E,FG$'7"89+F89=tH~?S?S?UV	 21 +*rb  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   r4  r   r5  X.Y-32.exe -prearg r^  rt   r_  r`  s      r/   test_py2_shebangzTestLauncher.test_py2_shebang5  s    [[)*:;v{{FJ#78 < + 	*D1E,FGT*:%;<.vhi@$x.BVBVBXY	 <; +*rb  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/python3 -preargr\  r   r4  r   r5  +X.Y-arm64.exe -X fake_arg_for_test -prearg r^  rt   r_  r`  s      r/   test_py3_shebangzTestLauncher.test_py3_shebang=  s    [[)*:;v{{FJ#78 < + 	*D1E,FG-=(>?FvhiXZ^_gZhZnZnZpq	 <; +*rb  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   r4  r   r5  r]  r^  rt   r_  r`  s      r/   test_py_shebang_nlzTestLauncher.test_py_shebang_nlE  s    [[)*;<{{FJ#78 = + 	*D1E,FG$'7"89+F89=tH~?S?S?UV	 =< +*rb  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   r4  r   r5  rf  r^  rt   r_  r`  s      r/   test_py2_shebang_nlz TestLauncher.test_py2_shebang_nlM  s    [[)*<={{FJ#78 > + 	*D1E,FGT*:%;<.vhi@$x.BVBVBXY	 >= +*rb  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   r4  r   r5  rj  r^  rt   r_  r`  s      r/   test_py3_shebang_nlz TestLauncher.test_py3_shebang_nlU  s    [[)*<={{FJ#78 > + 	*D1E,FG-=(>?FvhiXZ^_gZhZnZnZpq	 >= +*rb  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)Nr[  r\  z
"py.exe" "z
" -postargrM  r   r4  r   r5  zX.Y.exe -prearg "rt   r_  r`  s      r/   test_py_shebang_short_argv0z(TestLauncher.test_py_shebang_short_argv0]  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                  t              5  dj                  d      }| j                  d|z         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)Nr[  r   s   ﻿r\  r   r4  r   r5  r]  r^  rt   )r   r8  encoder   r   r   r9  rX   rV   r   r0   s       r/   test_py_shebang_valid_bomz&TestLauncher.test_py_shebang_valid_bomf  s    [[)*299'BG_w676{{FJ#78 8 + 	*D1E,FG$'7"89+F89=tH~?S?S?UV	 87 +*s"   &B>B2B>2B;	7B>>Cc                    | j                  t              5  dj                  d      }| j                  d|z         5 }| j	                  |dg      }d d d        d d d        | j                  dd          | j                  d|d          | j                  d	|d
          | j                  d d|d   j                                y # 1 sw Y   xxY w# 1 sw Y   |xY w)Nri  r   s   謹r\  zInvalid BOMru   r   r4  r   r5  X.Y.exe r^  rt   )r   r8  ru  r   r   assertInr   r9  rv  s       r/   test_py_shebang_invalid_bomz(TestLauncher.test_py_shebang_invalid_bomo  s    [[)*3::7CG_w676{{FJ#78 8 + 	mT(^4*D1E,FG$'7"898F895tH~7K7K7MN 87 +*s"   &CCCC	CC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-64r5  r   zSearchInfo.oldStyleTag)r   joinr   r   r   s     r/   test_py_handle_64_in_iniz%TestLauncher.test_py_handle_64_in_iniy  so    [[L2C#DEF;;rdc;JD G 	T*:%;<&>!?@	 GFs   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   r8  r   r   r~   r   r   r   r9  rX   r  r   r0   s       r/   test_search_pathzTestLauncher.test_search_path  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r  )r   r|   r}   r   r   r8  r   r   r~   r   r   r   r9  )rX   r   r   r0   s       r/   test_search_path_exez!TestLauncher.test_search_path_exe  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)Nr  rn   ro   r  ry  rt   )r   r  r   r8  r   r   r~   r   r   r   r9  r  s       r/   test_recursive_search_pathz'TestLauncher.test_recursive_search_path  s     %%[[)*/v676{{HDOO$5$<$<#=Qryy?P>Q!RS #  8 + 	8F8,d8n.B.B.DE 87 +*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.exerL  )rt   ru   zms-windows-store://9PJPW5LDXLZ5)r   r9  r   
check_callr   STDOUTrz  r^   )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   r9  r`  s      r/   test_literal_shebang_absolutez*TestLauncher.test_literal_shebang_absolute  sW    [[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~   r9  r`  s      r/   test_literal_shebang_relativez*TestLauncher.test_literal_shebang_relative  sg    [[:;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9V;;x(D ::6(CN  "	

 [[89V;;x(D ::6(CN  "	
 :9 :9s   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  sb    [[:;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   r9  r`  s      r/   test_literal_shebang_commandz)TestLauncher.test_literal_shebang_command  st    [[)*34{{F8, 5 + 	 )N  "	
 54 +*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   r9  )rX   r   r0   r   s       r/   %test_literal_shebang_invalid_templatez2TestLauncher.test_literal_shebang_invalid_template  sj    [[676;;x(D 8!66hfVH%N  "	
 87s   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   r9  r   )rX   r   r0   r   r   r  s         r/   !test_shebang_executable_extensionz.TestLauncher.test_shebang_executable_extension  s    [[56&;;x3;?D 73+/>+D+D+F 7+F4___5 **,+F 7&6* 767s   B(BBN)3rg   rh   ri   r   r   r   r   r   r   r  r
  r  r  r  r  r  r#  r.  r1  r:  r=  rA  rE  rG  rI  rN  rQ  rT  rY  ra  rd  rg  rk  rm  ro  rq  rs  rw  r{  r~  r  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WOA`	`	F+





+r2   r   )&r   r4   r   r   r   r   r|   rz   r   r   pathlibr   testr   platformr   r    r   r}   casefoldr-  prefixr   r   rD  r}  r"   lowerr8  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({  { |N+8$$j N+[ >s   )"F