
    ;e;                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	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d ZdAd	ZdAd
Zej        d             Zd Zi fdZ G d d edd                    Zej        d             Z G d d edd                    Z G d d edd                    ZdddZd Z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 d0 d1e#          Z, G d2 d3e#          Z- G d4 d5e#          Z. G d6 d7e#          Z/ G d8 d9e#          Z0 G d: d; ed;d<                    Z1 ej2        d=           G d> d?e#                      Z3e4d@k    r ej5                     dS dS )B    )
namedtupleN)dedent)support)import_helper)script_helper_xxsubinterpretersc                     t          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        3/usr/lib/python3.11/test/test__xxsubinterpreters.py_captured_scriptr      st    799DAq~~d$899H   	    G DW-----    c                     t          |          \  }}|5  t                              | ||           |                                cd d d            S # 1 swxY w Y   d S N)r   interpreters
run_stringread)interprequestsharedr   rpipes        r   _run_outputr#   #   s    $W--MFE	  777zz||                 s   0AAAc                 2   |t           j        }t          j                    }||z   }t                              |           sVt          j                    |k    rt          d          t          j        d           t                              |           Td S d S )Nzinterp is not runningg{Gz?)r   SHORT_TIMEOUTtime	monotonicr   
is_runningRuntimeErrorsleep)r   timeout
start_timedeadlines       r   _wait_for_interp_to_runr.   *   s     '!!JG#H%%f-- >h&&6777
5 %%f--     r   c              #   d   K   t          j                    \  } fd}t          j        |          }|                                 t                      d V  t          |dd          5 }|                    d           d d d            n# 1 swxY w Y   |                                 d S )Nc                  `    t                                t          d d                     d S )Nz7
            # wait for "signal"
            with open(zG, encoding="utf-8") as rpipe:
                rpipe.read()
            )r   r   r   )r   r   s   r   runz_running.<locals>.run;   sJ     00 0 0 ) ) 	 	 	 	 	r   targetr   r   r   done)	r   r   	threadingThreadstartr.   r   writejoin)r   r   r1   tspiper   s   `    @r   _runningr<   8   s      799DAq      	$$$AGGIIIF###	EEE	aw	'	'	' 5F              FFHHHHHs   /BBBc                 (    t          | ||           d S r   )_run_interp)idsourcer!   s      r   
run_interprA   W   s    FF#####r   c                    t          |          }t                                          }|| k    r6t                                          |k    rt          t          ||           d S t                              | ||           d S r   )r   r   get_mainget_currentr)   execr   )r?   r@   r!   _mainnsmains        r   r>   r>   [   sx    F^^F  ""Drzz##%%--VWFF33333r   c                   6     e Zd Zed             Zd fd	Z xZS )Interpreterc                 t    t          ||           r|S t          |t                    r | |          S t          r   )
isinstancestrNotImplementedError)clsraws     r   from_rawzInterpreter.from_rawi   s>    c3 	&JS!! 	&3s88O%%r   Nc                    t                                           }||k    r0|sd}n(|dk    r"t          d                    |                    |}nw|O|sd}n|dk    rt          d          t	          |t           j                  st                               |          }n&|r|dk    rd}|}nt                                           }t                                          | ||          }|S )NrG   z)name mismatch (expected "main", got "{}")r   z!name mismatch (unexpected "main"))	r   rC   
ValueErrorformatrK   InterpreterIDcreatesuper__new__)rN   namer?   rG   self	__class__s        r   rW   zInterpreter.__new__r   s   $$&&:: N ?FFtLLN N NBB^ F !DEEEb,"<== 4!//33 	'DBB$$&&BwwsD"--r   NN)__name__
__module____qualname__classmethodrP   rW   __classcell__rZ   s   @r   rI   rI   g   sV        & & [&         r   rI   zname idc               #   P   K   	 d V  J d            # t           j        $ r Y d S w xY w)NFzchannel not closed)r   ChannelClosedError r   r   expect_channel_closedre      sL      + 	+**** *   s    %%c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )ChannelActionNc                 `    |sd}|sd}t                                          | |||          }|S )NbothrG   rV   rW   )rN   actionendr   rY   rZ   s        r   rW   zChannelAction.__new__   s=     	C 	FwwsFC88r   c                    | j         dk    r| j        dvrt          | j                  n;| j         dv r| j        dvrt          | j                  nt          | j                   | j        dvrt          | j                  d S )Nuse)sameoppositesendrecvcloseforce-close)ri   ro   rp   rq   rr   )rG   ro   otherextra)rk   rl   rR   r   )rY   argskwargss      r   __init__zChannelAction.__init__   s    ;%xCCC *** D[444xKKK *** L T[)));@@@T[))) A@r   c                 T    | j         dk    r|S | j         dk    r
|dk    rdndS | j         S )Nro   rp   rq   rr   rl   rY   rl   s     r   resolve_endzChannelAction.resolve_end   s:    8vJX## F]]6668Or   c                     | j         dk    r|S | j         dk    r|t          |S | j         dk    r|t          |S | j         dk    r#|j        dk    r|S |r|j        dk    r|S t          d S )Nro   rv   rw   rG   )r   r)   rX   )rY   r   rv   rw   s       r   resolve_interpzChannelAction.resolve_interp   s    ;&  M[G##}""L[G##}""L[F""{f$$ #5://"" #"r   r[   )r\   r]   r^   rW   rz   r~   r   r`   ra   s   @r   rg   rg      sj             
* 
* 
*  # # # # # # #r   rg   zaction end interpc                   >     e Zd Zd
dd fdZd Zd Zddd	Z xZS )ChannelStater   Fclosedc                N    t                                          | ||          }|S r   rj   )rN   pendingr   rY   rZ   s       r   rW   zChannelState.__new__   s!    wwsGV44r   c                 P     t          |           | j        dz   | j                  S N   r   typer   r   rY   s    r   incrzChannelState.incr   &    tDzz$,*4;????r   c                 P     t          |           | j        dz
  | j                  S r   r   r   s    r   decrzChannelState.decr   r   r   Tforcec                t    | j         r|r| j        dk    r| S  t          |           |rdn| j        d          S )Nr   Tr   )r   r   r   )rY   r   s     r   rt   zChannelState.close   sK    ; 	 DLA--tDzzu6!!$,tDDDDr   )r   )r\   r]   r^   rW   r   r   rt   r`   ra   s   @r   r   r      s        %       @ @ @@ @ @ " E E E E E E E E Er   r   zpending closedT
hideclosedc                    |j         r|dk    r|dk    r
|j        rd}nd}nd}	 t          | |||          }|rdn.# t          j        $ r |s|s |                                }Y nw xY w|S )Nrn   rr   FT.)r   r   _run_actionr   rc   rt   )cidrk   rl   stater   
expectfailresults          r   
run_actionr      s    | U??sf}}}JJJJ
S&#u55  	I	 *    	* 	 Ms   ; (A&%A&c                    |dk    r|dk    r/t                               | d           |                                S |dk    rv|j        sA	 t                               |            t          d          # t           j        $ r |cY S w xY wt                               |            |                                S t          |          |dk    r1i }|dv rd||<   t          j	        | fi | |
                                S |d	k    r5d
di}|dv rd||<   t          j	        | fi | |
                    d          S t          |          )Nrn   rq      spamrr   zexpected ChannelEmptyErrorrt   rr   rq   Tru   r   r   )r   channel_sendr   r   channel_recv	ExceptionChannelEmptyErrorr   rR   channel_closert   )r   rk   rl   r   ry   s        r   r   r      s   &==%%c7333::<<F]]= 	$B --c222 $$@AAA $5 ! ! ! LLL!
 ))#...zz||#S//!	7		"""F3K"311&111{{}}	=	 	 T """F3K"311&111{{{&&&   s   
A3 3BBc                      t                                           D ]4} | dk    r		 t                               |            %# t          $ r Y 1w xY wd S )Nr   )r   list_alldestroyr)   r?   s    r   clean_up_interpretersr     so    ##%%  77	  $$$$ 	 	 	D	 s   ?
AAc                      t                                           D ]2} 	 t                               |            # t           j        $ r Y /w xY wd S r   )r   channel_list_allchannel_destroyChannelNotFoundErrorr   s    r   clean_up_channelsr      sf    ,,..  	((----0 	 	 	D	 s   8A
	A
c                       e Zd Zd ZdS )TestBasec                 >    t                       t                       d S r   r   r   r   s    r   tearDownzTestBase.tearDown*       r   N)r\   r]   r^   r   rd   r   r   r   r   (  s#            r   r   c                       e Zd Zd Zd ZdS )IsShareableTestsc                     g d}|D ]\}|                      |          5  |                     t                              |                     d d d            n# 1 swxY w Y   ]d S )N)Nr   spam
   i)subTest
assertTruer   is_shareable)rY   
shareablesobjs      r   test_default_shareablesz(IsShareableTests.test_default_shareables4  s      
  	4 	4Cc"" 4 4 --c224 4 44 4 4 4 4 4 4 4 4 4 4 4 4 4 4	4 	4s   .AA	A	c                     G d d          } G d dt                     }ddt          dt          t          t                      t	                      d| |d	           |d
          g}|D ]i}|                     t          |                    5  |                     t          	                    |                     d d d            n# 1 swxY w Y   jd S )Nc                       e Zd Zd Zd ZdS )3IsShareableTests.test_not_shareable.<locals>.Cheesec                     || _         d S r   rX   )rY   rX   s     r   rz   z<IsShareableTests.test_not_shareable.<locals>.Cheese.__init__E  s     			r   c                     | j         S r   r   r   s    r   __str__z;IsShareableTests.test_not_shareable.<locals>.Cheese.__str__G  s
    y r   N)r\   r]   r^   rz   r   rd   r   r   Cheeser   D  s2        ! ! !! ! ! ! !r   r   c                       e Zd ZdZdS )5IsShareableTests.test_not_shareable.<locals>.SubByteszA subclass of a shareable type.N)r\   r]   r^   __doc__rd   r   r   SubBytesr   J  s        1111r   r   TF.g      Y@Wensleydaler   )
bytesNotImplementedr   objectr   r   reprassertFalser   r   )rY   r   r   not_shareablesr   s        r   test_not_shareablez#IsShareableTests.test_not_shareableC  sO   	! 	! 	! 	! 	! 	! 	! 	!	2 	2 	2 	2 	2u 	2 	2 	2
 }%%!!" " 	4 	4Cd3ii(( 4 4   --c224 4 44 4 4 4 4 4 4 4 4 4 4 4 4 4 4	4 	4s   .CC	C	N)r\   r]   r^   r   r   rd   r   r   r   r   2  s2        4 4 44 4 4 4 4r   r   c                   R     e Zd Z fdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
ShareableTypeTestsc                     t                                                       t                                          | _        d S r   )rV   setUpr   channel_creater   rY   rZ   s    r   r   zShareableTypeTests.setUpf  s+    ..00r   c                     t                               | j                   t                                                       d S r   )r   r   r   rV   r   r   s    r   r   zShareableTypeTests.tearDownj  s5    $$TX...r   c                 t   |D ]}|                      |          5  t                              | j        |           t                              | j                  }|                     ||           |                     t          |          t          |                     d d d            n# 1 swxY w Y   d S r   )r   r   r   r   r   assertEqualassertIsr   )rY   valuesr   gots       r   _assert_valuesz!ShareableTypeTests._assert_valuesn  s     	4 	4Cc"" 4 4))$(C888"//99  c***d3iic3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4	4 	4s   BB,,B0	3B0	c                    dD ]}|                      |          5  t                              | j        |           t                              | j                  }|                     ||           d d d            n# 1 swxY w Y   d S )Nr   )r   r   r   r   r   r   )rY   r   r   s      r   test_singletonsz"ShareableTypeTests.test_singletonsy  s     	( 	(Cc"" ( ())$(C888"//99 c3'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (	( 	(s   AA<<B 	B 	c                 @    |                      dd| j        g           d S )Nr   i'  )r   r   r   s    r   
test_typeszShareableTypeTests.test_types  s4    H 	 	 	 	 	r   c                 `    |                      d t          dd          D                        d S )Nc              3   F   K   | ]}|                     d dd          V  dS )   littleT)signedN)to_bytes).0is     r   	<genexpr>z0ShareableTypeTests.test_bytes.<locals>.<genexpr>  sH       5 5 ! JJq(4J@@ 5 5 5 5 5 5r     )r   ranger   s    r   
test_byteszShareableTypeTests.test_bytes  sH     5 5%*2s^^5 5 5 	5 	5 	5 	5 	5r   c                 4    |                      g d           d S )N)zhello worldu   你好世界 )r   r   s    r   	test_strszShareableTypeTests.test_strs  s#    ???@@@@@r   c                     |                      t          j        t          dd          t          j        t          j         dz
  g                     d S )Nr   r   r   )r   	itertoolschainr   sysmaxsizer   s    r   test_intzShareableTypeTests.test_int  sV    IOE"cNN-0[3;,:J,KM M 	N 	N 	N 	N 	Nr   c                 T   t           j        dz   t           j         dz
  ddz  g}|D ]}|                     |          5  |                     t                    5  t
                              | j        |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )Nr   r     )r   r   r   assertRaisesOverflowErrorr   r   r   )rY   intsr   s      r   test_non_shareable_intz)ShareableTypeTests.test_non_shareable_int  s'   K!O[L1tG

  	; 	;Aa ; ;&&}55 ; ; --dh:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ;	; 	;s5   B!B9BB		BB	BB 	#B 	)r\   r]   r^   r   r   r   r   r   r   r   r   r  r`   ra   s   @r   r   r   d  s        1 1 1 1 1    4 4 4( ( (  5 5 5A A AN N N	; 	; 	; 	; 	; 	; 	;r   r   c                        e Zd Zd Zd Zd ZdS )ListAllTestsc                     t                                           }t                                           }|                     ||g           d S r   )r   rC   r   r   )rY   rG   idss      r   test_initialzListAllTests.test_initial  sB    $$&&##%%tf%%%%%r   c                     t                                           }t                                           }t                                           }t                                           }|                     ||||g           d S r   )r   rC   rU   r   r   rY   rG   firstsecondr  s        r   test_after_creatingz ListAllTests.test_after_creating  si    $$&&##%%$$&&##%%tUF344444r   c                 2   t                                           }t                                           }t                                           }t                               |           t                                           }|                     |||g           d S r   )r   rC   rU   r   r   r   r  s        r   test_after_destroyingz"ListAllTests.test_after_destroying  sz    $$&&##%%$$&&U#####%%tVn-----r   N)r\   r]   r^   r  r  r  rd   r   r   r  r    sA        & & &
