
    0hhrz              
       `   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  \R                  S:w  a  \	R                  " S5      eS SKrSrSr\R&                  R)                  5       R+                  SR)                  5       5      (       a  S	rS
rSSS\R,                  SS.S.S\R,                  SS.S.S\R,                  SSS.S.SS\R,                  0S.S.SS\R,                  \R&                  S.S.S.S.r\" SSSS 9rS!R5                  S"/\R7                  5        V Vs/ s H  u  pU S#S R9                  5        S$U 3PM     snn Q5      rS!R5                  S%S&/5      rS' rS( r S) r!S* r"S+ r# " S, S-5      r$ " S. S/5      r% " S0 S1\	RL                  \%5      r'gs  snn f )2    N)Path)supportwin32ztest only applies to Windowspy.exeFz_d.exezpy_d.exeTz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                 4    [        U 5      n SU ;   a  SU  S3$ U $ )N ")str)ss    ;/opt/python-3.13.8/usr/lib/python3.13/test/test_launcher.pyquoter"   ^   s$    AAaxQqc8&Q&    c                 V   ^ U4S jmUR                  5        H  u  p#T" XU5        M     g )Nc                   > [        U[        5      (       aB  [        R                  " X5       nUR	                  5        H  u  pET" X4U5        M     S S S 5        g [        U[
        5      (       a(  [        R                  " XS [        R                  U5        g [        SR                  U5      5      e! , (       d  f       g = f)Nz&don't know how to create data for '{}')

isinstancedictwinregCreateKeyExitemsr   
SetValueExREG_SZ	TypeErrorformat)rootkeyvaluehkeykv_create_registry_datas         r!   r5   3create_registry_data.<locals>._create_registry_datad   s    eT""##D.$!KKMDA)$15 * /. s##dv}}eDDKKERSS /.s   #B00
B>)r*   )r/   datar3   r4   r5   s       @r!   create_registry_datar8   c   s'    
T 

dq) r#   c              #      #    [         R                  " 5        H  n [        R                  " X5      v   M     g ! [         a  nUR
                  S:X  a   S nA  g e S nAff = f7f)Ni  )	itertoolscountr(   EnumKeyOSErrorwinerror)r/   iexs      r!   	enum_keysrA   t   sM     __	..))   	{{c!	s1   A"9A"
AAA"AAA"c                    [         R                  [         R                  -  n[        U5       HL  n[         R                  " XUS9 n[        U[        U5      5        S S S 5        [         R                  " X5        MN     g ! , (       d  f       N)= f)Naccess)r(   	KEY_WRITEKEY_ENUMERATE_SUB_KEYSlistOpenKeydelete_registry_datarA   	DeleteKey)r/   keysACCESSr0   r2   s        r!   rI   rI   ~   s^     = ==FDz^^Df5 y7 6# 55s   A>>
B	c           	      \   SU  S3n[         R                  S4[         R                  [         R                  4[         R                  [         R                  44 H@  u  p# [         R
                  " [         R                  " X![         R                  U-  S95          g   g! [         a     MR  f = f)NzSoftware\Python\PythonCore\z\InstallPathr   rC   TF)	r(   HKEY_CURRENT_USERHKEY_LOCAL_MACHINEKEY_WOW64_64KEYKEY_WOW64_32KEYCloseKeyrH   KEY_READr=   )tagr0   r/   flags       r!   is_installedrV      s    (\
:C		!	!1%		"	"F$:$:;		"	"F$:$:;

	OOFNN4V__t=STU   		s   :B
B+*B+c                   &    \ rS rSrS rS rS rSrg)PreservePyIni   c                 >    [        U5      U l        X l        S U l        g N)r   pathcontent
_preserved)selfr\   r]   s      r!   __init__PreservePyIni.__init__   s    J	r#   c                      U R                   R                  5       U l        U R                   R	                  U R
                  SS9  g ! [         a
    S U l         N8f = f)Nzutf-16encoding)r\   
read_bytesr^   FileNotFoundError
write_textr]   r_   s    r!   	__enter__PreservePyIni.__enter__   sP    	#"ii224DO 			T\\H= ! 	#"DO	#s   A AAc                     U R                   c  U R                  R                  5         g U R                  R                  U R                   5        g r[   )r^   r\   unlinkwrite_bytes)r_   exc_infos     r!   __exit__PreservePyIni.__exit__   s2    ??"IIII!!$//2r#   )r^   r]   r\   N)__name__
__module____qualname____firstlineno__r`   ri   ro   __static_attributes__ r#   r!   rX   rX      s    
>3r#   rX   c                       \ rS rSrSr\S 5       rS rS
S jrS r	\
R                  SS j5       r\
R                  S 5       rS	rg)
RunPyMixin   Nc           	         S n[         R                  " 5       (       a+  [        [        R                  5      R
                  [        -  nO`[        R                  " S5      R                  S5       H5  nU(       d  M  [        U5      [        -  nUR                  5       (       d  M5    O   S nU(       a   [        R                  " US/[        R                  [        R                  [        R                  SSS9 nUR                  R                  5         [!        UR"                  S5      R%                  5       S   R'                  S	5      S
   nUR"                  R)                  5         UR+                  S5        S S S 5        [        R,                  R/                  W5      (       d  S nU(       d)  [2        R4                  " SR7                  [        5      5      eU$ ! , (       d  f       Nf= f! [0         a    S n NQf = f)NPATH;-hasciiignore)stdinstdoutstderrrd   errorsr   r   r      
   zcannot locate '{}' for test)	sysconfigis_python_buildr   sys
executableparentPY_EXEosgetenvsplitis_file
subprocessPopenPIPEr   closenextr   
splitlines
rpartitionreadwaitversion
startswithr=   unittestSkipTestr.   )clspy_exepr   s       r!   find_pyRunPyMixin.find_py   sx   $$&&#..)0069FYYv&,,S11!!Wv-F~~''	 2  %%TN$//%??%??$# GGMMO"188T2==?BMMcRSTUGHHMMOFF2J {{--g66!F ##-44V<  +   s,   0AG% 5A?G4.G% 
G"G% %G43G4c                 f    U R                   (       d  U R                  5       U l         U R                   $ r[   )r   r   rh   s    r!   
get_py_exeRunPyMixin.get_py_exe   s     {{,,.DK{{r#   c           	         U R                   (       d  U R                  5       U l         1 Skn0 [        R                  R	                  5        VVs0 s H,  u  pxUR                  5       U;  d  M  UR                  5       U_M.     snnESSSS.EU=(       d    0 R	                  5        VVs0 s H  u  pxUR                  5       U_M     snnEnU(       d  U R                   /UQn[        R                  " UUU R                   [        R                  [        R                  [        R                  S9 n	U	R                  R                  5         U	R                  S5        U	R                  R                  5       R                  SS5      n
U	R                  R                  5       R                  S	S5      R!                  S
S5      nS S S 5        W	R"                  U:w  ak  [$        R&                  (       aV  U(       dO  [)        S5        [)        U R                   /UQ5        [)        S5        [)        W
5        [)        S5        [)        W5        U(       a@  U	R"                  U:w  a0  [        R*                  " U	R"                  U R                   /UQW
W5      eU R-                  XIR"                  5        WR/                  5        Vs0 s HX  nUR1                  S5      (       a  M  SU;   d  M#  UR3                  S5      S   UR3                  S5      S   R5                  5       _MZ     nnW
US'   XS'   U$ s  snnf s  snnf ! , (       d  f       GNv= fs  snf )N>   r   r   r   VIRTUAL_ENV1 )PYLAUNCHER_DEBUGPYLAUNCHER_DRYRUNPYLAUNCHER_LIMIT_TO_COMPANY)envr   r   r   r   r   utf-8replacer~   u   �?z++ COMMAND ++z++ STDOUT ++z++ STDERR ++#:r   r   r   r   )r   r   r   environr*   upperr   r   r   r   r   r   r   r   decoder   r   
returncoder   verboseprintCalledProcessErrorassertEqualr   r   	partitionlstrip)r_   argsr   
allow_failexpect_returncodeargvr   r3   r4   r   outerrr    r7   s                 r!   run_pyRunPyMixin.run_py   s   {{,,.DKI
(*

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

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

 XXM W =
 
.
s1   L+L&L$+BL*2L<L<9L<*
L9c                     [         R                  R                  S5      nU(       d  [        R                  " S5      e[        [        U5      S-  U5      $ )NLOCALAPPDATAz5LOCALAPPDATA environment variable is missing or emptyzpy.ini)r   r   getr   r   rX   r   )r_   r]   local_appdatas      r!   py_iniRunPyMixin.py_ini  sF    

~6## %7 8 8T-08;WEEr#   c              #   2  #    [        [        R                  " [        R                  " 5       S9S-   5      n[        U[        5      (       a  UR                  U5        OUR                  XS9   Uv   UR                  5         g ! UR                  5         f = f7f)N)dirz.pyrc   )
r   tempfilemktempr   getcwdr&   bytesrm   rg   rl   )r_   r]   rd   files       r!   scriptRunPyMixin.script  sh     HOO		4u<=gu%%W%OOGO7	JKKMDKKMs   A*B-B 1BBBc              #   :  #    [         R                  " 5       S-  nUR                  SSS9  U[        (       a  SOS-  nUR	                  5          US[        UR                  5      04v   [        R                  " U5        g ! [        R                  " U5        f = f7f)NScriptsT)exist_okparentszpython_d.exez
python.exer   )	r   cwdmkdirDEBUG_BUILDtouchr   r   shutilrmtree)r_   venvvenv_exes      r!   	fake_venvRunPyMixin.fake_venv  su     xxzI%

D$
/kkN|L	 ]C,<===MM$FMM$s   ABB  )B BB)r   )NFr   N)r   )rq   rr   rs   rt   r   classmethodr   r   r   r   
contextlibcontextmanagerr   r   ru   rv   r#   r!   rx   rx      s_    F& &P
,\F 	 	    r#   rx   c                   H   \ rS rSr\S 5       r\S 5       rS rS rS r	S r
S rS	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S  r#S! r$S" r%S# r&S$ r'S% r(S& r)S' r*S( r+S) r,S* r-S+ r.S, r/S- r0S. r1S/ r2S0 r3S1 r4S2r5g3)4TestLauncheri'  c                     [         R                  " [         R                  S5       n[        U[        5        S S S 5        [
        R                  (       a  [        R                  " S5      ng g ! , (       d  f       N;= f)NSoftware\Pythonz!reg query HKCU\Software\Python /s)	r(   	CreateKeyrN   r8   	TEST_DATAr   r   r   check_output)r   r0   r   s      r!   
setUpClassTestLauncher.setUpClass(  sT    f66?LPS i0 M ??''(MNA  MLs   A,,
A:c                     [         R                  " [         R                  S[         R                  [         R                  -  S9 n[        U[        5        S S S 5        g ! , (       d  f       g = f)Nr   rC   )r(   rH   rN   rE   rF   rI   r   )r   r0   s     r!   tearDownClassTestLauncher.tearDownClass2  s^    ^^F44RXRbRbek  fC  fC  SC  D  HK i0 D  D  Ds   A
A,c                     U R                  S/5      nU R                  U R                  [        US   5      5        U R                  [        R
                  R                  S5      S   US   5        g )N-0argv0r   r   r   )r   r   r   r   r   r   r   r_   r7   s     r!   test_versionTestLauncher.test_version8  sW    {{D6"d4=&9:..s3A6YHr#   c                 R    U R                  S/5      nU R                  SUS   5        g )Nr}   TruezSearchInfo.helpr   r   r   s     r!   test_help_optionTestLauncher.test_help_option=  s(    {{D6"&7!89r#   c                     S HZ  u  pnU R                  U5         U R                  U/5      nU R                  X$S   5        U R                  X4S   5        S S S 5        M\     g ! , (       d  f       Mn  = f)N))r   r   False)-0pr   r   )--listr   r   )--list-pathsr   r   zSearchInfo.listzSearchInfo.listPaths)subTestr   r   )r_   optv1v2r7   s        r!   test_list_optionTestLauncher.test_list_optionA  si    
KCR c"{{C5)  *;%<=  *@%AB #"
 #"s   ;A""
A1	c                    U R                  S/5      n0 n0 nUS   R                  5        HE  n[        R                  " SU5      nU(       d  M#  UR	                  S5      X%R	                  S5      '   MG     [
         Hg  n[
        U   nU Vs/ s H  n[        Xx   [        5      (       d  M  UPM      n	nU	 H  n
SU SU
 3nXz   S   X;'   M     UR                  SU S	3S 5        Mi     UR                  5        VVs0 s H  u  pX;   d  M  X_M     nnn U R                  X>5        g s  snf s  snnf !   [        R                  (       a  [        S
5        [        US   5        e = f)Nr   r   \s*(.+?)\s+?(\*\s+)?(.+)$r      -V:/r	   /ignored*** STDOUT ***)r   r   rematchgroupr   r&   r'   popr*   assertDictEqualr   r   r   )r_   r7   foundexpectlinemcompanycompany_datattagsrT   argr3   r4   actuals                  r!   	test_listTestLauncher.test_listM  sE   {{H:&N--/D5t<Aq$%GGAJggaj! 0 !G$W-L+Q|!z,/4/PA|DQG9AcU+*/>  JJWIX.5 ! $);;=@=41AK$!$=@	  0 R A	&'d8n%s$   	D"(D"7D'D'D- -1Ec           	         U R                  S/5      n0 n0 nUS   R                  5        HE  n[        R                  " SU5      nU(       d  M#  UR	                  S5      X%R	                  S5      '   MG     [
         H  n[
        U   nU Vs/ s H  n[        Xx   [        5      (       d  M  UPM      n	nU	 H-  n
SU SU
 3nXz   S   n US	   X;'    X;==   S
US   -   -  ss'   M/     UR                  SU S3S 5        M     UR                  5        VVs0 s H  u  pX;   d  M  X_M     nnn U R!                  X?5        g s  snf ! [         a     M  f = f! [         aA    [        [        US    5      [        [        R                  5      R                  -  5      X;'    M  f = fs  snnf !   ["        R$                  (       a  ['        S5        ['        US   5        e = f)Nr   r   r  r   r  r	  r
  r
   r   r   r   r  r  )r   r   r  r  r  r   r&   r'   KeyErrorr   r   r   r   namer  r*   r  r   r   r   )r_   r7   r  r  r  r  r  r  r  r  rT   r  installr3   r4   r  s                   r!   test_list_pathsTestLauncher.test_list_pathsf  s   {{N+,N--/D5t<Aq$%GGAJggaj! 0 !G$W-L+Q|!z,/4/PA|DQG9AcU+&+M:W")*:";FKsW5J-K'KK  JJWIX.5 !" $);;=@=41AK$!$=@	  0# R $  W"%d74=&9D<P<U<U&U"VFKW
 A	&'d8n%sU   	D;(D;EE FF)F%  
E
EEEAFF%1Gc                     SnU R                  SU S3/5      nU R                  SUS   5        U R                  XS   5        U R                  SUS   5        g )	Nr   r	  r
  r   LaunchCommandenv.companyr   env.tagr   r_   r  r7   s      r!   test_filter_to_company#TestLauncher.test_filter_to_company  s]    #{{c'!,-.D$9:}"56$y/2r#   c                     SnU R                  SU S3/[        SS9S9nU R                  SUS   5        U R                  XS	   5        U R                  S
US   5        g )Nr   r	  r
  z3.0)r   r   r   r%  r&  r   r'  )r   r'   r   r(  s      r!   #test_filter_to_company_with_default0TestLauncher.test_filter_to_company_with_default  sf    #{{c'!,-4%3H{ID$9:}"56$y/2r#   c                    SnU R                  S/5      nU R                  SUS   5        U R                  XS   5        U R                  SUS   5        U R                  S/5      nU R                  S	US   5        U R                  XS   5        U R                  S
US   5        U R                  S/5      nU R                  SUS   5        U R                  XS   5        U R                  SUS   5        g )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_tag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8r#   c                     SnU R                  SU S3/SS9nU R                  SU S3/5      nU R                  SUS   5        U R                  XS	   5        U R                  S
US   5        g )Nr   r	  z/3.1g   r   z/3.100r   r%  r&  r   r'  r   r(  s      r!   test_filter_to_company_and_tag+TestLauncher.test_filter_to_company_and_tag  s{    #{{c'$/0C{H{{c'&123D$9:}"56$y/2r#   c                 0    SnU R                  S/SU0SS9ng )Nr   z-V:Nonexistentr   r3  r   r   )r   r(  s      r!   test_filter_with_single_install,TestLauncher.test_filter_with_single_install  s+    ${{.8!  
r#   c                      U R                  S/SS9nU R                  SUS   5        U R                  US   R                  S5      US   5        g ! [        R                   a    [        R                  " S5      ef = f)	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_3 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                     U R                  S/SS9nU R                  SUS	   5        U R                  US
   R                  S5      US
   5        U R                  US
   R                  S5      US
   5        g ! [        R                   a9    [        S [	        SS5       5       5      (       d  [
        R                  " S5      ee f = f)Nz-3-32Tr=  c              3   @   #    U  H  n[        S U S35      v   M     g7f)r?  -32N)rV   ).0r?   s     r!   	<genexpr>6TestLauncher.test_search_major_3_32.<locals>.<genexpr>  s      G,Q|b3K00,s         z/requires at least one 32-bit Python 3.x installr>  r&  r'  r?  rE  )r   r   r   anyranger   r   r   r@  r   endswithr   s     r!   test_search_major_3_32#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G''(YZZ	s   A7 7ACc                      U R                  S/SS9nU R                  SWS   5        U R                  US   R                  S	5      US   5        g ! [        R                   a)    [        S5      (       d  [        R
                  " S5      e Nyf = f)
N-2Tr=  z2.7z(requires at least one Python 2.x installr>  r&  r'  z2.)	r   r   r   rV   r   r   r   r@  r   r   s     r!   test_search_major_2 TestLauncher.test_search_major_2  s    	T;;v$;7D 	tM':;Y2248$y/J	 ,, 	T&&''(RSS '	Ts   A :BBc                     U R                  [        5         U R                  S/5      nS S S 5        U R                  SWS   5        U R                  SUS   5        U R                  SUS   R	                  5       5        g ! , (       d  f       N\= f)N-argr   SearchInfo.companyr   SearchInfo.tagX.Y.exe -argr   r   TEST_PY_DEFAULTSr   r   stripr   s     r!   test_py_defaultTestLauncher.test_py_default  sw    [[)*;;x(D +*D1E,FG$'7"89h)=)=)?@	 +*s   A??
Bc                 "   U R                  [        5         U R                  SS/5      nS S S 5        U R                  SWS   5        U R                  SUS   5        U R                  SUS   R	                  5       5        g ! , (       d  f       N\= f)	NrQ  rU  r   rV  r   rW  X.Y-32.exe -argr   rY  r   s     r!   test_py2_defaultTestLauncher.test_py2_default  sz    [[)*;;f~.D +*D1E,FGT*:%;<*DN,@,@,BC	 +*   B  
Bc                 "   U R                  [        5         U R                  SS/5      nS S S 5        U R                  SWS   5        U R                  SUS   5        U R                  SUS   R	                  5       5        g ! , (       d  f       N\= f)	Nr<  rU  r   rV  r   rW  'X.Y-arm64.exe -X fake_arg_for_test -argr   rY  r   s     r!   test_py3_defaultTestLauncher.test_py3_default  sz    [[)*;;f~.D +*D1E,FG-=(>?BDNDXDXDZ[	 +*rb  c                     U R                  S/[        S9nU R                  SUS   5        U R                  SUS   5        U R                  SUS   R                  5       5        g )	NrU  r,  r   rV  r   rW  rX  r   r   TEST_PY_ENVr   r[  r   s     r!   test_py_default_env TestLauncher.test_py_default_env  s`    {{F8{5*D1E,FG$'7"89h)=)=)?@r#   c                     U R                  SS/[        S9nU R                  SUS   5        U R                  SUS   5        U R                  SUS	   R                  5       5        g )
NrQ  rU  r,  r   rV  r   rW  r_  r   rh  r   s     r!   test_py2_default_env!TestLauncher.test_py2_default_env  sc    {{D&>{{;*D1E,FGT*:%;<*DN,@,@,BCr#   c                     U R                  SS/[        S9nU R                  SUS   5        U R                  SUS   5        U R                  SUS	   R                  5       5        g )
Nr<  rU  r,  r   rV  r   rW  rd  r   rh  r   s     r!   test_py3_default_env!TestLauncher.test_py3_default_env  sc    {{D&>{{;*D1E,FG-=(>?BDNDXDXDZ[r#   c                    U R                  [        5         S H~  nU R                  U5         U R                  S/U S3S9nU R	                  SUS   5        U R	                  SUS   5        U R	                  S	US
   R                  5       5        S S S 5        M     S S S 5        g ! , (       d  f       M  = f! , (       d  f       g = f)N)z"py.exe"r   z"py"py	--versionz
 --versionr   r   rV  r   rW  zX.Y.exe --versionr   )r   rZ  r   r   r   r[  )r_   r   r7   s      r!   test_py_default_short_argv0(TestLauncher.test_py_default_short_argv0  s    [[)*=\\%(;;}eWJ;O;PD$$%6=Q8RS$$Wd3C.DE$$%8$x.:N:N:PQ	 )( > +*(( +*s#   B6A"B$B6$
B3.B66
Cc                     U R                  S/[        S9nS nUS   R                  5        H4  n[        R                  " SU5      nU(       d  M#  UR                  S5      n  O   U R                  SU5        g )Nr   r,  r   z\s*-V:(.+?)\s+?\*\s+(.+)$r  r   )r   ri  r   r  r  r  r   )r_   r7   defaultr  r  s        r!   test_py_default_in_list$TestLauncher.test_py_default_in_list  sk    {{D6{{3N--/D5t<Aq''!*	 0
 	0':r#   c                    U R                  5        u  pU R                  S/US9nUS   R                  5        HM  n[        R                  " SU5      nU(       d  M#  U R                  [        U5      UR                  S5      5          OD   [        R                  (       a  [        US   5        [        US   5        U R                  S5        U R                  S/US9nUS   R                  5        HD  n[        R                  " SU5      nU(       d  M#  U R                  S	UR                  S5      5          O   U R                  S
5        S S S 5        g ! , (       d  f       g = f)Nr   r,  r   z\s*\*\s+(.+)$r  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  r   r   r   fail)r_   r   r   r7   r  r  s         r!   test_virtualenv_in_list$TestLauncher.test_virtualenv_in_list  s   ^^(;;wC;0DX113HH-t41$$S]AGGAJ?	 4 ??$x.)$x.)		9:;;v3;/DX113HH-t41$$]AGGAJ?	 4 		:;) s   AEB3E6E
Ec                    U R                  5        u  pU R                  / 0 UESS0ES9nU R                  S/0 UESS0ES9nS S S 5        U R                  WS   R                  5       [	        W5      5        U R                  US   S5        U R                  WS   R                  5       [	        U5      5        U R                  US   S5        g ! , (       d  f       N= f)Nr   zPythonTestSuite/3r,  z-V:PythonTestSuite/3r   zSearchInfo.lowPriorityTagr   )r   r   r   r[  r"   assertNotEqual)r_   r   r   data1data2s        r!   test_virtualenv_with_env%TestLauncher.test_virtualenv_with_env%  s    ^^(KK(Q3(Q=P(QKREKK!7 8>g>gkSf>gKhE  	x..0%/B:;VDE(O113U8_EE"=>G s   0C
Cc                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
N#! /usr/bin/python -prearg-postargr   rV  r   rW  X.Y.exe -prearg 	 -postargr   r   rZ  r   r   r   r"   r[  r_   r   r7   s      r!   test_py_shebangTestLauncher.test_py_shebang0  s    [[)*9:f{{FJ#78 ; + 	*D1E,FG$'7"89+E&M?)Dd8nFZFZF\]	 ;: +*!   B8B'B8'
B5	1B88
Cc                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
Nz#! python -preargr  r   rV  r   rW  r  r  r   r  r  s      r!   test_python_shebang TestLauncher.test_python_shebang8  s    [[)*01V{{FJ#78 2 + 	*D1E,FG$'7"89+E&M?)Dd8nFZFZF\]	 21 +*r  c                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
Nz#! /usr/bin/python2 -preargr  r   rV  r   rW  X.Y-32.exe -prearg r  r   r  r  s      r!   test_py2_shebangTestLauncher.test_py2_shebang@  s    [[)*:;v{{FJ#78 < + 	*D1E,FGT*:%;<.uV}oYGh--/	1	 <; +*r  c                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
N#! /usr/bin/python3 -preargr  r   rV  r   rW  +X.Y-arm64.exe -X fake_arg_for_test -prearg r  r   r  r  s      r!   test_py3_shebangTestLauncher.test_py3_shebangI  s    [[)*:;v{{FJ#78 < + 	*D1E,FG-=(>?FuV}oU^_h--/	1	 <; +*r  c                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
Nz#! /usr/bin/python -prearg
r  r   rV  r   rW  r  r  r   r  r  s      r!   test_py_shebang_nlTestLauncher.test_py_shebang_nlR  s    [[)*;<{{FJ#78 = + 	*D1E,FG$'7"89+E&M?)Dh--/	1	 =< +*r  c                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
Nz#! /usr/bin/python2 -prearg
r  r   rV  r   rW  r  r  r   r  r  s      r!   test_py2_shebang_nl TestLauncher.test_py2_shebang_nl[  s    [[)*<={{FJ#78 > + 	*D1E,FGT*:%;<.uV}oYGh--/	1	 >= +*r  c                    U R                  [        5         U R                  S5       nU R                  US/5      nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS   5        U R	                  S[        W5       S3US	   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)
Nz#! /usr/bin/python3 -prearg
r  r   rV  r   rW  r  r  r   r  r  s      r!   test_py3_shebang_nl TestLauncher.test_py3_shebang_nld  s    [[)*<={{FJ#78 > + 	*D1E,FG-=(>?FuV}oU^_h--/	1	 >= +*r  c                    U R                  [        5         U R                  S5       nU R                  US/SU S3S9nS S S 5        S S S 5        U R	                  SWS   5        U R	                  SUS	   5        U R	                  S
W S3US   R                  5       5        g ! , (       d  f       Nh= f! , (       d  f       Nq= f)Nr  r  z
"py.exe" "z
" -postargru  r   rV  r   rW  zX.Y.exe -prearg "r   )r   rZ  r   r   r   r[  r  s      r!   test_py_shebang_short_argv0(TestLauncher.test_py_shebang_short_argv0m  s    [[)*9:f{{FJ#7
6(R\>]{^ ; + 	*D1E,FG$'7"89,VHJ?hAUAUAWX ;: +*s!   B2B!B2!
B/	+B22
C c                    U R                  [        5         SR                  S5      nU R                  SU-   5       nU R	                  US/5      nS S S 5        S S S 5        U R                  SWS   5        U R                  SUS   5        U R                  S	[        W5       S
3US   R                  5       5        g ! , (       d  f       Nq= f! , (       d  f       Nz= f)Nr  r   s   ﻿r  r   rV  r   rW  r  r  r   )r   rZ  encoder   r   r   r"   r[  r_   r]   r   r7   s       r!   test_py_shebang_valid_bom&TestLauncher.test_py_shebang_valid_bomv  s    [[)*299'BG_w676{{FJ#78 8 + 	*D1E,FG$'7"89+E&M?)Dd8nFZFZF\]	 87 +*s"   &CB;C;
C		C
Cc                    U R                  [        5         SR                  S5      nU R                  SU-   5       nU R	                  US/5      nS S S 5        S S S 5        U R                  SWS   5        U R                  SUS   5        U R                  S	US
   5        U R                  S[        W5       S3US   R                  5       5        g ! , (       d  f       N= f! , (       d  f       N= f)Nr  r   s   謹r  zInvalid BOMr   r   rV  r   rW  X.Y.exe r  r   )	r   rZ  r  r   r   assertInr   r"   r[  r  s       r!   test_py_shebang_invalid_bom(TestLauncher.test_py_shebang_invalid_bom  s    [[)*3::7CG_w676{{FJ#78 8 + 	mT(^4*D1E,FG$'7"898E&M?)<d8n>R>R>TU 87 +*s"   &C!CC!
C	C!!
C/c                     U R                  SR                  SS/5      5         U R                  / SSS9nS S S 5        U R                  SWS   5        U R                  S	US
   5        g ! , (       d  f       N9= f)Nr   r   zpython=3.999-64Tr3  )r   r   z3.999-64rW  r   zSearchInfo.oldStyleTag)r   joinr   r   r   s     r!   test_py_handle_64_in_ini%TestLauncher.test_py_handle_64_in_ini  so    [[L2C#DEF;;rdc;JD G 	T*:%;<&>!?@	 GFs   A((
A6c                 @   [        S5      R                  5       nUR                  5         U R                  UR                  5        U R                  [        5         U R                  SUR                   S35       nU R                  US/SUR                   S[        R                  " S5       30S9nS S S 5        S S S 5        U R                  [        U5       S[        W5       S	3WS
   R                  5       5        g ! , (       d  f       NR= f! , (       d  f       N[= fNzarbitrary-exe-name.exe#! /usr/bin/env z -preargr  r{   r|   r,  z	 -prearg r  r   )r   absoluter   
addCleanuprl   r   rZ  r   stemr   r   r   r   r   r"   r[  r_   exer   r7   s       r!   test_search_pathTestLauncher.test_search_path  s    +,557		

#[[)*/zBCv{{Z(CJJ<q61B0C!DE #  D + 	E#J<yvyIh--/	1 DC +*$    D:8C>2D>
D	D
Dc                 @   [        S5      R                  5       nUR                  5         U R                  UR                  5        U R                  [        5         U R                  SUR                   S35       nU R                  US/SUR                   S[        R                  " S5       30S9nS S S 5        S S S 5        U R                  [        U5       S[        W5       S	3WS
   R                  5       5        g ! , (       d  f       NR= f! , (       d  f       N[= fr  )r   r  r   r  rl   r   rZ  r   r   r   r   r   r   r   r"   r[  r  s       r!   test_search_path_exe!TestLauncher.test_search_path_exe  s    +,557		

#[[)*/zBCv{{Z(CJJ<q61B0C!DE #  D + 	E#J<yvyIh--/	1 DC +*r  c                    U R                  5       R                  nU R                  [        5         U R	                  SU 35       nU R                  U/SU R                  5       R                   S[        R                  " S5       30S9nS S S 5        S S S 5        U R                  S[        W5       3WS   R                  5       5        g ! , (       d  f       NF= f! , (       d  f       NO= f)Nr  r{   r|   r,  r  r   )r   r  r   rZ  r   r   r   r   r   r   r"   r[  )r_   r  r   r7   s       r!   test_recursive_search_path'TestLauncher.test_recursive_search_path  s     %%[[)*/v676{{HDOO$5$<$<#=Qryy?P>Q!RS #  8 + 	8E&M?3T(^5I5I5KL 87 +*s$   CAC

C

C	C
C)c                 H   U R                  S/SS0SS9nUS   R                  5       n [        R                  " SS/[        R                  [        R
                  S	9  U R                  SU5        U R                  SU5        g ! [         a    U R                  S
U5         N1f = f)Nz-V:3.10PYLAUNCHER_ALWAYS_INSTALLr   o   r8  r   z
winget.exert  )r   r   zms-windows-store://9PJPW5LDXLZ5)r   r[  r   
check_callr   STDOUTr  rf   )r_   r7   cmds      r!   test_installTestLauncher.test_install  s    {{I;-H#,Nbe{f8n""$	-!!<"=joo^h^o^op MM,,nc* ! 	6MM/5	6s   4B B! B!c                     U R                  S5       nU R                  U/5      nS S S 5        U R                  S[        W5       3WS   R	                  5       5        g ! , (       d  f       N>= f)Nz#! C:/some_random_app -withargzC:\some_random_app -witharg r   )r   r   r   r"   r[  r  s      r!   test_literal_shebang_absolute*TestLauncher.test_literal_shebang_absolute  s[    [[9:f;;x(D ;+E&M?;N  "	
 ;:s   A
A+c                     U R                  S5       nU R                  U/5      nS S S 5        U R                  [        WR                  R                  S-  5       S[        U5       3WS   R                  5       5        g ! , (       d  f       N`= f)Nz#! ..\some_random_app -withargsome_random_app
 -witharg r   r   r   r   r"   r   r[  r  s      r!   test_literal_shebang_relative*TestLauncher.test_literal_shebang_relative  sv    [[:;v;;x(D <V]])),==>?z%PV-YN  "	
 <;s   A??
Bc                    U R                  S5       nU R                  U/5      nS S S 5        U R                  [        WR                  S-  5       S[        U5       3WS   R                  5       5        U R                  S5       nU R                  U/5      nS S S 5        U R                  [        UR                  S-  5       S[        U5       3US   R                  5       5        g ! , (       d  f       N= f! , (       d  f       Ng= f)Nz#! "some random app" -withargzsome random appr  r   z#! some" random "app -withargr  r  s      r!   test_literal_shebang_quoted(TestLauncher.test_literal_shebang_quoted  s    [[89V;;x(D :V]]%6678
5=/RN  "	

 [[89V;;x(D :V]]%6678
5=/RN  "	
 :9 :9s   C(C9(
C69
Dc                    U R                  S5       nU R                  U/5      nS S S 5        U R                  [        WR                  S-  5       S[        U5       3WS   R                  5       5        g ! , (       d  f       NV= f)Nz#! some\" random "app -withargzsome/ random appr  r   r  r  s      r!   "test_literal_shebang_quoted_escape/TestLauncher.test_literal_shebang_quoted_escape  so    [[:;v;;x(D <V]]%7789E&M?SN  "	
 <;s   A55
Bc                 :   U R                  [        5         U R                  S5       nU R                  U/5      nS S S 5        S S S 5        U R	                  S[        W5       3WS   R                  5       5        g ! , (       d  f       NF= f! , (       d  f       NO= f)Nz#! test-command arg1zTEST_EXE.exe arg1 r   )r   TEST_PY_COMMANDSr   r   r   r"   r[  r  s      r!   test_literal_shebang_command)TestLauncher.test_literal_shebang_command  sx    [[)*34{{F8, 5 + 	 v0N  "	
 54 +*s!   BA;B;
B		B
Bc                    U R                  S5       nU R                  U/5      nS S S 5        WR                  S-  nU R                  [	        U5       S[	        U5       3WS   R                  5       5        g ! , (       d  f       NX= f)Nz#! /usr/bin/not-python arg1z/usr/bin/not-python arg1 r   )r   r   r   r   r"   r[  )r_   r   r7   r  s       r!   %test_literal_shebang_invalid_template2TestLauncher.test_literal_shebang_invalid_template  sr    [[676;;x(D 8!66V}oVE&M?3N  "	
 87s   A77
Bc           	         SnU R                  SU S35       nU R                  U/SS9nS S S 5        U R                  5        u  pE[        [        U5      R                  5      R                  5       nUR                  5         U R                  UR                  5        UR                   S[        R                  S    3US'   U R                  SU S35       nU R                  U/US9nS S S 5        U R                  WS	   R                  5       [        U5       S
[        W5       35        U R                  SUR                   S35       nU R                  U/US9nS S S 5        U R                  US	   R                  5       [        U5       S
[        U5       35        S S S 5        g ! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       Nt= f! , (       d  f       g = f)Nzpython-that-is-not-on-pathr  z arg1r3  r4  r|   r{   r,  r   r  )r   r   r   r   r   r  r   r  rl   r   r   r   r   r[  r"   r  )r_   r  r   r7   r   r   r  s          r!   test_shebang_command_in_venv)TestLauncher.test_shebang_command_in_venv  s   + [[+D678F;;x3;?D 9 ^^( tH~**+446CIIKOOCJJ' ZZL"**V*<)=>CK/vU;<{{F8{5 =T(^113h7HuU[}o5^_/z?@F{{F8{5 AT(^113c
|6%PV-5YZ  98 =< A@ sJ   F&BGF8(A!G	G	AG&
F58
G	G	
G	G
G(c                 B   U R                  S5       nU R                  U/SS9nS S S 5        SnWS   R                  5        Vs/ s H+  nUR                  S5      (       d  M  UR	                  5       PM-     nnU R                  U/U5        g ! , (       d  f       Nm= fs  snf )Nz#! /usr/bin/env python3.99r3  r4  z # Search PATH for python3.99.exer   z# Search PATH)r   r   r   r   r[  r   )r_   r   r7   r  r  r  s         r!   !test_shebang_executable_extension.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
Brv   N)6rq   rr   rs   rt   r   r   r   r   r   r  r  r"  r)  r-  r0  r5  r9  rA  rN  rR  r\  r`  re  rj  rm  rp  rv  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ru   rv   r#   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^^11111Y^VA11	M+





[2+r#   r   )(r   r:   r   r  r   r   r   r   r   r   pathlibr   testr   platformr   r(   r   r   r   casefoldrM  prefixr   r'   ri  r  r*   lowerrZ  r  r"   r8   rA   rI   rV   rX   rx   TestCaser   )r3   r4   s   00r!   <module>r     s     	 	   
     <<7


:
;;  
>>%%h&7&7&9::FK +/(jj"+
 ,jj".
 /jj"1'=
 ?cjj
3B 2/jj"%..
	C+	\ %), 99)4):):)<=)<12q)<=   99  '
*"$3 3({  { |u+8$$j u+g >s   0$F*