o
    Šåg¦³  ã                   @   s  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 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„e ¡  dS dS )é    N)ÚABCMeta)Úabstractmethod)Úgreenleté   )ÚTestCase)ÚRUNNING_ON_MANYLINUX)ÚPY313)Úfails_leakcheckc                   @   ó   e Zd ZdS )Ú	SomeErrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úX/var/www/html/flaskapp/venv/lib/python3.10/site-packages/greenlet/tests/test_greenlet.pyr      ó    r   c                 C   s0   z
t  ¡ j ¡  W t‚   |  t ¡ d ¡ ‚ ©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   | ‚©Nr   )Úexcr   r   r   Úcrasher,   ó   zsend_exception.<locals>.crasher©r   ©ÚRawGreenletr   )Úgr   r   Úg1r   r   r   Úsend_exception)   s   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d„ Zdd„ Zdd„ Ze eo=ed¡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d0d1„ Zd2d3„ Zd4d5„ Z e!d]d7d8„ƒZ"e!d9d:„ ƒZ#d;d<„ Z$e!d=d>„ ƒZ%d?d@„ Z&dAdB„ Z'dCdD„ Z(dEdF„ Z)dGdH„ Z*dIdJ„ Z+e eo¨edK¡dLdM„ ƒZ,dNdO„ Z-dPdQ„ Z.dRdS„ Z/dTdU„ Z0dVdW„ Z1dXdY„ Z2dZd[„ Z3d\S )^Ú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   Úf7   s   
z'TestGreenlet._do_simple_test.<locals>.fr   é   é   é   )r#   r   r   ÚassertEqualÚlistÚrange)Úselfr,   r$   r   r*   r   Ú_do_simple_test4   s   


zTestGreenlet._do_simple_testc                 C   ó   |   ¡  d S r   )r4   ©r3   r   r   r   Útest_simpleC   s   zTestGreenlet.test_simplec                 C   sN   t ƒ }|  t¡�}| ¡  W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S ©NÚrun)r#   ÚassertRaisesÚAttributeErrorr   ÚassertInÚstrÚ	exception©r3   r$   r   r   r   r   Ú(test_switch_no_run_raises_AttributeErrorF   s
   
ÿz5TestGreenlet.test_switch_no_run_raises_AttributeErrorc                 C   sP   t ƒ }|  t¡�}| t¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S r8   )r#   r:   r;   Úthrowr   r<   r=   r>   r?   r   r   r   Ú'test_throw_no_run_raises_AttributeErrorM   s
   ÿz4TestGreenlet.test_throw_no_run_raises_AttributeErrorc                 C   s*   t d d�}|  |¡ |  |jt ¡ ¡ d S )Nr!   )r#   ÚassertIsNotNoneÚassertIsr   r   r   ©r3   r$   r   r   r   Útest_parent_equals_NoneT   s   

z$TestGreenlet.test_parent_equals_Nonec                 C   s$   t d d�}|  |¡ |  |j¡ d S )N)r9   )r#   rC   ÚassertIsNoner9   rE   r   r   r   Útest_run_equals_NoneY   ó   

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,   a   s   
z)TestGreenlet.test_two_children.<locals>.fr   r-   r.   Té   )r#   r   r0   ÚlenÚdead)r3   r,   r$   Úhr   r*   r   Útest_two_children^   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,   u   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$   y   s   
z3TestGreenlet.test_two_recursive_children.<locals>.gr-   )rQ   rP   rR   )r#   r0   r   Úgetrefcountr   rE   r   rT   r   Útest_two_recursive_childrenr   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)r4   r   r   )r3   Ú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>Œ   s    z-TestGreenlet.test_threads.<locals>.<listcomp>é
   )r2   ÚstartÚjoinr0   rL   )r3   ÚthsÚthr   )r,   r3   rX   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   r0   r:   r   )r3   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   r:   ÚKeyErrorr&   r0   )r3   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   r0   ÚgcÚcollectr   ÚGreenletExit)r3   r   r%   rh   r   r   r   Útest_dealloc¶   s   