5 5 5. . . . .r   r  c                       e Zd Zd Zd ZdS )GetCurrentTestsc                     t                                           }t                                           }|                     ||           |                     |t           j                   d S r   )r   rC   rD   r   assertIsInstancerT   )rY   rG   curs      r   	test_mainzGetCurrentTests.test_main  sY    $$&&&&((d###c<#=>>>>>r   c                 v   t                                           }t                                           }t          |t	          d                    }t          |                                          }t                                           \  }}|                     ||           | 	                    ||           d S )Nz
            import _xxsubinterpreters as _interpreters
            cur = _interpreters.get_current()
            print(cur)
            assert isinstance(cur, _interpreters.InterpreterID)
            )
r   rC   rU   r#   r   intstripr   r   assertNotEqual)rY   rG   r   outr  _expecteds          r   test_subinterpreterz#GetCurrentTests.test_subinterpreter  s    $$&&$$&&&& * # #   #))++"++--8h'''C&&&&&r   N)r\   r]   r^   r  r  rd   r   r   r  r    s2        ? ? ?' ' ' ' 'r   r  c                       e Zd Zd Zd ZdS )GetMainTestsc                     t                                           \  }t                                           }|                     ||           |                     |t           j                   d S r   )r   r   rC   r   r  rT   )rY   r  rG   s      r   test_from_mainzGetMainTests.test_from_main  s[    !**,,
$$&&x(((dL$>?????r   c                    t                                           \  }t                                           }t          |t	          d                    }t          |                                          }|                     ||           d S )Nz
            import _xxsubinterpreters as _interpreters
            main = _interpreters.get_main()
            print(main)
            assert isinstance(main, _interpreters.InterpreterID)
            )r   r   rU   r#   r   r  r  r   )rY   r  r   r  rG   s        r   test_from_subinterpreterz%GetMainTests.test_from_subinterpreter  s{    !**,,
$$&&&& * # #   399;;x(((((r   N)r\   r]   r^   r  r!  rd   r   r   r  r    s5        @ @ @
) 
) 
) 
) 
)r   r  c                   ^    e Zd Zd Z ej        d          d             Zd Zd Zd Z	d Z
dS )	IsRunningTestsc                     t                                           }|                     t                               |                     d S r   )r   rC   r   r(   )rY   rG   s     r   r  zIsRunningTests.test_main  s9    $$&&//5566666r   zFails on FreeBSDc                    t                                           }|                     t                               |                     t	          |          5  |                     t                               |                     d d d            n# 1 swxY w Y   |                     t                               |                     d S r   )r   rU   r   r(   r<   r   rY   r   s     r   r  z"IsRunningTests.test_subinterpreter  s    $$&&0088999f 	= 	=OOL33F;;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=008899999s   .BBBc                     t                                           }t          |t          d| d                    }|                     |                                d           d S )Nz`
            import _xxsubinterpreters as _interpreters
            if _interpreters.is_running(zZ):
                print(True)
            else:
                print(False)
            True)r   rU   r#   r   r   r  )rY   r   r  s      r   r!  z'IsRunningTests.test_from_subinterpreter  sm    $$&&&& *)/* * * # #   	f-----r   c                    t                                           }t                               |           |                     t                    5  t                               |           d d d            d S # 1 swxY w Y   d S r   )r   rU   r   r   r)   r(   r&  s     r   test_already_destroyedz%IsRunningTests.test_already_destroyed   s    $$&&V$$$|,, 	, 	,##F+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,   A66A:=A:c                     |                      t                    5  t                              d           d d d            d S # 1 swxY w Y   d S Ni@B )r   r)   r   r(   r   s    r   test_does_not_existz"IsRunningTests.test_does_not_exist  s    |,, 	/ 	/##I...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/   AA
Ac                     |                      t                    5  t                              d           d d d            d S # 1 swxY w Y   d S Nr   )r   rR   r   r(   r   s    r   test_bad_idzIsRunningTests.test_bad_id
  s    z** 	( 	(##B'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(r/  N)r\   r]   r^   r  unittestskipr  r!  r*  r.  r2  rd   r   r   r#  r#    s        7 7 7 X]%&&: : '&:	. 	. 	., , ,/ / /( ( ( ( (r   r#  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	InterpreterIDTestsc                     t                               dd          }|                     t          |          d           d S )Nr   Tr   )r   rT   r   r  rY   r?   s     r   test_with_intz InterpreterIDTests.test_with_int  s<    ''$'77R"%%%%%r   c                      G d dt                     }t                               |            d          }|                     t	          |          d           d S )Nc                       e Zd Zd ZdS ).InterpreterIDTests.test_coerce_id.<locals>.Intc                     dS Nr   rd   r   s    r   	__index__z8InterpreterIDTests.test_coerce_id.<locals>.Int.__index__      rr   Nr\   r]   r^   r?  rd   r   r   Intr<    #            r   rB  Tr   r   )rL   r   rT   r   r  )rY   rB  r?   s      r   test_coerce_idz!InterpreterIDTests.test_coerce_id  sn    	 	 	 	 	# 	 	 	 ''T'::R"%%%%%r   c                    |                      t          t          j        t	                                 |                      t          t          j        d           |                      t          t          j        d           |                      t          t          j        d           |                      t
          t          j        d           |                      t          t          j        d           d S Ng      $@10s   10r   l            )r   	TypeErrorr   rT   r   rR   r   r   s    r   r2  zInterpreterIDTests.test_bad_id  s    )\%?JJJ)\%?FFF)\%?FFF)\%?GGG*l&@"EEE-)CUKKKKKr   c                     t                                           }|                     t                    5  t                               t          |          dz              d d d            d S # 1 swxY w Y   d S Nr   )r   r   r   r)   rT   r  r8  s     r   r.  z&InterpreterIDTests.test_does_not_exist&  s    ((**|,, 	4 	4&&s2ww{333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   +A,,A03A0c                     t                               dd          }|                     t          |          d           d S Nr   Tr   rG  )r   rT   r   rL   r8  s     r   test_strzInterpreterIDTests.test_str+  s<    ''$'77R$'''''r   c                     t                               dd          }|                     t          |          d           d S )Nr   Tr   zInterpreterID(10))r   rT   r   r   r8  s     r   	test_reprzInterpreterIDTests.test_repr/  s=    ''$'77b#677777r   c                    t                                           }t                               t          |                    }t                                           }|                     ||k               |                     ||k               |                     |t          |          k               |                     t          |          |k               |                     |t          t          |                    k               |                     t          t          |                    |k               |                     |t          t          |                    dz   k               |                     |t          t          |                    k               |                     |ddz  k               |                     |t          d          k               |                     |dk               |                     ||k               |                     ||k               |                     ||k               |                     ||k               d S N皙?r   r   infr   )r   rU   rT   r  r   floatr   rL   rY   id1id2id3s       r   test_equalityz InterpreterIDTests.test_equality3  s   !!##((S22!!##s
