U
    ËZjƒ[  ã                   @   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mZ d dlmZ G dd„ de	ƒZ
dd„ Zdd	„ ZG d
d„ dejƒZG dd„ dejƒZedkr˜e ¡  dS )é    N)ÚABCMetaÚabstractmethod)Úgreenletc                   @   s   e Zd ZdS )Ú	SomeErrorN©Ú__name__Ú
__module__Ú__qualname__© r
   r
   ú_/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/greenlet/tests/test_greenlet.pyr      s   r   c                 C   s<   zt  ¡ j ¡  W n    |  t ¡ d ¡ ‚ Y nX 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   ©r   r   )Ú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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d5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAS )BÚTestGreenletc                    s^   g ‰ ‡ fdd„}t |ƒ}ˆ  d¡ | ¡  ˆ  d¡ | ¡  ˆ  d¡ |  ˆ ttdƒƒ¡ d S )Nc                      s&   ˆ   d¡ t ¡ j ¡  ˆ   d¡ d S )Né   é   ©r   r   r   r   r   r
   ©Úlstr
   r   Úf'   s    
z#TestGreenlet.test_simple.<locals>.fr   é   é   é   )r   r   r   ÚassertEqualÚlistÚrange)Úselfr#   r   r
   r!   r   Útest_simple$   s    


zTestGreenlet.test_simplec                 C   s*   t d d�}|  |¡ |  |jt  ¡ ¡ d S )Nr   )r   ÚassertIsNotNoneZassertIsr   r   ©r*   r   r
   r
   r   Útest_parent_equals_None3   s    

z$TestGreenlet.test_parent_equals_Nonec                 C   s$   t d d�}|  |¡ |  |j¡ d S )N)Úrun)r   r,   ZassertIsNoner/   r-   r
   r
   r   Útest_run_equals_None8   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)r*   r#   r   Úhr
   r!   r   Útest_two_children=   s    zTestGreenlet.test_two_childrenc                    sT   g ‰‡fdd„‰ ‡ ‡fdd„}t |ƒ}| ¡  |  tˆƒd¡ |  t |¡d¡ d S )Nc                      s   ˆ   d¡ t ¡ j ¡  d S r1   r    r
   r!   r
   r   r#   T   s    
z3TestGreenlet.test_two_recursive_children.<locals>.fc                     s(   ˆ  d¡ tˆ ƒ} |  ¡  ˆ  d¡ d S r1   )r   r   r   ©r   ©r#   r"   r
   r   r   X   s    
z3TestGreenlet.test_two_recursive_children.<locals>.gr   r$   )r   r   r'   r4   r   Úgetrefcountr-   r
   r9   r   Útest_two_recursive_childrenQ   s    z(TestGreenlet.test_two_recursive_childrenc                    sd   g ‰‡‡fdd„‰ ‡ fdd„t dƒD ƒ}|D ]}| ¡  q,|D ]}| ¡  q>ˆ tˆƒt|ƒ¡ d S )Nc                      s   ˆ   ¡  ˆ d¡ d S )NT)r+   r   r
   )r*   Úsuccessr
   r   r#   e   s    z$TestGreenlet.test_threads.<locals>.fc                    s   g | ]}t jˆ d �‘qS )©Útarget)Ú	threadingÚThread)Ú.0Úi©r#   r
   r   Ú
<listcomp>h   s     z-TestGreenlet.test_threads.<locals>.<listcomp>é
   )r)   ÚstartÚjoinr'   r4   )r*   ZthsÚthr
   )r#   r*   r<   r   Útest_threadsb   s    

zTestGreenlet.test_threadsc                 C   sp   g }t tƒ}t tƒ}| |¡ | |¡ ||_|  |g ¡ |  t|j¡ |  |tg¡ | ¡  |  |tg¡ d S r   )r   r   r   r   r'   ÚassertRaisesr   ©r*   r   r   Úg2r
   r
   r   Útest_exceptiono   s    

zTestGreenlet.test_exceptionc                 C   s8   g }t tƒ}| |¡ |  tt|t¡ |  |tg¡ d S r   )r   r   r   rJ   ÚKeyErrorr   r'   )r*   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ÚcollectÚGreenletExitrK   r
   r
   r   Útest_deallocƒ   s    