zTestGreenlet.test_deallocc                 C   s|   dd„ }t |ƒ}| ¡  tj}ddlm} |ƒ  }t_z~W |t_n|t_w | ¡ }|  d|¡ |  d|¡ |  d|¡ d S )Nc                   S   s,   z
t  ¡ j ¡  W d S  t jy   td ‚w r   )r   r   r   r   ro   r   r   r   r   r   r9   Å   s
   ÿzHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.runr   )ÚStringIOÚ	ExceptionÚignoredr   )r#   r   r   ÚstderrÚiorq   Úgetvaluer<   )r3   r9   r$   Ú	oldstderrrq   rt   Úvr   r   r   Ú.test_dealloc_catches_GreenletExit_throws_otherÄ   s   z;TestGreenlet.test_dealloc_catches_GreenletExit_throws_otherz=Sometimes flaky (getting one GreenletExit in the second list)c              	      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 …= d S ˆ 	¡  | d¡ ˆd d …= ˆd d …= w )Nc                     sZ   t tƒ} |  ˆ¡ ˆ | ¡ ~ t ¡  ˆ  ¡  ˆ d¡ t ƒ  ˆ ¡  ˆ d¡ t ƒ  d S )Nr(   )r#   r   r   r   rm   rn   Ú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   Úsomerefr   r   r,   ï   s   




z1TestGreenlet.test_dealloc_other_thread.<locals>.frY   ra   r   r(   )r[   ÚEventr\   rb   r{   r0   rL   rm   rn   rz   r   ro   rc   )r3   r,   Útr   r|   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   Ú	_getframer0   Úf_backr   r   r   r   r_   r6   r   r   Úf1  s   
z#TestGreenlet.test_frame.<locals>.f1r…   )r#   r   Ú
assertTrueÚgr_frameÚassertFalser0   )r3   rˆ   r$   ÚframeÚfrom_gr   r6   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>$  ó   
 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š™™™™™É?©rZ   Úargs)g333333Ó?ra   )r[   r\   rb   rc   )r3   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-   é*   )r0   ©rQ   rP   r6   r   r   r9   .  s   z,TestGreenlet.test_switch_kwargs.<locals>.runr.   r-   rœ   r›   ©r#   r   r0   )r3   r9   r’   r   r6   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   r9   6  s   z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.runr’   r(   )r-   )r(   é	   )r#   r0   r   )r3   r9   r$   r   r   r   Útest_switch_kwargs_to_parent5  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 s8w   Y  ˆ 	¡  | 
d¡ ˆ ¡  d S )Nc                      ó&   t dd„ ƒˆd< ˆ  ¡  ˆ d¡ d S )Nc                   S   ó   d S r   r   r   r   r   r   r“   E  ó    zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>r$   ra   ©r#   rz   r{   r   ©Úcreated_eventÚdataÚ
done_eventr   r   r9   D  ó   z7TestGreenlet.test_switch_to_another_thread.<locals>.runrY   ra   r$   )r[   r‚   r\   rb   r{   r:   r   Úerrorr   rz   rc   Úclear)r3   r9   Úthreadr   r¦   r   Útest_switch_to_another_thread?  s   
ÿ
z*TestGreenlet.test_switch_to_another_threadc                    s*   ‡ ‡fdd„}‡fdd„‰ t |ƒ ¡  d S )Nc                     s:   zt dƒ‚   t ¡ } tˆ ƒ ¡  ˆ | t ¡ ¡ Y d S )NÚfun)Ú
ValueErrorr   r   r#   r   r0   )r   ©rN   r3   r   r   r,   S  s   z&TestGreenlet.test_exc_state.<locals>.fc                      s   ˆ   t ¡ d¡ d S )N)NNN)r0   r   r   r   r6   r   r   rN   [  ó   z&TestGreenlet.test_exc_state.<locals>.hr"   )r3   r,   r   r±   r   Útest_exc_stateR  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,   a  ó   z*TestGreenlet.test_instance_dict.<locals>.fc                 S   s   | ` d S r   ©Ú__dict__rS   r   r   r   Údeldictc  ó   z0TestGreenlet.test_instance_dict.<locals>.deldictc                 S   s
   || _ d S r   r·   )r$   ri   r   r   r   Úsetdicte  ó   
