a
    ze@                     @   s   d dl Z d dlmZmZmZ d dlZd dlmZ d dlZd dl	m
Z
 dd ZG dd dejZG d	d
 d
ejZG dd de
ejZedkre  dS )    N)asynccontextmanagerAbstractAsyncContextManagerAsyncExitStack)support)TestBaseExitStackc                    s   t   fdd}|S )Nc               	      sX    | i |}t  }t | z||W |  t d  S |  t d  0 d S N)asyncionew_event_loopset_event_loopZrun_until_completecloseset_event_loop_policy)argskwargscoroloopfunc 0/usr/lib/python3.9/test/test_contextlib_async.pywrapper   s    


  z_async_test.<locals>.wrapper)	functoolswraps)r   r   r   r   r   _async_test
   s    	r   c                   @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )
TestAbstractAsyncContextManagerc              	      st   G dd dt }| }| | I d H | |4 I d H "}| || W d   I d H  qp1 I d H sf0    Y  d S )Nc                       s   e Zd Z fddZ  ZS )z@TestAbstractAsyncContextManager.test_enter.<locals>.DefaultEnterc                    s   t  j| I d H  d S r   super	__aexit__selfr   	__class__r   r   r      s    zJTestAbstractAsyncContextManager.test_enter.<locals>.DefaultEnter.__aexit____name__
__module____qualname__r   __classcell__r   r   r   r   DefaultEnter   s   r&   )r   assertIs
__aenter__)r   r&   managercontextr   r   r   
test_enter   s
    z*TestAbstractAsyncContextManager.test_enterc              
      s   t dd   fdd}g }td}| tn   4 I d H : | 2 z3 d H W }|| |qF6 W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  | |dg d S )Nc                   S  s
   d V  d S r   r   r   r   r   r   ctx+   s    zUTestAbstractAsyncContextManager.test_async_gen_propagates_generator_exit.<locals>.ctxc                	     sD     4 I d H  dV  W d   I d H  q@1 I d H s60    Y  d S )N   r   r   r,   r   r   gen/   s    zUTestAbstractAsyncContextManager.test_async_gen_propagates_generator_exit.<locals>.gen   r-   )r   
ValueErrorassertRaisesappendassertEqual)r   r/   retexcvalr   r.   r   (test_async_gen_propagates_generator_exit'   s    

PzHTestAbstractAsyncContextManager.test_async_gen_propagates_generator_exitc                 C   sD   G dd dt }| t |  W d    n1 s60    Y  d S )Nc                   @   s   e Zd ZdS )zKTestAbstractAsyncContextManager.test_exit_is_abstract.<locals>.MissingAexitNr"   r#   r$   r   r   r   r   MissingAexit>   s   r:   )r   r2   	TypeError)r   r:   r   r   r   test_exit_is_abstract=   s    z5TestAbstractAsyncContextManager.test_exit_is_abstractc                 C   s   G dd d}|  t|t G dd dt}|  t|t G dd d|}| t|t G dd d|}| t|t d S )	Nc                   @   s   e Zd Zdd Zdd ZdS )zWTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratchc                    s   | S r   r   r   r   r   r   r(   F   s    zbTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratch.__aenter__c                    s   d S r   r   )r   exc_type	exc_value	tracebackr   r   r   r   H   s    zaTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratch.__aexit__Nr"   r#   r$   r(   r   r   r   r   r   ManagerFromScratchE   s   rB   c                       s   e Zd Z fddZ  ZS )zQTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.DefaultEnterc                    s   t  j| I d H  d S r   r   r   r   r   r   r   N   s    z[TestAbstractAsyncContextManager.test_structural_subclassing.<locals>.DefaultEnter.__aexit__r!   r   r   r   r   r&   M   s   r&   c                   @   s   e Zd ZdZdS )zOTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.NoneAenterN)r"   r#   r$   r(   r   r   r   r   
NoneAenterS   s   rC   c                   @   s   e Zd ZdZdS )zNTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.NoneAexitN)r"   r#   r$   r   r   r   r   r   	NoneAexitX   s   rD   )Z
assertTrue
issubclassr   assertFalse)r   rB   r&   rC   rD   r   r   r   test_structural_subclassingD   s    z;TestAbstractAsyncContextManager.test_structural_subclassingN)r"   r#   r$   r   r+   r8   r<   rG   r   r   r   r   r      s   