###s
###s3xx(((CC(((uSXX.///c#hh3.///c#hh# 55666CHH-...4(((e,---'''$$$$$$$$$s
#####r   N)
r\   r]   r^   r9  rD  r2  r.  rM  rO  rY  rd   r   r   r6  r6    s        & & &
& & &L L L4 4 4
( ( (8 8 8$ $ $ $ $r   r6  c                   d    e Zd Zd Z ej        d          d             Zd Zd Zd Z	d Z
d Zd	S )
CreateTestsc                     t                                           }|                     |t           j                   |                     |t                                                      d S r   )r   rU   r  rT   assertInr   r8  s     r   test_in_mainzCreateTests.test_in_mainL  sR      ""b,"<===b,//1122222r   z*enable this test when working on pystate.cc                    t                      }t          d          D ]J}t                                          }t                              |           |                    |           K|                     t          |          d           d S )Nd   )setr   r   rU   r   addr   len)rY   seenr  r?   s       r   test_unique_idzCreateTests.test_unique_idR  sx    uus 	 	A$$&&B  $$$HHRLLLLTC(((((r   c                 H   t          j                    d fd}t          j        |          }5  |                                 d d d            n# 1 swxY w Y   |                                 |                     t                                                     d S )Nc                      t                                                                                                              d S r   )r   rU   acquirerelease)r?   locks   r   fz%CreateTests.test_in_thread.<locals>.f_  s2    $$&&BLLNNNLLNNNNNr   r2   )r5   Lockr6   r7   r9   r]  r   r   )rY   rk  r:   r?   rj  s      @@r   test_in_threadzCreateTests.test_in_thread\  s    ~	 	 	 	 	 	 A&&& 	 	GGIII	 	 	 	 	 	 	 	 	 	 	 	 	 	 		b,//1122222s   AAAc                 d   t                                           \  }t                                           }t          |t	          d                    }t          |                                          }|                     t          t                                                     |||h           d S )Nz
            import _xxsubinterpreters as _interpreters
            id = _interpreters.create()
            print(id)
            assert isinstance(id, _interpreters.InterpreterID)
            )	r   r   rU   r#   r   r  r  r   ra  )rY   rG   rV  r  rW  s        r   test_in_subinterpreterz"CreateTests.test_in_subinterpreterk  s    %%''!!###v '       #))++\224455c37GHHHHHr   c                 v   t                                           \  }t                                           d fd}t          j        |          }|                                 |                                 |                     t          t                                                     |h           d S )Nc                      t          t          d                    } t          |                                           d S )Nz
                import _xxsubinterpreters as _interpreters
                id = _interpreters.create()
                print(id)
                )r#   r   r  r  )r  rV  rW  s    r   rk  z6CreateTests.test_in_threaded_subinterpreter.<locals>.f|  s@    c6 + $ $  C
 ciikk""CCCr   r2   )	r   r   rU   r5   r6   r7   r9   r   ra  )rY   rG   rk  r:   rV  rW  s       @@r   test_in_threaded_subinterpreterz+CreateTests.test_in_threaded_subinterpreterx  s    %%''!!##	# 	# 	# 	# 	# 	# A&&&					\224455c37GHHHHHr   c                    t          t                                                    }g }t          d          D ]0}t                                          }|                    |           1|D ]}t                              |           t                                          }|                     t          t                                                    ||hz             d S N   )ra  r   r   r   rU   appendr   r   rY   beforer  r  r?   s        r   test_after_destroy_allz"CreateTests.test_after_destroy_all  s    \**,,--q 	 	A$$&&BJJrNNNN 	% 	%B  $$$$  ""\224455v}EEEEEr   c                     t          t                                                    }t                                          }t                                          }t                                          }t                              |           t                              |           t                                          }|                     t          t                                                    |||hz             d S r   )ra  r   r   rU   r   r   )rY   rx  rV  rW  rX  r?   s         r   test_after_destroy_somez#CreateTests.test_after_destroy_some  s    \**,,--!!##!!##!!##S!!!S!!!  ""\224455vS	7IJJJJJr   N)r\   r]   r^   r^  r3  r4  re  rm  ro  rr  ry  r{  rd   r   r   r[  r[  J  s        3 3 3 X]?@@) ) A@)3 3 3I I II I I&F F FK K K K Kr   r[  c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )DestroyTestsc                 8   t                                           }t                                           }t                                           }|                     |t                                                      t                               |           |                     |t                                                      |                     |t                                                      |                     |t                                                      d S r   )r   rU   r]  r   r   assertNotInrU  s       r   test_onezDestroyTests.test_one  s    !!##!!##!!##c<0022333S!!!l3355666c<0022333c<002233333r   c                    t          t                                                    }t                      }t          d          D ]0}t                                          }|                    |           1|                     t          t                                                    ||z             |D ]}t                              |           |                     t          t                                                    |           d S rt  )ra  r   r   r   rU   rb  r   r   rw  s        r   test_allzDestroyTests.test_all  s    \**,,--eeq 	 	A$$&&BGGBKKKK\224455v|DDD 	% 	%B  $$$$\224455v>>>>>r   c                 ^    t                                           \                       t                    5  t                                          d d d            n# 1 swxY w Y    fd}t          j        |          }|                                 |                                 d S )Nc                                           t                    5  t                                          d d d            d S # 1 swxY w Y   d S r   r   r)   r   r   )rG   rY   s   r   rk  z!DestroyTests.test_main.<locals>.f  s    ""<00 + +$$T***+ + + + + + + + + + + + + + + + + +s   AAAr2   )	r   r   r   r)   r   r5   r6   r7   r9   )rY   rk  r:   rG   s   `  @r   r  zDestroyTests.test_main  s    %%''|,, 	' 	'  &&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'	+ 	+ 	+ 	+ 	+ 	+ A&&&					s   AA#&A#c                    t                                           }t                               |           |                     t                    5  t                               |           d d d            d S # 1 swxY w Y   d S r   )r   rU   r   r   r)   r8  s     r   r*  z#DestroyTests.test_already_destroyed  s      ""R   |,, 	% 	%  $$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%r+  c                     |                      t                    5  t                              d           d d d            d S # 1 swxY w Y   d S r-  r  r   s    r   r.  z DestroyTests.test_does_not_exist  s    |,, 	, 	,  +++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,r/  c                     |                      t                    5  t                              d           d d d            d S # 1 swxY w Y   d S r1  )r   rR   r   r   r   s    r   r2  zDestroyTests.test_bad_id  s    z** 	% 	%  $$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%r/  c                 B   t                                           \  }t                                           }t          d| d          }t                               ||           |                     t          t                                                     ||h           d S )Nzo
            import _xxsubinterpreters as _interpreters
            try:
                _interpreters.destroy(zD)
            except RuntimeError:
                pass
            r   r   rU   r   r   r   ra  )rY   rG   r?   r   s       r   test_from_currentzDestroyTests.test_from_current  s    %%''  ""  (*     	F+++\224455bzBBBBBr   c                 t   t                                           \  }t                                           }t                                           }t          d| d          }t                               ||           |                     t          t                                                     ||h           d S )NzZ
            import _xxsubinterpreters as _interpreters
            _interpreters.destroy()
            r  )rY   rG   rV  rW  r   s        r   test_from_siblingzDestroyTests.test_from_sibling  s    %%''!!##!!## #&     	V,,,\224455c{CCCCCr   c                     t                                           fd}t          j        |          }|                                 |                                 d S )Nc                  <    t                                           d S r   )r   r   r   s   r   rk  z.DestroyTests.test_from_other_thread.<locals>.f  s      $$$$$r   r2   )r   rU   r5   r6   r7   r9   )rY   rk  r:   r?   s      @r   test_from_other_threadz#DestroyTests.test_from_other_thread  s`      ""	% 	% 	% 	% 	% A&&&					r   c                 "   t                                           \  }t                                           }t          |          5  |                     t                               |          d| d           |                     t          d| d          5  t                               |           d d d            n# 1 swxY w Y   |                     t                               |                     d d d            d S # 1 swxY w Y   d S )NzInterp z& should be running before destruction.)msgz%Should not be able to destroy interp z while it's still running.)	r   r   rU   r<   r   r(   r   r)   r   )rY   rG   r   s      r   test_still_runningzDestroyTests.test_still_running  s   %%''$$&&f 	= 	=OOL33F;; X& X X X  Z Z Z ""<'qv'q'q'q # s s - -$$V,,,- - - - - - - - - - - - - - - OOL33F;;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s7   ADB?3D?C	DC	0DDDN)r\   r]   r^   r  r  r  r*  r.  r2  r  r  r  r  rd   r   r   r}  r}    s        4 4 4	? 	? 	?  % % %, , ,% % %C C C
