
    6bhm                     f   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Zd dlZd dl	m
Z
 d dlmZ d dlmZ  ej                  d      Z ej                  d      Zd Zd&d	Zd&d
Ze j(                  d        Zd Z G d dej.                        Z G d dej.                        Z G d dej.                        Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d d e      Z! G d! d"e      Z" G d# d$e      Z#e$d%k(  r ejJ                          yy)'    N)dedent)support)import_helper)script_helper_xxsubinterpreters	_testcapic                     t        j                         \  }}| j                  dd      }t        d| d| d      }|t	        |d      fS )N
z
                z-
        import contextlib
        with open(zg, 'w', encoding="utf-8") as spipe:
            with contextlib.redirect_stdout(spipe):
                z	
        utf-8encoding)ospipereplacer   open)scriptrwindentedwrappeds        F/opt/python-3.12.12/usr/lib/python3.12/test/test__xxsubinterpreters.py_captured_scriptr      s^    779DAq~~d$89H # 
 		 G DW---    c                     t        |      \  }}|5  t        j                  | ||       |j                         cd d d        S # 1 sw Y   y xY wN)r   interpreters
run_stringread)interprequestsharedr   rpipes        r   _run_outputr#   !   s8    $W-MFE	7zz| 
s   'AAc                     |t         j                  }t        j                  |d      D ]  }t        j	                  |       s y  t        d      )NF)errorzinterp is not running)r   SHORT_TIMEOUTsleeping_retryr   
is_runningRuntimeError)r   timeout_s      r   _wait_for_interp_to_runr,   (   sJ     ''##G59""6* : 233r   c              #   <   K   t        j                         \  } fd}t        j                  |      }|j	                          t                d  t        |dd      5 }|j                  d       d d d        |j                          y # 1 sw Y   xY ww)Nc                  L    t         j                   t        d d             y )Nz7
            # wait for "signal"
            with open(zG, encoding="utf-8") as rpipe:
                rpipe.read()
            )r   r   r   )r   r   s   r   runz_running.<locals>.run8   s.     4c 0 ) 	r   targetr   r   r   done)	r   r   	threadingThreadstartr,   r   writejoin)r   r   r/   tspiper   s   `    @r   _runningr:   5   sq     779DAq 	$AGGIF#		aw	'5F 
(FFH 
(	's   A!B%B7BBBc                      t         j                         D ]  } | dk(  r		 t         j                  |          y # t        $ r Y -w xY w)Nr   )r   list_alldestroyr)   ids    r   clean_up_interpretersr@   J   sF    ##%7	  $	 &
  		s   7	AAc                       e Zd Zd Zy)TestBasec                     t                y r   )r@   selfs    r   tearDownzTestBase.tearDownV   s    r   N)__name__
__module____qualname__rF    r   r   rB   rB   T   s     r   rB   c                       e Zd Zd Zd Zy)IsShareableTestsc                     g d}|D ]@  }| j                  |      5  | j                  t        j                  |             d d d        B y # 1 sw Y   MxY w)N)N   spamspam
   i)subTest
assertTruer   is_shareable)rE   
shareablesobjs      r   test_default_shareablesz(IsShareableTests.test_default_shareables_   sJ    
 Cc" --c24 #" ""s   %AA	c                 V    G d d      } G d dt               }ddt        dt        t        t               t	               d| |d	       |d
      g}|D ]I  }| j                  t        |            5  | j                  t        j                  |             d d d        K y # 1 sw Y   VxY w)Nc                       e Zd Zd Zd Zy)3IsShareableTests.test_not_shareable.<locals>.Cheesec                     || _         y r   name)rE   r\   s     r   __init__z<IsShareableTests.test_not_shareable.<locals>.Cheese.__init__p   s	     	r   c                     | j                   S r   r[   rD   s    r   __str__z;IsShareableTests.test_not_shareable.<locals>.Cheese.__str__r   s    yy r   N)rG   rH   rI   r]   r_   rJ   r   r   CheeserY   o   s    !!r   r`   c                       e Zd Zy)5IsShareableTests.test_not_shareable.<locals>.SubBytesN)rG   rH   rI   rJ   r   r   SubBytesrb   u   s    1r   rc   TF.g      Y@WensleydalerN   )
