a
    Ò�éiS¨  ã                   @   s  d dl mZ d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlZd dlmZ ddlmZ dd	lmZ G d
d„ deƒZdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedk�r
d dlZe ¡  dS )é    )Úabsolute_import)Údivision)Úprint_functionN)ÚABCMetaÚabstractmethod)Úgreenleté   )ÚTestCase)Úfails_leakcheckc                   @   s   e Zd ZdS )Ú	SomeErrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úL/home/Claro/venv/lib/python3.9/site-packages/greenlet/tests/test_greenlet.pyr      s   r   c                 C   s<   zt  ¡ j ¡  W n    |  t ¡ d ¡ ‚ Y n0 t‚d S ©Nr   )r   Ú
getcurrentÚparentÚswitchÚappendÚsysÚexc_infor   ©Úseenr   r   r   Úfmain   s    r   c                 C   s"   dd„ }t || d�}| |¡ d S )Nc                 S   s   | ‚d S ©Nr   )Úexcr   r   r   Úcrasher&   s    zsend_exception.<locals>.crasher©r   ©ÚRawGreenletr   )Úgr   r   Úg1r   r   r   Úsend_exception#   s    r$   c                   @   sj  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ ZedWd6d7„ƒZed8d9„ ƒZd:d;„ Z ed<d=„ ƒZ!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVS )XÚTestGreenletc                    s^   g ‰ ‡ fdd„}t |ƒ}ˆ  d¡ | ¡  ˆ  d¡ | ¡  ˆ  d¡ |  ˆ ttdƒƒ¡ d S )Nc                      s&   ˆ   d¡ t ¡ j ¡  ˆ   d¡ d S )Nr   é   ©r   r   r   r   r   r   ©Úlstr   r   Úf1   s    
z'TestGreenlet._do_simple_test.<locals>.fr   é   é   é   )r!   r   r   ÚassertEqualÚlistÚrange)Úselfr*   r"   r   r(   r   Ú_do_simple_test.   s    


zTestGreenlet._do_simple_testc                 C   s   |   ¡  d S r   )r2   ©r1   r   r   r   Útest_simple=   s    zTestGreenlet.test_simplec                 C   sN   t ƒ }|  t¡�}| ¡  W d   ƒ n1 s.0    Y  |  dt|jƒ¡ d S ©NÚrun)r!   ÚassertRaisesÚAttributeErrorr   ÚassertInÚstrÚ	exception©r1   r"   r   r   r   r   Ú(test_switch_no_run_raises_AttributeError@   s    &z5TestGreenlet.test_switch_no_run_raises_AttributeErrorc                 C   sP   t ƒ }|  t¡�}| t¡ W d   ƒ n1 s00    Y  |  dt|jƒ¡ d S r5   )r!   r7   r8   Úthrowr   r9   r:   r;   r<   r   r   r   Ú'test_throw_no_run_raises_AttributeErrorG   s    (z4TestGreenlet.test_throw_no_run_raises_AttributeErrorc                 C   s*   t d d�}|  |¡ |  |jt ¡ ¡ d S )Nr   )r!   ÚassertIsNotNoneÚassertIsr   r   r   ©r1   r"   r   r   r   Útest_parent_equals_NoneN   s    

z$TestGreenlet.test_parent_equals_Nonec                 C   s$   t d d�}|  |¡ |  |j¡ d S )N)r6   )r!   r@   ÚassertIsNoner6   rB   r   r   r   Útest_run_equals_NoneS   s    

z!TestGreenlet.test_run_equals_Nonec                    s    g ‰ ‡ fdd„}t |ƒ}t |ƒ}| ¡  |  tˆ ƒd¡ | ¡  |  tˆ ƒd¡ | ¡  |  tˆ ƒd¡ |  |jd¡ | ¡  |  tˆ ƒd¡ |  |jd¡ d S )Nc                      s*   ˆ   d¡ t ¡ j ¡  ˆ  ddg¡ d S )Nr   )r   r   r   r   r   Úextendr   r(   r   r   r*   [   s    
z)TestGreenlet.test_two_children.<locals>.fr   r+   r,   Té   )r!   r   r.   ÚlenÚdead)r1   r*   r"   Úhr   r(   r   Útest_two_childrenX   s    zTestGreenlet.test_two_childrenc                    sf   g ‰‡fdd„‰ ‡ ‡fdd„}t |ƒ}|  t |¡d¡ | ¡  |  ˆg d¢¡ |  t |¡d¡ d S )Nc                      s   ˆ   d¡ t ¡ j ¡  d S )NÚbr'   r   r(   r   r   r*   o   s    
z3TestGreenlet.test_two_recursive_children.<locals>.fc                     s(   ˆ  d¡ tˆ ƒ} |  ¡  ˆ  d¡ d S )NÚaÚc)r   r!   r   ©r"   ©r*   r)   r   r   r"   s   s    
z3TestGreenlet.test_two_recursive_children.<locals>.gr+   )rM   rL   rN   )r!   r.   r   Úgetrefcountr   rB   r   rP   r   Útest_two_recursive_childrenl   s    z(TestGreenlet.test_two_recursive_childrenc                    sf   g ‰‡‡fdd„‰ ‡ fdd„t dƒD ƒ}|D ]}| ¡  q,|D ]}| d¡ q>ˆ tˆƒt|ƒ¡ d S )Nc                      s   ˆ   ¡  ˆ d¡ d S ©NT)r2   r   r   )r1   Úsuccessr   r   r*   ƒ   s    z$TestGreenlet.test_threads.<locals>.fc                    s   g | ]}t jˆ d �‘qS )©Útarget)Ú	threadingÚThread)Ú.0Úi©r*   r   r   Ú
<listcomp>†   ó    z-TestGreenlet.test_threads.<locals>.<listcomp>é
   )r0   ÚstartÚjoinr.   rH   )r1   ZthsÚthr   )r*   r1   rT   r   Útest_threads€   s    