r   c                   @   s   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zdd Zdd Zejdd Zejedd Zedd ZdS ) AsyncContextManagerTestCasec              	      s   g  t  fdd}| 4 I d H :}|  dg | |d  | W d   I d H  qr1 I d H sh0    Y  |  g d d S )Nc                     s     d dV    d d S N   *     r3   r   stater   r   woohooc   s    
zEAsyncContextManagerTestCase.test_contextmanager_plain.<locals>.woohoorJ   rK   rJ   rK   rL   )r   r4   r3   r   rP   xr   rN   r   test_contextmanager_plain`   s    4z5AsyncContextManagerTestCase.test_contextmanager_plainc              
      s   g  t  fdd}| tt | 4 I d H @}|  dg | |d  | t W d   I d H  q1 I d H sz0    Y  W d    n1 s0    Y  |  g d d S )Nc                	     s0     d zdV  W   d n  d 0 d S rI   rM   r   rN   r   r   rP   q   s    
zGAsyncContextManagerTestCase.test_contextmanager_finally.<locals>.woohoorJ   rK   rQ   )r   r2   ZeroDivisionErrorr4   r3   rR   r   rN   r   test_contextmanager_finallyn   s    
Nz7AsyncContextManagerTestCase.test_contextmanager_finallyc                    sB   t dd }| }| I d H  | |ttdd I d H  d S )Nc                   S  s
   d V  d S r   r   r   r   r   r   whee   s    zHAsyncContextManagerTestCase.test_contextmanager_no_reraise.<locals>.wheefoo)r   r(   rF   r   r;   )r   rW   r,   r   r   r   test_contextmanager_no_reraise   s
    
z:AsyncContextManagerTestCase.test_contextmanager_no_reraisec                    sf   t dd }| }| I d H  | t( |ttdd I d H  W d    n1 sX0    Y  d S )Nc                   S  s"   z
d V  W n   d V  Y n0 d S r   r   r   r   r   r   whoo   s    
zTAsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throw.<locals>.whoorX   )r   r(   r2   RuntimeErrorr   r;   r   rZ   r,   r   r   r   *test_contextmanager_trap_yield_after_throw   s    
zFAsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throwc                    sN   t dd }| }| t | I d H  W d    n1 s@0    Y  d S )Nc                   S  s   d S r   r   r   r   r   r   rZ      s    zKAsyncContextManagerTestCase.test_contextmanager_trap_no_yield.<locals>.whoo)r   r2   r[   r(   r\   r   r   r   !test_contextmanager_trap_no_yield   s
    
z=AsyncContextManagerTestCase.test_contextmanager_trap_no_yieldc                    sb   t dd }| }| I d H  | t$ |d d d I d H  W d    n1 sT0    Y  d S )Nc                   S  s   d V  d V  d S r   r   r   r   r   r   rZ      s    zOAsyncContextManagerTestCase.test_contextmanager_trap_second_yield.<locals>.whoo)r   r(   r2   r[   r   r\   r   r   r   %test_contextmanager_trap_second_yield   s    
zAAsyncContextManagerTestCase.test_contextmanager_trap_second_yieldc                    sb   t dd }| }| I d H  | t$ |td d I d H  W d    n1 sT0    Y  d S )Nc                   S  s&   z
d V  W n t y    tY n0 d S r   )r[   SyntaxErrorr   r   r   r   rZ      s    
zLAsyncContextManagerTestCase.test_contextmanager_non_normalised.<locals>.whoo)r   r(   r2   r`   r   r[   r\   r   r   r   "test_contextmanager_non_normalised   s    
z>AsyncContextManagerTestCase.test_contextmanager_non_normalisedc              	      s   g t  fdd}| 4 I d H B} dg  |d | tdW d   I d H  q|1 I d H sr0    Y   g d d S )Nc               
     s^    d z