bytesNotImplementedtypeobject	ExceptionrQ   reprassertFalser   rS   )rE   r`   rc   not_shareablesrU   s        r   test_not_shareablez#IsShareableTests.test_not_shareablen   s    	! 	!	2u 	2
 }%!" "Cd3i(   --c24 )( "((s   /%BB(	N)rG   rH   rI   rV   rm   rJ   r   r   rL   rL   ]   s    44r   rL   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	ShareableTypeTestsc                    |D ]|  }| j                  |      5  t        j                  |      }t        j                  |      }| j	                  ||       | j                  t        |      t        |             d d d        ~ y # 1 sw Y   xY wr   )rQ   r   get_crossinterp_datarestore_crossinterp_dataassertEqualassertIsrg   )rE   valuesrU   xidgots        r   _assert_valuesz!ShareableTypeTests._assert_values   sm    Cc"44S988=  c*d3ic3 #" ""s   A!BB	c                     dD ]X  }| j                  |      5  t        j                  |      }t        j                  |      }| j	                  ||       d d d        Z y # 1 sw Y   exY w)Nr   )rQ   r   rq   rr   rt   )rE   rU   rv   rw   s       r   test_singletonsz"ShareableTypeTests.test_singletons   sW    Cc"44S988= c3' #" ""s   =AA(	c                 *    | j                  ddg       y )NrN   i'  rx   rD   s    r   
test_typeszShareableTypeTests.test_types   s     	r   c                 H    | j                  d t        dd      D               y )Nc              3   D   K   | ]  }|j                  d dd        yw)   littleT)signedN)to_bytes).0is     r   	<genexpr>z0ShareableTypeTests.test_bytes.<locals>.<genexpr>   s'      5%3 JJq(4J@%3s      )rx   rangerD   s    r   
test_byteszShareableTypeTests.test_bytes   s#     5%*2s^5 	5r   c                 *    | j                  g d       y )N)zhello worldu   你好世界 r|   rD   s    r   	test_strszShareableTypeTests.test_strs   s    ?@r   c                     | j                  t        j                  t        dd      t        j
                  t        j
                   dz
  g             y )Nr   r      )rx   	itertoolschainr   sysmaxsizerD   s    r   test_intzShareableTypeTests.test_int   s<    IOOE"cN-0[[3;;,:J,KM 	Nr   c                 2   t         j                  dz   t         j                   dz
  ddz  g}|D ]O  }| j                  |      5  | j                  t              5  t
        j                  |       d d d        d d d        Q y # 1 sw Y   xY w# 1 sw Y   hxY w)Nr   r     )r   r   rQ   assertRaisesOverflowErrorr   rq   )rE   intsr   s      r   test_non_shareable_intz)ShareableTypeTests.test_non_shareable_int   sw    KK!O[[L1tG

 Aa&&}52215 6 ! 55 !s$   BB.BB
BB	N)
rG   rH   rI   rx   rz   r}   r   r   r   r   rJ   r   r   ro   ro      s'    4(5AN	6r   ro   c                       e Zd Zd Zy)ModuleTestsc                 @    t        t        j                         d       y )Nz*import _xxsubinterpreters as _interpreters)r#   r   createrD   s    r   test_import_in_interpreterz&ModuleTests.test_import_in_interpreter   s    !8	
r   N)rG   rH   rI   r   rJ   r   r   r   r      s    
r   r   c                       e Zd Zd Zd Zd Zy)ListAllTestsc                 z    t         j                         }t         j                         }| j                  ||g       y r   )r   get_mainr<   rs   )rE   mainidss      r   test_initialzListAllTests.test_initial   s0    $$&##%tf%r   c                     t         j                         }t         j                         }t         j                         }t         j                         }| j	                  ||||g       y r   )r   r   r   r<   rs   rE   r   firstsecondr   s        r   test_after_creatingz ListAllTests.test_after_creating   sQ    $$&##%$$&##%tUF34r   c                     t         j                         }t         j                         }t         j                         }t         j                  |       t         j	                         }| j                  |||g       y r   )r   r   r   r=   r<   rs   r   s        r   test_after_destroyingz"ListAllTests.test_after_destroying   s\    $$&##%$$&U###%tVn-r   N)rG   rH   rI   r   r   r   rJ   r   r   r   r      s    &
5.r   r   c                       e Zd Zd Zd Zy)GetCurrentTestsc                     t         j                         }t         j                         }| j                  ||       | j	                  |t         j
                         y r   )r   r   get_currentrs   assertIsInstanceInterpreterID)rE   r   curs      r   	test_mainzGetCurrentTests.test_main   sD    $$&&&(d#c<#=#=>r   c                 &   t         j                         }t         j                         }t        |t	        d            }t        |j                               }t         j                         \  }}| j                  ||       | j                  ||       y )Nz
            import _xxsubinterpreters as _interpreters
            cur = _interpreters.get_current()
            print(cur)
            assert isinstance(cur, _interpreters.InterpreterID)
            )
r   r   r   r#   r   intstripr<   rs   assertNotEqual)rE   r   r   outr   r+   expecteds          r   test_subinterpreterz#GetCurrentTests.test_subinterpreter   sz    $$&$$&&& * #  #))+"++-8h'C&r   N)rG   rH   rI   r   r   rJ   r   r   r   r      s    ?'r   r   c                       e Zd Zd Zd Zy)GetMainTestsc                     t         j                         \  }t         j                         }| j                  ||       | j	                  |t         j
                         y r   )r   r<   r   rs   r   r   )rE   r   r   s      r   test_from_mainzGetMainTests.test_from_main   sF    !**,
$$&x(dL$>$>?r   c                     t         j                         \  }t         j                         }t        |t	        d            }t        |j                               }| j                  ||       y )Nz
            import _xxsubinterpreters as _interpreters
            main = _interpreters.get_main()
            print(main)
            assert isinstance(main, _interpreters.InterpreterID)
            )r   r<   r   r#   r   r   r   rs   )rE   r   r   r   r   s        r   test_from_subinterpreterz%GetMainTests.test_from_subinterpreter  sZ    !**,
$$&&& * #  399;x(r   N)rG   rH   rI   r   r   rJ   r   r   r   r      s    @
)r   r   c                   Z    e Zd Zd Z ej
                  d      d        Zd Zd Zd Z	d Z
y)	IsRunningTestsc                 t    t         j                         }| j                  t         j                  |             y r   )r   r   rR   r(   )rE   r   s     r   r   zIsRunningTests.test_main  s'    $$&//56r   zFails on FreeBSDc                 D   t         j                         }| j                  t         j                  |             t	        |      5  | j                  t         j                  |             d d d        | j                  t         j                  |             y # 1 sw Y   .xY wr   )r   r   rk   r(   r:   rR   rE   r   s     r   r   z"IsRunningTests.test_subinterpreter  so    $$&0089fOOL33F;< 0089 s   %BBc                     t         j                         }t        |t        d| d            }| j	                  |j                         d       y )Nz`
            import _xxsubinterpreters as _interpreters
            if _interpreters.is_running(zZ):
                print(True)
            else:
                print(False)
            True)r   r   r#   r   rs   r   )rE   r   r   s      r   r   z'IsRunningTests.test_from_subinterpreter  sO    $$&&& .))/ 1* #  	f-r   c                     t         j                         }t         j                  |       | j                  t              5  t         j                  |       d d d        y # 1 sw Y   y xY wr   )r   r   r=   r   r)   r(   r   s     r   test_already_destroyedz%IsRunningTests.test_already_destroyed)  sF    $$&V$|,##F+ -,,   AA'c                     | j                  t              5  t        j                  d       d d d        y # 1 sw Y   y xY wNi@B )r   r)   r   r(   rD   s    r   test_does_not_existz"IsRunningTests.test_does_not_exist/  s*    |,##I. -,,   5>c                     | j                  t              5  t        j                  d       d d d        y # 1 sw Y   y xY wNr   )r   