zTestGreenlet.test_threadsc                 C   s    g }t tƒ}t tƒ}| |¡ | |¡ ||_|  |g ¡ |  t|j¡ |  |tg¡ | ¡ }|  |d¡ |  |tg¡ | d¡}|  |d¡ |  |tg¡ d S )Nr   é   )r!   r   r   r   r.   r7   r   )r1   r   r#   Úg2Úvaluer   r   r   Útest_exception�   s    


zTestGreenlet.test_exceptionc                 C   s8   g }t tƒ}| |¡ |  tt|t¡ |  |tg¡ d S r   )r!   r   r   r7   ÚKeyErrorr$   r.   )r1   r   r#   r   r   r   Útest_send_exception©   s
    
z TestGreenlet.test_send_exceptionc                 C   sp   g }t tƒ}t tƒ}| |¡ | |¡ |  |g ¡ ~t ¡  |  |tjg¡ ~t ¡  |  |tjtjg¡ d S r   )r!   r   r   r.   ÚgcÚcollectr   ÚGreenletExit)r1   r   r#   rd   r   r   r   Útest_dealloc°   s    

zTestGreenlet.test_deallocc                 C   s    dd„ }t |ƒ}| ¡  tj}zddlm} W n tyL   ddlm} Y n0 |ƒ  }t_z~W |t_n|t_0 | ¡ }|  	d|¡ |  	d|¡ |  	d|¡ d S )Nc                   S   s2   zt  ¡ j ¡  W n t jy,   td ‚Y n0 d S r   )r   r   r   r   rk   r   r   r   r   r   r6   ¿   s    zHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.runr   )ÚStringIOÚ	ExceptionZignoredr   )
r!   r   r   ÚstderrÚ	cStringIOrm   ÚImportErrorÚioÚgetvaluer9   )r1   r6   r"   Z	oldstderrrm   ro   Úvr   r   r   Ú.test_dealloc_catches_GreenletExit_throws_other¾   s     z;TestGreenlet.test_dealloc_catches_GreenletExit_throws_otherc              	      s  g ‰g ‰t  ¡ ‰ t  ¡ ‰t  ¡ ‰t  ¡ ‰‡ ‡‡‡‡‡fdd„}t j|d�}| ¡  ˆ  d¡ |  ˆg ¡ |  tˆƒd¡ ˆd d …= t ¡  |  ˆg ¡ ˆ 	¡  ˆ d¡ z:|  ˆt
jg¡ W ˆ 	¡  | d¡ ˆd d …= ˆd d …= n(ˆ 	¡  | d¡ ˆd d …= ˆd d …= 0 d S )Nc                     sZ   t tƒ} |  ˆ¡ ˆ | ¡ ~ t ¡  ˆ  ¡  ˆ d¡ t ƒ  ˆ ¡  ˆ d¡ t ƒ  d S )Nr&   )r!   r   r   r   ri   rj   ÚsetÚwait)r#   ©Z/bg_glet_created_running_and_no_longer_ref_in_bgZbg_should_be_clearZfg_ref_releasedZok_to_exit_bg_threadr   Zsomerefr   r   r*   å   s    



z1TestGreenlet.test_dealloc_other_thread.<locals>.frU   r^   r   r&   )rW   ÚEventrX   r_   rw   r.   rH   ri   rj   rv   r   rk   r`   )r1   r*   Útr   rx   r   Útest_dealloc_other_threadÜ   s6    




ý

z&TestGreenlet.test_dealloc_other_threadc                    sf   ‡ fdd„}t |ƒ}| ¡ }ˆ  ||ju ¡ ˆ  |¡ | ¡ }ˆ  |¡ ˆ  |d¡ ˆ  |jd ¡ d S )Nc                     s,   t  d¡} ˆ  | jd ¡ t ¡ j | ¡ dS )Nr   úmeaning of life)r   Ú	_getframer.   Úf_backr   r   r   r   r[   r3   r   r   Úf1	  s    
z#TestGreenlet.test_frame.<locals>.f1r|   )r!   r   Ú
assertTrueÚgr_frameÚassertFalser.   )r1   r   r"   ÚframeZfrom_gr   r3   r   Ú
test_frame  s    

zTestGreenlet.test_framec                 C   sL   dd„ }t j|dd�}t j|dd�}| ¡  | ¡  | d¡ | d¡ d S )Nc                    s   t ‡ fdd„ƒ}| ¡  d S )Nc                      s
   t  ˆ ¡S r   )ÚtimeÚsleepr   ©Úxr   r   Ú<lambda>  r]   z>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>r    )rˆ   r"   r   r‡   r   Úrunner  s    z,TestGreenlet.test_thread_bug.<locals>.runner)gš™™™™™É?©rV   Úargs)g333333Ó?r^   )rW   rX   r_   r`   )r1   rŠ   Út1Út2r   r   r   Útest_thread_bug  s    
zTestGreenlet.test_thread_bugc                    s.   ‡ fdd„}t |ƒjddd�}ˆ  |d¡ d S )Nc                    s   ˆ   | d¡ ˆ   |d¡ dS )Nr,   r+   é*   )r.   ©rM   rL   r3   r   r   r6   $  s    z,TestGreenlet.test_switch_kwargs.<locals>.runr,   r+   r‘   r�   ©r!   r   r.   )r1   r6   rˆ   r   r3   r   Útest_switch_kwargs#  s    zTestGreenlet.test_switch_kwargsc                 C   sR   dd„ }t |ƒ}|  ddi| d¡¡ |  dddif| ¡ ¡ |  d| ¡ ¡ d S )Nc                 S   s2   t  ¡ jj| d� t  ¡ jjddd� | | d fS )Nr‡   r+   r&   ©r   r   r   r   r‡   r   r   r   r6   ,  s    z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.runrˆ   r&   )r+   )r&   é	   )r!   r.   r   )r1   r6   r"   r   r   r   Útest_switch_kwargs_to_parent+  s
    z)TestGreenlet.test_switch_kwargs_to_parentc                    s˜   i ‰t  ¡ ‰ t  ¡ ‰‡ ‡‡fdd„}t j|d�}| ¡  ˆ  d¡ |  tj¡� ˆd  ¡  W d   ƒ n1 sp0    Y  ˆ 	¡  | 