dV  W nD tyX }  z, | jd   g d W Y d } ~ n
d } ~ 0 0 d S )NrJ   rK   r   rQ   )r3   rU   r   r4   )er   rO   r   r   rP      s    

zFAsyncContextManagerTestCase.test_contextmanager_except.<locals>.woohoorJ   rK   rL   rQ   )r   r4   r3   rU   rR   r   rc   r   test_contextmanager_except   s    
2z6AsyncContextManagerTestCase.test_contextmanager_exceptc                    s  t dd }G dd dt}G dd dt}tdtd|d|dfD ]}| jt|d	 zB| 4 I d H  |W d   I d H  q1 I d H s0    Y  W n0 ty } z| || W Y d }~nd }~0 0 | | d
 W d    qH1 s0    Y  qHd S )Nc                   S  s
   d V  d S r   r   r   r   r   r   rP      s    zOAsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.woohooc                   @   s   e Zd ZdS )z^AsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.StopIterationSubclassNr9   r   r   r   r   StopIterationSubclass   s   re   c                   @   s   e Zd ZdS )zcAsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.StopAsyncIterationSubclassNr9   r   r   r   r   StopAsyncIterationSubclass   s   rf   spamZham)typez was suppressed)r   StopIterationStopAsyncIterationsubTestrh   	Exceptionr'   fail)r   rP   re   rf   Zstop_excexr   r   r   #test_contextmanager_except_stopiter   s     
2"z?AsyncContextManagerTestCase.test_contextmanager_except_stopiterc              
      s   t dd }| tR | 4 I d H  dd  W d   I d H  qZ1 I d H sP0    Y  W d    n1 sn0    Y  | tN | 4 I d H  tW d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  d S )Nc               
   S  sD   z
d V  W n4 t y> }  ztd|  | W Y d } ~ n
d } ~ 0 0 d S )Nzcaught )rl   r[   r6   r   r   r   rP      s    
zQAsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerror.<locals>.woohoorJ   r   )r   r2   r[   rj   )r   rP   r   r   r   %test_contextmanager_wrap_runtimeerror   s    
PzAAsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerrorc                 C   s"   dd }t |dddd }|S )Nc                     s    fdd}|S )Nc                    s"      D ]\}}t| || q| S r   )itemssetattr)r   kvkwr   r   decorate   s    z]AsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribs.<locals>.decorater   )rw   rx   r   rv   r   attribs   s    zKAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribsbar)rX   c                 S  s
   d V  d S r   r   )rg   r   r   r   baz  s    zGAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.baz)r   )r   ry   r{   r   r   r   _create_contextmanager_attribs   s
    z:AsyncContextManagerTestCase._create_contextmanager_attribsc                 C   s(   |   }| |jd | |jd d S )Nr{   rz   )r|   r4   r"   rX   r   r{   r   r   r   test_contextmanager_attribs	  s    z7AsyncContextManagerTestCase.test_contextmanager_attribsc                 C   s   |   }| |jd d S NzWhee!r|   r4   __doc__r}   r   r   r   test_contextmanager_doc_attrib  s    z:AsyncContextManagerTestCase.test_contextmanager_doc_attribc              	      sV   |   d }| |jd |4 I d H  W d   I d H  qR1 I d H sH0    Y  d S r   r   r}   r   r   r   *test_instance_docstring_given_cm_docstring  s    zFAsyncContextManagerTestCase.test_instance_docstring_given_cm_docstringc              	      s`   t dd }|ddddd4 I d H "}| |d W d   I d H  q\1 I d H sR0    Y  d S )	Nc                 S  s   | |||fV  d S r   r   r   r   r   kwdsr   r   r   rP     s    z9AsyncContextManagerTestCase.test_keywords.<locals>.woohoor-   r0   !   ,   r   )r-   r0   r   r   )r   r4   )r   rP   targetr   r   r   test_keywords  s    
z)AsyncContextManagerTestCase.test_keywordsN)r"   r#   r$   r   rT   rV   rY   r]   r^   r_   ra   rd   ro   rq   r|   r~   r   Zrequires_docstringsr   r   r   r   r   r   r   rH   ^   s:   


	

	