D 
D 
D  
= 
= 
= 
= 
=r   r}  c                       e Zd Z f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                                          | _        d S r   )rV   r   r   rU   r?   r   s    r   r   zRunStringTests.setUp  s+    %%''r   c                     t          d          \  }}|5  t                              | j        |           |                                }d d d            n# 1 swxY w Y   |                     |d           d S )Nprint("it worked!", end="")
it worked!)r   r   r   r?   r   r   )rY   r   filer  s       r   test_successzRunStringTests.test_success  s    '(EFF 	 	##DGV444))++C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	l+++++s   5AAAc                 <    t          d          \  }|5   fd}t          j        |          }|                                 |                                 |                                }d d d            n# 1 swxY w Y                        |d           d S )Nr  c                  H    t                               j                    d S r   )r   r   r?   )r   rY   s   r   rk  z(RunStringTests.test_in_thread.<locals>.f  s!    ''88888r   r2   r  )r   r5   r6   r7   r9   r   r   )rY   r  rk  r:   r  r   s   `    @r   rm  zRunStringTests.test_in_thread  s    '(EFF 	 	9 9 9 9 9 9  ***AGGIIIFFHHH))++C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	l+++++s   AA;;A?A?c                    t                               d          }t          d          \  }}|5  t                               ||           |                                }d d d            n# 1 swxY w Y   |                     |d           d S )NF)isolatedz
            import threading
            def f():
                print('it worked!', end='')

            t = threading.Thread(target=f)
            t.start()
            t.join()
            r  )r   rU   r   r   r   r   )rY   	subinterpr   r  r  s        r   test_create_threadz!RunStringTests.test_create_thread$  s     '''77	' )    	 	##Iv666))++C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	l+++++s   0A,,A03A0c                    dd l }|                    dd          5 }|                    d           |                                 d}t	          d|j         d| d	          }t                              | j        |           |	                    d           |
                                }|                     ||           d d d            d S # 1 swxY w Y   d S )
Nr   zw+r   r   r   zspam spam spam spam spamz
                import os
                try:
                    os.fork()
                except RuntimeError:
                    with open('zE', 'w', encoding='utf-8') as out:
                        out.write('z')
                )tempfileNamedTemporaryFiler8   flushr   rX   r   r   r?   seekr   r   )rY   r  r  r  r   contents         r   	test_forkzRunStringTests.test_fork5  s+   (((@@ 	0DJJrNNNJJLLL1H 
 !%	  %-    F ##DGV444IIaLLLiikkGWh///#	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   B&CCCc                    t          | j                  5  |                     t                    5  t                              | j        d           d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nprint("spam"))r<   r?   r   r)   r   r   r   s    r   test_already_runningz#RunStringTests.test_already_runningK  s   dg 	B 	B""<00 B B''AAAB B B B B B B B B B B B B B B	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs4   A5!AA5A!	!A5$A!	%A55A9<A9c                    d}|t                                           v r |dz  }|t                                           v  |                     t                    5  t                               |d           d d d            d S # 1 swxY w Y   d S )Nr   r   r  )r   r   r   r)   r   r8  s     r   r.  z"RunStringTests.test_does_not_existP  s    L))++++!GB L))++++|,, 	9 	9##B888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9s   BBBc                     |                      t                    5  t                              dd           d d d            d S # 1 swxY w Y   d S )Nr   r  )r   rR   r   r   r   s    r   test_error_idzRunStringTests.test_error_idW  s    z** 	9 	9##B888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9   AAAc                     |                      t                    5  t                              dd           d d d            d S # 1 swxY w Y   d S )Nr   r  )r   rH  r   r   r   s    r   r2  zRunStringTests.test_bad_id[  s    y)) 	= 	=##FO<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=r  c                     |                      t                    5  t                              | j        d           d d d            d S # 1 swxY w Y   d S r>  r   rH  r   r   r?   r   s    r   test_bad_scriptzRunStringTests.test_bad_script_  s    y)) 	1 	1##DGR000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1   !A		AAc                     |                      t                    5  t                              | j        d           d d d            d S # 1 swxY w Y   d S )Ns   print("spam")r  r   s    r   test_bytes_for_scriptz$RunStringTests.test_bytes_for_scriptc  s    y)) 	? 	?##DG-=>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?r  Nc              #     K   |                      t          j                  5 }d V  d d d            n# 1 swxY w Y   |P|                     t	          |j                                      d          d         t	          |                     d S |                     t	          |j                  d                    ||                     d S )N:r   z{}: {})r   r   RunFailedErrorr   rL   	exceptionsplitrS   )rY   exctyper  caughts       r   assert_run_failedz RunStringTests.assert_run_failedg  s
     |:;; 	vEEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	;S!12288==a@ \\+ + + + + S!122%__Wc::< < < < <s   377c                     |                      t                    5  t                              | j        d           d d d            d S # 1 swxY w Y   d S )Nzprint("spam")r  SyntaxErrorr   r   r?   r   s    r   test_invalid_syntaxz"RunStringTests.test_invalid_syntaxr  s    ##K00 	= 	=##DG^<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=r  c                     |                      t          d          5  t                              | j        d           d d d            d S # 1 swxY w Y   d S )Nr   zraise Exception("spam"))r  r   r   r   r?   r   s    r   test_failurezRunStringTests.test_failurew  s    ##Iv66 	H 	H##DG-FGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H   !A

AAc                     |                      t          d          5  t                              | j        d           d d d            d S # 1 swxY w Y   d S )N42zraise SystemExit(42))r  
SystemExitr   r   r?   r   s    r   test_SystemExitzRunStringTests.test_SystemExit{  s    ##J55 	E 	E##DG-CDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Er  c                    |                      t                    5  t                              | j        t          d                     d d d            n# 1 swxY w Y   |                      t          d          5  t                              | j        t          d                     d d d            d S # 1 swxY w Y   d S )NzG
                import sys
                sys.exit()
                r  zI
                import sys
                sys.exit(42)
                )r  r  r   r   r?   r   r   s    r   test_sys_exitzRunStringTests.test_sys_exit  sA   ##J// 	 	##DGV 5 . .   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ##J55 	 	##DGV 5 . .   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s#   .AAA;.B66B:=B:c                    t          j                    \  }}ddd d}t          d| d          }t                              | j        ||           t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | 	                    |d         d           | 	                    |d	         d
           | 	                    |d         d           | 
                    |d                    d S )N   hams   -1)r   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)
            rbr   *   r  r   r   )   r  )r   r   r   r   r   r?   r   pickleloadr   assertIsNonerY   r   r   r!   r   channss          r   test_with_sharedzRunStringTests.test_with_shared  sK   wyy1  
  
 
 
 
 
 
 	888!T]] 	#dT""B	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	FR(((FR(((Hr***"Y-(((((s   !BB	Bc                    t                               | j        t          d                     ddi}t          d          }t                               | j        ||           t	          j                    \  }}t          d| d          }t                               | j        |           t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | 	                    |d         d         d	           | 	                    |d
         d         d           | 	                    |d         d           d S )Nzj
            spam = 'eggs'
            ns1 = dict(vars())
            del ns1['__builtins__']
            r   r  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  r   )rY   r!   r   r   r   r  r  s          r   test_shared_overwritesz%RunStringTests.test_shared_overwrites  s    1 * * 	 	 	 &!    	888wyy1  	     	000!T]] 	#dT""B	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	E6*F333E6*F333FV,,,,,s   ;CC #C c                 R   t          j                    \  }}ddi}t          d| d          }t                              | j        ||           t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | 	                    |d         d           d S )Nr\   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  r   r  s          r   #test_shared_overwrites_default_varsz2RunStringTests.test_shared_overwrites_default_vars  s    wyy1o.       	888!T]] 	#dT""B	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	J99999s   B  BBc                    t          j                    \  }}t                              | j        t          d| d                     t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          j                    \  }}t                              | j        t          d| d                     t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | 	                    d|           | 
                    d|           | 	                    d|           | 	                    d|           d S )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  r   r  )r   r   r   r   r?   r   r   r  r  r]  r  )rY   r   r   r  r  r  s         r   test_main_reusedzRunStringTests.test_main_reused  s   wyy1 	1 	1 	1 	1 	* 	* 		 		 		 !T]] 	$d+d##C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ wyy1 1 1 1 1 * * 	 	 	 !T]] 	$d+d##C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	fc"""%%%fc"""fc"""""s$   A99A= A=C<<D D c           
         t          j                    \  }}t          d| d          }t                              | j        |           t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   |	                    d           |	                    d           | 
                    |di d d d dd           d S )	Nz
            spam = 42

            ns = dict(vars())
            ns['__builtins__'] = str(ns['__builtins__'])
            import pickle
            with open(r  r  __builtins__
__loader____main__r  )r\   __annotations__r   __package____spec__r   )r   r   r   r   r   r?   r   r  r  popr   )rY   r   r   r   r  r  s         r    test_execution_namespace_is_mainz/RunStringTests.test_execution_namespace_is_main  s(   wyy1       	000!T]] 	#dT""B	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	~
|"!  	 	 	 	 	s   A;;A?A?zblocking foreverc                 R   t          d          }t          j                    5 }t          j        |d|          }t          j        |          5 }|                                }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     |d           d S )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waitr   )rY   r   dirnamefilenameprocretcodes         r   test_still_running_at_exitz)RunStringTests.test_still_running_at_exit  s        	&7$0(FKKH+H55 &))++& & & & & & & & & & & & & & &	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&
 	!$$$$$s5   +BA/#B/A3	3B6A3	7BB
B
r   ) r\   r]   r^   r   r  rm  r  r   requires_forkr  r  r.  r  r2  r  r  
contextlibcontextmanagerr  r  r  r  r  r  r  r  r  r  r3  r4  r  r`   ra   s   @r   r  r  	  s       ( ( ( ( (, , ,, , ,, , ," W0 0 0*B B B
9 9 99 9 9= = =1 1 1? ? ? < < < <= = =
H H HE E E  ) ) )8- - -<: : :&# # #B  8 X]%&&% % '&% % % % %r   r  c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )ChannelIDTestsc                     t                               dd          }|                     t          |          d           |                     |j        d           d S )Nr   Tr   ri   )r   _channel_idr   r  rl   rY   r   s     r   test_default_kwargsz"ChannelIDTests.test_default_kwargs4  sT    &&r&66S2&&&&)))))r   c                 <   t                               ddd          }|                     |j        d           t                               dddd          }|                     |j        d           t                               ddd          }|                     |j        d           t                               dddd	          }|                     |j        d           t                               dddd          }|                     |j        d
           d S )Nr   Trq   r   rq   Frq   rr   r   rr   r   rr   )rr   rq   r   ri   )r   r  r   rl   r  s     r   test_with_kwargszChannelIDTests.test_with_kwargs:  s   &&rD&AA&)))&&r5&MM&)))&&rD&AA&)))&&r5&MM&)))&&r4t&LL&)))))r   c                      G d dt                     }t                               |            d          }|                     t	          |          d           d S )Nc                       e Zd Zd ZdS )*ChannelIDTests.test_coerce_id.<locals>.Intc                     dS r>  rd   r   s    r   r?  z4ChannelIDTests.test_coerce_id.<locals>.Int.__index__L  r@  r   NrA  rd   r   r   rB  r  K  rC  r   rB  Tr   r   )rL   r   r  r   r  )rY   rB  r   s      r   rD  zChannelIDTests.test_coerce_idJ  sn    	 	 	 	 	# 	 	 	 &&ssuuD&99S2&&&&&r   c                    |                      t          t          j        t	                                 |                      t          t          j        d           |                      t          t          j        d           |                      t          t          j        d           |                      t
          t          j        d           |                      t          t          j        d           d S rF  )r   rH  r   r  r   rR   r   r   s    r   r2  zChannelIDTests.test_bad_idR  s    )\%=vxxHHH)\%=tDDD)\%=tDDD)\%=uEEE*l&>CCC-)A5IIIIIr   c                     |                      t                    5  t                              ddd           d d d            d S # 1 swxY w Y   d S )Nr   Frq   rr   )r   rR   r   r  r   s    r   test_bad_kwargszChannelIDTests.test_bad_kwargsZ  s    z** 	A 	A$$Re%$@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   AA
A
c                     t                                           }|                     t           j                  5  t                               t          |          dz              d d d            d S # 1 swxY w Y   d S rJ  )r   r   r   r   r  r  r  s     r   r.  z"ChannelIDTests.test_does_not_exist^  s    ))++|@AA 	3 	3$$SXX\222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   +A11A58A5c                     t                               dd          }|                     t          |          d           d S rL  )r   r  r   rL   r  s     r   rM  zChannelIDTests.test_strc  s<    &&r&66S4(((((r   c                    t                               dd          }|                     t          |          d           t                               ddd          }|                     t          |          d           t                               ddd          }|                     t          |          d           t                               dddd	          }|                     t          |          d           d S )
Nr   Tr   zChannelID(10)r   zChannelID(10, send=True)r  zChannelID(10, recv=True)r  )r   r  r   r   r  s     r   rO  zChannelIDTests.test_reprg  s    &&r&66cO444&&rD&AAc$>???&&rD&AAc$>???&&r4t&LLcO44444r   c                    t                                           }t                               t          |                    }t                                           }|                     ||k               |                     ||k               |                     |t          |          k               |                     t          |          |k               |                     |t          t          |                    k               |                     t          t          |                    |k               |                     |t          t          |                    dz   k               |                     |t          t          |                    k               |                     |ddz  k               |                     |t          d          k               |                     |dk               |                     ||k               |                     ||k               |                     ||k               |                     ||k               d S rQ  )r   r   r  r  r   rT  r   rL   )rY   cid1cid2cid3s       r   rY  zChannelIDTests.test_equalityt  s   **,,''D		22**,,%%%%%%D		)***D		T)***c$ii 0 00111c$ii((D0111s4yy!1!1C!77888SYY/000D)))u-...(((&&&&&&&&&%%%%%r   N)r\   r]   r^   r  r  rD  r2  r  r.  rM  rO  rY  rd   r   r   r  r  2  s        * * ** * * ' ' 'J J JA A A3 3 3
) ) )5 5 5& & & & &r   r  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej        d          d             Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d'S )(ChannelTestsc                 x    t                                           }|                     |t           j                   d S r   )r   r   r  	ChannelIDr  s     r   test_create_cidzChannelTests.test_create_cid  s2    ))++c<#9:::::r   c                    t                                           }t                                           }t                                           }t                                           }t                                           }|                     |t	          |          dz              |                     |t	          |          dz              |                     t          |          t          |          z
  |||h           d S rJ  )r   r   r   r   r  ra  )rY   rx  rV  rW  rX  afters         r   test_sequential_idsz ChannelTests.test_sequential_ids  s    ..00))++))++))++--//c#hhl+++c#hhl+++Uc&kk1Cc?CCCCCr   c                    t                                           }t          |t          d                    }t	          |                                          }t                                           }t          |t          d                    }t	          |                                          }|                     |t	          |          dz              d S )Nz
            import _xxsubinterpreters as _interpreters
            cid = _interpreters.channel_create()
            print(cid)
            r   )r   rU   r#   r   r  r  r   )rY   rV  r  r  rW  r  s         r   test_ids_globalzChannelTests.test_ids_global  s    !!###v '      
 399;;!!###v '      
 399;;s4yy1}-----r   c                     t                                           }t                               |d          }t                               |d          }|                     |g            |                     |g            dS )z=Test listing interpreters for a channel with no associations.Trq   FN)r   r   channel_list_interpretersr   )rY   r   send_interpsrecv_interpss       r   #test_channel_list_interpreters_nonez0ChannelTests.test_channel_list_interpreters_none  sw     ))++#==c=MM#==c=NNr***r*****r   c                    t                                           }t                                           }t                               |d           t                               |d          }t                               |d          }|                     ||g           |                     |g            t                                           }t          |t          d| d                     t                               |d          }t                               |d          }|                     ||g           |                     ||g           dS )z(Test basic listing channel interpreters.rq   Tr  Fe
            import _xxsubinterpreters as _interpreters
            obj = _interpreters.channel_recv(r  N)	r   rC   r   r   r  r   rU   r#   r   )rY   interp0r   r   r!  interp1s         r   $test_channel_list_interpreters_basicz1ChannelTests.test_channel_list_interpreters_basic  sH   ''))))++!!#v...#==c=MM#==c=NNy111r***%%''GV %.1% % %   	 	 	
 $==c=MM#==c=NNy111y11111r   c                     t                                           }t                                           }t                                           }t                                           }t                                           }t                               |d           t          |t          d| d                     t          |t          d| d                     t          |t          d| d                     t                               |d          }t                               |d          }|                     t          |          ||h           |                     t          |          ||h           d	S )
z?Test listing interpreters for a channel with many associations.rq   _
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_send(z, "send")
            r$  r  Tr  FN)
r   rC   rU   r   r   r#   r   r  r   ra  )rY   r%  r&  interp2interp3r   r   r!  s           r   'test_channel_list_interpreters_multiplez4ChannelTests.test_channel_list_interpreters_multiple  s   ''))%%''%%''%%''))++!!#v...GV %(+% % %   	 	 	 	GV %.1% % %   	 	 	 	GV %.1% % %   	 	 	 $==c=MM#==c=NN\**Wg,>???\**Wg,>?????r   c                    t                                           }t                                           }t                                           }t                               |d           t          |t          d| d                     t                               |d          }t                               |d          }|                     ||g           |                     ||g           t           	                    |           t                               |d          }t                               |d          }|                     ||g           |                     |g            dS )z?Test listing channel interpreters with a destroyed interpreter.rq   r$  r  Tr  FN)
r   rC   rU   r   r   r#   r   r  r   r   rY   r%  r&  r   r   r!  s         r   (test_channel_list_interpreters_destroyedz5ChannelTests.test_channel_list_interpreters_destroyed  s\   ''))%%''))++!!#v...GV %.1% % %   	 	 	
 $==c=MM#==c=NNy111y111W%%%#==c=MM#==c=NNy111r*****r   c                    t                                           }t                                           }t                                           }t                                           }t                               |d           t          |t          d| d                     t                               |d           t          |t          d| d                     t                               |d          }t                               |d          }|                     t          |          d           |                     t          |          d           t           
                    |d           t                               |d          }t                               |d          }|                     t          |          d	           |                     t          |          d           t          |t          d
| d                     t                               |d          }t                               |d          }|                     t          |          d	           |                     ||g           dS )z:Test listing channel interpreters with a released channel.datar$  r  Tr  Fr   r   r   b
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_release(N)r   rC   rU   r   r   r#   r   r  r   rc  channel_release)rY   r%  r&  r*  r   r   r!  s          r   'test_channel_list_interpreters_releasedz4ChannelTests.test_channel_list_interpreters_released  s    ''))%%''%%''))++!!#v...GV %.1% % %   	 	 	 	!!#v...GV %.1% % %   	 	 	
 $==c=MM#==c=NN\**A...\**A... 	$$St$444#==c=MM#==c=NN\**A...\**A... 	GV %+.% % %   	 	 	
 $==c=MM#==c=NN\**A...y11111r   c                 T   t                                           }t                                           }t                                           }t                               |d           t                               |d          }t                               |d          }|                     t          |          d           |                     t          |          d           t                               |d           | 	                    t           j
                  5  t                               |d           ddd           n# 1 swxY w Y   | 	                    t           j
                  5  t                               |d           ddd           dS # 1 swxY w Y   dS )	z8Test listing channel interpreters with a closed channel.rq   Tr  Fr   r   r   N)r   rC   rU   r   r   r  r   rc  r   r   rc   r.  s         r   %test_channel_list_interpreters_closedz2ChannelTests.test_channel_list_interpreters_closed*  s   ''))%%''))++!!#v... $==c=MM#==c=NN\**A...\**A... 	""3d"333|>?? 	C 	C223T2BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C|>?? 	D 	D223U2CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds$    E		EE3FF!$F!c                    t                                           }t                                           }t                                           }t                               |d           t                               |d          }t                               |d          }|                     t          |          d           |                     t          |          d           t                               |d           | 	                    t           j
                  5  t                               |d           ddd           n# 1 swxY w Y   t                               |d          }|                     t          |          d           t          |t          d| d	                     | 	                    t           j
                  5  t                               |d           ddd           n# 1 swxY w Y   | 	                    t           j
                  5  t                               |d           ddd           dS # 1 swxY w Y   dS )
zCTest listing channel interpreters with a channel's send end closed.rq   Tr  Fr   r   N`
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_close(, force=True)
            )r   rC   rU   r   r   r  r   rc  r   r   rc   r#   r   r.  s         r   .test_channel_list_interpreters_closed_send_endz;ChannelTests.test_channel_list_interpreters_closed_send_end@  s   ''))%%''))++!!#v... $==c=MM#==c=NN\**A...\**A... 	""3T"222|>?? 	C 	C223T2BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C $==c=NN\**A... 	GV %),% % %   	 	 	
 |>?? 	C 	C223T2BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C|>?? 	D 	D223U2CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds6    E		EEG<<H H &IIIc                     t                                           }d}t                               ||           t                               |          }|                     ||           |                     ||           d S Nr   )r   r   r   r   r   assertIsNot)rY   r   origr   s       r   test_send_recv_mainz ChannelTests.test_send_recv_maind  ss    ))++!!#t,,,'',,d###d#####r   c                 r    t                                           }t          |t          d                    }d S )Na6  
            import _xxsubinterpreters as _interpreters
            cid = _interpreters.channel_create()
            orig = b'spam'
            _interpreters.channel_send(cid, orig)
            obj = _interpreters.channel_recv(cid)
            assert obj is not orig
            assert obj == orig
            )r   rU   r#   r   )rY   rV  r  s      r   test_send_recv_same_interpreterz,ChannelTests.test_send_recv_same_interpreterm  s9    !!###v '      r   c                    t                                           }t                                           }t          |t	          d| d                    }t                               |          }|                     |d           d S )Nr)  , b'spam')
            r   )r   r   rU   r#   r   r   r   )rY   r   rV  r  r   s        r   %test_send_recv_different_interpretersz2ChannelTests.test_send_recv_different_interpretersy  s    ))++!!###v '(+' ' '       '',,g&&&&&r   c                 T   t                                           fd}t          j        |          }|                                 t                               d           |                                 t                                         }|                     |d           d S )Nc                      	 	 t                                         } n*# t           j        $ r t          j        d           Y nw xY wFt                               |            d S )NTrR  )r   r   r   r&   r*   r   )r   r   s    r   rk  z8ChannelTests.test_send_recv_different_threads.<locals>.f  su    $$&33C88C#5 $ $ $JsOOOOO$	$ %%c3/////s    #AAr2   r   )	r   r   r5   r6   r7   r   r9   r   r   )rY   rk  r:   r   r   s       @r    test_send_recv_different_threadsz-ChannelTests.test_send_recv_different_threads  s    ))++	0 	0 	0 	0 	0 A&&&				!!#w///	'',,g&&&&&r   c                    t                                           t                                           d fd}t          j        |          }|                                 t                               d           |                                 t                                         }| 	                    |d           d S )Nc            
      P    t          t          d  d  d                    d S )Nz
                import time
                import _xxsubinterpreters as _interpreters
                while True:
                    try:
                        obj = _interpreters.channel_recv(z)
                        break
                    except _interpreters.ChannelEmptyError:
                        time.sleep(0.1)
                assert(obj == b'spam')
                _interpreters.channel_send(z, b'eggs')
                )r#   r   )r   rV  r  s   r   rk  zIChannelTests.test_send_recv_different_interpreters_and_threads.<locals>.f  sL    c6 +
 ;>+ + -0+ + + $ $  CCCr   r2   r      eggs)
r   r   rU   r5   r6   r7   r   r9   r   r   )rY   rk  r:   r   r   rV  r  s       @@@r   1test_send_recv_different_interpreters_and_threadsz>ChannelTests.test_send_recv_different_interpreters_and_threads  s    ))++!!##	 	 	 	 	 	 	 A&&&				!!#w///	'',,g&&&&&r   c                     |                      t          j                  5  t                              dd           d d d            d S # 1 swxY w Y   d S )Nr   r   )r   r   r   r   r   s    r   test_send_not_foundz ChannelTests.test_send_not_found  s    |@AA 	3 	3%%b'222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   A		AAc                     |                      t          j                  5  t                              d           d d d            d S # 1 swxY w Y   d S r>  )r   r   r   r   r   s    r   test_recv_not_foundz ChannelTests.test_recv_not_found  s    |@AA 	* 	*%%b)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   AAAc                     t                                           }|                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S r   )r   r   r   r   r   r  s     r   test_recv_emptyzChannelTests.test_recv_empty  s    ))++|=>> 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   A!!A%(A%c                 v   t                      }t                                          }t                              ||          }t                              |d            t                              |d           t                              |d           t                              |d           t                              ||          }t                              ||          }t                              |          }t                              ||          }t                              ||          }|                     ||           |                     |d            |                     |d           |                     |d           |                     |d           |                     ||           d S )Nr   r   rJ  )r   r   r   r   r   r   r   )	rY   defaultr   obj1obj2obj3obj4obj5obj6s	            r   test_recv_defaultzChannelTests.test_recv_default  st   (())++((g66!!#t,,,!!#q)))!!#w///!!#w///((g66((g66((--((g66((g66dG$$$dD!!!q!!!w'''w'''dG$$$$$r   c                 |   t                                           }t                                           }t          |t	          d          t          |j                            }t                               |          }|                     |d           |                     |	                                d           d S )Nz
            import _xxsubinterpreters as _interpreters
            print(cid.end)
            _interpreters.channel_send(cid, b'spam')
            r   r   rq   )
r   r   rU   r#   r   dictrq   r   r   r  rY   r   r   r  r   s        r   test_run_string_arg_unresolvedz+ChannelTests.test_run_string_arg_unresolved  s    ))++$$&&&& * # #
 SX    '',,g&&&f-----r   z(disabled until high-level channels existc                    t                                           }t                               |d          }t                                           }t	          |t          d          t          |j                            }t                               |          }| 	                    |d           | 	                    |
                                d           d S )NT)_resolvez
            import _xxsubinterpreters as _interpreters
            print(chan.id.end)
            _interpreters.channel_send(chan.id, b'spam')
            )r  r   rq   )r   r   r  rU   r#   r   r\  rq   r   r   r  r]  s        r   test_run_string_arg_resolvedz)ChannelTests.test_run_string_arg_resolved  s    ))++&&sT&::$$&&&& * # #
 ch! ! '',,g&&&f-----r   c                    t                                           }t                               |d           t                               |           t                               |           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S Nr   rJ  r   r   r   r   r   r   rc   r  s     r   test_close_single_userz#ChannelTests.test_close_single_user  sb   ))++!!#w///!!#&&&""3'''|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+$   B00B47B4DD	Dc           	         t                                           }t                                           }t                                           }t                               |t	          d| d                     t                               |t	          d| d                     t                               |           |                     t           j                  5 }t                               |t	          d| d                     d d d            n# 1 swxY w Y   |                     dt          |j
                             |                     t           j                  5 }t                               |t	          d| d                     d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr)  rC  z_
            import _xxsubinterpreters as _interpreters
            _interpreters.channel_recv(r  z,
                _interpreters.channel_send(z, b'spam')
                rc   )r   r   rU   r   r   r   r   r  r]  rL   r  )rY   r   rV  rW  cms        r   test_close_multiple_usersz&ChannelTests.test_close_multiple_users  s[   ))++!!##!!##V -(+- - - & & 	 	 	 	V -(+- - - & & 	 	 	 	""3'''|:;; 	r##C 1,/1 1 1 * *   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	*C,=,=>>>|:;; 	r##C 1,/1 1 1 * *   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	*C,=,=>>>>>s$   -DDD(-F!!F%(F%c                 z   t                                           }t                               |d           t                               |           t                               |           |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S r<  rd  r  s     r   test_close_multiple_timesz&ChannelTests.test_close_multiple_times  s    ))++!!#w///!!#&&&""3'''|>?? 	, 	,&&s+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   B00B47B4c                    g d}|D ]C\  }}|                      ||f          5  t                                          }t                              |d           t                              |           t                              |||           |                     t          j                  5  t                              |d           d d d            n# 1 swxY w Y   |                     t          j                  5  t                              |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   Ed S )N))FFTF)FT)TTr   r
  rJ  )r   r   r   r   r   r   r   rc   )rY   testsrq   rr   r   s        r   test_close_emptyzChannelTests.test_close_empty'  s        
	3 
	3JD$tTl++ 	3 	3"1133))#w777))#...**3T*EEE&&|'FGG < < --c7;;;< < < < < < < < < < < < < < <&&|'FGG 3 3 --c2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3
	3 
	3sZ   BD?/CD?CD?C"D?D(D?(D,,D?/D,0D??E	E	c                    t                                           }t                               |d           t                               |d           |                     t           j                  5  t                               |           d d d            n# 1 swxY w Y   t                               |           t                               |d           d S )Nr   r  rJ  r   r   r   r   ChannelNotEmptyErrorr   r   r  s     r   %test_close_defaults_with_unused_itemsz2ChannelTests.test_close_defaults_with_unused_items:  s    ))++!!#w///!!#v...|@AA 	, 	,&&s+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,!!#&&&!!#w/////s   /BBBc                 T   t                                           }t                               |d           t                               |d           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   t                               |           t                               |d           t                               |           t                               |           t                               |d           d S )Nr   r  Trr   rJ  rq  r  s     r   *test_close_recv_with_unused_items_unforcedz7ChannelTests.test_close_recv_with_unused_items_unforcedD  s5   ))++!!#w///!!#v...|@AA 	7 	7&&s&666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7!!#&&&!!#w///!!#&&&!!#&&&""3T"22222s   /BBBc                    t                                           }t                               |d           t                               |d           t                               |d           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   t                               |           t                               |           |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nr   r  Tr  rJ  r   r   r   r   r   rc   r   r  s     r   *test_close_send_with_unused_items_unforcedz7ChannelTests.test_close_send_with_unused_items_unforcedQ  s   ))++!!#w///!!#v...""3T"222|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4!!#&&&!!#&&&|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s$   B33B7:B7D99D= D=c                 V   t                                           }t                               |d           t                               |d           |                     t           j                  5  t                               |dd           d d d            n# 1 swxY w Y   t                               |           t                               |d           t                               |           t                               |           t                               |d           d S )Nr   r  Tr   rJ  ru  rq  r  s     r   *test_close_both_with_unused_items_unforcedz7ChannelTests.test_close_both_with_unused_items_unforced^  sH   ))++!!#w///!!#v...|@AA 	B 	B&&sD&AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B!!#&&&!!#w///!!#&&&!!#&&&""3T"22222s   /BB Bc                 &   t                                           }t                               |d           t                               |d           t                               |dd           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nr   r  Tr  rJ  rx  r  s     r   (test_close_recv_with_unused_items_forcedz5ChannelTests.test_close_recv_with_unused_items_forcedk  k   ))++!!#w///!!#v...""3T">>>|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+$   B44B8;B8DD