d¡ ˆ ¡  d S )Nc                      s&   t dd„ ƒˆd< ˆ  ¡  ˆ d¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   ;  r]   zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>r"   r^   ©r!   rv   rw   r   ©Zcreated_eventÚdataÚ
done_eventr   r   r6   :  s    z7TestGreenlet.test_switch_to_another_thread.<locals>.runrU   r^   r"   )rW   ry   rX   r_   rw   r7   r   Úerrorr   rv   r`   Úclear)r1   r6   Úthreadr   r˜   r   Útest_switch_to_another_thread5  s    
*
z*TestGreenlet.test_switch_to_another_threadc                    s*   ‡ ‡fdd„}‡fdd„‰ t |ƒ ¡  d S )Nc                     sB   zt dƒ‚W n0   t ¡ } tˆ ƒ ¡  ˆ | t ¡ ¡ Y n0 d S )NZfun)Ú
ValueErrorr   r   r!   r   r.   )r   ©rJ   r1   r   r   r*   I  s    z&TestGreenlet.test_exc_state.<locals>.fc                      s   ˆ   t ¡ d¡ d S )N)NNN)r.   r   r   r   r3   r   r   rJ   Q  s    z&TestGreenlet.test_exc_state.<locals>.hr    )r1   r*   r   r    r   Útest_exc_stateH  s    zTestGreenlet.test_exc_statec                 C   s’   dd„ }dd„ }dd„ }t |ƒ}|  |ji ¡ | ¡  |  |jd¡ |  |jddi¡ |j|_|  |jddi¡ |  t||¡ |  t||d¡ d S )	Nc                   S   s   dt  ¡ _d S ©Nr�   )r   r   Útestr   r   r   r   r*   W  s    z*TestGreenlet.test_instance_dict.<locals>.fc                 S   s   | ` d S r   ©Ú__dict__rO   r   r   r   ÚdeldictY  s    z0TestGreenlet.test_instance_dict.<locals>.deldictc                 S   s
   || _ d S r   r¤   )r"   re   r   r   r   Úsetdict[  s    z0TestGreenlet.test_instance_dict.<locals>.setdictr�   r£   )r!   r.   r¥   r   r£   r7   Ú	TypeError)r1   r*   r¦   r§   r"   r   r   r   Útest_instance_dictV  s    zTestGreenlet.test_instance_dictc                    s2   g ‰ ‡ fdd„}t |ƒ}| ¡  |  ˆ dg¡ d S )Nc                      s   ˆ   tt ¡ dƒ¡ d S r5   )r   Úhasattrr   r   r   ©Zhas_runr   r   Úfunci  s    ÿz;TestGreenlet.test_running_greenlet_has_no_run.<locals>.funcFr’   ©r1   r¬   r"   r   r«   r   Ú test_running_greenlet_has_no_rung  s
    z-TestGreenlet.test_running_greenlet_has_no_runc                 C   s0   dd l }|  t|j tƒ ¡ |  t|jtƒ ¡ d S r   )Úcopyr7   r¨   r!   Údeepcopy)r1   r¯   r   r   r   Útest_deepcopyr  s    zTestGreenlet.test_deepcopyc                    s€   t dd„ ƒ‰ t ¡ ‰g ‰‡ ‡‡fdd„}t |ˆ d�}| ¡  ~|  ˆ¡ |  ˆd ˆ¡ |  ˆd jˆ ¡ ˆd d …= d ‰ d ‰d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   x  r]   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>c                      sL   zˆ  ¡  W n: tjyF   ˆ t ¡ j¡ ˆ t ¡ ¡ ˆ   ¡  Y n0 d S r   )r   r   rk   r   r   r   r   ©ÚhubÚmainÚresultr   r   Úworker{  s    z9TestGreenlet.test_parent_restored_on_kill.<locals>.workerr   r   r   )r!   r   r   r   r€   rA   r   )r1   r¶   r"   r   r²   r   Útest_parent_restored_on_killw  s    	

z)TestGreenlet.test_parent_restored_on_killc                 C   sL   t ƒ }t dd„ |d�}|  t¡� | ¡  W d   ƒ n1 s>0    Y  d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   –  r]   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>r   )r!   r7   r8   r   )r1   r#   rd   r   r   r   Útest_parent_return_failure’  s    z'TestGreenlet.test_parent_return_failurec                 C   s2   G dd„ dt ƒ}|dd„ ƒ}|  t|jtƒ ¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletc                 S   s$   z
t ƒ ‚W n   Y n0 t | |¡S r   )rn   r!   Ú__getattribute__©r1   Únamer   r   r   r¹   �  s
    
zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__N©r   r   r   r¹   r   r   r   r   Ú
mygreenletœ  s   r½   c                   S   s   d S r   r   r   r   r   r   r‰   £  r]   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>)r!   r7   r   r>   )r1   r½   r"   r   r   r   Útest_throw_exception_not_lost›  s    z*TestGreenlet.test_throw_exception_not_lostFc                    s:  g ‰ dd„ ‰‡ ‡‡fdd„}t j|d�}| ¡  | d¡ ~ˆrH|  ¡  |  tj¡�}ˆ d  t	¡ W d   ƒ n1 sx0    Y  ˆsž|  
t|jƒdd	g¡ n|  t|jƒd¡ tˆ d jd
ƒrø|  t¡� ˆ d j ¡  W d   ƒ n1 sî0    Y  ˆ�sˆ d jj ¡  n|  ˆ d j¡ ~d ‰ˆ d d …= d| _d S )Nc                   S   s   t  ¡ j ¡  d S r   r”   r   r   r   r   r¶   ©  s    zGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.workerc                     s2   t ˆƒ} |  ¡  ˆ  | ¡ ˆr.|  ¡  t ¡  d S r   )r!   r   r   r   r   rO   ©rµ   Úwait_for_cleanupr¶   r   r   Úcreator¬  s    
zHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creatorrU   r^   r   úBcannot switch to a different thread (which happens to have exited)ú#cannot switch to a different threadrœ   T)rW   rX   r_   r`   Úwait_for_pending_cleanupsr7   r   r›   r>   r   r9   r:   r;   r.   rª   r�   ÚRuntimeErrorrœ   Úf_localsrD   Úexpect_greenlet_leak)r1   rÀ   rÁ   rz   r   r   r¿   r   Ú*_do_test_throw_to_dead_thread_doesnt_crash¦  s@    
,þÿþ,
z7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crashc                 C   s   |   ¡  d S r   ©rÈ   r3   r   r   r   Ú&test_throw_to_dead_thread_doesnt_crashß  s    z3TestGreenlet.test_throw_to_dead_thread_doesnt_crashc                 C   s   |   d¡ d S rS   rÉ   r3   r   r   r   Ú+test_throw_to_dead_thread_doesnt_crash_waitã  s    z8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_waitc                 C   s2   G dd„ dt ƒ}|ƒ }|  | d¡d¡ d| _d S )Nc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z7TestGreenlet.test_recursive_startup.<locals>.convolutedc                 S   s   t  | ¡ d| _d S r   )r!   Ú__init__Úcountr3   r   r   r   rÌ   é  s    
z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__c                 S   s.   |dkr"| j dkr"d| _ |  d¡ t | |¡S )Nr6   r   r   é+   )rÍ   r   r!   r¹   rº   r   r   r   r¹   ì  s    
zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__c                 S   s   | j  |¡ q d S r   ©r   r   ©r1   re   r   r   r   r6   ñ  s    z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runN)r   r   r   rÌ   r¹   r6   r   r   r   r   Ú
convolutedè  s   rÑ   r�   rÎ   T)r!   r.   r   rÇ   )r1   rÑ   r"   r   r   r   Útest_recursive_startupæ  s    z#TestGreenlet.test_recursive_startupc                    sº   t  ¡ ‰ˆ ¡  t  ¡ ‰ˆ ¡  G ‡‡fdd„dtƒ}dd„ }‡ ‡‡fdd„}t ¡ }t|ƒg‰ |ƒ ˆ d _ˆ d  ¡  t j	|d�}| 
¡  ˆ ¡  ˆ ¡  |  t ¡ |¡ | d	¡ d S )
Nc                       s   e Zd Z‡ ‡fdd„ZdS )z;TestGreenlet.test_threaded_updatecurrent.<locals>.finalizedc                    s   ˆ  ¡  ˆ  ¡  d S r   ©ÚreleaseÚacquirer3   ©Úlock1Úlock2r   r   Ú__del__  s    zCTestGreenlet.test_threaded_updatecurrent.<locals>.finalized.__del__N©r   r   r   rÙ   r   rÖ   r   r   Ú	finalized  s   rÛ   c                   S   s   t  ¡ j ¡  d S r   r”   r   r   r   r   Údeallocator  s    z=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorc                      s:   ˆ  ¡  t ¡  ˆ d= ˆ ¡  ˆ  ¡  t ¡  ˆ ¡  d S r   ©rÕ   r   r   rÔ   r   ©r"   r×   rØ   r   r   Úfthread  s    z9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreadr   rU   r^   )rW   ÚLockrÕ   Úobjectr   r   r!   Zbombr   rX   r_   rÔ   r.   r`   )r1   rÛ   rÜ   rß   r´   rz   r   rÞ   r   Útest_threaded_updatecurrentü  s"    

