
    [h                     x   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlZd dlmZ	 ddl
mZ ddl
mZ ddl
mZ dd	l
mZ dd
lmZ  G d de          Zd Zd Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zedk    r ej                     dS dS )    N)ABCMeta)abstractmethod)greenlet   )TestCase)RUNNING_ON_MANYLINUX)PY313)PY314)fails_leakcheckc                       e Zd ZdS )	SomeErrorN__name__
__module____qualname__     k/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/greenlet/tests/test_greenlet.pyr   r      s        Dr   r   c                     	 t          j                    j                                         n2#  |                     t          j                    d                     xY wt          Nr   )r   
getcurrentparentswitchappendsysexc_infor   seens    r   fmainr   !   sV    $++----CLNN1%&&&
Os	   *- /Ac                 X    d }t          ||           }|                    |           d S )Nc                     | Nr   )excs    r   crasherzsend_exception.<locals>.crasher-   s    	r   r   RawGreenletr   )gr#   r$   g1s       r   send_exceptionr*   *   s6      	WQ	'	'	'BIIcNNNNNr   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 ej        eoe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 e!d1d            Z"e!d             Z#d Z$e!d              Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+ ej        eoed'          d(             Z,d) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0S )2TestGreenletc                 b   g fd}t          |          }                    d           |                                                     d           |                                                     d           |                     t	          t          d                               d S )Nc                                            d           t          j                    j                                                               d           d S )Nr      r   r   r   r   r   lsts   r   fz'TestGreenlet._do_simple_test.<locals>.f8   sC    JJqMMM!!(//111JJqMMMMMr   r            )r'   r   r   assertEquallistrange)selfr3   r(   r2   s      @r   _do_simple_testzTestGreenlet._do_simple_test5   s    	 	 	 	 	 NN

1	




1	




1d588nn-----r   c                 .    |                                   d S r"   )r;   r:   s    r   test_simplezTestGreenlet.test_simpleD   s    r   c                     t                      }|                     t                    5 }|                                 d d d            n# 1 swxY w Y   |                     dt          |j                             d S Nrun)r'   assertRaisesAttributeErrorr   assertInstr	exceptionr:   r(   r#   s      r   (test_switch_no_run_raises_AttributeErrorz5TestGreenlet.test_switch_no_run_raises_AttributeErrorG   s    MM~.. 	#HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	eS//00000s   A

AAc                 
   t                      }|                     t                    5 }|                    t                     d d d            n# 1 swxY w Y   |                     dt          |j                             d S r@   )r'   rB   rC   throwr   rD   rE   rF   rG   s      r   'test_throw_no_run_raises_AttributeErrorz4TestGreenlet.test_throw_no_run_raises_AttributeErrorN   s    MM~.. 	#GGI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	eS//00000s   AAAc                     t          d           }|                     |           |                     |j        t	          j                               d S )Nr%   )r'   assertIsNotNoneassertIsr   r   r   r:   r(   s     r   test_parent_equals_Nonez$TestGreenlet.test_parent_equals_NoneU   sK    t$$$Qah 3 5 566666r   c                     t          d           }|                     |           |                     |j                   d S )N)rA   )r'   rM   assertIsNonerA   rO   s     r   test_run_equals_Nonez!TestGreenlet.test_run_equals_NoneZ   sB    D!!!Q!%     r   c                 v   g fd}t          |          }t          |          }|                                 |                     t                    d           |                                 |                     t                    d           |                                 |                     t                    d           |                     |j        d           |                                 |                     t                    d           |                     |j        d           d S )Nc                                            d           t          j                    j                                                              ddg           d S )Nr   )r   r   r   r   r   extendr1   s   r   r3   z)TestGreenlet.test_two_children.<locals>.fb   sL    JJqMMM!!(//111JJ1vr   r   r4   r5   T   )r'   r   r7   lendead)r:   r3   r(   hr2   s       @r   test_two_childrenzTestGreenlet.test_two_children_   s   	 	 	 	 	 NNNN	


S1%%%	


S1%%%	


S1%%%&&&	


