a
    vaM                     @   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re  dS )    N)ABCMetaabstractmethod)greenletc                   @   s   e Zd ZdS )	SomeErrorN__name__
__module____qualname__ r
   r
   ;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   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=S )>GreenletTestsc                    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$GreenletTests.test_simple.<locals>.fr            )r   r   r   assertEquallistrange)selfr#   r   r
   r!   r   test_simple"   s    


zGreenletTests.test_simplec                 C   s*   t d d}| | | |jt   d S )Nr   )r   assertIsNotNoneZassertIsr   r   r*   r   r
   r
   r   test_parent_equals_None1   s    

z%GreenletTests.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_None6   s    

z"GreenletTests.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*GreenletTests.test_two_children.<locals>.fr   r$   r%   T   )r   r   r'   lendead)r*   r#   r   hr
   r!   r   test_two_children;   s    zGreenletTests.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#   R   s    
z4GreenletTests.test_two_recursive_children.<locals>.fc                     s(    d t } |    d d S r1   )r   r   r   r   r#   r"   r
   r   r   V   s    
z4GreenletTests.test_two_recursive_children.<locals>.gr   r$   )r   r   r'   r4   r   getrefcountr-   r
   r9   r   test_two_recursive_childrenO   s    z)GreenletTests.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#   c   s    z%GreenletTests.test_threads.<locals>.fc                    s   g | ]}t j d qS )target)	threadingThread).0ir#   r
   r   
<listcomp>f       z.GreenletTests.test_threads.<locals>.<listcomp>
   )r)   startjoinr'   r4   )r*   ZthsZthr
   )r#   r*   r<   r   test_threads`   s    

zGreenletTests.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_exceptionm   s    

zGreenletTests.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_exceptionz   s
    
z!GreenletTests.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GreenletTests.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    

z2GreenletTests.test_dealloc_other_thread.<locals>.fr=   r   )r?   LockrU   r@   rG   r'   r4   rP   rQ   rT   r   rR   rH   )r*   r#   tr
   rV   r   test_dealloc_other_thread   s(    
z'GreenletTests.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   rC   r*   r
   r   f1   s    
z$GreenletTests.test_frame.<locals>.f1r\   )r   r   
assertTrueZgr_frameZassertFalser'   )r*   r`   r   frameZfrom_gr
   r_   r   
test_frame   s    

zGreenletTests.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>   rE   z?GreenletTests.test_thread_bug.<locals>.runner.<locals>.<lambda>r   )rg   r   r
   rf   r   runner   s    z-GreenletTests.test_thread_bug.<locals>.runner)g?)r>   args)g333333?)r?   r@   rG   rH   )r*   ri   t1t2r
   r
   r   test_thread_bug   s    zGreenletTests.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-GreenletTests.test_switch_kwargs.<locals>.runr%   r$   ro   rn   )r   r   r'   )r*   r/   rg   r
   r_   r   test_switch_kwargs   s    z GreenletTests.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    z7GreenletTests.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*GreenletTests.test_switch_kwargs_to_parentc                    s   i d }t   t   fdd}t j|d}|     zd   W n  tjyt   t	 d }Y n0 | 
|d   |  d S )Nc                      s$   t dd d<      d S )Nc                   S   s   d S r   r
   r
   r
   r
   r   rh      rE   zJGreenletTests.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>r   r   setwaitr
   Zcreated_eventdataZ