zTestGreenlet.test_deallocc                    sÄ   g ‰g ‰t  ¡ ‰ ˆ  ¡  t  ¡ ‰ˆ ¡  ‡ ‡‡‡fdd„}t j|d�}| ¡  ˆ  ¡  |  ˆg ¡ |  tˆƒd¡ ˆd d …= t ¡  |  ˆg ¡ ˆ 	¡  ˆ  ¡  |  ˆt
jg¡ ˆ 	¡  | ¡  d S )Nc                     sP   t tƒ} |  ˆ¡ ˆ | ¡ ~ t ¡  ˆ  ¡  ˆ ¡  t ƒ  ˆ  ¡  ˆ ¡  d S r   )r   r   r   r   rP   rQ   ÚreleaseÚacquire)r   ©ÚlockÚlock2r   Zsomerefr
   r   r#   ™   s    

z1TestGreenlet.test_dealloc_other_thread.<locals>.fr=   r   )r?   ÚLockrU   r@   rF   r'   r4   rP   rQ   rT   r   rR   rG   )r*   r#   Útr
   rV   r   Útest_dealloc_other_thread‘   s(    
z&TestGreenlet.test_dealloc_other_threadc                    sf   ‡ fdd„}t |ƒ}| ¡ }ˆ  ||jk¡ ˆ  |¡ | ¡ }ˆ  |¡ ˆ  |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   rC   ©r*   r
   r   Úf1´   s    
z#TestGreenlet.test_frame.<locals>.f1r\   )r   r   Ú
assertTrueZgr_frameZassertFalser'   )r*   r`   r   ÚframeZfrom_gr
   r_   r   Ú
test_frame³   s    

zTestGreenlet.test_framec                 C   sH   dd„ }t j|dd�}t j|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   )rg   r   r
   rf   r   ÚrunnerÄ   s    z,TestGreenlet.test_thread_bug.<locals>.runner)gš™™™™™É?©r>   Úargs)g333333Ó?)r?   r@   rF   rG   )r*   rj   Ú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'   ©ÚaÚbr_   r
   r   r/   Ï   s    z,TestGreenlet.test_switch_kwargs.<locals>.runr%   r$   rq   rp   )r   r   r'   )r*   r/   rg   r
   r_   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 )Nrf   r$   r   ©r   r   r   r   rf   r
   r
   r   r/   ×   s    z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.runrg   r   )r$   )r   é	   ©r   r'   r   )r*   r/   r   r
   r
   r   Útest_switch_kwargs_to_parentÖ   s
    z)TestGreenlet.test_switch_kwargs_to_parentc                    s˜   i ‰d }t  ¡ ‰ t  ¡ ‰‡ ‡‡fdd„}t j|d�}| ¡  ˆ  ¡  zˆd  ¡  W n" tjk
rv   t 	¡ d }Y nX |  
|d¡ ˆ ¡  | ¡  d S )Nc                      s$   t dd„ ƒˆd< ˆ  ¡  ˆ ¡  d S )Nc                   S   s   d S r   r
   r
   r
   r
   r   rh   ç   ri   zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>r   ©r   ÚsetÚwaitr
   ©Zcreated_eventÚdataÚ
done_eventr
   r   r/   æ   s    z7TestGreenlet.test_switch_to_another_thread.<locals>.runr=   r   r   zgreenlet.error was not raised!)r?   ÚEventr@   rF   r{   r   r   Úerrorr   r   r,   rz   rG   )r*   r€   r/   Ú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                     sB   zt dƒ‚W n0   t ¡ } tˆ ƒ ¡  ˆ | t ¡ ¡ Y nX d S )NZfun)Ú
ValueErrorr   r   r   r   r'   )r   ©r6   r*   r
   r   r#   ö   s    z&TestGreenlet.test_exc_state.<locals>.fc                      s   ˆ   t ¡ d¡ d S )N)NNN)r'   r   r   r
   r_   r
   r   r6   þ   s    z&TestGreenlet.test_exc_state.<locals>.hr   )r*   r#   r
   r„   r   Útest_exc_stateõ   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 ©Nrp   )r   r   Útestr
   r
   r
   r   r#     s    z*TestGreenlet.test_instance_dict.<locals>.fc                 S   s   | ` d S r   ©Ú__dict__r8   r
   r
   r   Údeldict  s    z0TestGreenlet.test_instance_dict.<locals>.deldictc                 S   s
   || _ d S r   rˆ   ©r   Úvaluer
   r
   r   Úsetdict  s    z0TestGreenlet.test_instance_dict.<locals>.setdictrp   r‡   )r   r'   r‰   r   r‡   rJ   Ú	TypeError)r*   r#   rŠ   r�   r   r
   r
   r   Útest_instance_dict  s    zTestGreenlet.test_instance_dictc                    sˆ   i ‰t  ¡ ‰ t  ¡ ‰‡ ‡‡fdd„}dd„ }dd„ }t j|d�}| ¡  ˆ  ¡  t|ƒ}| ¡  |  t||ˆd ¡ ˆ 	¡  | 