S1%%%&&&&&r   c                    g fdfd}|                      t          j        |          t          sdnd           t	          |          }|                      t          j        |          t          sdnd           |                                 |                      g d           |                      t          j        |          t          sdnd           d S )Nc                                            d           t          j                    j                                         d S )Nbr0   r1   s   r   r3   z3TestGreenlet.test_two_recursive_children.<locals>.fv   s6    JJsOOO!!(//11111r   c                                           d           t                    } |                                                       d           d S )Nac)r   r'   r   )r(   r3   r2   s    r   r(   z3TestGreenlet.test_two_recursive_children.<locals>.gz   s=    JJsOOOAAHHJJJJJsOOOOOr   r4   r   )r`   r^   ra   )r7   r   getrefcountr
   r'   r   )r:   r(   r3   r2   s     @@r   test_two_recursive_childrenz(TestGreenlet.test_two_recursive_childrens   s    	2 	2 	2 	2 	2	 	 	 	 	 	
 	++e-BQQCCCNN 	++e-BQQCCC	


ooo...++e-BQQCCCCCr   c                     g  fdfdt          d          D             }|D ]}|                                 |D ]}|                    d                                t	                    t	          |                     d S )Nc                  Z                                                           d           d S NT)r;   r   )r:   successs   r   r3   z$TestGreenlet.test_threads.<locals>.f   s-      """NN4     r   c                 :    g | ]}t          j                   S )target)	threadingThread).0ir3   s     r   
<listcomp>z-TestGreenlet.test_threads.<locals>.<listcomp>   s'    ===ayq)))===r   
   )r9   startjoinr7   rX   )r:   thsthr3   rg   s   `  @@r   test_threadszTestGreenlet.test_threads   s    	! 	! 	! 	! 	! 	! >===599=== 	 	BHHJJJJ 	 	BGGBKKKKWs3xx00000r   c                 z   g }t          t                    }t          t                    }|                    |           |                    |           ||_        |                     |g            |                     t          |j                   |                     |t          g           |                                }|                     |d           |                     |t          g           |                    d          }|                     |d           |                     |t          g           d S )Nr      )r'   r   r   r   r7   rB   r   )r:   r   r)   g2values        r   test_exceptionzTestGreenlet.test_exception   s   
		$
		$	r""" 	)RY///	{+++		###	{+++		"###	{+++++r   c                     g }t          t                    }|                    |           |                     t          t
          |t                     |                     |t          g           d S r"   )r'   r   r   rB   KeyErrorr*   r7   )r:   r   r)   s      r   test_send_exceptionz TestGreenlet.test_send_exception   s[    
		$(NBAAAz*****r   c                    g }t          t                    }t          t                    }|                    |           |                    |           |                     |g            ~t	          j                     |                     |t          j        g           ~t	          j                     |                     |t          j        t          j        g           d S r"   )r'   r   r   r7   gccollectr   GreenletExit)r:   r   r)   rx   s       r   test_dealloczTestGreenlet.test_dealloc   s    
		$
		$r"""

 56777

 5x7LMNNNNNr   c                    d }t          |          }|                                 t          j        }ddlm}  |            x}t          _        	 ~|t          _        n# |t          _        w xY w|                                }|                     d|           |                     d|           |                     d|           d S )Nc                      	 t          j                    j                                         d S # t           j        $ r	 t
          d w xY wr"   )r   r   r   r   r   r   r   r   r   rA   zHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.run   sQ    *#%%,3355555( * * *T)*s	   *. Ar   )StringIO	Exceptionignoredr   )r'   r   r   stderrior   getvaluerD   )r:   rA   r(   	oldstderrr   r   vs          r   .test_dealloc_catches_GreenletExit_throws_otherz;TestGreenlet.test_dealloc_catches_GreenletExit_throws_other   s    	* 	* 	* 	



 J	&hjj(	#"CJJCJ""""OOk1%%%i###k1%%%%%s   A A,z=Sometimes flaky (getting one GreenletExit in the second list)c                 |   g g t          j                    t          j                    t          j                    t          j                    fd}t          j        |          }|                                                     d           |                     g            |                     t                    d           d d = t          j                     |                     g            	                                                     d           	 |                     t          j        g           	                                 |                    d           d d = d d = d S # 	                                 |                    d           d d = d d = w xY w)Nc                     t          t                    } |                                                    |            ~ t	          j                                                                          d           t                                                                            d           t                       d S )Nr/   )r'   r   r   r   r   r   setwait)r)   /bg_glet_created_running_and_no_longer_ref_in_bgbg_should_be_clearfg_ref_releasedok_to_exit_bg_threadr   somerefs    r   r3   z1TestGreenlet.test_dealloc_other_thread.<locals>.f   s    U##BIIdOOONN2JLLL;??AAA  ###MMM""$$$ %%a(((MMMMMr   ri   rp   r   r/   )rk   Eventrl   rq   r   r7   rX   r   r   r   r   r   rr   )	r:   r3   tr   r   r   r   r   r   s	      @@@@@@r   test_dealloc_other_threadz&TestGreenlet.test_dealloc_other_thread   s    :C/:K:K7#/++&_..(00	 	 	 	 	 	 	 	 	 	 A&&&				7<<R@@@r"""Wq)))AAAJ

r""""""	TH$9#:;;; $$&&&FF2JJJQQQ


 !$$&&&FF2JJJQQQ
NNNNs   0!F 5F;c                 n     fd}t          |          }|                                }                     ||j        u                                 |           |                                }                     |                                |d                                |j        d            d S )Nc                      t          j        d          }                     | j        d            t	          j                    j                            |            dS )Nr   meaning of life)r   	_getframer7   f_backr   r   r   r   )r3   r:   s    r   f1z#TestGreenlet.test_frame.<locals>.f1  sP    a  AQXt,,,!!(//222$$r   r   )r'   r   
assertTruegr_frameassertFalser7   )r:   r   r(   framefrom_gs   `    r   
test_framezTestGreenlet.test_frame  s    	% 	% 	% 	% 	%
 OO

+,,,!2333T*****r   c                    d }t          j        |d          }t          j        |d          }|                                 |                                 |                    d           |                    d           d S )Nc                 T     t           fd          }|                                 d S )Nc                  ,    t          j                   S r"   )timesleepxs   r   <lambda>z>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>'  s    DJqMM r   r&   )r   r(   s   ` r   runnerz,TestGreenlet.test_thread_bug.<locals>.runner&  s+    111122AHHJJJJJr   )g?rj   args)g333333?rp   )rk   rl   rq   rr   )r:   r   t1t2s       r   test_thread_bugzTestGreenlet.test_thread_bug%  sy    	 	 	 V&999V&999









r   c                       fd}t          |                              dd          }                     |d           d S )Nc                 `                         | d                                |d           dS )Nr5   r4   *   )r7   )r`   r^   r:   s     r   rA   z,TestGreenlet.test_switch_kwargs.<locals>.run1  s4    Q"""Q"""2r   r5   r4   )r`   r^   r   r'   r   r7   )r:   rA   r   s   `  r   test_switch_kwargszTestGreenlet.test_switch_kwargs0  sZ    	 	 	 	 	 ##a1#--Br   c                 (   d }t          |          }|                     ddi|                    d                     |                     dddif|                                           |                     d|                                           d S )Nc                     t          j                    j                            |            t          j                    j                            dd           | | dz  fS )Nr   r4   r/   r   r   r   r   r   s    r   rA   z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.run9  sX    !!(//!/444!!(//Q/777a1f9r   r   r/   )r4   )r/   	   )r'   r7   r   )r:   rA   r(   s      r   test_switch_kwargs_to_parentz)TestGreenlet.test_switch_kwargs_to_parent8  s    	 	 	 #q188A;;///$a)188::666,,,,,r   c                    i t          j                    t          j                    fd}t          j        |          }|                                                     d           |                     t          j                  5  d                                          d d d            n# 1 swxY w Y   	                                 |
                    d                                            d S )Nc                      t          d           d<                                                         d           d S )Nc                      d S r"   r   r   r   r   r   zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>H      D r   r(   rp   r'   r   r   created_eventdata
done_events   r   rA   z7TestGreenlet.test_switch_to_another_thread.<locals>.runG  @    #LL11DIOOBr   ri   rp   r(   )rk   r   rl   rq   r   rB   r   errorr   r   rr   clear)r:   rA   threadr   r   r   s      @@@r   test_switch_to_another_threadz*TestGreenlet.test_switch_to_another_threadB  s.   !))_&&
	  	  	  	  	  	  	  !---2x~.. 	 	I	 	 	 	 	 	 	 	 	 	 	 	 	 	 	B