done_eventr
   r   r/      s    z8GreenletTests.test_switch_to_another_thread.<locals>.runr=   r   r   zgreenlet.error was not raised!)r?   Eventr@   rG   ry   r   r   errorr   r   r,   rx   rH   )r*   r}   r/   threadr
   rz   r   test_switch_to_another_thread   s    z+GreenletTests.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   r6   r*   r
   r   r#      s    z'GreenletTests.test_exc_state.<locals>.fc                      s     t d d S )N)NNN)r'   r   r   r
   r_   r
   r   r6      s    z'GreenletTests.test_exc_state.<locals>.hr   )r*   r#   r
   r   r   test_exc_state   s    zGreenletTests.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 Nrn   )r   r   testr
   r
   r
   r   r#     s    z+GreenletTests.test_instance_dict.<locals>.fc                 S   s   | ` d S r   __dict__r8   r
   r
   r   deldict  s    z1GreenletTests.test_instance_dict.<locals>.deldictc                 S   s
   || _ d S r   r   r   valuer
   r
   r   setdict  s    z1GreenletTests.test_instance_dict.<locals>.setdictrn   r   )r   r'   r   r   r   rJ   	TypeError)r*   r#   r   r   r   r
   r
   r   test_instance_dict  s    z GreenletTests.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     rE   zCGreenletTests.test_threaded_reparent.<locals>.run.<locals>.<lambda>r   rw   r
   rz   r
   r   r/     s    z1GreenletTests.test_threaded_reparent.<locals>.runc                   S   s   t  j  d S r   rs   r
   r
   r
   r   blank  s    z3GreenletTests.test_threaded_reparent.<locals>.blankc                 S   s
   || _ d S r   r   r   r
   r
   r   	setparent  s    z7GreenletTests.test_threaded_reparent.<locals>.setparentr=   r   )r?   r|   r@   rG   ry   r   r   rJ   r   rx   rH   )r*   r/   r   r   r~   r   r
   rz   r   test_threaded_reparent  s    z$GreenletTests.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GreenletTests.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   1  rE   z<GreenletTests.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   rR   r   r   r   r
   Zhubmainresultr
   r   worker4  s    z:GreenletTests.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_kill0  s    	
z*GreenletTests.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   H  rE   z:GreenletTests.test_parent_return_failure.<locals>.<lambda>r   )r   rJ   AttributeErrorr   )r*   r   rL   r
   r
   r   test_parent_return_failureD  s    z(GreenletTests.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?GreenletTests.test_throw_exception_not_lost.<locals>.mygreenletc                 S   s$   z
t  W n   Y n0 t| |S r   )	Exceptionr   __getattribute__r*   namer
   r
   r   r   N  s
    
zPGreenletTests.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__Nr   r   r	   r   r
   r
   r
   r   
mygreenletM  s   r   c                   S   s   d S r   r
   r
   r
   r
   r   rh   T  rE   z=GreenletTests.test_throw_exception_not_lost.<locals>.<lambda>)r   rJ   r   throw)r*   r   r   r
   r
   r   test_throw_exception_not_lostL  s    z+GreenletTests.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   rs   r
   r
   r
   r   r   Y  s    z5GreenletTests.test_throw_doesnt_crash.<locals>.workerc                     s   t } |    |  d S r   )r   r   r   r8   r   r   r
   r   creator[  s    z6GreenletTests.test_throw_doesnt_crash.<locals>.creatorr=   r   )	r?   r@   rG   rH   rJ   r   r}   r   r   )r*   r   rZ   r
   r   r   test_throw_doesnt_crashW  s    z%GreenletTests.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 )z8GreenletTests.test_recursive_startup.<locals>.convolutedc                 S   s   t |  d| _d S r   )r   __init__countr_   r
   r
   r   r   f  s    
zAGreenletTests.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   i  s    
zIGreenletTests.test_recursive_startup.<locals>.convoluted.__getattribute__c                 S   s   | j | q d S r   )r   r   r*   r   r
   r
   r   r/   n  s    z<GreenletTests.test_recursive_startup.<locals>.convoluted.runN)r   r   r	   r   r   r/   r
   r
   r
   r   
convolutede  s   r   rn   r   ru   )r*   r   r   r
   r
   r   test_recursive_startupd  s    z$GreenletTests.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   w  rE   zKGreenletTests.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>)r   r   r   r8   Zanotherr
   r   r   v  s    
z9GreenletTests.test_unexpected_reparenting.<locals>.workerr=   c                       s   e Zd Z fddZdS )z=GreenletTests.test_unexpected_reparenting.<locals>.convolutedc                    s   |dkr d | _ t| |S )Nr/   r   )r   r   r   r   r   r
   r   r   ~  s    