ValueErrorr   r(   rD   s    r   test_bad_idzIsRunningTests.test_bad_id3  s*    z*##B' +**r   N)rG   rH   rI   r   unittestskipr   r   r   r   r   rJ   r   r   r   r     s;    7 X]]%&: ':	.,/(r   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	InterpreterIDTestsc                 h    t         j                  dd      }| j                  t        |      d       y )NrP   Tforce)r   r   rs   r   rE   r?   s     r   test_with_intz InterpreterIDTests.test_with_int:  s+    ''$'7R"%r   c                      G d dt               }t        j                   |       d      }| j                  t	        |      d       y )Nc                       e Zd Zd Zy).InterpreterIDTests.test_coerce_id.<locals>.Intc                      yNrP   rJ   rD   s    r   	__index__z8InterpreterIDTests.test_coerce_id.<locals>.Int.__index__A  s    r   N)rG   rH   rI   r   rJ   r   r   Intr   @  s    r   r   Tr   rP   )strr   r   rs   r   )rE   r   r?   s      r   test_coerce_idz!InterpreterIDTests.test_coerce_id?  s;    	# 	 ''T':R"%r   c                    | j                  t        t        j                  t	                      | j                  t        t        j                  d       | j                  t        t        j                  d       | j                  t        t        j                  d       | j                  t
        t        j                  d       | j                  t        t        j                  d       y )Ng      $@10s   10r   l            )r   	TypeErrorr   r   rh   r   r   rD   s    r   r   zInterpreterIDTests.test_bad_idG  s    )\%?%?J)\%?%?F)\%?%?F)\%?%?G*l&@&@"E-)C)CUKr   c                     t         j                         }| j                  t              5  t         j	                  t        |      dz          d d d        y # 1 sw Y   y xY w)Nr   )r   r   r   r)   r   r   r   s     r   r   z&InterpreterIDTests.test_does_not_existO  s@      "|,&&s2w{3 -,,s   "AAc                 h    t         j                  dd      }| j                  t        |      d       y )NrP   Tr   r   )r   r   rs   r   r   s     r   test_strzInterpreterIDTests.test_strT  s+    ''$'7R$'r   c                 h    t         j                  dd      }| j                  t        |      d       y )NrP   Tr   zInterpreterID(10))r   r   rs   rj   r   s     r   	test_reprzInterpreterIDTests.test_reprX  s,    ''$'7b#67r   c                    t         j                         }t         j                  t        |            }t         j                         }| j	                  ||k(         | j	                  ||k(         | j	                  |t        |      k(         | j	                  t        |      |k(         | j	                  |t        t        |            k(         | j	                  t        t        |            |k(         | j                  |t        t        |            dz   k(         | j                  |t        t        |            k(         | j                  |ddz  k(         | j                  |t        d      k(         | j                  |dk(         | j                  ||k(         | j                  ||k7         | j                  ||k7         | j	                  ||k7         y )Ng?r   r   infrO   )r   r   r   r   rR   floatrk   r   rE   id1id2id3s       r   test_equalityz InterpreterIDTests.test_equality\  sl   !!#((S2!!#s
#s
#s3x(CC(uSX./c#h3./c#h# 556CH-.4(e,-'$$$s
#r   N)
rG   rH   rI   r   r   r   r   r   r   r   rJ   r   r   r   r   8  s&    &
&L4
(8$r   r   c                   `    e Zd Zd Z ej
                  d      d        Zd Zd Zd Z	d Z
d Zy	)
CreateTestsc                     t         j                         }| j                  |t         j                         | j	                  |t         j                                y r   )r   r   r   r   assertInr<   r   s     r   test_in_mainzCreateTests.test_in_mainu  s=      "b,"<"<=b,//12r   z*enable this test when working on pystate.cc                     t               }t        d      D ]<  }t        j                         }t        j	                  |       |j                  |       > | j                  t        |      d       y )Nd   )setr   r   r   r=   addrs   len)rE   seenr+   r?   s       r   test_unique_idzCreateTests.test_unique_id{  sT    usA$$&B  $HHRL 
 	TC(r   c                 "   t        j                         d fd}t        j                  |      }5  |j                          d d d        |j	                          | j                  t        j                                y # 1 sw Y   >xY w)Nc                  n    t         j                          j                          j                          y r   )r   r   acquirerelease)r?   locks   r   fz%CreateTests.test_in_thread.<locals>.f  s#    $$&BLLNLLNr   r0   )r3   Lockr4   r5   r7   r   r   r<   )rE   r  r8   r?   r  s      @@r   test_in_threadzCreateTests.test_in_thread  sd    ~~	 A&GGI 	b,//12 Ts   BBc                    t         j                         \  }t         j                         }t        |t	        d            }t        |j                               }| j                  t        t         j                               |||h       y )Nz
            import _xxsubinterpreters as _interpreters
            id = _interpreters.create()
            print(id)
            assert isinstance(id, _interpreters.InterpreterID)
            )	r   r<   r   r#   r   r   r   rs   r   )rE   r   r   r   r   s        r   test_in_subinterpreterz"CreateTests.test_in_subinterpreter  so    %%'!!##v '    #))+\2245c37GHr   c                 8   t         j                         \  }t         j                         d fd}t        j                  |      }|j                          |j                          | j                  t        t         j                               |h       y )Nc                  b    t        t        d            } t        | j                               y )Nz
                import _xxsubinterpreters as _interpreters
                id = _interpreters.create()
                print(id)
                )r#   r   r   r   )r   r   r   s    r   r  z6CreateTests.test_in_threaded_subinterpreter.<locals>.f  s-    c6 + $ C
 ciik"Cr   r0   )	r   r<   r   r3   r4   r5   r7   rs   r   )rE   r   r  r8   r   r   s       @@r   test_in_threaded_subinterpreterz+CreateTests.test_in_threaded_subinterpreter  st    %%'!!#	# A&			\2245c37GHr   c                 n   t        t        j                               }g }t        d      D ]'  }t        j	                         }|j                  |       ) |D ]  }t        j                  |        t        j	                         }| j                  t        t        j                               ||hz         y N   )r   r   r<   r   r   appendr=   rs   rE   beforer   r+   r?   s        r   test_after_destroy_allz"CreateTests.test_after_destroy_all  s    \**,-qA$$&BJJrN  B  $    "\2245v}Er   c                    t        t        j                               }t        j                         }t        j                         }t        j                         }t        j	                  |       t        j	                  |       t        j                         }| j                  t        t        j                               |||hz         y r   )r   r   r<   r   r=   rs   )rE   r  r   r   r   r?   s         r   test_after_destroy_somez#CreateTests.test_after_destroy_some  s    \**,-!!#!!#!!#S!S!  "\2245vS	7IJr   N)rG   rH   rI   r   r   r   r  r
  r  r  r  r  rJ   r   r   r   r   s  sE    3 X]]?@) A)3II&FKr   r   c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)DestroyTestsc                    t         j                         }t         j                         }t         j                         }| j                  |t         j                                t         j	                  |       | j                  |t         j                                | j                  |t         j                                | j                  |t         j                                y r   )r   r   r   r<   r=   assertNotInr   s       r   test_onezDestroyTests.test_one  s    !!#!!#!!#c<0023S!l3356c<0023c<0023r   c                    t        t        j                               }t               }t        d      D ]'  }t        j	                         }|j                  |       ) | j                  t        t        j                               ||z         |D ]  }t        j                  |        | j                  t        t        j                               |       y r  )r   r   r<   r   r   r   rs   r=   r  s        r   test_allzDestroyTests.test_all  s    \**,-eqA$$&BGGBK  	\2245v|DB  $ \2245v>r   c                 *    t         j                         \   j                  t              5  t         j	                         d d d         fd}t        j                  |      }|j                          |j                          y # 1 sw Y   FxY w)Nc                      j                  t              5  t        j                          d d d        y # 1 sw Y   y xY wr   r   r)   r   r=   )r   rE   s   r   r  z!DestroyTests.test_main.<locals>.f  s+    ""<0$$T* 100s   6?r0   )	r   r<   r   r)   r=   r3   r4   r5   r7   )rE   r  r8   r   s   `  @r   r   zDestroyTests.test_main  sf    %%'|,  & -	+ A&			 -,s   B		Bc                     t         j                         }t         j                  |       | j                  t              5  t         j                  |       d d d        y # 1 sw Y   y xY wr   )r   r   r=   r   r)   r   s     r   r   z#DestroyTests.test_already_destroyed  sF      "R |,  $ -,,r   c                     | j                  t              5  t        j                  d       d d d        y # 1 sw Y   y xY wr   r"  rD   s    r   r   z DestroyTests.test_does_not_exist  s*    |,  + -,,r   c                     | j                  t              5  t        j                  d       d d d        y # 1 sw Y   y xY wr   )r   r   r   r=   rD   s    r   r   zDestroyTests.test_bad_id  s*    z*  $ +**r   c                     t         j                         \  }t         j                         }t        d| d      }t         j	                  ||       | j                  t        t         j                               ||h       y )Nzo
            import _xxsubinterpreters as _interpreters
            try:
                _interpreters.destroy(zD)
            except RuntimeError:
                pass
            r   r<   r   r   r   rs   r   )rE   r   r?   r   s       r   test_from_currentzDestroyTests.test_from_current  st    %%'  " ' (*d +  	F+\2245bzBr   c                 (   t         j                         \  }t         j                         }t         j                         }t        d| d      }t         j	                  ||       | j                  t        t         j                               ||h       y )NzZ
            import _xxsubinterpreters as _interpreters
            _interpreters.destroy(z)
            r'  )rE   r   r   r   r   s        r   test_from_siblingzDestroyTests.test_from_sibling  s    %%'!!#!!# ##&% (  	V,\2245c{Cr   c                     t         j                         fd}t        j                  |      }|j	                          |j                          y )Nc                  0    t         j                          y r   )r   r=   r>   s   r   r  z.DestroyTests.test_from_other_thread.<locals>.f  s      $r   r0   )r   r   r3   r4   r5   r7   )rE   r  r8   r?   s      @r   test_from_other_threadz#DestroyTests.test_from_other_thread  s:      "	% A&			r   c                    t         j                         \  }t         j                         }t        |      5  | j	                  t         j                  |      d| d       | j                  t        d| d      5  t         j                  |       d d d        | j	                  t         j                  |             d d d        y # 1 sw Y   6xY w# 1 sw Y   y xY w)NzInterp z& should be running before destruction.)msgz%Should not be able to destroy interp z while it's still running.)	r   r<   r   r:   rR   r(   r   r)   r=   )rE   r   r   s      r   test_still_runningzDestroyTests.test_still_running%  s    %%'$$&fOOL33F;")&1W X  Z ""<)NvhVp'q # s$$V,s OOL33F;< s s	 s$   AC<C,CC	CCN)rG   rH   rI   r  r  r   r   r   r   r(  r*  r-  r0  rJ   r   r   r  r    s6    4	?%,%C