D
c                 &   t                                           }t                               |d           t                               |d           t                               |dd           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nr   r  Tr   rJ  rx  r  s     r   (test_close_send_with_unused_items_forcedz5ChannelTests.test_close_send_with_unused_items_forcedv  r~  r  c                 (   t                                           }t                               |d           t                               |d           t                               |ddd           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nr   r  Tr  rJ  rx  r  s     r   (test_close_both_with_unused_items_forcedz5ChannelTests.test_close_both_with_unused_items_forced  sm   ))++!!#w///!!#v...""3TD"III|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s$   B55B9<B9DDDc                    t                                           }t                               |           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S r<  )r   r   r   r   rc   r   r   r  s     r   test_close_never_usedz"ChannelTests.test_close_never_used  s8   ))++""3'''|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+$   A;;A?A?%CCCc                 >   t                                           }t                               |d           t                                           }t                               |t          d| d                     |                     t           j                  5  t                               |           d d d            n# 1 swxY w Y   |                     t           j                  5  t           	                    |           d d d            d S # 1 swxY w Y   d S )Nr   r8  r9  )
r   r   r   rU   r   r   r   rc   r   r   rY   r   r   s      r   !test_close_by_unassociated_interpz.ChannelTests.test_close_by_unassociated_interp  s   ))++!!#w///$$&& 0),0 0 0 ) ) 	 	 	 |>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+|>?? 	, 	,&&s+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s$   C  CC*DDDc                    t                                           }t                               |d           t                               |d           t                               |d           t                               |           t                               |d           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nr   Tr   rJ  rd  r  s     r   -test_close_used_multiple_times_by_single_userz:ChannelTests.test_close_used_multiple_times_by_single_user  s   ))++!!#w///!!#w///!!#w///!!#&&&""3d"333|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s$    C((C,/C,D::D>D>c                    t                                           }|                     t           j                  5  t                               dd           d d d            n# 1 swxY w Y   t                               |           |                     t           j                  5  t                               |d           d d d            d S # 1 swxY w Y   d S )Nr   Tr  )r   r   r   r   r  r   rc   r  s     r   .test_channel_list_interpreters_invalid_channelz;ChannelTests.test_channel_list_interpreters_invalid_channel  sg   ))++|@AA 	D 	D224d2CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	""3'''|>?? 	C 	C223T2BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	Cs#   A""A&)A&&CCCc                     t                                           }|                     t                    5  t                               |           d d d            d S # 1 swxY w Y   d S r   )r   r   r   rH  r  r  s     r   +test_channel_list_interpreters_invalid_argsz8ChannelTests.test_channel_list_interpreters_invalid_args  s    ))++y)) 	8 	8223777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   AA #A N)*r\   r]   r^   r  r  r  r"  r'  r,  r/  r4  r6  r:  r?  rA  rD  rG  rK  rM  rO  rQ  rZ  r^  r3  r4  ra  re  ri  rk  ro  rs  rv  ry  r{  r}  r  r  r  r  r  r  r  rd   r   r   r  r    sj       ; ; ;	D 	D 	D. . .&+ + +2 2 2,@ @ @4+ + +.)2 )2 )2VD D D, D  D  DH$ $ $
 
 
	' 	' 	'' ' '(' ' '83 3 3* * *+ + +
% % %*. . .$ X]=>>. . ?>.$	+ 	+ 	+? ? ?0, , ,3 3 3&0 0 03 3 3+ + +3 3 3	+ 	+ 	+	+ 	+ 	+	+ 	+ 	++ + +, , ,+ + +	C 	C 	C8 8 8 8 8r   r  c                   R    e Zd ZdZ	 	 d Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )ChannelReleaseTestsa  
    - main / interp / other
    - run in: current thread / new thread / other thread / different threads
    - end / opposite
    - force / no force
    - used / not used  (associated / not associated)
    - empty / emptied / never emptied / partly emptied
    - closed / not closed
    - released / not released
    - creator (interp) / other
    - associated interpreter not running
    - associated interpreter destroyed
    c                 $   t                                           }t                               |d           t                               |           t                               |dd           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S Nr   Tr
  rJ  r   r   r   r   r3  r   rc   r  s     r   test_single_userz$ChannelReleaseTests.test_single_user  si   ))++!!#w///!!#&&&$$St$$???|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s$   B33B7:B7DD	D	c           
         t                                           }t                                           }t                                           }t                               |t	          d| d                     t          |t	          d| d| d                    }t                               |t	          d| d                     |                     |                                d           d S )	Nr)  rC  r$  z,)
            _interpreters.channel_release(z+)
            print(repr(obj))
            z+
            _interpreters.channel_release(r  zb'spam')r   r   rU   r   r   r#   r   r  )rY   r   rV  rW  r  s        r   test_multiple_usersz'ChannelReleaseTests.test_multiple_users  s   ))++!!##!!##V -(+- - - & & 	 	 	 #v '.1' ' ,/' ' '       	V -+.- - - & & 	 	 	 	i00000r   c                    t                                           }t                               |d           t                               |           t                               |           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S rc  r  r  s     r   test_no_kwargsz"ChannelReleaseTests.test_no_kwargs  sb   ))++!!#w///!!#&&&$$S)))|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+rf  c                    t                                           }t                               |d           t                               |           t                               |dd           |                     t           j                  5  t                               |dd           d d d            d S # 1 swxY w Y   d S )Nr   Tr
  r  r  s     r   test_multiple_timesz'ChannelReleaseTests.test_multiple_times  s   ))++!!#w///!!#&&&$$St$$???|>?? 	D 	D((4d(CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds   B66B:=B:c                    t                                           }t                               |d           t                               |d           t                               |dd           |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nr   r  Tr
  )r   r   r   r3  r   rc   r   r  s     r   test_with_unused_itemsz*ChannelReleaseTests.test_with_unused_items  s    ))++!!#w///!!#v...$$St$$???|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   B44B8;B8c                    t                                           }t                               |           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S r<  )r   r   r3  r   rc   r   r   r  s     r   test_never_usedz#ChannelReleaseTests.test_never_used(  s8   ))++$$S)))|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+r  c                 0   t                                           }t                               |d           t                                           }t                               |t          d| d                     t                               |          }t                               |           |                     t           j	                  5  t                               |d           d d d            n# 1 swxY w Y   | 
                    |d           d S )Nr   r2  r  rJ  )r   r   r   rU   r   r   r   r3  r   rc   r   )rY   r   r   r   s       r   test_by_unassociated_interpz/ChannelReleaseTests.test_by_unassociated_interp1  s>   ))++!!#w///$$&& 0+.0 0 0 ) ) 	 	 	 '',,$$S)))|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4g&&&&&s   C55C9<C9c           
      l   t                                           }t                                           }t                               |t	          d| d| d                     |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S )Nze
            import _xxsubinterpreters as _interpreters
            obj = _interpreters.channel_send(z5, b'spam')
            _interpreters.channel_release(r  )r   r   rU   r   r   r   rc   r   r  s      r   test_close_if_unassociatedz.ChannelReleaseTests.test_close_if_unassociated@  s   ))++$$&& 0.10 0 ,/0 0 0 ) ) 	 	 	 |>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   B))B-0B-c                 p   t                                           }t                               |d            t                               |           t                               |d           t                               |d           t                               |          }|                     |d           d S )Nr   Tr  )r   r   r   r   r3  r   )rY   r   r   s      r   test_partiallyz"ChannelReleaseTests.test_partiallyM  s    ))++!!#t,,,!!#&&&!!#w///$$St$444'',,g&&&&&r   c                    t                                           }t                               |d           t                               |d           t                               |d           t                               |           t                               |dd           |                     t           j                  5  t                               |d           d d d            n# 1 swxY w Y   |                     t           j                  5  t                               |           d d d            d S # 1 swxY w Y   d S r  r  r  s     r   'test_used_multiple_times_by_single_userz;ChannelReleaseTests.test_used_multiple_times_by_single_userX  s   ))++!!#w///!!#w///!!#w///!!#&&&$$St$$???|>?? 	4 	4%%c7333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4|>?? 	+ 	+%%c***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s$   C))C-0C-D;;D?D?N)r\   r]   r^   r   r  r  r  r  r  r  r  r  r  r  rd   r   r   r  r    s         "	+ 	+ 	+1 1 1(	+ 	+ 	+D D D+ + ++ + +' ' '+ + +	' 	' 	'+ + + + +r   r  c                        e Zd ZdZ fdZed             Zed             Zd ZddZ	d Z
d	 Zd
 Zd Zd Zd Z xZS )ChannelCloseFixtureFc                    |dv sJ | j         ri }net                              |          }t                              |          }t                              |          }|j        ||j        ||j        |i}|sd}t	                                          | |||||          }t                      |_        t                      |_	        ||_
        |S )Nr
  ro   )QUICKrI   rP   rX   rV   rW   ra  _preppedr   _state_known)	rN   rl   r   rv   rw   creatorknownrY   rZ   s	           r   rW   zChannelCloseFixture.__new__m  s    &&&&&9 
	EE ))&11F((//E((//EV
E
EE
  	GwwsCwGG"nnr   c                     | j         S r   r  r   s    r   r   zChannelCloseFixture.state  s
    {r   c                     	 | j         S # t          $ r> |                     | j                  }|                     |          | _         | j         cY S w xY wr   )_cidAttributeError_get_interpreterr  _new_channel)rY   r  s     r   r   zChannelCloseFixture.cid  sb    	9 	 	 	++DL99G))'22DI9	s   	 AAAc                 Z    |                      |          }|                     |           |S r   )r  _prep_interpreterr&  s     r   get_interpreterz#ChannelCloseFixture.get_interpreter  s.    &&v..v&&&r   Nc                 v    || j         }|dk    r| j        j        dk    rdS t          | j        j                  S )Nrr   rq   F)rl   r   r   boolr}   s     r   expect_closed_errorz'ChannelCloseFixture.expect_closed_error  s>    ;(C&==TZ.&885DJ%&&&r   c                 0    |                      |           d S r   )r  r&  s     r   prep_interpreterz$ChannelCloseFixture.prep_interpreter  s    v&&&&&r   c                     || _         d S r   r  )rY   rk   r   s      r   record_actionz!ChannelCloseFixture.record_action  s    r   c                 >    t                       t                       d S r   r   r   s    r   clean_upzChannelCloseFixture.clean_up  r   r   c                     |j         dk    rt                                          S t                                          }t          |j        d| d           t                              |          | _        | j        S )NrG   a  
                import _xxsubinterpreters
                cid = _xxsubinterpreters.channel_create()
                # We purposefully send back an int to avoid tying the
                # channel to the other interpreter.
                _xxsubinterpreters.channel_send(zC, int(cid))
                del _xxsubinterpreters
                )rX   r   r   rA   r?   r   r  )rY   r  chs      r   r  z ChannelCloseFixture._new_channel  s    <6!!..000,,..Bwz $
 24$ $ $    %11"55DIyr   c                     |dv r| j         S |dk    r| j        S |dk    r| j        S |}	 | j        |         }n)# t          $ r t          |          x}| j        |<   Y nw xY w|S )N)ro   r   rv   rw   )r   rv   rw   r  KeyErrorrI   )rY   r   rX   s      r   r  z$ChannelCloseFixture._get_interpreter  s    ''';w:w:D?T* ? ? ?-8->->>T***?Ms   7 #AAc                     |j         | j        v rd S | j                            |j                    |j        dk    rd S t	          |j         d| j         d           d S )NrG   a  
            import _xxsubinterpreters as interpreters
            import test.test__xxsubinterpreters as helpers
            ChannelState = helpers.ChannelState
            try:
                cid
            except NameError:
                cid = interpreters._channel_id(r  )r?   r  rb  rX   rA   r   r&  s     r   r  z%ChannelCloseFixture._prep_interpreter  s{    9%%F&)$$$;&  F69  15   	 	 	 	 	r   r   )r\   r]   r^   r  rW   propertyr   r   r  r  r  r  r  r  r  r  r`   ra   s   @r   r  r  f  s        
 E    *   X   X  
' ' ' '' ' '               r   r  zend interp other extra creatorz%these tests take several hours to runc                   t    e Zd ZdZ	 	 d Zd Zd Zd Zd Zddd	Z	d
 Z
d ZddZd ZddZd Zd Zd ZdS )ExhaustiveChannelTestsa  
    - main / interp / other
    - run in: current thread / new thread / other thread / different threads
    - end / opposite
    - force / no force
    - used / not used  (associated / not associated)
    - empty / emptied / never emptied / partly emptied
    - closed / not closed
    - released / not released
    - creator (interp) / other
    - associated interpreter not running
    - associated interpreter destroyed

    - close after unbound
    c              #   r  K   g V  |                      dd          D ]$}|V  |                                 D ]	}||z   V  
%|                      dd          D ]$}|V  |                                 D ]	}||z   V  
%|                     dd          D ]}|V  |                      dd          D ])}||z   }|V  |                                 D ]	}||z   V  
*|                      dd          D ])}||z   }|V  |                                 D ]	}||z   V  
*|                     dd          D ]}|V  |                      dd          D ])}||z   }|V  |                                 D ]	}||z   V  
*|                      dd          D ])}||z   }|V  |                                 D ]	}||z   V  
*d S )Nro   rv   rw   )_iter_close_action_sets_iter_post_close_action_sets_iter_use_action_sets)rY   closeactionspostactions
useactionsactionss        r   iter_action_setsz'ExhaustiveChannelTests.iter_action_sets  s       !88II 	1 	1L#@@BB 1 1"[000001 88'JJ 	1 	1L#@@BB 1 1"[000001 44VWEE 	0 	0J $ < <VW M M 0 0$|3#'#D#D#F#F 0 0K!K/////0 $ < <Wg N N 0 0$|3#'#D#D#F#F 0 0K!K/////00
 44WgFF 	0 	0J $ < <VW M M 0 0$|3#'#D#D#F#F 0 0K!K/////0 $ < <Wg N N 0 0$|3#'#D#D#F#F 0 0K!K/////00	0 	0r   c              #   x  K   ||f}t          dd|          gV  t          dd|          gV  t          dd|          t          dd|          gV  t          dd|          gV  t          dd|          gV  t          dd|          t          dd|          gV  |D ]@}|D ];}|D ]6}t          dd|          t          dd|          t          dd|          gV  7<A|D ]U}|D ]P}|D ]K}|D ]F}t          dd|          t          dd|          t          dd|          t          dd|          gV  GLQVd S )Nrn   rr   rq   rg   )rY   r&  r*  interpsr+  interp4s         r   r  z,ExhaustiveChannelTests._iter_use_action_sets/  s7     G$ %11 	 	 	 %11 	 	 	 %11%11 	 	 	 %11 	 	 	 %11 	 	 	 %11%11 	 	 	  	 	G"  &  G%eVW==%eVW==%eVW==      		 		G"  &  G#*  )%AA)%AA)%AA)%AA	    		 		r   c           
   #      K   d}||f}dD ]&}|rdnd}|D ]}|D ]}t          |||          gV  'dD ]5}	dD ]0}
|D ]+}|D ]&}t          |	d|          t          |
d|          gV  ',16d S )Nr   rm  ru   rt   rs   rr   rq   r  )rY   r&  r*  endsr  r   opr   rl   recvopsendoprr   rq   s                r   r  z.ExhaustiveChannelTests._iter_close_action_sets`  s     G$" 	 	E"'4WB!    C%b#v66    
 / 	 	F2  #  D '  )&&$??)&&$??    	 	r   c              #   d   K   dD ]*}t          dd|          gV  t          dd|          gV  +d S )N)ro   rw   rv   rn   rr   rq   r  r&  s     r   r  z3ExhaustiveChannelTests._iter_post_close_action_setss  sl      0 	 	FeVV44    eVV44    		 	r   c                 <    |D ]}|                      ||           d S r   )r   )rY   fixr  rk   s       r   run_actionsz"ExhaustiveChannelTests.run_actions|  s2     	) 	)FOOC((((	) 	)r   Tr   c                *   |                     |j                  }|                    |j        |j        |j                  }|                    |           |j        dk    r;t          |j	        |j
        ||j        |          }|                    ||           d S t                                          }t          |j        d|j	         dt#          |j
                   dt#          |           dt#          |j                   d| d| d| d           t%          t&                              t                              |          d	          t-          t                              |                    
          }|                    ||           d S )NrG   r   zB
                result = helpers.run_action(
                    z,
                    z!,
                    hideclosed=zB,
                    )
                interpreters.channel_send(zR, result.pending.to_bytes(1, 'little'))
                interpreters.channel_send(z2, b'X' if result.closed else b'')
                r   )r   r   )r~   rl   r   r   rv   rw   r  rX   r   r   rk   r   r  r   r   rA   r?   r   r   r  