z(TestGreenlet.test_threaded_updatecurrentc                    sb   g ‰‡ ‡‡fdd„‰dd„ ‰ t ˆƒg‰ˆd  ¡  t ˆ ˆd ƒ‰ ˆ  ¡ }|  ˆ¡ |  |d¡ d S )Nc               
      sX   t  ¡ j ¡ } ˆd= t  ¡ jˆ _z"t  ¡ j | ¡ W ˆ t  ¡ ¡ nˆ t  ¡ ¡ 0 d S r   )r   r   r   r   r   )re   ©Ú	initiatorr   r¶   r   r   r¶   -  s    z>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.workerc                   S   s   dS r¢   r   r   r   r   r   rä   :  s    zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiatorr   r�   )r!   r   r€   r.   rÐ   r   rã   r   Ú!test_dealloc_switch_args_not_lost+  s    

z.TestGreenlet.test_dealloc_switch_args_not_lostc                    sT   dd„ ‰ G dd„ dt ƒ}|ƒ ‰tdd�‰‡ ‡‡fdd„}t|ƒ}|  | ¡ ˆ¡ d S )	Nc                 S   s   | |i |¤Ž d S r   r   )r¬   rM   Úkr   r   r   Ú_applyS  s    z0TestGreenlet.test_tuple_subclass.<locals>._applyc                   @   s   e Zd Zdd„ ZdS )z1TestGreenlet.test_tuple_subclass.<locals>.mytuplec                 S   s   t  ¡  ¡  t | ¡S r   )r   r   r   ÚtupleÚ__len__r3   r   r   r   ré   W  s    z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__N)r   r   r   ré   r   r   r   r   ÚmytupleV  s   rê   r�   )rM   c                      s   ˆ t  ¡ jjˆˆƒ d S r   r”   r   ©rç   rŒ   Úkwargsr   r   Úswitchapply\  s    z5TestGreenlet.test_tuple_subclass.<locals>.switchapply)rè   Údictr!   r.   r   )r1   rê   rí   r"   r   rë   r   Útest_tuple_subclassE  s    
z TestGreenlet.test_tuple_subclassc                 C   sP   t dtfdtdd„ ƒiƒ}G dd„ d|ƒ}G dd„ d|ƒ}|ƒ  |  t|¡ d S )	NÚAbstractSubclassr6   c                 S   s   d S r   r   r3   r   r   r   r‰   e  r]   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>c                   @   s   e Zd ZdS )z:TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   r   ÚBadSubclassg  s   rñ   c                   @   s   e Zd Zdd„ ZdS )z;TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                 S   s   d S r   r   r3   r   r   r   r6   k  s    z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runN)r   r   r   r6   r   r   r   r   ÚGoodSubclassj  s   rò   )r   r!   r   r7   r¨   )r1   rð   rñ   rò   r   r   r   Útest_abstract_subclassesa  s    ýz%TestGreenlet.test_abstract_subclassesc                    sN   t  ¡ sd S t  ¡ d ‰ ˆ dk r$d S ‡ ‡fdd„}tdƒD ]}|ƒ r: qJq:d S )Nr   é2   c            	         s  t  ¡ ‰ˆ ¡  t  ¡ ‰ˆ ¡  dg‰‡‡fdd„} t j| d�}| ¡  G ‡‡‡fdd„dtƒ‰ G ‡ fdd„dtƒ}g }tˆd	 ƒ}t ¡ }|ƒ }|D ]<}d }ˆd
 r¶| 	d¡  dS t