D
=r   r  c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	 e
j                         d        Zd	 Zd
 Zd Zd Zd Zd Zej(                  dd       Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej@                  d      d        Z! xZ"S )RunStringTestsc                 T    t         |           t        j                         | _        y r   )supersetUpr   r   r?   )rE   	__class__s    r   r5  zRunStringTests.setUp4  s    %%'r   c                     t        d      \  }}|5  t        j                  | j                  |       |j	                         }d d d        | j                  d       y # 1 sw Y   xY w)Nprint("it worked!", end="")
it worked!)r   r   r   r?   r   rs   )rE   r   filer   s       r   test_successzRunStringTests.test_success8  sR    '(EF##DGGV4))+C  	l+	 Ts   1AA&c                     t        d      \  }|5   fd}t        j                  |      }|j                          |j	                          |j                         }d d d         j                  d       y # 1 sw Y   xY w)Nr8  c                  F    t         j                  j                          y r   )r   r   r?   )r   rE   s   r   r  z(RunStringTests.test_in_thread.<locals>.fC  s    ''8r   r0   r9  )r   r3   r4   r5   r7   r   rs   )rE   r:  r  r8   r   r   s   `    @r   r
  zRunStringTests.test_in_thread@  sh    '(EF9   *AGGIFFH))+C  	l+ Ts   AA;;Bc                     t         j                         }t        d      \  }}|5  t         j                  ||       |j	                         }d d d        | j                  d       y # 1 sw Y   xY w)Nz
            import threading
            def f():
                print('it worked!', end='')

            t = threading.Thread(target=f)
            t.start()
            t.join()
            r9  r   r   r   r   r   rs   )rE   	subinterpr   r:  r   s        r   test_create_threadz!RunStringTests.test_create_threadM  sb     '')	' )  ##Iv6))+C  	l+	 Ts   'A''A0c                 t   | j                  d      5  d}t        j                  d      }t        d| d      \  }}|5  t        j	                  ||       |j                         }d d d        | j                  |       d d d        | j                  d      5  t        j                  d      }t        d	      \  }}|5  t        j	                  ||       |j                         }d d d        | j                  d
       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   <xY w# 1 sw Y   y xY w)Nisolatedspam spam spam spam spamT)rC  a<  
                import threading
                def f():
                    print('it worked!', end='')

                try:
                    t = threading.Thread(target=f, daemon=True)
                    t.start()
                    t.join()
                except RuntimeError:
                    print('z', end='')
                znot isolatedFz
                import threading
                def f():
                    print('it worked!', end='')

                t = threading.Thread(target=f, daemon=True)
                t.start()
                t.join()
                r9  )rQ   r   r   r   r   r   rs   rE   r   r@  r   r:  r   s         r   test_create_daemon_threadz(RunStringTests.test_create_daemon_thread^  s   \\*%1H$++T+:I+ 
1 %: &- LFD ''	6:iik  S(+' &* \\.)$++U+;I+ - LFD ''	6:iik  S,/ *)  &%@  *)sF   -D'D
&D'D. 'D"'D.
D	DD"D+	'D..D7c           	          t         j                         }g d}|D ]B  }| j                  |      5  t         j                  |d|dt	        |             d d d        D y # 1 sw Y   OxY w)N)NrO   rN   *   zassert(obj == ))rU   )r!   )r   r   rQ   r   dict)rE   r   objectsrU   s       r   test_shareable_typesz#RunStringTests.test_shareable_types  sg    $$&
 Cc"''$SG1-C= (  #" ""s   'A!!A*	c                     d}t         j                         }t        d| d      \  }}|5  t         j                  ||       |j	                         }d d d        | j                  |       y # 1 sw Y   xY w)NrD  z
            import os, sys
            try:
                os.execl(sys.executable)
            except RuntimeError:
                print('z', end='')
            r?  rE  s         r   test_os_execzRunStringTests.test_os_exec  sx    - '')	' -
 !z ")  ##Iv6))+C  	h'	 Ts   'A--A6c                    dd l }|j                  dd      5 }|j                  d       |j                          d}t	        d|j
                   d| d	      }t        j                  | j                  |       |j                  d       |j                         }| j                  ||       d d d        y # 1 sw Y   y xY w)