s   B77B;>B;c                 b      fd} fdt          |                                           d S )Nc                      	 t          d          #  t          j                    } t                                                                         | t          j                               Y d S xY w)Nfun)
ValueErrorr   r   r'   r   r7   )r   rZ   r:   s    r   r3   z&TestGreenlet.test_exc_state.<locals>.fV  sg    ; ''';<>>A%%'''  3<>>::::::s
    AA2c                  V                          t          j                    d           d S )N)NNN)r7   r   r   r=   s   r   rZ   z&TestGreenlet.test_exc_state.<locals>.h^  s&    S\^^-?@@@@@r   r&   )r:   r3   rZ   s   ` @r   test_exc_statezTestGreenlet.test_exc_stateU  s`    	; 	; 	; 	; 	; 	;	A 	A 	A 	A 	A 	Ar   c                    d }d }d }t          |          }|                     |j        i            |                                 |                     |j        d           |                     |j        ddi           |j        |_        |                     |j        ddi           |                     t          ||           |                     t          ||d           d S )Nc                  6    dt          j                    _        d S Nr   )r   r   testr   r   r   r3   z*TestGreenlet.test_instance_dict.<locals>.fd  s    )+H!!&&&r   c                 
    | ` d S r"   __dict__)r(   s    r   deldictz0TestGreenlet.test_instance_dict.<locals>.deldictf  s    


r   c                     || _         d S r"   r   )r(   ry   s     r   setdictz0TestGreenlet.test_instance_dict.<locals>.setdicth  s    AJJJr   r   r   )r'   r7   r   r   r   rB   	TypeError)r:   r3   r   r   r(   s        r   test_instance_dictzTestGreenlet.test_instance_dictc  s    	, 	, 	,	 	 		 	 	NNR(((	


$$$fb\222Z
fb\222)Wa000)Wa44444r   c                     g fd}t          |          }|                                 |                     dg           d S )Nc                  p                          t          t          j                    d                     d S r@   )r   hasattrr   r   )has_runs   r   funcz;TestGreenlet.test_running_greenlet_has_no_run.<locals>.funcv  s9    NN+--u55    r   Fr   )r:   r   r(   r   s      @r    test_running_greenlet_has_no_runz-TestGreenlet.test_running_greenlet_has_no_runt  s[    	 	 	 	 	
 	


5'*****r   c                     dd l }|                     t          |j         t                                 |                     t          |j        t                                 d S r   )copyrB   r   r'   deepcopy)r:   r   s     r   test_deepcopyzTestGreenlet.test_deepcopy  sM    )TY>>>)T]KMMBBBBBr   c                 f   t          d           t          j                    g fd}t          |          }|                                 ~|                                |                     d                    |                     d         j                   d d = d d d S )Nc                      d S r"   r   r   r   r   r   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>  s    $ r   c                  (   	                                   d S # t          j        $ ri                     t          j                    j                                       t          j                                                                  Y d S w xY wr"   )r   r   r   r   r   r   )hubmainresults   r   workerz9TestGreenlet.test_parent_restored_on_kill.<locals>.worker  s    (   h133:;;;h133444

	s    A4BBr%   r   r   )r'   r   r   r   r   rN   r   )r:   r   r(   r   r   r   s      @@@r   test_parent_restored_on_killz)TestGreenlet.test_parent_restored_on_kill  s    ,,''"$$	 	 	 	 	 	 	 s+++	


fQi&&&fQi&,,, 111Ir   c                     t                      }t          d |          }|                     t                    5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                      d S r"   r   r   r   r   r   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>       r   r%   )r'   rB   rC   r   )r:   r)   rx   s      r   test_parent_return_failurez'TestGreenlet.test_parent_return_failure  s    ]]b111~.. 	 	IIKKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA!$A!c                      G d dt                     } |d           }|                     t          |j        t                                 d S )Nc                       e Zd Zd ZdS )>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletc                 J    	 t           #  Y nxY wt          j        | |          S r"   )r   r'   __getattribute__r:   names     r   r   zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__  s-    #OD"3D$???s   	 Nr   r   r   r   r   r   r   
mygreenletr     s(        @ @ @ @ @r   r   c                      d S r"   r   r   r   r   r   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>      t r   )r'   rB   r   rJ   )r:   r   r(   s      r   test_throw_exception_not_lostz*TestGreenlet.test_throw_exception_not_lost  sk    	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ J||$$)QWikk:::::r   Fc                    g d fd}t          j        |          }|                                 |                    d           ~r|                                  |                     t          j                  5 }d                             t                     d d d            n# 1 swxY w Y   s2t          |j                  }|                     |dk    pd|v            n(|                     t          |j                  d           t          d         j        d          rQ|                     t                     5  d         j                                         d d d            n# 1 swxY w Y   sEt          d         j        j        d          r$d         j        j                                         n |                     d         j                   ~d d d = d	| _        d S )
Nc                  Z    t          j                    j                                         d S r"   r   r   r   r   r   zGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.worker  &    !!(//11111r   c                      t                    } |                                                      |            r)|                                  t          j                     d S d S r"   )r'   r   r   r   r   )r(   r   wait_for_cleanupr   s    r   creatorzHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creator  sc    F##AHHJJJMM! &


#%%%%%& &r   ri   rp   r   Bcannot switch to a different thread (which happens to have exited)zCannot switchr   T)rk   rl   rq   rr   wait_for_pending_cleanupsrB   r   r   rJ   r   rE   rF   r   r7   r   r   RuntimeErrorr   f_localsrR   expect_greenlet_leak)r:   r  r  r   r#   sr   r   s    `    @@r   *_do_test_throw_to_dead_thread_doesnt_crashz7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crash  s   	2 	2 	2	& 	& 	& 	& 	& 	& 	& G,,,					r


  	-**,,,x~.. 	'#1IOOI&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'   
	CM""AOOYY ("a'   
 CM""T  
 6!9%w// 	+""<00 + +q	"((***+ + + + + + + + + + + + + + +   	2vay)2G<< 4q	"+11333fQi0111111I %)!!!s$   !B11B58B5 E99E= E=c                 .    |                                   d S r"   r  r=   s    r   &test_throw_to_dead_thread_doesnt_crashz3TestGreenlet.test_throw_to_dead_thread_doesnt_crash  s    7799999r   c                 0    |                      d           d S rf   r  r=   s    r   +test_throw_to_dead_thread_doesnt_crash_waitz8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_wait  s    77=====r   c                      G d dt                     } |            }|                     |                    d          d           d| _        d S )Nc                        e Zd Zd Zd Zd ZdS )7TestGreenlet.test_recursive_startup.<locals>.convolutedc                 <    t          j        |            d| _        d S r   )r'   __init__countr=   s    r   r  z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__  s    $T***


r   c                     |dk    r'| j         dk    rd| _         |                     d           t          j        | |          S )NrA   r   r   +   )r  r   r'   r   r   s     r   r   zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__  s>    5==TZ1__!"DJKKOOO"3D$???r   c                 :    	 | j                             |           r"   r   r   )r:   ry   s     r   rA   z;TestGreenlet.test_recursive_startup.<locals>.convoluted.run  s"    .K&&u---.r   N)r   r   r   r  r   rA   r   r   r   
convolutedr    sD          @ @ @
. . . . .r   r  r   r  T)r'   r7   r   r
  )r:   r  r(   s      r   test_recursive_startupz#TestGreenlet.test_recursive_startup  si    	. 	. 	. 	. 	. 	. 	. 	. JLL"r***
 %)!!!r   c                    t          j                                                     t          j                                                      G fddt                    }d }fd}t	          j                    }t          |          g |            d         _        d                                          t          j	        |          }|
                                                                                                   |                     t	          j                    |           |                    d           d S )Nc                       e Zd Z fdZdS );TestGreenlet.test_threaded_updatecurrent.<locals>.finalizedc                 X                                                                       d S r"   releaseacquire)r:   lock1lock2s    r   __del__zCTestGreenlet.test_threaded_updatecurrent.<locals>.finalized.__del__  s#     r   Nr   r   r   r'  r%  r&  s   r   	finalizedr     s3                       r   r*  c                  Z    t          j                    j                                         d S r"   r   r   r   r   deallocatorz=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocator  r  r   c                                                        t          j                      d=                                                                    t          j                                                      d S r   r$  r   r   r#  )r(   r%  r&  s   r   fthreadz9TestGreenlet.test_threaded_updatecurrent.<locals>.fthread  s`    MMOOO!!!!MMOOOMMOOO!!!MMOOOOOr   r   ri   rp   )rk   Lockr$  objectr   r   r'   bombr   rl   rq   r#  r7   rr   )	r:   r*  r,  r/  r   r   r(   r%  r&  s	         @@@r   test_threaded_updatecurrentz(TestGreenlet.test_threaded_updatecurrent
  sT       	  	  	  	  	  	  	  	  	  	  	 	2 	2 	2	 	 	 	 	 	 	 "$$%%&IKK!		!G,,,				 	,..555	r




r   c                 "   g fdd t                    gd                                          t          d                                                   }|                                |                     |d           d S )Nc                     t          j                    j                                        } d= t          j                    j        _        	 t          j                    j                            |                                t          j                               d S #                     t          j                               w xY wr   )r   r   r   r   r   )ry   	initiatorr   r   s    r   r   z>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.worker;  s    '))07799Eq	'244;I3#%%,33E:::H/1122222H/112222s   +B   (Cc                      dS r   r   r   r   r   r6  zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiatorH      2r   r   r   )r'   r   r   r7   )r:   ry   r6  r   r   s     @@@r   !test_dealloc_switch_args_not_lostz.TestGreenlet.test_dealloc_switch_args_not_lost9  s    	3 	3 	3 	3 	3 	3 	3	 	 	 f%%&q		6!955	  ""#####r   c                     d  G d dt                     } |            t          d          fd}t          |          }|                     |                                           d S )Nc                      | |i | d S r"   r   )r   r`   ks      r   _applyz0TestGreenlet.test_tuple_subclass.<locals>._applya  s    D!MqMMMMMr   c                       e Zd Zd ZdS )1TestGreenlet.test_tuple_subclass.<locals>.mytuplec                     t          j                                                     t                              |           S r"   )r   r   r   tuple__len__r=   s    r   rB  z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__e  s/    #%%,,...}}T***r   N)r   r   r   rB  r   r   r   mytupler?  d  s#        + + + + +r   rC  r   )r`   c                  X      t          j                    j        j                   d S r"   r   )r=  r   kwargss   r   switchapplyz5TestGreenlet.test_tuple_subclass.<locals>.switchapplyj  s,    F8&((/6fEEEEEr   )rA  dictr'   r7   r   )r:   rC  rF  r(   r=  r   rE  s       @@@r   test_tuple_subclassz TestGreenlet.test_tuple_subclassS  s    	 	 		+ 	+ 	+ 	+ 	+e 	+ 	+ 	+ wyy	F 	F 	F 	F 	F 	F 	F$$V,,,,,r   c                     t          dt          fdt          d           i          } G d d|          } G d d|          } |             |                     t          |           d S )NAbstractSubclassrA   c                     d S r"   r   r=   s    r   r   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>s  s     r   c                       e Zd ZdS ):TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   BadSubclassrM  u          Dr   rN  c                       e Zd Zd ZdS );TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                     d S r"   r   r=   s    r   rA   z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runy  s    r   N)r   r   r   rA   r   r   r   GoodSubclassrQ  x  s#            r   rS  )r   r'   r   rB   r   )r:   rJ  rN  rS  s       r   test_abstract_subclassesz%TestGreenlet.test_abstract_subclasseso  s    "NN#4#45568 8
	 	 	 	 	* 	 	 		 	 	 	 	+ 	 	 	 	)[11111r   c                      t          j                    sd S t          j                    d         dk     rd S  fd}t          d          D ]} |            r d S d S )Nr   2   c                  L  	
 t          j                    

                                 t          j                                                     dg
fd} t          j        |           }|                                  G 
fddt
                    	 G 	fddt
                    }g }t          dz            }t          j                    } |            }|D ]Q}d }d	         r|	                    d
            dS t                      }d	         r nH|                    |           Rt          j                     d	         r|	                    d
           dS                     |j        |           |D ]}                    |j        |           dS )NFc                  ~                                       t          j                                                      d S r"   r.  r)  s   r   another_threadzWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_thread  s0    #%%%r   ri   c                       e Zd Z fdZdS )TTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callbackc                 b                                                                       dd<   d S )NTr   r"  )r:   r%  r&  recycleds    r   r'  z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__  s*    MMOOOMMOOO"&HQKKKr   Nr(  )r%  r&  r]  s   r   gc_callbackr[    s8        ' ' ' ' ' ' ' ' 'r   r^  c                       e Zd Z fdZdS )PTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                 4    | | _                      | _        d S r"   )cyclecallback)r:   r^  s    r   r  zYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__  s    !%DJ$/KMMDMMMr   N)r   r   r   r  )r^  s   r   garbager`    s.        2 2 2 2 2 2 2r   rd  r4   r   rp   T)rk   r0  r$  rl   rq   r1  r9   r   r   rr   r'   r   r   r   r7   r   )rY  r   rd  lr   currentr(   _lastr^  r%  r&  r]  Nr:   s            @@@@r   attemptz?TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt  s   N$$EMMOOON$$EMMOOOwH             777AGGIII' ' ' ' ' ' ' ' 'f ' ' '
2 2 2 2 2 2 2& 2 2 2 Aac

A)++G		A  A; !FF2JJJ 55"}}A; E 
A; FF2JJJuT['222 4 4  733334r   r6   )r   	isenabledget_thresholdr9   )r:   rj  rg  ri  s   `  @r   !test_implicit_parent_with_threadsz.TestGreenlet.test_implicit_parent_with_threads  s    |~~ 	Fq!r66F,	 ,	 ,	 ,	 ,	 ,	Z q 	 	Awyy 	 	r   c                 @    ddl m ddl m  G d dt                    }t	          j        |          }g  _         fd}t          d          D ]} ||                                             ` 	                    t	          j        |          |           d S )Nr   r   )r   c                       e Zd ZdS )TTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   Greenletrq    rO  r   rr  c                      	              j                                          d S #  $ r& j                                                    Y d S w xY wr"   )r   r   gletsr   )r   r   r:   s   r   greenlet_mainzYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_main  si    0
#**,,,,, 0 0 0
!!**,,//////0s   !& 'AArp   )
r   r   r   r'   r   rb   rt  r9   r   r7   )r:   rr  initial_refsru  rg  r   r   s   `    @@r   5test_issue_245_reference_counting_subclass_no_threadszBTestGreenlet.test_issue_245_reference_counting_subclass_no_threads  s     	('''''))))))	 	 	 	 	{ 	 	 	 x00 
	0 	0 	0 	0 	0 	0 	0 r 	- 	-AH]##**,,,,J22LAAAAAr   z;The manylinux images appear to hang on this test on 3.13rc2c                 D  
 ddl m} ddl m} ddlm  G d dt
                    