z0TestGreenlet.test_instance_dict.<locals>.setdictr›   rµ   )r#   r0   r¸   r   rµ   r:   Ú	TypeError)r3   r,   r¹   r»   r$   r   r   r   Útest_instance_dict`  s   zTestGreenlet.test_instance_dictc                    s2   g ‰ ‡ fdd„}t |ƒ}| ¡  |  ˆ dg¡ d S )Nc                      s   ˆ   tt ¡ dƒ¡ d S r8   )r   Úhasattrr   r   r   ©Úhas_runr   r   Úfuncs  s   ÿz;TestGreenlet.test_running_greenlet_has_no_run.<locals>.funcFr�   ©r3   rÂ   r$   r   rÀ   r   Ú test_running_greenlet_has_no_runq  s
   z-TestGreenlet.test_running_greenlet_has_no_runc                 C   s0   dd l }|  t|j tƒ ¡ |  t|jtƒ ¡ d S r   )Úcopyr:   r½   r#   Údeepcopy)r3   rÅ   r   r   r   Útest_deepcopy|  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   r£   r   r   r   r   r   r   r“   ‚  r¤   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>c                      sL   zˆ  ¡  W d S  tjy%   ˆ t ¡ j¡ ˆ t ¡ ¡ ˆ   ¡  Y d S w r   )r   r   ro   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‰   rD   r   )r3   rÌ   r$   r   rÈ   r   Útest_parent_restored_on_kill�  s   	

z)TestGreenlet.test_parent_restored_on_killc                 C   sN   t ƒ }t dd„ |d�}|  t¡� | ¡  W d   ƒ d S 1 s w   Y  d S )Nc                   S   r£   r   r   r   r   r   r   r“      r¤   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>r!   )r#   r:   r;   r   )r3   r%   rh   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                   @   ó   e Zd Zdd„ ZdS )z>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletc                 S   s   zt ‚   Y t | |¡S r   )rr   r#   Ú__getattribute__©r3   Únamer   r   r   rÐ   §  s
   zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__N©r   r   r   rÐ   r   r   r   r   Ú
mygreenlet¦  ó    rÔ   c                   S   r£   r   r   r   r   r   r   r“   ­  r¤   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>)r#   r:   r   rA   )r3   rÔ   r$   r   r   r   Útest_throw_exception_not_lost¥  s   z*TestGreenlet.test_throw_exception_not_lostFc                    sT  g ‰ dd„ ‰‡ ‡‡fdd„}t j|d�}| ¡  | d¡ ~ˆr$|  ¡  |  tj¡�}ˆ d  t	¡ W d   ƒ n1 s<w   Y  ˆsTt
|jƒ}|  |dkpQd	|v ¡ n	|  t
|jƒd¡ tˆ d jd
ƒr�|  t¡� ˆ d j ¡  W d   ƒ n1 s|w   Y  ˆs•tˆ d jjd
ƒr”ˆ d jj ¡  n|  ˆ d j¡ ~d ‰ˆ d d …= d| _d S )Nc                   S   ó   t  ¡ j ¡  d S r   rŸ   r   r   r   r   rÌ   ³  ó   zGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.workerc                     s6   t ˆƒ} |  ¡  ˆ  | ¡ ˆr|  ¡  t ¡  d S d S r   )r#   r   r   r   r   rS   ©rË   Úwait_for_cleanuprÌ   r   r   Úcreator¶  s   
ýzHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creatorrY   ra   r   úBcannot switch to a different thread (which happens to have exited)zCannot switchr¬   T)r[   r\   rb   rc   Úwait_for_pending_cleanupsr:   r   r«   rA   r   r=   r>   r‰   r0   r¿   rŠ   ÚRuntimeErrorr¬   Úf_localsrG   Úexpect_greenlet_leak)r3   rÚ   rÛ   rƒ   r   Úsr   rÙ   r   Ú*_do_test_throw_to_dead_thread_doesnt_crash°  sF   
ÿ
þþÿ€