Nr   zw+r   r   r   rD  z
                import os
                try:
                    os.fork()
                except RuntimeError:
                    with open('zE', 'w', encoding='utf-8') as out:
                        out.write('z')
                )tempfileNamedTemporaryFiler6   flushr   r\   r   r   r?   seekr   rs   )rE   rP  r:  r   r   contents         r   	test_forkzRunStringTests.test_fork  s    (((@DJJrNJJL1H ! 
 !%		{ +$$,: . F ##DGGV4IIaLiikGWh/# A@@s   BB44B=c                     t        | j                        5  | j                  t              5  t        j                  | j                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nprint("spam"))r:   r?   r   r)   r   r   rD   s    r   test_already_runningz#RunStringTests.test_already_running  sM    dgg""<0''A 1 00 s"   A*!AA*A'	#A**A3c                     d}|t         j                         v r|dz  }|t         j                         v r| j                  t              5  t         j	                  |d       d d d        y # 1 sw Y   y xY w)Nr   r   rW  )r   r<   r   r)   r   r   s     r   r   z"RunStringTests.test_does_not_exist  s^    L))++!GB L))++|,##B8 -,,s   
A**A3c                     | j                  t              5  t        j                  dd       d d d        y # 1 sw Y   y xY w)Nr   rW  )r   r   r   r   rD   s    r   test_error_idzRunStringTests.test_error_id  s,    z*##B8 +**   6?c                     | j                  t              5  t        j                  dd       d d d        y # 1 sw Y   y xY w)NrO   rW  )r   r   r   r   rD   s    r   r   zRunStringTests.test_bad_id  s,    y)##FO< *))r\  c                     | j                  t              5  t        j                  | j                  d       d d d        y # 1 sw Y   y xY wr   r   r   r   r   r?   rD   s    r   test_bad_scriptzRunStringTests.test_bad_script  s0    y)##DGGR0 *))   !A  A	c                     | j                  t              5  t        j                  | j                  d       d d d        y # 1 sw Y   y xY w)Ns   print("spam")r_  rD   s    r   test_bytes_for_scriptz$RunStringTests.test_bytes_for_script  s1    y)##DGG-=> *))ra  c              #   l  K   | j                  t        j                        5 }d  d d d        |A| j                  t	        j
                        j                  d      d   t	        |             y | j                  t	        j
                        dj                  ||             y # 1 sw Y   xY ww)N:r   z{}: {})r   r   RunFailedErrorrs   r   	exceptionsplitformat)rE   exctyper/  caughts       r   assert_run_failedz RunStringTests.assert_run_failed  s     |::;v <;S!1!1288=a@ \+ S!1!12%__Wc:< <;s    B4B(BB4(B1-B4c                     | j                  t              5  t        j                  | j                  d       d d d        y # 1 sw Y   y xY w)Nzprint("spam")rl  SyntaxErrorr   r   r?   rD   s    r   test_invalid_syntaxz"RunStringTests.test_invalid_syntax  s0    ##K0##DGG^< 100ra  c                     | j                  t        d      5  t        j                  | j                  d       d d d        y # 1 sw Y   y xY w)NrO   zraise Exception("spam"))rl  ri   r   r   r?   rD   s    r   test_failurezRunStringTests.test_failure  s3    ##Iv6##DGG-FG 766   !AA
c                     | j                  t        d      5  t        j                  | j                  d       d d d        y # 1 sw Y   y xY w)N42zraise SystemExit(42))rl  
SystemExitr   r   r?   rD   s    r   test_SystemExitzRunStringTests.test_SystemExit  s3    ##J5##DGG-CD 655rr  c                 R   | j                  t              5  t        j                  | j                  t        d             d d d        | j                  t        d      5  t        j                  | j                  t        d             d d d        y # 1 sw Y   RxY w# 1 sw Y   y xY w)NzG
                import sys
                sys.exit()
                rt  zI
                import sys
                sys.exit(42)
                )rl  ru  r   r   r?   r   rD   s    r   test_sys_exitzRunStringTests.test_sys_exit  s    ##J/##DGGV 5 .  0 ##J5##DGGV 5 .  65 0/ 65s   *B*BBB&c                    t        j                         \  }}ddd d}t        d| d      }t        j	                  | j
                  ||       t        |d      5 }t        j                  |      }d d d        | j                  d   d       | j                  |d	   d
       | j                  |d   d       | j                  |d          y # 1 sw Y   ]xY w)N   hams   -1)rO   eggscheddarz
            eggs = int(eggs)
            spam = 42
            result = spam + eggs

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(C, 'wb') as chan:
                pickle.dump(ns, chan)
            rbrO   rH  r{  r   result)   r|  )r   r   r   r   r   r?   r   pickleloadrs   assertIsNonerE   r   r   r!   r   channss          r   test_with_sharedzRunStringTests.test_with_shared  s    wwy1 
   c 
 
 	8!T]dT"B  	FR(FR(Hr*"Y-( ]s   CCc                 8   t         j                  | j                  t        d             ddi}t        d      }t         j                  | j                  ||       t	        j
                         \  }}t        d| d      }t         j                  | j                  |       t        |d      5 }t        j                  |      }d d d        | j                  d   d   d	       | j                  |d
   d   d       | j                  |d   d       y # 1 sw Y   OxY w)Nzj
            spam = 'eggs'
            ns1 = dict(vars())
            del ns1['__builtins__']
            rO   rz  zL
            ns2 = dict(vars())
            del ns2['__builtins__']
        zr
            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(r}  r~  ns1r{  ns2)