rH   c                   @   sd   e Zd ZG dd deZeZdd Zedd Zedd Z	ed	d
 Z
edd Zedd ZdS )TestAsyncExitStackc                   @   s0   e Zd Zedd Zdd Zdd Zdd Zd	S )
z%TestAsyncExitStack.SyncAsyncExitStackc                    sj   t   t | }| fdd    | }|s@| S |j}z|W n   ||_|Y n0 d S )Nc                    s      S r   )stop)fr   r   r   <lambda>,      zETestAsyncExitStack.SyncAsyncExitStack.run_coroutine.<locals>.<lambda>)r   Zget_event_loopZensure_futureadd_done_callbackZrun_forever	exceptionresult__context__)r   r   r6   r*   r   r   r   run_coroutine'  s    
z3TestAsyncExitStack.SyncAsyncExitStack.run_coroutinec                 C   s   |  |  S r   )r   acloser=   r   r   r   r   <  s    z+TestAsyncExitStack.SyncAsyncExitStack.closec                 C   s   |  |  S r   )r   r(   r=   r   r   r   	__enter__?  s    z/TestAsyncExitStack.SyncAsyncExitStack.__enter__c                 G   s   |  | j| S r   )r   r   r   exc_detailsr   r   r   __exit__B  s    z.TestAsyncExitStack.SyncAsyncExitStack.__exit__N)r"   r#   r$   staticmethodr   r   r   r   r   r   r   r   SyncAsyncExitStack&  s
   
r   c                 C   s6   t  | _t | j | | jj | t jd  d S r   )r   r	   r   r
   Z
addCleanupr   r   r=   r   r   r   setUpG  s    
zTestAsyncExitStack.setUpc              	      sR  di fdi fdi fdt ddfdt ddfdt ddfg}g   fdd}t 4 I d H }t|D ]p\}}|r|r|j|g|R i |}n:|r|j|g|R  }n"|r|j|fi |}n
||}| || qb|jD ]>}| |d j| | |d j|j | 	|d j
|j
 qW d   I d H  qH1 I d H s>0    Y  |  | g  t 4 I d H }| t |jdd W d    n1 s0    Y  | t | jjd	d W d    n1 s0    Y  | t |j|d
d W d    n1 s
0    Y  W d   I d H  qB1 I d H s80    Y  |  g  d S )Nr   )rJ   )rJ      rJ   )Zexamplec                     s     | |f d S r   rM   )r   r   r   r   r   _exitX  s    z5TestAsyncExitStack.test_async_callback.<locals>._exit)argr      )callbackr   )dictr   reversedpush_async_callbackr'   _exit_callbacks__wrapped__ZassertNotEqualr"   assertIsNoner   r4   r2   r;   
exit_stack)r   Zexpectedr   stackr   r   r   r   r   r   r   test_async_callbackM  sB    

D,.\z&TestAsyncExitStack.test_async_callbackc              	      sV  t   fdd}dd }fdd}G dd dt} 4 I d H }|| |jd	 d
 | ||}|| |jd	 d
 j| || |jd	 d
 | ||}|| |jd	 d
 j| || |jd	 d
 | || |jd	 d
 | d
d  W d   I d H  qR1 I d H sH0    Y  d S )Nc                    s    |   d S r   )r'   r>   r6   exc_tbZ
exc_raisedr   r   r   _expect_exc{  s    z7TestAsyncExitStack.test_async_push.<locals>._expect_excc                     s   dS NTr   r   r   r   r   _suppress_exc}  s    z9TestAsyncExitStack.test_async_push.<locals>._suppress_excc                    s"     |    |   | d S r   )r   r   r=   r   r   
_expect_ok  s    