g  |            fd
fd}t          j        
          }g }t          |d	z             D ]C} |            } |||f
          }|	                    |           |
                                 D|D ]}	|	                    d           d d =                                  |                                  |                     t          j        
          |           d S )Nr   )rl   )r   ro  c                       e Zd ZdS )STestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   
MyGreenletrz    rO  r   r{  c                  J                  j                                          d S r"   r  ro  s   r   ru  zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_main  s$    JLL&&(((((r   c                                }                     |           |                                 ~|                                                      d                         d S )Nrp   )r   r   r   r   )greenlet_running_eventminer{  r   rt  ru  ref_cleareds     r   thread_mainzTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_main  sm    :m,,DLLKKMMM"&&((( R    JLLLLLr   -   r   rp   )rk   rl   r   r   r   r'   r   rb   r9   r   rq   r   r   r  r7   )r:   rl   r   r  rv  thread_ready_eventsrg  eventr   r   r{  r   rt  ru  r  s             @@@@@r   2test_issue_245_reference_counting_subclass_threadsz?TestGreenlet.test_issue_245_reference_counting_subclass_threads  s    	%$$$$$######''''''	 	 	 	 	 	 	 	 egg	) 	) 	) 	) 	)	 	 	 	 	 	 	 	 	8 z22 r!
 
 	 	A EGGEV;eX>>>F&&u---LLNNNN . 	  	 JOOB !!!H 	&&(((44lCCCCCr   c                     d }t          |          }d }t          ||          }|                     t                    5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                      dS )N   r   r   r   r   no_argsz\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_args   r8  r   c                      dS r   r   r   r   r   leafzYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf%  r8  r   )r'   rB   r   r   )r:   r  parent_never_startedr  childs        r   >test_falling_off_end_switches_to_unstarted_parent_raises_errorzKTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error  s    	 	 	  +733	 	 	 D"677 y)) 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s    A""A&)A&c                     d }t          |          }d }t          ||          }|                                }|                     |d           d S )Nc                 
    | dfS N   r   r   s    r   one_argzUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_arg/  s    r7Nr   c                      dS r   r   r   r   r   r  zRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf4  r8  r   )r   r  r   )r:   r  r  r  r  r   s         r   7test_falling_off_end_switches_to_unstarted_parent_workszDTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.  sk    	 	 	  +733	 	 	 D"677*****r   c                     G d dt                     } |            }g t          fd|          }|                     t                    5  |                                 d d d            n# 1 swxY w Y   |                     dg           |                     t                    5  |                                 d d d            n# 1 swxY w Y   |                     dg           d S )Nc                       e Zd Zd ZdS )XTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentc                      |dk    rt           d S r@   )r   r   s     r   r   ziTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parent.__getattribute__>  s    5==#O !=r   Nr   r   r   r   Parentr  =  s#        $ $ $ $ $r   r  c                  .                          d          S r   r   r   s   r   r   zZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>E      DKKOO r   r   )r'   rB   r   r   r7   )r:   r  r  r  r   s       @r   ;test_switch_to_dead_greenlet_with_unstarted_perverse_parentzHTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent<  s   	$ 	$ 	$ 	$ 	$[ 	$ 	$ 	$  &vxx33335IJJ y)) 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	t$$$y)) 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	t$$$$$s$   A//A36A3+CCCc                 :   g t          fd          }t          fd          }|                                 |                     dg           ||_        |                                }|                     |           |                     ddg           d S )Nc                  .                          d          S r  r  r   s   r   r   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>S  s    4;;r?? r   c                  .                          d          S r   r  r   s   r   r   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>T  r  r   r   r  )r'   r   r7   r   rR   )r:   r  r  r   r   s       @r   %test_switch_to_dead_greenlet_reparentz2TestGreenlet.test_switch_to_dead_greenlet_reparentQ  s    *+B+B+B+BCC333344t$$$+&!!!Bx(((((r   c                 *   t          j                    fd}fdt          |          }|                                 t          d           }|                                 |                     |j                   |                     |j        j        j        d           |                     |j        j	                   |                     |j        j	        j        j        d           | 
                    |j        j	        j	                   d S )Nc                                     d S r"   r   inners   r   outerzHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.outere  s    EGGGGGr   c                  V                          t          j        d                     d S r   )r   r   r   r   s   r   r  zHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.innerh  s%    KKa(()))))r   c                      d S r"   r   r   r   r   r   zKTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.<lambda>q       r   r  r  )r   r   r'   r   rM   r   r7   f_codeco_namer   rR   )r:   r  r   	unrelatedr  r   s       @@r   ,test_can_access_f_back_of_suspended_greenletz9TestGreenlet.test_can_access_f_back_of_suspended_greenlet_  s    "$$	 	 	 	 		* 	* 	* 	* 	* %  

  --	 	S\***,4g>>>S\0111,3;WEEE#,-455555r   c                    ddl m ddlm fdt	                    }|                    d           |j        }t          d          D ]*}|                     |j	        d         |           |j
        }+|                     |j	        d         d           |                     |j
                   |                     |                    d          d	           d S )
Nr   )partialr   )_test_extension_cppc                     | dk    r%|                       | dz
                      z  S t          j                    j                                        S )Nr   r   )	test_callr   r   r   r   )r   r  r  recurses    r   r  z@TestGreenlet.test_get_stack_with_nested_c_calls.<locals>.recurse  sT    1uu.88!a%9P9PQQQQ&((/66888r   r6   r   rp   i  )	functoolsr   r  r'   r   r   r9   r7   r	  r   rR   )r:   grr   rn   r  r  r  s       @@@r   "test_get_stack_with_nested_c_callsz/TestGreenlet.test_get_stack_with_nested_c_calls|  s   %%%%%%))))))	9 	9 	9 	9 	9 	9 	9
 !!
		!q 	! 	!AU^C0!444LEE,a000%,'''2-----r   c                 F   t          j                    fd}fdt          |          }|                                }t          d           }|                                 |                     |j        j        d           |                     |j                   d S )Nc                  B      t          j        d                     d S r   )r   r   r  s   r   r  z6TestGreenlet.test_frames_always_exposed.<locals>.outer  s#    E#-""#####r   c                 2                         |            d S r"   )r   )r   r   s    r   r  z6TestGreenlet.test_frames_always_exposed.<locals>.inner  s    KKr   c                      d S r"   r   r   r   r   r   z9TestGreenlet.test_frames_always_exposed.<locals>.<lambda>  r  r   r  )	r   r   r'   r   r7   r  r  rR   r   )r:   r  r  r   r  r  r   s        @@r   test_frames_always_exposedz'TestGreenlet.test_frames_always_exposed  s     "$$	$ 	$ 	$ 	$ 	$	 	 	 	 	 		  --	-w777%,'''''r   N)F)4r   r   r   r;   r>   rH   rK   rP   rS   r[   rc   ru   rz   r}   r   r   unittestskipIfr	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r3  r9  rH  rT  rm  rw  r  r  r  r  r  r  r  r  r   r   r   r,   r,   3   s:       . . .  1 1 11 1 17 7 7