z7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crashc                 C   r5   r   ©râ   r6   r   r   r   Ú&test_throw_to_dead_thread_doesnt_crashê  s   z3TestGreenlet.test_throw_to_dead_thread_doesnt_crashc                 C   s   |   d¡ d S rW   rã   r6   r   r   r   Ú+test_throw_to_dead_thread_doesnt_crash_waitî  r¶   z8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_waitc                 C   s2   G dd„ dt ƒ}|ƒ }|  | d¡d¡ d| _d S )Nc                   @   ó$   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__Úcountr6   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 )Nr9   r   r   é+   )rè   r   r#   rÐ   rÑ   r   r   r   rÐ   ÷  s   
zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__c                 S   s   	 | j  |¡ qr   ©r   r   ©r3   ri   r   r   r   r9   ü  s   ÿz;TestGreenlet.test_recursive_startup.<locals>.convoluted.runN)r   r   r   rç   rÐ   r9   r   r   r   r   Ú
convolutedó  s    rì   r›   ré   T)r#   r0   r   rà   )r3   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Úacquirer6   ©Ú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   r×   r   rŸ   r   r   r   r   Údeallocator  rØ   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   rY   ra   )r[   ÚLockrð   Úobjectr   r   r#   Úbombr   r\   rb   rï   r0   rc   )r3   rö   r÷   rú   rÊ   rƒ   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               
      sV   t  ¡ j ¡ } ˆd= t  ¡ jˆ _zt  ¡ j | ¡ W ˆ t  ¡ ¡ d S ˆ t  ¡ ¡ w r   )r   r   r   r   r   )ri   ©Ú	initiatorr   rÌ   r   r   rÌ   8  s   "z>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.workerc                   S   ó   dS r´   r   r   r   r   r   r   E  r    zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiatorr   r›   )r#   r   r‰   r0   rë   r   rÿ   r   Ú!test_dealloc_switch_args_not_lost6  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Â   rQ   Úkr   r   r   Ú_apply^  rØ   z0TestGreenlet.test_tuple_subclass.<locals>._applyc                   @   rÏ   )z1TestGreenlet.test_tuple_subclass.<locals>.mytuplec                 S   s   t  ¡  ¡  t | ¡S r   )r   r   r   ÚtupleÚ__len__r6   r   r   r   r  b  s   
z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__N)r   r   r   r  r   r   r   r   Úmytuplea  rÕ   r  r›   )rQ   c                      s   ˆ t  ¡ jjˆˆƒ d S r   rŸ   r   ©r  r—   Úkwargsr   r   Úswitchapplyg  s   z5TestGreenlet.test_tuple_subclass.<locals>.switchapply)r  Údictr#   r0   r   )r3   r  r
  r$   r   r  r   Útest_tuple_subclassP  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ÚAbstractSubclassr9   c                 S   r£   r   r   r6   r   r   r   r“   p  r¤   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>c                   @   r
   )z:TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   r   ÚBadSubclassr  r   r  c                   @   rÏ   )z;TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                 S   r£   r   r   r6   r   r   r   r9   v  r    z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runN)r   r   r   r9   r   r   r   r   ÚGoodSubclassu  rÕ   r  )r   r#   r   r:   r½   )r3   r  r  r  r   r   r   Útest_abstract_subclassesl  s   ýz%TestGreenlet.test_abstract_subclassesc                    sP   t  ¡ sd S t  ¡ d ‰ ˆ dk rd S ‡ ‡fdd„}tdƒD ]}|ƒ r% d S q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
 rd n| |¡ qKt ¡  ˆd
 rw| 	d¡ dS ˆ |j|¡ |D ]	}ˆ |j|¡ q‚dS )NFc                      s   ˆ   ¡  t ¡  ˆ ¡  d S r   rø   r   rñ   r   r   Úanother_threadˆ  ó   zWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadrY   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î   r6   ©rò   ró   Úrecycledr   r   rô   �  r  z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__Nrõ   r   r  r   r   Úgc_callbackŽ  s    r  c                       ó   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Úcallbackr6   ©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“  ó    r  r-   r   ra   T)r[   rû   rð   r\   rb   rü   r2   r   r   rc   r#   r   rm   rn   r0   r   )	r  rƒ   r  Úlr’   Úcurrentr$   Ú_Úlast©ÚNr3   )r  rò   ró   r  r   Úattempt‚  s>   

z?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptr/   )rm   Ú	isenabledÚget_thresholdr2   )r3   r#  r  r   r!  r   Ú!test_implicit_parent_with_threads|  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 ]}||ƒ ¡  q(ˆ`ˆ 	t |¡|¡ d S )	Nr   ©r   )ro   c                   @   r
   )zTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   r   ÚGreenlet¼  r   r(  c                      s6   z	ˆƒ j  ¡  W d S  ˆ y   ˆj ˆƒ ¡ Y d S w r   )r   r   Úgletsr   r   ©ro   r   r3   r   r   Úgreenlet_mainÅ  s
   ÿzYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_mainra   )