r   r   r?   r   r   r   r   r  r  rs   )rE   r!   r   r   r   r  r  s          r   test_shared_overwritesz%RunStringTests.test_shared_overwrites  s    1 * 	 &!   	8wwy1  c 	  	0!T]dT"B  	E6*F3E6*F3FV, ]s   ,DDc                 0   t        j                         \  }}ddi}t        d| d      }t        j	                  | j
                  ||       t        |d      5 }t        j                  |      }d d d        | j                  d   d       y # 1 sw Y   xY w)NrG   s   not __main__z
            spam = 42

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(r}  r~  )
r   r   r   r   r   r?   r   r  r  rs   r  s          r   #test_shared_overwrites_default_varsz2RunStringTests.test_shared_overwrites_default_vars6  s    wwy1o.  c   	8!T]dT"B  	J9 ]s   BBc                 |   t        j                         \  }}t        j                  | j                  t        d| d             t        |d      5 }t        j                  |      }d d d        t        j                         \  }}t        j                  | j                  t        d| d             t        |d      5 }t        j                  |      }d d d        | j                  d       | j                  d|       | j                  d       | j                  d|       y # 1 sw Y   xY w# 1 sw Y   ^xY w)Nz
            spam = True

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(zd, 'wb') as chan:
                pickle.dump(ns, chan)
            del ns, pickle, chan
            r~  z
            eggs = False

            ns = dict(vars())
            del ns['__builtins__']
            import pickle
            with open(r}  rO   r{  )r   r   r   r   r?   r   r   r  r  r   r  )rE   r   r   r  r  r  s         r   test_main_reusedzRunStringTests.test_main_reusedI  s   wwy1 5 c 	1 	* 		 !T]d++d#C  wwy1 5 c 1 * 	 !T]d++d#C  	fc"%fc"fc"' ] ]s   D&?D2&D/2D;c           
      r   t        j                         \  }}t        d| d      }t        j	                  | j
                  |       t        |d      5 }t        j                  |      }d d d        j                  d       |j                  d       | j                  |di d d d dd       y # 1 sw Y   ExY w)	Nz
            spam = 42

            ns = dict(vars())
            ns['__builtins__'] = str(ns['__builtins__'])
            import pickle
            with open(r}  r~  __builtins__