! ! !
' ' '(D D D,1 1 1, , ,8+ + +O O O& & &6 X_&&G * * *X+ + + 	 	 	     - - -  &     5 5 5"	+ 	+ 	+C C C
  6  	; 	; 	; 7) 7) 7) _7)r : : _:> > > ) ) _)*- - -^$ $ $4- - -82 2 2 5 5 5nB B B> X_&&E AD AD ADF  + + +% % %*) ) )6 6 6:. . .&( ( ( ( (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 )TestGreenletSetParentErrorsc                 R   i t          j                    t          j                    fd}d }t          j        |          }|                                                     d           t          |          }|                                 |                     t                    5 }d         |_	        d d d            n# 1 swxY w Y   
                                 |                    d           |                     t          |j                  d           d S )Nc                      t          d           d<                                                         d           d S )Nc                      d S r"   r   r   r   r   r   zQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>  r   r   r(   rp   r   r   s   r   rA   z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.run  r   r   c                  Z    t          j                    j                                         d S r"   r   r   r   r   blankzATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blank  r  r   ri   rp   r(   z&parent cannot be on a different thread)rk   r   rl   rq   r   r'   r   rB   r   r   r   rr   r7   rE   rF   )	r:   rA   r  r   r(   r#   r   r   r   s	         @@@r   test_threaded_reparentz2TestGreenletSetParentErrors.test_threaded_reparent  s]   !))_&&
	  	  	  	  	  	  	 
	2 	2 	2 !---2	