r   r   ro   r#   r   rU   r)  r2   r   r0   )r3   r(  Úinitial_refsr+  r  r   r*  r   Ú5test_issue_245_reference_counting_subclass_no_threads³  s   
zBTestGreenlet.test_issue_245_reference_counting_subclass_no_threadsz;The manylinux images appear to hang on this test on 3.13rc2c           
         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�}| 	|¡ | 
¡  q<|D ]}	|	 d¡ qTˆd d …= ˆ ¡  |  ¡  |  t ˆ ¡|¡ d S )Nr   )r\   )r‚   r'  c                   @   r
   )zSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   r   Ú
MyGreenletà  r   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 )Nra   )r   r   rz   r{   )Úgreenlet_running_eventÚmine©r.  r   r)  r+  Úref_clearedr   r   Úthread_mainé  s   


zTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_mainé-   r–   ra   )r[   r\   r‚   r   r   r#   r   rU   r2   r   rb   r{   rz   rÝ   r0   )
r3   r\   r‚   r3  r,  Úthread_ready_eventsr  Úeventr­   r©   r   r1  r   Ú2test_issue_245_reference_counting_subclass_threadsÒ  s.   	
ÿ


z?TestGreenlet.test_issue_245_reference_counting_subclass_threadsc                 C   sZ   dd„ }t |ƒ}dd„ }t ||ƒ}|  t¡� | ¡  W d   ƒ d S 1 s&w   Y  d S )Nc                   S   r  )Né   r   r   r   r   r   Úno_args  r    z\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_argsc                   S   r  r´   r   r   r   r   r   Úleaf"  r    zYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf)r#   r:   r½   r   )r3   r9  Ú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,  rº   zUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_argc                   S   r  r´   r   r   r   r   r   r:  1  r    zRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf)r›   r?  r�   )r3   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 s*w   Y  |  ˆ dg¡ |  t¡� | ¡  W d   ƒ n1 sJw   Y  |  ˆ dg¡ d S )Nc                   @   rÏ   )zXTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentc                 S   s   |dkrt ‚d S r8   )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:  rÕ   rB  c                      ó
   ˆ   d¡S r´   ©r   r   r   r   r   r“   B  r”   zZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>r›   )r#   r:   r   r   r0   )r3   rB  r;  r<  r   r   r   Ú;test_switch_to_dead_greenlet_with_unstarted_perverse_parent9  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                      rC  r>  rD  r   r   r   r   r“   P  r”   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>c                      rC  r´   rD  r   r   r   r   r“   Q  r”   r›   r?  )r#   r   r0   r   rG   )r3   r;  r<  rË   r   r   r   Ú%test_switch_to_dead_greenlet_reparentN  s   