from_bytesr   r  )rY   r  rk   r   rl   r   r   r  s           r   r   z!ExhaustiveChannelTests.run_action  s     ))&&sz39ciHHV$$$;&  	%  F ff-----..00Dvy 
#W
# 
# &-((
# 
# #YY	
# 
#
 #)__
# 
# !+
# 
# ,0
# 
# ,0
# 
# 
# 
 
 
 "|'@'@'F'FQQL55d;;<<  F ff-----r   c           
   #   b   K   g d}|D ]%\  }}}dD ]}dD ]}t          |||||          V  &d S )N))rG   r   rw   )r   rG   rw   )r&  r*  rw   )r&  r*  rG   )ro   rv   r  r
  )r  )rY   r   r   rv   rw   r  rl   s          r   iter_fixturesz$ExhaustiveChannelTests.iter_fixtures  s      
 
 
 %1 	R 	R FE57 R R+ R RC-c65%QQQQQQRR	R 	Rr   c                :   |rdnd}t          ||j        d          }|                                s|                     ||d           d S |                     t
          j                  5  |                     ||d           d d d            d S # 1 swxY w Y   d S )Nru   rt   ro   Fr   )rg   rl   r  r   r   r   rc   )rY   r  r   r  rt   s        r   _closezExhaustiveChannelTests._close  s    #0]]b#'622&&(( 	>OOC5O99999""<#BCC > >Uu===> > > > > > > > > > > > > > > > > >s   *BBBNc                    ||j         dk    r^|                     t          j                  5  t                              |j                   d d d            n# 1 swxY w Y   |                     t          j                  5  t                              |j        d           d d d            n# 1 swxY w Y   |                     t          j                  5  t                              |j                   d d d            n# 1 swxY w Y   |                     t          j                  5  t                              |j        d           d d d            d S # 1 swxY w Y   d S t          |j	        d           t          |j	        d           t          |j	        d           t          |j	        d           d S )	NrG   r   Tr   zz
                with helpers.expect_channel_closed():
                    interpreters.channel_recv(cid)
                z
                with helpers.expect_channel_closed():
                    interpreters.channel_send(cid, b'spam')
                z{
                with helpers.expect_channel_closed():
                    interpreters.channel_close(cid)
                z
                with helpers.expect_channel_closed():
                    interpreters.channel_close(cid, force=True)
                )