z** 	!cCyAH	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!BS]++-UVVVVVs   1CCCc                     g fd}t          j        |          }|                                 |                    d           |                     | j        dz               G fddt                    } |d           }|                     t          j	                  5 }|
                                 d d d            n# 1 swxY w Y   |                     t          |j                  d	           d d = d S )
Nc                  z    t          d           }                     |            |                                  d S )Nc                      d S r"   r   r   r   r   r   zYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>      D r   )r'   r   r   )r(   anothers    r   r   zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker  s5    LL))ANN1HHJJJJJr   ri   rp   r   )initial_main_greenletsc                       e Zd Z fdZdS )KTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedc                 T    |dk    rd         | _         t          j        | |          S NrA   r   r   r'   r   r:   r   r  s     r   r   z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__  *    5==")!*DK"3D$???r   Nr   r  s   r   r  r    5        @ @ @ @ @ @ @r   r  c                      d S r"   r   r   r   r   r   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>  r   r   r  )rk   rl   rq   rr   r  main_greenlets_before_testr'   rB   r   r   r   r7   rE   rF   )r:   r   r   r  r(   r#   r  s         @r   test_unexpected_reparentingz7TestGreenletSetParentErrors.test_unexpected_reparenting  ss   	 	 	 	 	 F+++					r