z2TestGreenlet.test_switch_to_dead_greenlet_reparentc                    s˜   t  ¡ ‰‡ fdd„}‡fdd„‰ t|ƒ}| ¡  tdd„ ƒ}| ¡  |  |j¡ |  |jjjd¡ |  |jj	¡ |  |jj	jjd¡ |  
|jj	j	¡ d S )	Nc                      s
   ˆ ƒ  d S r   r   r   ©Úinnerr   r   Úouterb  r¼   zHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.outerc                      s   ˆ   t d¡¡ d S r   )r   r   r†   r   ©rÊ   r   r   rH  e  r²   zHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.innerc                   S   r£   r   r   r   r   r   r   r“   n  r¤   zKTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.<lambda>rH  rI  )r   r   r#   r   rC   rŠ   r0   Úf_codeÚco_namer‡   rG   )r3   rI  rÉ   Ú	unrelatedr   ©rH  rÊ   r   Ú,test_can_access_f_back_of_suspended_greenlet\  s   z9TestGreenlet.test_can_access_f_back_of_suspended_greenletc                    sš   ddl m‰ ddlm‰  ‡ ‡‡fdd„‰tˆƒ}| d¡ |j}tdƒD ]}|  |j	d |¡ |j
}q$|  |j	d d¡ |  |j
¡ |  | d	¡d
¡ d S )Nr   )Úpartialr   )Ú_test_extension_cppc                    s.   | dkr| ˆ   ˆˆ| d ƒ¡ S t ¡ j ¡ S )Nr   r   )Ú	test_callr   r   r   r   )rx   ©rQ  rP  Úrecurser   r   rT  }  s   z@TestGreenlet.test_get_stack_with_nested_c_calls.<locals>.recurser/   rx   ra   i°  )Ú	functoolsrP  Ú rQ  r#   r   rŠ   r2   r0   rß   r‡   rG   )r3   ÚgrrŒ   r^   r   rS  r   Ú"test_get_stack_with_nested_c_callsy  s   
z/TestGreenlet.test_get_stack_with_nested_c_callsc                    sd   t  ¡ ‰‡ fdd„}‡fdd„‰ t|ƒ}| ¡ }tdd„ ƒ}| ¡  |  |jjd¡ |  |j¡ d S )Nc                      s   ˆ t  d¡ƒ d S r   )r   r†   r   rG  r   r   rI  ’  rØ   z6TestGreenlet.test_frames_always_exposed.<locals>.outerc                    s   ˆ   | ¡ d S r   )r   )rŒ   rJ  r   r   rH  •  r¶   z6TestGreenlet.test_frames_always_exposed.<locals>.innerc                   S   r£   r   r   r   r   r   r   r“   �  r¤   z9TestGreenlet.test_frames_always_exposed.<locals>.<lambda>rI  )	r   r   r#   r   r0   rK  rL  rG   r‡   )r3   rI  rW  rŒ   rM  r   rN  r   Útest_frames_always_exposedŒ  s   z'TestGreenlet.test_frames_always_exposedN)F)4r   r   r   r4   r7   r@   rB   rF   rH   rO   rV   rf   rj   rl   rp   ry   ÚunittestÚskipIfr   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-  r7  r=  rA  rE  rF  rO  rX  rY  r   r   r   r   r'   2   sp    þ
,
	9

/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 sBw   Y  ˆ 
¡  | d¡ |  t|jƒd¡ d S )	Nc                      r¢   )Nc                   S   r£   r   r   r   r   r   r   r“   ¬  r¤   zQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>r$   ra   r¥   r   r¦   r   r   r9   «  rª   z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.runc                   S   r×   r   rŸ   r   r   r   r   Úblank°  rØ   zATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blankrY   ra   r$   z&parent cannot be on a different thread)r[   r‚   r\   rb   r{   r#   r   r:   r°   r   rz   rc   r0   r=   r>   )r3   r9   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 sEw   Y  |  t|jƒd¡ ˆ d d …= d S )Nc                     s"   t dd„ ƒ} ˆ  | ¡ |  ¡  d S )Nc                   S   r£   r   r   r   r   r   r   r“   Â  r¤   zYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>)r#   r   r   rS   ©Úanotherr   r   rÌ   Á  s   
zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.workerrY   ra   r   )Úinitial_main_greenletsc                       r  )zKTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedc                    ó   |dkr	ˆ d | _ t | |¡S ©Nr9   r   ©r   r#   rÐ   rÑ   r_  r   r   rÐ   Ý  ó   
z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__NrÓ   r   r_  r   r   rì   Ü  r  rì   c                   S   r£   r   r   r   r   r   r   r“   á  r¤   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>rÜ   )r[   r\   rb   rc   rÝ   Úmain_greenlets_before_testr#   r:   r   r«   r   r0   r=   r>   )r3   rÌ   rƒ   rì   r$   r   r   r_  r   Útest_unexpected_reparenting¿  s   

ÿÿz7TestGreenletSetParentErrors.test_unexpected_reparentingc              	      s  g ‰ t  ¡ ‰t  ¡ ‰‡ ‡‡fdd„}G ‡ fdd„dtƒ}t j|d�}| ¡  ˆ d¡ zL|dd„ ƒ}|  tj¡�}| 	¡  W d   ƒ n1 sGw   Y  |  
d	t|jƒ¡ |  
d
t|jƒ¡ |  
dt|jƒ¡ W ˆ ¡  | d¡ ˆ d d …= d S ˆ ¡  | d¡ ˆ d d …= w )Nc                     s4   t dd„ ƒ} ˆ  | ¡ |  ¡  ˆ ¡  ˆ d¡ d S )Nc                   S   r£   r   r   r   r   r   r   r“   ï  r¤   zhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>ra   )r#   r   r   rz   r{   rS   ©r`  Úkeep_main_aliveÚswitched_to_greenletr   r   rÌ   î  s
   
zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerc                       r  )zZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedc                    rb  rc  rd  rÑ   r_  r   r   rÐ   õ  re  zkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__NrÓ   r   r_  r   r   rì   ô  r  rì   rY   ra   c                   S   r£   r   r   r   r   r   r   r“   ÿ  r¤   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>z#Cannot switch to a different threadÚExpectedÚCurrent)r[   r‚   r#   r\   rb   r{   r:   r   r«   r   r<   r=   r>   rz   rc   )r3   rÌ   rì   rƒ   r$   r   r   rh  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 s!w   Y  |  t|j	ƒd¡ d S )Nc                   S   r£   r   r   r   r   r   r   r“     r¤   zGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>úcan't delete attribute)
r#   rD   r   r   r   r:   r;   r0   r=   r>   )r3   rÌ   r   r   r   r   Útest_cannot_delete_parent  s   ÿz5TestGreenletSetParentErrors.test_cannot_delete_parentc                 C   sH   |   t¡�}t ¡ `W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )Nrn  ©r:   r;   r   r   r   r0   r=   r>   ©r3   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   )rG   r   r   r   r6   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   r×   r   rŸ   r   r   r   r   Úbg  s   zCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bgc              	      sb   d dˆ dfD ](}ˆ   t¡�}|| _W d   ƒ n1 sw   Y  ˆ  t|jƒdt|ƒj ¡ qd S )Nr   Ú42z4GreenletChecker: Expected any type of greenlet, not )r:   r½   r   r0   r=   r>   Útyper   )ÚgletÚpr   r6   r   r   Úcheck#  s   ÿþüzFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check)r#   r‹   r   r‰   )r3   rt  ry  r$   r   r6   r   Útest_set_parent_wrong_types  s   


z7TestGreenletSetParentErrors.test_set_parent_wrong_typesc                 C   sR   t dd„ ƒ}|  t¡�}||_W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )Nc                   S   r£   r   r   r   r   r   r   r“   ;  r¤   z@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>úcyclic parent chain)r#   r:   r°   r   r0   r=   r>   )r3   rw  r   r   r   r   Útest_trivial_cycle:  s
   ÿz.TestGreenletSetParentErrors.test_trivial_cyclec                 C   sN   |   t¡�}t ¡ t ¡ _W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )Nz(cannot set the parent of a main greenletrp  rq  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 s+w   Y  |  t|jƒd¡ d S )Nc                   S   r£   r   r   r   r   r   r   r“   G  r¤   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>c                   S   r£   r   r   r   r   r   r   r“   H  r¤   c                   S   r£   r   r   r   r   r   r   r“   I  r¤   r{  )r#   r   r:   r°   r0   r=   r>   )r3   r%   rh   Úg3r   r   r   r   Útest_deeper_cycleF  s   ÿz-TestGreenletSetParentErrors.test_deeper_cycleN)r   r   r   r^  rg  rm  ro  rr  rs  rz  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)r3   ÚgotÚsuffixr   r   r   ÚassertEndsWithT  s   zTestRepr.assertEndsWithc                 C   s   t t ¡ ƒ}|  |d¡ d S )Nú current active started main>)Úreprr   r   r„  ©r3   Úrr   r   r   Útest_main_while_runningW  s   z TestRepr.test_main_while_runningc                    s4   t  ¡ ‰ ‡ fdd„}t|ƒ}| ¡ }|  |d¡ d S )Nc                      s   t ˆ ƒS r   )r†  r   rJ  r   r   r9   ]  rº   z-TestRepr.test_main_in_background.<locals>.runú suspended active started main>)r   r   r#   r   r„  )r3   r9   r$   rˆ  r   rJ  r   Útest_main_in_background[  s
   z TestRepr.test_main_in_backgroundc                 C   s   t tƒ ƒ}|  |d¡ d S )Nz	 pending>)r†  r#   r„  r‡  r   r   r   Útest_initiald  s   