ƒ }ˆd
 rÈ qò| |¡ q–t ¡  ˆd
 rî| 	d¡ dS ˆ |j|¡ |D ]}ˆ |j|¡ �qdS )NFc                      s   ˆ   ¡  t ¡  ˆ ¡  d S r   rÝ   r   rÖ   r   r   Úanother_thread}  s    zWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadrU   c                       s   e Zd Z‡ ‡‡fdd„ZdS )zTTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callbackc                    s   ˆ   ¡  ˆ ¡  dˆd< d S )NTr   rÓ   r3   ©r×   rØ   Úrecycledr   r   rÙ   „  s    z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__NrÚ   r   rö   r   r   Úgc_callbackƒ  s   rø   c                       s   e Zd Z‡ fdd„ZdS )zPTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                    s   | | _ ˆ ƒ | _d S r   )ÚcycleÚcallbackr3   ©rø   r   r   rÌ   ‰  s    zYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__N)r   r   r   rÌ   r   rû   r   r   Úgarbageˆ  s   rü   r+   r   r^   T)rW   rà   rÕ   rX   r_   rá   r0   r   r   r`   r!   r   ri   rj   r.   r   )	rõ   rz   rü   Úlrˆ   Úcurrentr"   Ú_Úlast©ÚNr1   )rø   r×   rØ   r÷   r   Úattemptw  s>    

z?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptr-   )ri   Ú	isenabledZget_thresholdr0   )r1   r  rÿ   r   r  r   Ú!test_implicit_parent_with_threadsq  s    -z.TestGreenlet.test_implicit_parent_with_threadsc                    s|   ddl m‰ ddl m‰  G dd„ dtƒ}t |¡}g ˆ_‡ ‡‡fdd„}tdƒD ]}||ƒ ¡  qPˆ`ˆ 	t |¡|¡ d S )	Nr   ©r   )rk   c                   @   s   e Zd ZdS )zTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   r   ÚGreenlet±  s   r  c                      s6   zˆƒ j  ¡  W n  ˆ y0   ˆj ˆƒ ¡ Y n0 d S r   )r   r   Úgletsr   r   ©rk   r   r1   r   r   Úgreenlet_mainº  s    zYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_mainr^   )
r   r   rk   r!   r   rQ   r  r0   r   r.   )r1   r  Úinitial_refsr
  rÿ   r   r	  r   Ú5test_issue_245_reference_counting_subclass_no_threads¨  s    
zBTestGreenlet.test_issue_245_reference_counting_subclass_no_threadsc           
         sè   ddl m} ddl m} ddlm‰ G dd„ dtƒ‰ g ‰|ƒ ‰‡fdd„‰‡ ‡‡‡‡fd	d
„}t ˆ ¡}g }t|d ƒD ]*}|ƒ }|||fd�}| 	|¡ | 
¡  qx|D ]}	|	 d¡ q¨ˆd d …= ˆ ¡  |  ¡  |  t ˆ ¡|¡ d S )Nr   )rX   )ry   r  c                   @   s   e Zd ZdS )zSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   r   Ú
MyGreenletÎ  s   r  c                      s   ˆ ƒ j  ¡  d S r   rÏ   r   r  r   r   r
  Ô  s    zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_mainc                    s8   ˆ ˆƒ}ˆ  |¡ | ¡  ~|  ¡  ˆ d¡ ˆƒ  d S )Nr^   )r   r   rv   rw   )Zgreenlet_running_eventZmine©r  r   r  r
  Zref_clearedr   r   Úthread_main×  s    

zTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_mainé-   r‹   r^   )rW   rX   ry   r   r   r!   r   rQ   r0   r   r_   rw   rv   rÄ   r.   )
r1   rX   ry   r  r  Zthread_ready_eventsrÿ   Úeventr�   rš   r   r  r   Ú2test_issue_245_reference_counting_subclass_threadsÇ  s.    
ÿ


z?TestGreenlet.test_issue_245_reference_counting_subclass_threadsc                 C   sX   dd„ }t |ƒ}dd„ }t ||ƒ}|  t¡� | ¡  W d   ƒ n1 sJ0    Y  d S )Nc                   S   s   dS )Né   r   r   r   r   r   Úno_args  s    z\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_argsc                   S   s   dS r¢   r   r   r   r   r   Úleaf  s    zYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf)r!   r7   r¨   r   )r1   r  Úparent_never_startedr  Úchildr   r   r   Ú>test_falling_off_end_switches_to_unstarted_parent_raises_error
  s    
zKTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_errorc                 C   s:   dd„ }t |ƒ}dd„ }t ||ƒ}| ¡ }|  |d¡ d S )Nc                 S   s   | dfS ©Né   r   r‡   r   r   r   Úone_arg  s    zUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_argc                   S   s   dS r¢   r   r   r   r   r   r    s    zRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf)r�   r  r’   )r1   r  r  r  r  rµ   r   r   r   Ú7test_falling_off_end_switches_to_unstarted_parent_works  s    
zDTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_worksc                    s°   G dd„ dt ƒ}|ƒ }g ‰ t ‡ fdd„|ƒ}|  t¡� | ¡  W d   ƒ n1 sT0    Y  |  ˆ dg¡ |  t¡� | ¡  W d   ƒ n1 s”0    Y  |  ˆ dg¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zXTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentc                 S   s   |dkrt ‚d S r5   )r   rº   r   r   r   r¹   )  s    ziTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parent.__getattribute__Nr¼   r   r   r   r   ÚParent(  s   r  c                      s
   ˆ   d¡S r¢   ©r   r   r   r   r   r‰   0  r]   zZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>r�   )r!   r7   r   r   r.   )r1   r  r  r  r   r   r   Ú;test_switch_to_dead_greenlet_with_unstarted_perverse_parent'  s    &&zHTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parentc                    sf   g ‰ t ‡ fdd„ƒ}t ‡ fdd„ƒ}| ¡  |  ˆ dg¡ ||_| ¡ }|  |¡ |  ˆ ddg¡ d S )Nc                      s
   ˆ   d¡S r  r  r   r   r   r   r‰   >  r]   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>c                      s
   ˆ   d¡S r¢   r  r   r   r   r   r‰   ?  r]   r�   r  )r!   r   r.   r   rD   )r1   r  r  rµ   r   r   r   Ú%test_switch_to_dead_greenlet_reparent<  s    
z2TestGreenlet.test_switch_to_dead_greenlet_reparentc                    sB   t  ¡ ‰ ‡ fdd„}t|ƒ}| ¡  |  |j¡ |  |jj¡ d S )Nc                      s   ˆ   ¡  d S r   )r   r   ©r´   r   r   ÚHubP  s    zFTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.Hub)r   r   r!   r   r@   r�   rD   r~   )r1   r"  r³   r   r!  r   Ú,test_can_access_f_back_of_suspended_greenletJ  s    z9TestGreenlet.test_can_access_f_back_of_suspended_greenletN)F).r   r   r   r2   r4   r=   r?   rC   rE   rK   rR   rb   rf   rh   rl   ru   r{   r„   r�   r“   r–   rž   r¡   r©   r®   r±   r·   r¸   r¾   r
   rÈ   rÊ   rË   rÒ   râ   rå   rï   ró   r  r  r  r  r  r  r   r#  r   r   r   r   r%   ,   sZ   ,
	8

/7Cr%   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestGreenletSetParentErrorsc                    s¶   i ‰t  ¡ ‰ t  ¡ ‰‡ ‡‡fdd„}dd„ }t j|d�}| ¡  ˆ  d¡ t|ƒ}| ¡  |  t¡�}ˆd |_	W d   ƒ n1 s„0    Y  ˆ 
¡  | d¡ |  t|jƒd¡ d S )	Nc                      s&   t dd„ ƒˆd< ˆ  ¡  ˆ d¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   e  r]   zQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>r"   r^   r—   r   r˜   r   r   r6   d  s    z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.runc                   S   s   t  ¡ j ¡  d S r   r”   r   r   r   r   Úblanki  s    zATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blankrU   r^   r"   z&parent cannot be on a different thread)rW   ry   rX   r_   rw   r!   r   r7   rŸ   r   rv   r`   r.   r:   r;   )r1   r6   r%  r�   r"   r   r   r˜   r   Útest_threaded_reparent_  s    
(
z2TestGreenletSetParentErrors.test_threaded_reparentc                    s´   g ‰ ‡ fdd„}t j|d�}| ¡  | d¡ | j| jd d� G ‡ fdd„dtƒ}|d	d
„ ƒ}|  tj	¡�}| 
¡  W d   ƒ n1 sŠ0    Y  |  t|jƒd¡ ˆ d d …= d S )Nc                     s"   t dd„ ƒ} ˆ  | ¡ |  ¡  d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   {  r]   zYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>)r!   r   r   rO   ©Úanotherr   r   r¶   z  s    
zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.workerrU   r^   r   )Zinitial_main_greenletsc                       s   e Zd Z‡ fdd„ZdS )zKTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedc                    s   |dkrˆ d | _ t | |¡S ©Nr6   r   ©r   r!   r¹   rº   r'  r   r   r¹   –  s    
z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__Nr¼   r   r'  r   r   rÑ   •  s   rÑ   c                   S   s   d S r   r   r   r   r   r   r‰   š  r]   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>rÂ   )rW   rX   r_   r`   rÄ   Zmain_greenlets_before_testr!   r7   r   r›   r   r.   r:   r;   )r1   r¶   rz   rÑ   r"   r   r   r'  r   Útest_unexpected_reparentingx  s    
&ÿz7TestGreenletSetParentErrors.test_unexpected_reparentingc              	      sì   g ‰ t  ¡ ‰t  ¡ ‰‡ ‡‡fdd„}G ‡ fdd„dtƒ}t j|d�}| ¡  ˆ d¡ zr|dd„ ƒ}|  tj¡�}| 	¡  W d   ƒ n1 sŽ0    Y  |  
t|jƒd	¡ W ˆ ¡  | d¡ ˆ d d …= nˆ ¡  | d¡ ˆ d d …= 0 d S )
Nc                     s4   t dd„ ƒ} ˆ  | ¡ |  ¡  ˆ ¡  ˆ d¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   ¨  r]   zhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>r^   )r!   r   r   rv   rw   rO   ©r(  Zkeep_main_aliveZswitched_to_greenletr   r   r¶   §  s
    
zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerc                       s   e Zd Z‡ fdd„ZdS )zZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedc                    s   |dkrˆ d | _ t | |¡S r)  r*  rº   r'  r   r   r¹   ®  s    
zkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__Nr¼   r   r'  r   r   rÑ   ­  s   rÑ   rU   r^   c                   S   s   d S r   r   r   r   r   r   r‰   ¸  r]   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>rÃ   )rW   ry   r!   rX   r_   rw   r7   r   r›   r   r.   r:   r;   rv   r`   )r1   r¶   rÑ   rz   r"   r   r   r,  r   Ú*test_unexpected_reparenting_thread_running¡  s&    
&
ý
zFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_runningc                 C   sb   t dd„ ƒ}|  |jt ¡ ¡ |  t¡�}|`W d   ƒ n1 sB0    Y  |  t|j	ƒd¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   Ä  r]   zGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>úcan't delete attribute)
r!   rA   r   r   r   r7   r8   r.   r:   r;   )r1   r¶   r   r   r   r   Útest_cannot_delete_parentÃ  s
    "z5TestGreenletSetParentErrors.test_cannot_delete_parentc                 C   sH   |   t¡�}t ¡ `W d   ƒ n1 s(0    Y  |  t|jƒd¡ d S )Nr.  ©r7   r8   r   r   r   r.   r:   r;   ©r1   r   r   r   r   Ú!test_cannot_delete_parent_of_mainË  s    &z=TestGreenletSetParentErrors.test_cannot_delete_parent_of_mainc                 C   s   |   t ¡ j¡ d S r   )rD   r   r   r   r3   r   r   r   Ú!test_main_greenlet_parent_is_noneÑ  s    z=TestGreenletSetParentErrors.test_main_greenlet_parent_is_nonec                    sT   dd„ }‡ fdd„}t |ƒ}ˆ  |¡ ||ƒ | ¡  ˆ  |¡ ||ƒ | ¡  d S )Nc                   S   s   t  ¡ j ¡  d S r   r”   r   r   r   r   ÚbgÖ  s    zCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bgc              	      sb   d dˆ dfD ]P}ˆ   t¡�}|| _W d   ƒ n1 s60    Y  ˆ  t|jƒdt|ƒj ¡ qd S )Nr   Z42z4GreenletChecker: Expected any type of greenlet, not )r7   r¨   r   r.   r:   r;   Útyper   )ÚgletÚpr   r3   r   r   ÚcheckÚ  s    $þzFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check)r!   r‚   r   r€   )r1   r4  r8  r"   r   r3   r   Útest_set_parent_wrong_typesÕ  s    