& 	&&d>]`a>a&bbb	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@
 J||$$x~.. 	#HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++]	_ 	_ 	_AAAJJJs   %CC
C
c                 r   g t          j                    t          j                    fd} G fddt                    }t          j        |          }|                                                     d           	  |d           }|                     t          j                  5 }|	                                 d d d            n# 1 swxY w Y   | 
                    dt          |j                             | 
                    dt          |j                             | 
                    d	t          |j                                                              |                    d           d d = d S #                                  |                    d           d d = w xY w)
Nc                      t          d           }                     |            |                                                                                       d           d S )Nc                      d S r"   r   r   r   r   r   zhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>  r  r   rp   )r'   r   r   r   r   )r(   r  keep_main_aliveswitched_to_greenlets    r   r   zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker  s]    LL))ANN1HHJJJ $$&&&  $$$$$r   c                       e Zd Z fdZdS )ZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedc                 T    |dk    rd         | _         t          j        | |          S r  r  r  s     r   r   zkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__  r  r   Nr   r  s   r   r  r    r  r   r  ri   rp   c                      d S r"   r   r   r   r   r   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>      4 r   z#Cannot switch to a different threadExpectedCurrent)rk   r   r'   rl   rq   r   rB   r   r   r   rD   rE   rF   r   rr   )	r:   r   r  r   r(   r#   r  r  r  s	         @@@r   *test_unexpected_reparenting_thread_runningzFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running  s    (00#/++	% 	% 	% 	% 	% 	% 	%	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ F+++				!!"%%%	
<<((A""8>22 c


              MM?S]ASASTTTMM*c#-&8&8999MM)S%7%7888!!!FF2JJJ


 !!!FF2JJJ
NNNNs1   +F 2CF CF CA;F 0F6c                 6   t          d           }|                     |j        t          j                               |                     t                    5 }|`d d d            n# 1 swxY w Y   |                     t          |j	                  d           d S )Nc                      d S r"   r   r   r   r   r   zGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>      T r   can't delete attribute)
r'   rN   r   r   r   rB   rC   r7   rE   rF   )r:   r   r#   s      r   test_cannot_delete_parentz5TestGreenletSetParentErrors.test_cannot_delete_parent  s    \\**fmX%8%:%:;;;~.. 	#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++-EFFFFFs   A&&A*-A*c                     |                      t                    5 }t          j                    `d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nr  rB   rC   r   r   r   r7   rE   rF   r:   r#   s     r   !test_cannot_delete_parent_of_mainz=TestGreenletSetParentErrors.test_cannot_delete_parent_of_main  s    ~.. 	-##%%,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-S]++-EFFFFFs   ;??c                 \    |                      t          j                    j                   d S r"   )rR   r   r   r   r=   s    r   !test_main_greenlet_parent_is_nonez=TestGreenletSetParentErrors.test_main_greenlet_parent_is_none  s(    (-//677777r   c                     d } fd}t          |          }                     |            ||           |                                                      |            ||           |                                 d S )Nc                  Z    t          j                    j                                         d S r"   r   r   r   r   bgzCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bg"  s&    !!(//11111r   c                    d ddfD ]x}                     t                    5 }|| _        d d d            n# 1 swxY w Y                       t	          |j                  dt          |          j        z              yd S )Nr   42z4GreenletChecker: Expected any type of greenlet, not )rB   r   r   r7   rE   rF   typer   )gletpr#   r:   s      r   checkzFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check&  s    1dD( _ _&&y11 $S"#DK$ $ $ $ $ $ $ $ $ $ $ $ $ $ $   &&JTRSWWM]]_ _ _ _	_ _s   8<	<	)r'   r   r   r   )r:   r  r  r(   s   `   r   test_set_parent_wrong_typesz7TestGreenletSetParentErrors.test_set_parent_wrong_types!  s    	2 	2 	2	_ 	_ 	_ 	_ 	_ OOa 	



a 	





r   c                     t          d           }|                     t                    5 }||_        d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nc                      d S r"   r   r   r   r   r   z@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>>  r  r   cyclic parent chain)r'   rB   r   r   r7   rE   rF   )r:   r  r#   s      r   test_trivial_cyclez.TestGreenletSetParentErrors.test_trivial_cycle=  s    <<((z** 	cDK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++-BCCCCCs   ?AAc                    |                      t                    5 }t          j                    t          j                    _        d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nz(cannot set the parent of a main greenletr  r  s     r   test_trivial_cycle_mainz3TestGreenletSetParentErrors.test_trivial_cycle_mainC  s    ~.. 	A#+3+>+@+@H!!(	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	AS]++-WXXXXXs   *AAAc                 D   t          d           }t          d           }t          d           }||_        ||_        |                     t                    5 }||_        d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nc                      d S r"   r   r   r   r   r   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>J  r   r   c                      d S r"   r   r   r   r   r   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>K  r   r   c                      d S r"   r   r   r   r   r   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>L  r   r   r  )r'   r   rB   r   r7   rE   rF   )r:   r)   rx   g3r#   s        r   test_deeper_cyclez-TestGreenletSetParentErrors.test_deeper_cycleI  s    &&&&&&		z** 	cBI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++-BCCCCCs   A--A14A1N)r   r   r   r  r  r  r  r  r  r  r   r  r  r   r   r   r  r    s        W W W2' ' 'R" " "HG G GG G G8 8 8  8D D DY Y Y	D 	D 	D 	D 	Dr   r  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	TestReprc                 \    |                      |                    |          ||f           d S r"   )r   endswith)r:   gotsuffixs      r   assertEndsWithzTestRepr.assertEndsWithW  s,    V,,sFm<<<<<r   c                 r    t          t          j                              }|                     |d           d S )N current active started main>)reprr   r   r  r:   rs     r   test_main_while_runningz TestRepr.test_main_while_runningZ  s5    $&&''A>?????r   c                     t          j                    fd}t          |          }|                                }|                     |d           d S )Nc                  "    t                     S r"   )r  r  s   r   rA   z-TestRepr.test_main_in_background.<locals>.run`  s    ::r    suspended active started main>)r   r   r'   r   r  )r:   rA   r(   r  r   s       @r   test_main_in_backgroundz TestRepr.test_main_in_background^  sc    "$$	 	 	 	 	 HHJJA@AAAAAr   c                 h    t          t                                }|                     |d           d S )Nz	 pending>)r  r'   r  r  s     r   test_initialzTestRepr.test_initialg  s/    A{+++++r   c                 6   t          j                     G fddt          j                  } |            }|                                 |                    d           |                     |j        d           |                     |j        d           t          d          D ]}t          j        d           t          d          D ]K}|                     |j        j                   t          |j                  }|                     |d           Ld S )	Nc                   &    e Zd ZdxZZdZ fdZdS )/TestRepr.test_main_from_other_thread.<locals>.TNc                     t                    | _        t          j                    | _        t          | j                  | _        d S r"   )r  original_mainr   r   	main_gletr  )r:   r   s    r   rA   z3TestRepr.test_main_from_other_thread.<locals>.T.runq  s9    %)$ZZ"!)!4!6!6#'#7#7   r   )r   r   r   r   r  r!  rA   r  s   r   Tr  n  s=        *..MKI8 8 8 8 8 8 8r   r"  rp   r  r  r/   gMbP?z (thread exited) dead>)r   r   rk   rl   rq   rr   r  r   r  r9   r   r   r   r!  rY   r  )r:   r"  r   rg  r  r   s        @r   test_main_from_other_threadz$TestRepr.test_main_from_other_threadk  s.   "$$	8 	8 	8 	8 	8 	8 	8	  	8 	8 	8 ACC					r