¡  d S )	Nc                      s$   t dd„ ƒˆd< ˆ  ¡  ˆ ¡  d S )Nc                   S   s   d S r   r
   r
   r
   r
   r   rh     ri   zBTestGreenlet.test_threaded_reparent.<locals>.run.<locals>.<lambda>r   ry   r
   r|   r
   r   r/     s    z0TestGreenlet.test_threaded_reparent.<locals>.runc                   S   s   t  ¡ j ¡  d S r   ru   r
   r
   r
   r   Úblank  s    z2TestGreenlet.test_threaded_reparent.<locals>.blankc                 S   s
   || _ d S r   r   r‹   r
   r
   r   Ú	setparent!  s    z6TestGreenlet.test_threaded_reparent.<locals>.setparentr=   r   )r?   r   r@   rF   r{   r   r   rJ   rƒ   rz   rG   )r*   r/   r�   r‘   r�   r   r
   r|   r   Útest_threaded_reparent  s    z#TestGreenlet.test_threaded_reparentc                 C   s0   dd l }|  t|j tƒ ¡ |  t|jtƒ ¡ d S r   )ÚcopyrJ   rŽ   r   Údeepcopy)r*   r“   r
   r
   r   Útest_deepcopy-  s    zTestGreenlet.test_deepcopyc                    sn   t dd„ ƒ‰ t  ¡ ‰g ‰‡ ‡‡fdd„}t |ˆ d�}| ¡  ~|  ˆ¡ |  ˆd ˆ¡ |  ˆd jˆ ¡ d S )Nc                   S   s   d S r   r
   r
   r
   r
   r   rh   3  ri   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>c                      sN   zˆ  ¡  W n< tjk
rH   ˆ t ¡ j¡ ˆ t ¡ ¡ ˆ   ¡  Y nX d S r   )r   r   rR   r   r   r   r
   ©ZhubÚmainÚresultr
   r   Úworker6  s    z9TestGreenlet.test_parent_restored_on_kill.<locals>.workerr   r   r   )r   r   r   ra   r'   r   )r*   r™   r   r
   r–   r   Útest_parent_restored_on_kill2  s    	
z)TestGreenlet.test_parent_restored_on_killc                 C   s(   t ƒ }t dd„ |d�}|  t|j¡ d S )Nc                   S   s   d S r   r
   r
   r
   r
   r   rh   J  ri   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>r   )r   rJ   ÚAttributeErrorr   )r*   r   rL   r
   r
   r   Útest_parent_return_failureF  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X t | |¡S r   )Ú	Exceptionr   Ú__getattribute__©r*   Únamer
   r
   r   rž   P  s
    
zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__N©r   r   r	   rž   r
   r
   r
   r   Ú
mygreenletO  s   r¢   c                   S   s   d S r   r
   r
   r
   r
   r   rh   V  ri   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>)r   rJ   r   Úthrow)r*   r¢   r   r
   r
   r   Útest_throw_exception_not_lostN  s    z*TestGreenlet.test_throw_exception_not_lostc                    sR   g ‰ dd„ ‰‡ ‡fdd„}t j|d�}| ¡  | ¡  |  tjˆ d jtƒ ¡ d S )Nc                   S   s   t  ¡ j ¡  d S r   ru   r
   r
   r
   r   r™   [  s    z4TestGreenlet.test_throw_doesnt_crash.<locals>.workerc                     s   t ˆƒ} |  ¡  ˆ  | ¡ d S r   )r   r   r   r8   ©r˜   r™   r
   r   Úcreator]  s    z5TestGreenlet.test_throw_doesnt_crash.<locals>.creatorr=   r   )	r?   r@   rF   rG   rJ   r   r€   r£   r   )r*   r¦   rZ   r
   r¥   r   Útest_throw_doesnt_crashY  s    z$TestGreenlet.test_throw_doesnt_crashc                 C   s,   G dd„ dt ƒ}|ƒ }|  | 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__Úcountr_   r
   r
   r   r¨   h  s    
z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__c                 S   s.   |dkr"| j dkr"d| _ |  d¡ t | |¡S )Nr/   r   r   é+   )r©   r   r   rž   rŸ   r
   r
   r   rž   k  s    
zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__c                 S   s   | j  |¡ q d S r   ©r   r   ©r*   rŒ   r
   r
   r   r/   p  s    z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runN)r   r   r	   r¨   rž   r/   r
   r
   r
   r   Ú
convolutedg  s   r­   rp   rª   rw   )r*   r­   r   r
   r
   r   Útest_recursive_startupf  s    z#TestGreenlet.test_recursive_startupc                    s`   g ‰ ‡ fdd„}t j|d�}| ¡  | ¡  G ‡ fdd„dtƒ}|dd„ ƒ}|  tj|j¡ d S )Nc                     s"   t dd„ ƒ} ˆ  | ¡ |  ¡  d S )Nc                   S   s   d S r   r
   r
   r
   r
   r   rh   y  ri   zJTestGreenlet.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>)r   r   r   r8   ©Zanotherr
   r   r™   x  s    
z8TestGreenlet.test_unexpected_reparenting.<locals>.workerr=   c                       s   e Zd Z‡ fdd„ZdS )z<TestGreenlet.test_unexpected_reparenting.<locals>.convolutedc                    s   |dkrˆ d | _ t | |¡S )Nr/   r   )r   r   rž   rŸ   r¯   r
   r   rž   €  s    
zMTestGreenlet.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   rh   „  ri   z:TestGreenlet.test_unexpected_reparenting.<locals>.<lambda>)r?   r@   rF   rG   r   rJ   r€   r   )r*   r™   rZ   r­   r   r
   r¯   r   Útest_unexpected_reparentingv  s    z(TestGreenlet.test_unexpected_reparentingc                    s¸   t  ¡ ‰ˆ ¡  t  ¡ ‰ˆ ¡  G ‡‡fdd„dtƒ}dd„ }‡ ‡‡fdd„}t ¡ }t|ƒg‰ |ƒ ˆ d _ˆ d  ¡  t j|d�}| 	¡  ˆ 
¡  ˆ ¡  |  t ¡ |¡ | ¡  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   ©rT   rU   r_   ©Úlock1rX   r
   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   ru   r
   r
   r
   r   Údeallocator–  s    z=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorc                      s:   ˆ  ¡  t ¡  ˆ d= ˆ ¡  ˆ  ¡  t ¡  ˆ ¡  d S r   ©rU   r   r   rT   r
   ©r   r³   rX   r
   r   Úfthread˜  s    z9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreadr   r=   )r?   rY   rU   Úobjectr   r   Úbombr   r@   rF   rT   r'   rG   )r*   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               
      sJ   t  ¡ j ¡ } ˆd= t  ¡ jˆ _zt  ¡ j | ¡ W 5 ˆ t  ¡ ¡ X d S r   )r   r   r   r   r   )rŒ   ©Ú	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   rp   )r   r   ra   r'   r¬   r
   r¾   r   Ú!test_dealloc_switch_args_not_lost¶  s    

z.TestGreenlet.test_dealloc_switch_args_not_lostc                    sh   t jd dkrdd„ ‰ nt‰ G dd„ dtƒ}|ƒ ‰tdd�‰‡ ‡‡fd	d
„}t|ƒ}|  | ¡ ˆ¡ d S )Nr   r$   c                 S   s   | ||Ž d S r   r
   )Úfuncrr   Úkr
   r
   r   Ú_applyÓ  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__r_   r
   r
   r   rÅ   Ù  s    z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__N)r   r   r	   rÅ   r
   r
   r
   r   ÚmytupleØ  s   rÆ   rp   )rr   c                      s   ˆ t  ¡ jjˆˆƒ d S r   ru   r
   ©rÃ   rl   Úkwargsr
   r   ÚswitchapplyÞ  s    z5TestGreenlet.test_tuple_subclass.<locals>.switchapply)r   Úversion_infoÚapplyrÄ   Údictr   r'   r   )r*   rÆ   rÉ   r   r
   rÇ   r   Útest_tuple_subclassÐ  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ÚAbstractSubclassr/   c                 S   s   d S r   r
   r_   r
   r
   r   rh   ç  ri   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   ÚBadSubclassé  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
   r_   r
   r
   r   r/   í  s    z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runN)r   r   r	   r/   r
   r
   r
   r   ÚGoodSubclassì  s   rÐ   )r   r   r   rJ   rŽ   )r*   rÎ   rÏ   rÐ   r
   r
   r   Útest_abstract_subclassesã  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S tƒ }ˆd
 rÆ qî| 