z6TestAsyncExitStack.test_async_push.<locals>._expect_okc                   @   s$   e Zd Zdd Zdd Zdd ZdS )z2TestAsyncExitStack.test_async_push.<locals>.ExitCMc                 S   s
   || _ d S r   	check_exc)r   r   r   r   r   __init__  s    z;TestAsyncExitStack.test_async_push.<locals>.ExitCM.__init__c                    s   |  d d S )NzShould not be called!)rm   r=   r   r   r   r(     s    z=TestAsyncExitStack.test_async_push.<locals>.ExitCM.__aenter__c                    s   | j | I d H  d S r   r   r   r   r   r   r     s    z<TestAsyncExitStack.test_async_push.<locals>.ExitCM.__aexit__N)r"   r#   r$   r   r(   r   r   r   r   r   ExitCM  s   r   rJ   r   )rU   objectr   push_async_exitr'   r   __self__)r   r   r   r   r   r   cmr   r   r   test_async_pushx  s*    





z"TestAsyncExitStack.test_async_pushc              	      s   G  fdddt }g  | }t 4 I d H d}|j fdd}| | ||I d H  | |jd d j|  d W d   I d H  q1 I d H s0    Y  | 	 g d d S )	Nc                       s$   e Zd Z fddZ fddZdS )z;TestAsyncExitStack.test_async_enter_context.<locals>.TestCMc                    s     d d S )NrJ   rM   r=   r   r   r   r(     s    zFTestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aenter__c                    s     d d S )Nr   rM   r   r   r   r   r     s    zETestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aexit__NrA   r   r   r   r   TestCM  s   r   c                      s     d d S )N   rM   r   r   r   r   r     s    z:TestAsyncExitStack.test_async_enter_context.<locals>._exitr   rJ   r   )rJ   r   r   r   )
r   r   r   ZassertIsNotNoneenter_async_contextr'   r   r   r3   r4   )r   r   r   r   r   r   r   r   test_async_enter_context  s    
4z+TestAsyncExitStack.test_async_enter_contextc              
      s  dd }d   fdd}z|   4 I d H X}||t ||t ||t || ||t dd  W d   I d H  q1 I d H s0    Y  W nR ty } z:| |jt | |jjt | 	|jjj W Y d }~nd }~0 0 | 
d  d }| |t | |jt d S )Nc                    s   | d S r   r   rp   r   r   r   	raise_exc  s    zHTestAsyncExitStack.test_async_exit_exception_chaining.<locals>.raise_excc                     s   |  dS r   r   r   Zsaved_detailsr   r   suppress_exc  s    zKTestAsyncExitStack.test_async_exit_exception_chaining.<locals>.suppress_excrJ   r   0Expected IndexError, but no exception was raised)r   r   
IndexErrorKeyErrorAttributeErrorr   r1   ZassertIsInstancer   r   rm   rU   )r   r   r   r   r6   Z	inner_excr   r   r   "test_async_exit_exception_chaining  s&    
6&
z5TestAsyncExitStack.test_async_exit_exception_chainingc                    s   G dd dt  t fddtfdd}|fD ]}  zD| 4 I d H  t W d   I d H  q1 I d H s0    Y  W n0  y } z|j W Y d }~nd }~0 0 d W d    q:1 s0    Y  q:d S )Nc                   @   s   e Zd ZdS )zWTestAsyncExitStack.test_async_exit_exception_explicit_none_context.<locals>.MyExceptionNr9   r   r   r   r   MyException  s   r   c                    s@   z
d V  W n0 t y:     } z| W d | _nd | _0 Y n0 d S r   )BaseExceptionr   rp   )r   r   r   my_cm  s    
zQTestAsyncExitStack.test_async_exit_exception_explicit_none_context.<locals>.my_cmc               	     sX     4 I d H .} |   I d H  | V  W d   I d H  qT1 I d H sJ0    Y  d S r   )r   r   )r   )r   r   r   r   my_cm_with_exit_stack  s    zaTestAsyncExitStack.test_async_exit_exception_explicit_none_context.<locals>.my_cm_with_exit_stackr   )rl   r   rk   r   r   r   rm   )r   r   r   r6   r   )r   r   r   r   /test_async_exit_exception_explicit_none_context  s    

4"zBTestAsyncExitStack.test_async_exit_exception_explicit_none_contextN)r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   %  s   
*
#

r   __main__)r   
contextlibr   r   r   r   testr   ZunittestZtest.test_contextlibr   r   ZTestCaser   rH   r   r"   mainr   r   r   r   <module>   s   E H R