AO-NOOOAM+JKKK q 	 	AJu q 	= 	=AOOAK,---Q[!!A#;<<<<	= 	=r   c                 f   t          d           }|                                 |                     t          |          d           |                     dt          |                     |                     dt          |                     |                     dt          |                     d S )Nc                      d S r"   r   r   r   r   r   z$TestRepr.test_dead.<locals>.<lambda>  s     r   z dead>	suspendedstartedactive)r'   r   r  r  assertNotInrO   s     r   	test_deadzTestRepr.test_dead  s    %%	


DGGX...d1gg...DGG,,,477+++++r   c                     t          d           }t          d           }t          j                    }|||fD ]:}|                     |t                     |                     |t                     ;d S )Nc                      d S r"   r   r   r   r   r   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>  r  r   c                      d S r"   r   r   r   r   r   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>  r   r   )r'   r   r   assertIsInstancerE   )r:   g_deadg_not_startedg_curr(   s        r   #test_formatting_produces_native_strz,TestRepr.test_formatting_produces_native_str  s     \\**#LL11#%%- 		 		A!!   !!   		 		r   N)
r   r   r   r  r  r  r  r#  r*  r2  r   r   r   r
  r
  U  s        = = =@ @ @B B B, , ,!= != !=F, , ,    r   r
  c                        e Zd Zd Zd Zd ZdS )TestMainGreenletc                     dt          t          j                              v sJ t          t          j                              }dt          |          vsJ |S )Nr   )r  r   r   r  )r:   r   s     r   _check_current_is_mainz'TestMainGreenlet._check_current_is_main  sV    h133444444$&&''T!WW$$$$r   c                 |    |                                  }t          d|fi           }|                     |           d S )Nsubclass)r6  r  rM   )r:   	main_typer8  s      r   )test_main_greenlet_type_can_be_subclassedz:TestMainGreenlet.test_main_greenlet_type_can_be_subclassed  s@    //11	
YL"55X&&&&&r   c                     |                                   |                     t          j                    t                     d S r"   )r6  r.  r   r   r'   r=   s    r   test_main_greenlet_is_greenletz/TestMainGreenlet.test_main_greenlet_is_greenlet  s9    ##%%%h133[AAAAAr   N)r   r   r   r6  r:  r<  r   r   r   r4  r4    sF          ' ' '
B B B B Br   r4  c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
TestBrokenGreenletsc                     d }t           j                            |          }d|_        |                     t
          d          5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                       t          d          )NzNever get here)AssertionErrorr   r   r   r   z<TestBrokenGreenlets.test_failed_to_initialstub.<locals>.func  s     !1222r   Tz;Failed to switch stacks into a greenlet for the first time.)r   	_greenletUnswitchableGreenletforce_switch_errorassertRaisesRegexSystemErrorr   )r:   r   r(   s      r   test_failed_to_initialstubz.TestBrokenGreenlets.test_failed_to_initialstub  s    	3 	3 	3 33D99###K$ac c 	 	HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A''A+.A+c                    g fd}t           j                            |          }|                                 |                     dg           |                                 |                     ddg           d|_        |                     t          d          5  |                                 d d d            n# 1 swxY w Y   d|_        |                                 |                     g d           d S )Nc                  .                         d           t          j                    j                                                               d           t          j                    j                                                               d           d S )Nr   r4   r/   r0   )runss   r   r   zDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.func  sp    KKNNN!!(//111KKNNN!!(//111KKNNNNNr   r   r4   Tz0Failed to switch stacks into a running greenlet.F)r   r4   r/   )r   rB  rC  r   r7   rD  rE  rF  )r:   r   r(   rJ  s      @r   "test_failed_to_switch_into_runningz6TestBrokenGreenlets.test_failed_to_switch_into_running  sC   	 	 	 	 	 33D99	


s###	


1v&&&###K$VX X 	 	HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  %	


yyy)))))s   !CC	Cc                     |                      d          }|                     d|j                   |                     |j        |                                            d S )Nzfail_slp_switch.pyzfail_slp_switch is running)assertScriptRaisesrD   output
returncode,get_expected_returncodes_for_aborted_processr:   exs     r   &test_failed_to_slp_switch_into_runningz:TestBrokenGreenlets.test_failed_to_slp_switch_into_running  sU    $$%9::2BI>>>bmT%V%V%X%XYYYYYr   c                 8   |                      d          }|                     d|           |                     d|           |                     d|           |                     d|           |                     d|           |                     d|           d S )Nzfail_switch_two_greenlets.pyz	In g1_runTRACEzLEAVE TRACEzFalling off end of mainzFalling off end of g1_runzFalling off end of g2
run_scriptrD   r:   rN  s     r   #test_reentrant_switch_two_greenletsz7TestBrokenGreenlets.test_reentrant_switch_two_greenlets  s    !?@@k6***gv&&&mV,,,/88816:::-v66666r   c                     |                      dd          }|                     d|j                   |                     d|j                   d S )Nzfail_switch_three_greenlets.py)r   )	exitcodesr   zpositional arguments)rM  rD   rN  rQ  s     r   %test_reentrant_switch_three_greenletsz9TestBrokenGreenlets.test_reentrant_switch_three_greenlets  sQ     $$%EQU$VVk29---,bi88888r   c                 \    |                      d          }|                     d|           d S )Nzfail_switch_three_greenlets2.pya  RESULTS: [('trace', 'switch'), ('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), ('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), ('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), ('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), ('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), ('trace', 'switch'), ('main g2.2', 'g2 done')]rV  rX  s     r   &test_reentrant_switch_three_greenlets2z:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2  s@     !BCC= 		
 		
 		
 		
 		
r   c                 \    |                      d          }|                     d|           d S )Nz#fail_initialstub_already_started.pya!  RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', ('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), 'B.__getattribute__ back from main in C', ('Begin A', (None,)), ('A dead?', True, 'B dead?', True, 'C dead?', False), 'C done', ('main from c.2', None)]rV  rX  s     r   4test_reentrant_switch_GreenletAlreadyStartedInPythonzHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython  s>    !FGG1
 	
 	
 	
 	
 	
r   c                 \    |                      d          }|                     d|           d S )Nzfail_clearing_run_switches.pyzRESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]rV  rX  s     r   *test_reentrant_switch_run_callable_has_delz>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_del$  s>    !@AA 	
 	
 	
 	
 	
r   N)r   r   r   rG  rK  rS  rY  r\  r^  r`  rb  r   r   r   r>  r>    s        
 
 
* * *8Z Z Z7 7 79 9 9
 
 
$

 

 


 
 
 
 
r   r>  __main__)r   r   r   rk   r  abcr   r   r   r'   r  r   r   r	   r
   	leakcheckr   r   r   r   r*   r,   r  r
  r4  r>  r   r   r   r   r   <module>rf     sB   				 



                    , , , , , ,       " " " " " "             & & & & & &	 	 	 	 		 	 	 	    r( r( r( r( r(8 r( r( r(jjD jD jD jD jD( jD jD jDZR R R R Rx R R RjB B B B Bx B B B.k
 k
 k
 k
 k
( k
 k
 k
Z zHMOOOOO r   