o
    jc[                     @   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rNe  dS dS )    N)ABCMetaabstractmethod)greenletc                   @      e Zd ZdS )	SomeErrorN__name__
__module____qualname__ r   r   G/usr/local/lib/python3.10/dist-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   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   assertIsNotNone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/   assertIsNoner3   r1   r   r   r   test_run_equals_None8      

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 r7   r#   r   r$   r   r   r&   T   s   
z3TestGreenlet.test_two_recursive_children.<locals>.fc                     s(    d t } |    d d S r7   )r   r   r   r   r&   r%   r   r   r   X   s   
z3TestGreenlet.test_two_recursive_children.<locals>.gr"   r'   )r   r   r*   r:   r   getrefcountr1   r   r?   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*   r:   )r-   thsthr   )r&   r-   rB   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   rQ   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GreenletExitrR   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   rW   rX   releaseacquire)r   locklock2r   somerefr   r   r&      s   

z1TestGreenlet.test_dealloc_other_thread.<locals>.frC   r!   )rE   Lockr\   rF   rL   r*   r:   rW   rX   r[   r   rY   rM   )r-   r&   tr   r]   r   test_dealloc_other_thread   s(   
z&TestGreenlet.test_dealloc_other_threadc                    sf    fdd}t |}| } ||ju   | | } |  |d  |jd  d S )Nc                     s,   t d}  | jd  t j|  dS )Nr   meaning of life)r   	_getframer*   f_backr   r   r   r   rI   r-   r   r   f1   s   
z#TestGreenlet.test_frame.<locals>.f1rd   )r   r   
assertTruegr_frameassertFalser*   )r-   rh   r   framefrom_gr   rg   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>   s   
 z>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>r   )rr   r   r   rq   r   runner   s   z,TestGreenlet.test_thread_bug.<locals>.runner)g?rD   args)g333333?)rE   rF   rL   rM   )r-   rt   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brg   r   r   r3      s   z,TestGreenlet.test_switch_kwargs.<locals>.runr(   r'   r{   rz   )r   r   r*   )r-   r3   rr   r   rg   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 )Nrq   r'   r"   r   r   r   r   rq   r   r   r   r3      s   z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.runrr   r"   )r'   )r"   	   r   r*   r   )r-   r3   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y:   t	 d }Y nw | 