rX   r   r   rc   r   r   r   r   rA   r?   )rY   r  r   s      r   _assert_closed_in_interpz/ExhaustiveChannelTests._assert_closed_in_interp  s   >V[F22""<#BCC 3 3))#'2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3""<#BCC < <))#'7;;;< < < < < < < < < < < < < < <""<#BCC 4 4**373334 4 4 4 4 4 4 4 4 4 4 4 4 4 4""<#BCC @ @**37$*???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ vy #    vy #    vy #    vy #     sG    AA!A!B11B58B5 DDD1"E  E$'E$c                    |                      |j        j                   t          |j        j                  D ]!}t
                              |j                   "|                     |           dD ]9}|	                    |          }|j
        dk    r#|                     ||           :|	                    d          }|                     ||           d S )N)ro   rv   rG   fresh)r   r   r   r   r   r   r   r   r  r  rX   )rY   r  r  r   s       r   _assert_closedz%ExhaustiveChannelTests._assert_closed  s    	()))sy()) 	/ 	/A%%cg....%%c***' 	7 	7F((00F{f$$))#v6666$$W--%%c622222r   Fc              #   $  K   d}|                                  D ]}t                       |                                 D ]}|dz  }|dk    r  d S |rL|dz
  dz  dk    rt                       t          ||d                    t	          |                               nL|dz
  dz  dk    rt          dd           t          d	d           t
          j                                         |||fV  |rt          d
           t                       d S )Nr   r   r      z({} actions) r   r|   .z---)r  printr  rS   rc  r   stdoutr  )rY   verboser   r  r  s        r   _iter_close_testsz(ExhaustiveChannelTests._iter_close_tests  s4     ,,.. 	 	GGGG))++ & &Qt88FFF ;A{a''!S."7"7G"E"EFFFFA{a''cr****#2&&&&
(8(8(:(:(:go%%%% er   c                 T    dt           _        |                                 D ]\  }}}d S )NT)r  r  r  rY   r   r  r  s       r   _skim_close_testsz(ExhaustiveChannelTests._skim_close_tests  s9    $(!#5577 	 	OAsG	 	r   c                    |                                  D ]\  }}}|                     d                    |||                    5  |                    |j                   |                     ||           |                     |d           |                     |           d d d            n# 1 swxY w Y   |                                 d S )N	{} {}  {}Fr   	r  r   rS   r  r   r  r  r  r  r  s       r   
test_closez!ExhaustiveChannelTests.test_close  s   #5577 		 		OAsGk00CAABB ) )$$SZ000  g...Cu---##C((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) LLNNNN		 		   AB..B2	5B2	c                    |                                  D ]\  }}}|                     d                    |||                    5  |                    |j                   |                     ||           |                     |d           |                     |           d d d            n# 1 swxY w Y   |                                 d S )Nr  Tr   r  r  s       r   test_force_closez'ExhaustiveChannelTests.test_force_close		  s   #5577 		 		OAsGk00CAABB ) )$$SZ000  g...Ct,,,##C((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) LLNNNN		 		r  r   )F)r\   r]   r^   r   r  r  r  r  r  r   r  r  r  r  r  r  r  r  rd   r   r   r  r    s          +0 +0 +0Z/ / /b  &  ) ) ) 59 . . . . .@R R R> > >   83 3 3    ,  

 
 

 
 
 
 
r   r  r  r   )6collectionsr   r  r   r   r  r   textwrapr   r5   r&   r3  testr   test.supportr   r   import_moduler   r   r#   r.   r  r<   rA   r>   rI   re   rg   r   r   r   r   r   TestCaser   r   r   r  r  r  r#  r6  r[  r}  r  r  r  r  r  r4  r  r\   rG   rd   r   r   <module>r     s   " " " " " "         				  



                   & & & & & & & & & & & & +}*+?@@	. 	. 	.         <$ $ $ -/ 	4 	4 	4 	4! ! ! ! !**]I66 ! ! !L + + +/# /# /# /# /#JJ0CDD /# /# /#fE E E E E::n.>?? E E E& 7;     *!! !! !!H        x    /4 /4 /4 /4 /4x( /4 /4 /4d9; 9; 9; 9; 9;* 9; 9; 9;~. . . . .8 . . ..' ' ' ' 'h ' ' '.) ) ) ) )8 ) ) )*&( &( &( &( &(X &( &( &(R8$ 8$ 8$ 8$ 8$ 8$ 8$ 8$vZK ZK ZK ZK ZK( ZK ZK ZKz_= _= _= _= _=8 _= _= _=Dc% c% c% c% c%X c% c% c%R	V& V& V& V& V&X V& V& V&rs8 s8 s8 s8 s88 s8 s8 s8lb+ b+ b+ b+ b+( b+ b+ b+Jn n n n n**%:%EG G n n nb 677{ { { { {X { { 87{|	 zHMOOOOO r   