z7TestGreenletSetParentErrors.test_set_parent_wrong_typesc                 C   sR   t dd„ ƒ}|  t¡�}||_W d   ƒ n1 s20    Y  |  t|jƒd¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   ò  r]   z@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>úcyclic parent chain)r!   r7   rŸ   r   r.   r:   r;   )r1   r6  r   r   r   r   Útest_trivial_cycleñ  s    $z.TestGreenletSetParentErrors.test_trivial_cyclec                 C   sN   |   t¡�}t ¡ t ¡ _W d   ƒ n1 s.0    Y  |  t|jƒd¡ d S )Nz(cannot set the parent of a main greenletr0  r1  r   r   r   Útest_trivial_cycle_main÷  s    ,z3TestGreenletSetParentErrors.test_trivial_cycle_mainc                 C   sv   t dd„ ƒ}t dd„ ƒ}t dd„ ƒ}||_||_|  t¡�}||_W d   ƒ n1 sV0    Y  |  t|jƒd¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   þ  r]   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>c                   S   s   d S r   r   r   r   r   r   r‰   ÿ  r]   c                   S   s   d S r   r   r   r   r   r   r‰      r]   r:  )r!   r   r7   rŸ   r.   r:   r;   )r1   r#   rd   Zg3r   r   r   r   Útest_deeper_cycleý  s    $z-TestGreenletSetParentErrors.test_deeper_cycleN)r   r   r   r&  r+  r-  r/  r2  r3  r9  r;  r<  r=  r   r   r   r   r$  ^  s   )"r$  c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚTestReprc                 C   s   |   | |¡||f¡ d S r   )r€   Úendswith)r1   ÚgotÚsuffixr   r   r   ÚassertEndsWith  s    zTestRepr.assertEndsWithc                 C   s   t t ¡ ƒ}|  |d¡ d S )Nú current active started main>)Úreprr   r   rB  ©r1   Úrr   r   r   Útest_main_while_running  s    z TestRepr.test_main_while_runningc                    s4   t  ¡ ‰ ‡ fdd„}t|ƒ}| ¡ }|  |d¡ d S )Nc                      s   t ˆ ƒS r   )rD  r   r!  r   r   r6     s    z-TestRepr.test_main_in_background.<locals>.runú suspended active started main>)r   r   r!   r   rB  )r1   r6   r"   rF  r   r!  r   Útest_main_in_background  s
    z TestRepr.test_main_in_backgroundc                 C   s   t tƒ ƒ}|  |d¡ d S )Nz	 pending>)rD  r!   rB  rE  r   r   r   Útest_initial  s    
zTestRepr.test_initialc                    s    t  ¡ ‰ G ‡ fdd„dtjƒ}|ƒ }| ¡  | d¡ |  |jd¡ |  |jd¡ t	dƒD ]}t
 d¡ qZt	dƒD ](}|  |jj¡ t|jƒ}|  |d¡ qrd S )	Nc                       s$   e Zd Zd ZZdZ‡ fdd„ZdS )z/TestRepr.test_main_from_other_thread.<locals>.TNc                    s$   t ˆ ƒ| _t ¡ | _t | jƒ| _d S r   )rD  Úoriginal_mainr   r   Ú	main_gletr  r3   r!  r   r   r6   %  s    

z3TestRepr.test_main_from_other_thread.<locals>.T.run)r   r   r   rK  r  rL  r6   r   r!  r   r   ÚT"  s   rM  r^   rH  rC  r&   gü©ñÒMbP?z (thread exited) dead>)r   r   rW   rX   r_   r`   rB  rK  r  r0   r…   r†   r€   rL  rI   rD  )r1   rM  rz   rÿ   rF  r   r!  r   Útest_main_from_other_thread  s    