|d   |  d S )Nc                      $   t dd d<      d S )Nc                   S      d S r   r   r   r   r   r   rs          zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>r   r   setwaitr   created_eventdata
done_eventr   r   r3         z7TestGreenlet.test_switch_to_another_thread.<locals>.runrC   r   r!   zgreenlet.error was not raised!)rE   EventrF   rL   r   r   r   errorr   r   r/   r   rM   )r-   r   r3   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   r*   )r   r<   r-   r   r   r&      s   z&TestGreenlet.test_exc_state.<locals>.fc                      s     t d d S )N)NNN)r*   r   r   r   rg   r   r   r<      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 Nrz   )r   r   testr   r   r   r   r&     s   z*TestGreenlet.test_instance_dict.<locals>.fc                 S   s   | ` d S r   __dict__r>   r   r   r   deldict     z0TestGreenlet.test_instance_dict.<locals>.deldictc                 S   
   || _ d S r   r   r   valuer   r   r   setdict     
z0TestGreenlet.test_instance_dict.<locals>.setdictrz   r   )r   r*   r   r   r   rQ   	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                      r   )Nc                   S   r   r   r   r   r   r   r   rs     r   zBTestGreenlet.test_threaded_reparent.<locals>.run.<locals>.<lambda>r   r   r   r   r   r   r3     r   z0TestGreenlet.test_threaded_reparent.<locals>.runc                   S      t  j  d S r   r   r   r   r   r   blank     z2TestGreenlet.test_threaded_reparent.<locals>.blankc                 S   r   r   r   r   r   r   r   	setparent!  r   z6TestGreenlet.test_threaded_reparent.<locals>.setparentrC   r   )rE   r   rF   rL   r   r   r   rQ   r   r   rM   )r-   r3   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   )copyrQ   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   r   r   r   r   r   r   r   rs   3  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   rY   r   r   r   r   hubmainresultr   r   worker6  s   z9TestGreenlet.test_parent_restored_on_kill.<locals>.workerr   r   r!   )r   r   r   ri   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   r   r   r   r   r   r   r   rs   J  r   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>r   )r   rQ   AttributeErrorr   )r-   r   rS   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                   @      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   )	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      r   c                   S   r   r   r   r   r   r   r   rs   V  r   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>)r   rQ   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   r   r   r   r   r   r   r   r   [  r   z4TestGreenlet.test_throw_doesnt_crash.<locals>.workerc                     s   t } |    |  d S r   )r   r   r   r>   r   r   r   r   creator]  s   z5TestGreenlet.test_throw_doesnt_crash.<locals>.creatorrC   r   )	rE   rF   rL   rM   rQ   r   r   r   r   )r-   r   rb   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__countrg   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 )Nr3   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r   r   r   r-   r   r   r   r   r3   p  s   z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runN)r   r	   r
   r   r   r3   r   r   r   r   
convolutedg  s    r   rz   r   r   )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   r   r   r   r   r   r   r   rs   y  r   zJTestGreenlet.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>)r   r   r   r>   anotherr   r   r   x  s   
z8TestGreenlet.test_unexpected_reparenting.<locals>.workerrC   c                          e Zd Z fddZdS )z<TestGreenlet.test_unexpected_reparenting.<locals>.convolutedc                    s   |dkr	 d | _ t| |S )Nr3   r   )r   r   r   r   r   r   r   r     s   
zMTestGreenlet.test_unexpected_reparenting.<locals>.convoluted.__getattribute__Nr   r   r   r   r   r         r   c                   S   r   r   r   r   r   r   r   rs     r   z:TestGreenlet.test_unexpected_reparenting.<locals>.<lambda>)rE   rF   rL   rM   r   rQ   r   r   )r-   r   rb   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   r[   r\   rg   lock1r_   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   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   rC   )rE   ra   r\   objectr   r   bombr   rF   rL   r[   r*   rM   )r-   r   r   r   r   rb   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   )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     r   zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiatorr   rz   )r   r   ri   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   | |i | d S r   r   )funcr|   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__rg   r   r   r   r     s   
z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__N)r   r	   r
   r   r   r   r   r   mytuple  r   r   rz   )r|   c                      s    t  jj d S r   r   r   r   rv   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AbstractSubclassr3   c                 S   r   r   r   rg   r   r   r   rs     r   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>c                   @   r   )z:TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   r   BadSubclass  r   r   c                   @   r   )z;TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                 S   r   r   r   rg   r   r   r   r3     r   z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runN)r   r	   r
   r3   r   r   r   r   GoodSubclass  r   r   )r   r   r   rQ   r   )r-   r   r   r   r   r   r   test_abstract_subclasses  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
 rZ|	   dS t }d
 rc n|
| qKt  d
 ru|	  dS |j| |D ]	}|j| qdS )NFc                      s       t    d S r   r   r   r   r   r   another_thread     zWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadrC   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   rg   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                       r   )zPTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                    s   | | _   | _d S r   )cyclecallbackrg   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'   r   T)rE   ra   r\   rF   rL   r   r,   r   r   rM   r   rW   rX   r*   r   )	r   rb   r   lrr   currentr   _lastNr-   )r   r   r_   r   r   attempt  s>   z?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptr)   )rW   	isenabled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 ]}||  q(`t|| d S )	Nr   r   )rY   c                   @   r   )zTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   r   Greenlet3  r   r  c                      s6   z	 j   W d S   y   j  Y d S w r   )r   r   gletsr   r   rY   r   r-   r   r   greenlet_main<  s
   zYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_mainrK   )	r   r   rY   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}|| |	  q<|D ]}	|	
  qTd d =   td | t | d S )Nr   )rF   )r   r  c                   @   r   )zSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   r   
MyGreenletP  r   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   r   r   )greenlet_running_eventminer  r   r  r  ref_clearedr   r   thread_mainY  s   

zTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_main-   ru   r!   )rE   rF   r   r   r   r   r@   r,   r   rL   r   r   ro   rp   r*   )
r-   rF   r   r  r  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.   r2   r5   r=   rA   rP   rT   rV   rZ   rc   rn   ry   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    #   sB    "
/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   )ri   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   r3     r   z-TestRepr.test_main_in_background.<locals>.run suspended active started main>)r   r   r   r  )r-   r3   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r4J | |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  rg   r  r   r   r3     r6   z3TestRepr.test_main_from_other_thread.<locals>.T.run)r   r	   r
   r   r  r!  r3   r   r  r   r   T  s    r"  rK   r  r  )r   r   rE   rF   rL   rM   r  r   r  r  r!  r;   )r-   r"  rb   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   r   r   r   r   r   r   r   rs     r   z$TestRepr.test_dead.<locals>.<lambda>z dead>	suspendedstartedactive)r   r   r  r  assertNotInr1   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   rs     r   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>c                   S   r   r   r   r   r   r   r   rs     r   z%sz%r)r   r   assertIsInstancestr)r-   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    s    	r  __main__)rW   r   ro   rE   unittestabcr   r   r   r   r   r   r   TestCaser    r  r   r   r   r   r   r   <module>   s&    		    nJ