__loader____main__rH  )rG   __annotations____doc____package____spec__rO   )r   r   r   r   r   r?   r   r  r  poprs   )rE   r   r   r   r  r  s         r    test_execution_namespace_is_mainz/RunStringTests.test_execution_namespace_is_mainj  s    wwy1  c   	0!T]dT"B  	~
|"! 	 ]s   B--B6zblocking foreverc                 2   t        d      }t        j                         5 }t        j                  |d|      }t        j
                  |      5 }|j                         }d d d        d d d        | j                  d       y # 1 sw Y   $xY w# 1 sw Y   (xY w)Na  
        from textwrap import dedent
        import threading
        import _xxsubinterpreters as _interpreters
        id = _interpreters.create()
        def f():
            _interpreters.run_string(id, dedent('''
                import time
                # Give plenty of time for the main interpreter to finish.
                time.sleep(1_000_000)
                '''))

        t = threading.Thread(target=f)
        t.start()
        r   r   )r   r   temp_dirr   make_scriptspawn_pythonwaitrs   )rE   r   dirnamefilenameprocretcodes         r   test_still_running_at_exitz)RunStringTests.test_still_running_at_exit  s~       7$00(FKH++H5))+ 6  
 	!$ 65  s#   -BBBB
	BBr   )#rG   rH   rI   r5  r;  r
  rA  rF  rL  rN  r   requires_forkrU  rX  r   r[  r   r`  rc  
contextlibcontextmanagerrl  ro  rq  rv  rx  r  r  r  r  r  r   r   r  __classcell__)r6  s   @r   r2  r2  2  s    (,,,"%0N (  W0 0*B
99=1? < <=
HE)8-<:&#B8 X]]%&% '%r   r2  r  r   )&r  r   r   r  r   textwrapr   r3   r   testr   test.supportr   r   import_moduler   r   r   r#   r,   r  r:   r@   TestCaserB   rL   ro   r   r   r   r   r   r   r   r  r2  rG   r   rJ   r   r   <module>r     sF     	  
     & & +}**+?@'M''4	
	.
4  ( x    /4x(( /4d.6** .6b
( 
.8 ..'h '.)8 )*&(X &(R8$ 8$vZK( ZKz_=8 _=Dj%X j%Z zHMMO r   