z$TestRepr.test_main_from_other_threadc                 C   sX   t dd„ ƒ}| ¡  |  t|ƒd¡ |  dt|ƒ¡ |  dt|ƒ¡ |  dt|ƒ¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   C  r]   z$TestRepr.test_dead.<locals>.<lambda>z dead>Z	suspendedÚstartedÚactive)r!   r   rB  rD  ZassertNotInrB   r   r   r   Ú	test_deadB  s    zTestRepr.test_deadc                 C   sX   t dd„ ƒ}t dd„ ƒ}t ¡ }|||fD ](}|  d|f t¡ |  d|f t¡ q*d S )Nc                   S   s   d S r   r   r   r   r   r   r‰   N  r]   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>c                   S   s   d S r   r   r   r   r   r   r‰   O  r]   z%sz%r)r!   r   r   ÚassertIsInstancer:   )r1   Zg_deadZg_not_startedZg_curr"   r   r   r   Ú#test_formatting_produces_native_strJ  s    þþz,TestRepr.test_formatting_produces_native_strN)
r   r   r   rB  rG  rI  rJ  rN  rQ  rS  r   r   r   r   r>  	  s   	#r>  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestMainGreenletc                 C   s4   dt t ¡ ƒv sJ ‚tt ¡ ƒ}dt |ƒvs0J ‚|S )Nr´   )rD  r   r   r5  )r1   rz   r   r   r   Ú_check_current_is_mainb  s    z'TestMainGreenlet._check_current_is_mainc                 C   s$   |   ¡ }td|fi ƒ}|  |¡ d S )NÚsubclass)rU  r5  r@   )r1   Z	main_typerV  r   r   r   Ú)test_main_greenlet_type_can_be_subclassedj  s    z:TestMainGreenlet.test_main_greenlet_type_can_be_subclassedc                 C   s   |   ¡  |  t ¡ t¡ d S r   )rU  rR  r   r   r!   r3   r   r   r   Útest_main_greenlet_is_greenleto  s    z/TestMainGreenlet.test_main_greenlet_is_greenletN)r   r   r   rU  rW  rX  r   r   r   r   rT  ^  s   rT  c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestBrokenGreenletsc                 C   sR   dd„ }t j |¡}d|_|  td¡� | ¡  W d   ƒ n1 sD0    Y  d S )Nc                   S   s   t dƒ‚d S )NzNever get here)ÚAssertionErrorr   r   r   r   r¬   z  s    z<TestBrokenGreenlets.test_failed_to_initialstub.<locals>.funcTz;Failed to switch stacks into a greenlet for the first time.)r   Ú	_greenletÚUnswitchableGreenletÚforce_switch_errorÚassertRaisesRegexÚSystemErrorr   r­   r   r   r   Útest_failed_to_initialstuby  s    ÿz.TestBrokenGreenlets.test_failed_to_initialstubc                    s¦   g ‰ ‡ fdd„}t j |¡}| ¡  |  ˆ dg¡ | ¡  |  ˆ ddg¡ d|_|  td¡� | ¡  W d   ƒ n1 sz0    Y  d|_| ¡  |  ˆ g d¢¡ d S )	Nc                      s>   ˆ   d¡ t ¡ j ¡  ˆ   d¡ t ¡ j ¡  ˆ   d¡ d S )Nr   r+   r&   r'   r   ©Úrunsr   r   r¬   ‡  s
    

zDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.funcr   r+   Tz0Failed to switch stacks into a running greenlet.F)r   r+   r&   )r   r[  r\  r   r.   r]  r^  r_  r­   r   ra  r   Ú"test_failed_to_switch_into_running…  s    ÿ&z6TestBrokenGreenlets.test_failed_to_switch_into_runningc                 C   s.   |   d¡}|  d|j¡ |  |j|  ¡ ¡ d S )Nzfail_slp_switch.pyzfail_slp_switch is running)ÚassertScriptRaisesr9   ÚoutputÚ
returncodeZ,get_expected_returncodes_for_aborted_process©r1   Úexr   r   r   Ú&test_failed_to_slp_switch_into_running¡  s    
z:TestBrokenGreenlets.test_failed_to_slp_switch_into_runningc                 C   sV   |   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_scriptr9   ©r1   re  r   r   r   Ú#test_reentrant_switch_two_greenlets§  s    
z7TestBrokenGreenlets.test_reentrant_switch_two_greenletsc                 C   s.   | j ddd�}|  d|j¡ |  d|j¡ d S )Nzfail_switch_three_greenlets.py)r   )Z	exitcodesr¨   zpositional arguments)rd  r9   re  rg  r   r   r   Ú%test_reentrant_switch_three_greenlets±  s    z9TestBrokenGreenlets.test_reentrant_switch_three_greenletsc                 C   s   |   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')]rk  rm  r   r   r   Ú&test_reentrant_switch_three_greenlets2º  s
    
øz:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2c                 C   s   |   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)]rk  rm  r   r   r   Ú4test_reentrant_switch_GreenletAlreadyStartedInPythonÌ  s
    
úzHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPythonc                 C   s   |   d¡}|  d|¡ d S )Nzfail_clearing_run_switches.pyz„RESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]rk  rm  r   r   r   Ú*test_reentrant_switch_run_callable_has_delØ  s
    
ûz>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_delN)r   r   r   r`  rc  ri  rn  ro  rp  rq  rr  r   r   r   r   rY  u  s   
	rY  Ú__main__)Ú
__future__r   r   r   ri   r   r…   rW   Úabcr   r   r   r!   Ú r	   Z	leakcheckr
   rn   r   r   r$   r%   r$  r>  rT  rY  r   Zunittestr´   r   r   r   r   Ú<module>   s:   		      8 ,Um