|¡ q–t ¡  ˆd
 rê| 	¡  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_threadr=   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±   r_   ©r³   rX   Ú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Úcallbackr_   ©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   T)r?   rY   rU   r@   rF   r»   r)   r   r   rG   r   rP   rQ   r'   r   )	rÓ   rZ   rÚ   Úlrg   Úcurrentr   Ú_Úlast©ÚNr*   )rÖ   r³   rX   rÕ   r   Úattemptù  s>    z?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptr&   )rP   Ú	isenabledZget_thresholdr)   )r*   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 ]}||ƒ ¡  qPˆ`ˆ t |¡|¡ d S )	Nr   ©r   )rR   c                   @   s   e Zd ZdS )zTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r
   r
   r
   r   ÚGreenlet3  s   rå   c                      s8   zˆƒ j  ¡  W n" ˆ k
r2   ˆj ˆƒ ¡ Y nX d S r   )r   r   Úgletsr   r
   ©rR   r   r*   r
   r   Úgreenlet_main<  s    zYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_mainrE   )	r   r   rR   r   r:   ræ   r)   r   r'   )r*   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 ]}	|	 
¡  q¨ˆd d …= ˆ ¡  t d¡ |  t ˆ ¡|¡ d S )Nr   )r@   )r   rä   c                   @   s   e Zd ZdS )zSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r
   r
   r
   r   Ú
MyGreenletP  s   rë   c                      s   ˆ ƒ j  ¡  d S r   r«   r
   rä   r
   r   rè   V  s    zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_mainc                    s6   ˆ ˆƒ}ˆ  |¡ | ¡  ~|  ¡  ˆ ¡  ˆƒ  d S r   )r   r   rz   r{   )Zgreenlet_running_eventZmine©rë   r   ræ   rè   Zref_clearedr
   r   Úthread_mainY  s    
zTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_mainé-   rk   r   )r?   r@   r   r   r   r   r:   r)   r   rF   r{   rz   rd   re   r'   )
r*   r@   r   rí   ré   Zthread_ready_eventsrÝ   Úeventr�   r~   r
   rì   r   Ú2test_issue_245_reference_counting_subclass_threadsI  s.    
ÿ




z?TestGreenlet.test_issue_245_reference_counting_subclass_threadsN)#r   r   r	   r+   r.   r0   r7   r;   rI   rM   rO   rS   r[   rc   ro   rt   rx   r‚   r…   r�   r’   r•   rš   rœ   r¤   r§   r®   r°   r½   rÀ   rÍ   rÑ   rã   rê   rð   r
   r
   r
   r   r   #   s@   "
/7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   )ra   Úendswith)r*   ÚgotÚsuffixr
   r
   r   ÚassertEndsWith�  s    zTestRepr.assertEndsWithc                 C   s   t t ¡ ƒ}|  |d¡ d S )Nú current active started main>)Úreprr   r   rõ   ©r*   Ú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   )r÷   r
   ©r—   r
   r   r/   ˜  s    z-TestRepr.test_main_in_background.<locals>.runú suspended active started main>)r   r   r   rõ   )r*   r/   r   rù   r
   rû   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_initialŸ  s    
zTestRepr.test_initialc                    sx   t  ¡ ‰ G ‡ fdd„dtjƒ}|ƒ }| ¡  | d¡ |  |jd¡ |  |jd¡ t	|j
ƒ}|j
jrht‚|  |d¡ d 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_gletrí   r_   rû   r
   r   r/   ©  s    

z3TestRepr.test_main_from_other_thread.<locals>.T.run)r   r   r	   rÿ   rí   r   r/   r
   rû   r
   r   ÚT¦  s   r  rE   rü   rö   )r   r   r?   r@   rF   rG   rõ   rÿ   rí   r÷   r   r5   ÚAssertionError)r*   r  rZ   rù   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   rh   ¼  ri   z$TestRepr.test_dead.<locals>.<lambda>z dead>Z	suspendedÚstartedZactive)r   r   rõ   r÷   ZassertNotInr-   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   s   d S r   r
   r
   r
   r
   r   rh   Ç  ri   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>c                   S   s   d S r   r
   r
   r
   r
   r   rh   È  ri   z%sz%r)r   r   ZassertIsInstanceÚstr)r*   Zg_deadZg_not_startedZ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ñ   �  s   	rñ   Ú__main__)rP   r   rd   r?   ZunittestÚabcr   r   r   r�   r   r   r   ZTestCaser   rñ   r   r—   r
   r
   r
   r   Ú<module>   s"   		    nJ