zNGreenletTests.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     rE   z;GreenletTests.test_unexpected_reparenting.<locals>.<lambda>)r?   r@   rG   rH   r   rJ   r}   r   )r*   r   rZ   r   r   r
   r   r   test_unexpected_reparentingt  s    z)GreenletTests.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<GreenletTests.test_threaded_updatecurrent.<locals>.finalizedc                    s         d S r   rT   rU   r_   lock1rX   r
   r   __del__  s    zDGreenletTests.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   rs   r
   r
   r
   r   deallocator  s    z>GreenletTests.test_threaded_updatecurrent.<locals>.deallocatorc                      s:      t   d=      t    d S r   rU   r   r   rT   r
   r   r   rX   r
   r   fthread  s    z:GreenletTests.test_threaded_updatecurrent.<locals>.fthreadr   r=   )r?   rY   rU   objectr   r   Zbombr   r@   rG   rT   r'   rH   )r*   r   r   r   r   rZ   r
   r   r   test_threaded_updatecurrent  s"    

z)GreenletTests.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   )r   	initiatorr   r   r
   r   r     s    z?GreenletTests.test_dealloc_switch_args_not_lost.<locals>.workerc                   S   s   dS r   r
   r
   r
   r
   r   r     s    zBGreenletTests.test_dealloc_switch_args_not_lost.<locals>.initiatorr   rn   )r   r   ra   r'   r   r
   r   r   !test_dealloc_switch_args_not_lost  s    

z/GreenletTests.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   | |i | d S r   r
   )funcrp   kr
   r
   r   _apply  s    z1GreenletTests.test_tuple_subclass.<locals>._applyc                   @   s   e Zd Zdd ZdS )z2GreenletTests.test_tuple_subclass.<locals>.mytuplec                 S   s   t    t| S r   )r   r   r   tuple__len__r_   r
   r
   r   r     s    z:GreenletTests.test_tuple_subclass.<locals>.mytuple.__len__N)r   r   r	   r   r
   r
   r
   r   mytuple  s   r   rn   )rp   c                      s    t  jj d S r   rs   r
   r   rj   kwargsr
   r   switchapply  s    z6GreenletTests.test_tuple_subclass.<locals>.switchapply)r   version_infoZapplyr   dictr   r'   r   )r*   r   r   r   r
   r   r   test_tuple_subclass  s    

z!GreenletTests.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     rE   z8GreenletTests.test_abstract_subclasses.<locals>.<lambda>c                   @   s   e Zd ZdS )z;GreenletTests.test_abstract_subclasses.<locals>.BadSubclassNr   r
   r
   r
   r   BadSubclass  s   r   c                   @   s   e Zd Zdd ZdS )z<GreenletTests.test_abstract_subclasses.<locals>.GoodSubclassc                 S   s   d S r   r
   r_   r
   r
   r   r/     s    z@GreenletTests.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&GreenletTests.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|
| qt  d
 r|	  dS |j| |D ]}|j| q dS )NFc                      s       t    d S r   r   r
   r   r
   r   another_thread  s    zXGreenletTests.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadr=   c                       s   e Zd Z fddZdS )zUGreenletTests.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]GreenletTests.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 )zQGreenletTests.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                    s   | | _   | _d S r   )cyclecallbackr_   r   r
   r   r   	  s    zZGreenletTests.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@   rG   r   r)   r   r   rH   r   rP   rQ   r'   r   )	r   rZ   r   lrg   Zcurrentr   _ZlastNr*   )r   r   rX   r   r   attempt  s>    z@GreenletTests.test_implicit_parent_with_threads.<locals>.attemptr&   )rP   	isenabledZget_thresholdr)   )r*   r   r   r
   r   r   !test_implicit_parent_with_threads  s    -z/GreenletTests.test_implicit_parent_with_threadsN)!r   r   r	   r+   r.   r0   r7   r;   rI   rM   rO   rS   r[   rc   rm   rr   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   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   )ra   endswith)r*   Z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/   3  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_background1  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rhJ | |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_gletthread_mainr_   r   r
   r   r/   D  s    

z3TestRepr.test_main_from_other_thread.<locals>.T.run)r   r   r	   r   r   r   r/   r
   r   r
   r   TA  s   r   rF   r   r   )r   r   r?   r@   rG   rH   r   r   r   r   r   r5   )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   W  rE   z$TestRepr.test_dead.<locals>.<lambda>z dead>Z	suspendedZstartedZactive)r   r   r   r   ZassertNotInr-   r
   r
   r   	test_deadV  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   b  rE   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>c                   S   s   d S r   r
   r
   r
   r
   r   rh   c  rE   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"   		    J