zTestRepr.test_initialc                    s    t  ¡ ‰ G ‡ fdd„dtjƒ}|ƒ }| ¡  | d¡ |  |jd¡ |  |jd¡ t	dƒD ]}t
 d¡ q-t	dƒD ]}|  |jj¡ t|jƒ}|  |d¡ q9d 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   )r†  Úoriginal_mainr   r   Ú	main_gletr3  r6   rJ  r   r   r9   n  rI   z3TestRepr.test_main_from_other_thread.<locals>.T.run)r   r   r   r�  r3  rŽ  r9   r   rJ  r   r   ÚTk  s    r�  ra   rŠ  r…  r(   gü©ñÒMbP?z (thread exited) dead>)r   r   r[   r\   rb   rc   r„  r�  r3  r2   r�   r�   r‰   rŽ  rM   r†  )r3   r�  rƒ   r  rˆ  r   rJ  r   Útest_main_from_other_threadh  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   r£   r   r   r   r   r   r   r“   Œ  r¤   z$TestRepr.test_dead.<locals>.<lambda>z dead>Ú	suspendedÚstartedÚactive)r#   r   r„  r†  ÚassertNotInrE   r   r   r   Ú	test_dead‹  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   r£   r   r   r   r   r   r   r“   —  r¤   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>c                   S   r£   r   r   r   r   r   r   r“   ˜  r¤   z%sz%r)r#   r   r   ÚassertIsInstancer=   )r3   Úg_deadÚg_not_startedÚg_curr$   r   r   r   Ú#test_formatting_produces_native_str“  s   þþúz,TestRepr.test_formatting_produces_native_strN)
r   r   r   r„  r‰  r‹  rŒ  r�  r•  rš  r   r   r   r   r€  R  s    	#r€  c                   @   ræ   )ÚTestMainGreenletc                 C   s4   dt t ¡ ƒv s
J ‚tt ¡ ƒ}dt |ƒvsJ ‚|S )NrÊ   )r†  r   r   rv  )r3   rƒ   r   r   r   Ú_check_current_is_main«  s   z'TestMainGreenlet._check_current_is_mainc                 C   s$   |   ¡ }td|fi ƒ}|  |¡ d S )NÚsubclass)rœ  rv  rC   )r3   Ú	main_typer�  r   r   r   Ú)test_main_greenlet_type_can_be_subclassed³  s   z:TestMainGreenlet.test_main_greenlet_type_can_be_subclassedc                 C   s   |   ¡  |  t ¡ t¡ d S r   )rœ  r–  r   r   r#   r6   r   r   r   Útest_main_greenlet_is_greenlet¸  s   z/TestMainGreenlet.test_main_greenlet_is_greenletN)r   r   r   rœ  rŸ  r   r   r   r   r   r›  §  s    r›  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   sT   dd„ }t j |¡}d|_|  td¡� | ¡  W d   ƒ d S 1 s#w   Y  d S )Nc                   S   s   t dƒ‚)NzNever get here)ÚAssertionErrorr   r   r   r   rÂ   Ã  rº   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_initialstubÂ  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 s=w   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   r0   r¥  r¦  r§  rÃ   r   r©  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)ÚassertScriptRaisesr<   ÚoutputÚ
returncodeÚ,get_expected_returncodes_for_aborted_process©r3   Ú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_scriptr<   ©r3   r­  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   )Ú	exitcodesr½   zpositional arguments)r¬  r<   r­  r°  r   r   r   Ú%test_reentrant_switch_three_greenletsú  s   z9TestBrokenGreenlets.test_reentrant_switch_three_greenletsc                 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')]r´  r¶  r   r   r   Ú&test_reentrant_switch_three_greenlets2  s
   
øz:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2c                 C   rº  )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)]r´  r¶  r   r   r   Ú4test_reentrant_switch_GreenletAlreadyStartedInPython  s
   
úzHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPythonc                 C   rº  )Nzfail_clearing_run_switches.pyz„RESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]r´  r¶  r   r   r   Ú*test_reentrant_switch_run_callable_has_del!  s
   
ûz>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_delN)r   r   r   r¨  r«  r²  r·  r¹  r»  r¼  r½  r   r   r   r   r¡  ¾  s    
	r¡  Ú__main__)rm   r   r�   r[   rZ  Úabcr   r   r   r#   rV  r   r   r   Ú	leakcheckr	   rr   r   r   r&   r'   r\  r€  r›  r¡  r   rÊ   r   r   r   r   Ú<module>   s>    		      y .Umÿ