B
    u9a8                 @   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           	      s@    | |}t  }t | z
||S |  t d  X d S )N)asyncionew_event_loopset_event_loopZrun_until_completeclose)argskwargscoroloop)func +/usr/lib/python3.7/test_contextlib_async.pywrapper   s    


z_async_test.<locals>.wrapper)	functoolswraps)r   r   r   )r   r   _async_test
   s    
r   c               @   s(   e Zd Zedd Zdd Zdd ZdS )TestAbstractAsyncContextManagerc          
      sZ   G dd dt }| }| | I d H | |4 I d H }| || W d Q I d H R X 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 )N)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   Zmanagercontextr   r   r   
test_enter   s
    z*TestAbstractAsyncContextManager.test_enterc          	   C   s0   G dd dt }| t |  W d Q R X 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   assertRaises	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 )Nr   )r   r   r   r   r!   0   s    zbTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratch.__aenter__c                s   d S )Nr   )r   exc_type	exc_value	tracebackr   r   r   r   2   s    zaTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratch.__aexit__N)r   r   r   r!   r   r   r   r   r   ManagerFromScratch/   s   r+   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 )N)r   r   )r   r   )r   r   r   r   8   s    z[TestAbstractAsyncContextManager.test_structural_subclassing.<locals>.DefaultEnter.__aexit__)r   r   r   r   r   r   r   )r   r   r   7   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   
NoneAenter=   s   r,   c               @   s   e Zd ZdZdS )zNTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.NoneAexitN)r   r   r   r   r   r   r   r   	NoneAexitB   s   r-   )Z
assertTrue
issubclassr   assertFalse)r   r+   r   r,   r-   r   r   r   test_structural_subclassing.   s    z;TestAbstractAsyncContextManager.test_structural_subclassingN)r   r   r   r   r#   r'   r0   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          
      sn   g  t  fdd}| 4 I d H *}|  dg | |d  | W d Q I d H R X |  dddg d S )Nc                 s     d dV    d d S )N   *   i  )appendr   )stater   r   woohooM   s    
zEAsyncContextManagerTestCase.test_contextmanager_plain.<locals>.woohoor2   r3   i  )r   assertEqualr4   )r   r6   xr   )r5   r   test_contextmanager_plainJ   s    z5AsyncContextManagerTestCase.test_contextmanager_plainc                s   g  t  fdd}| tP | 4 I d H 0}|  dg | |d  | t W d Q I d H R X W d Q R X |  dddg d S )Nc            	     s&     d z
dV  W d   d X d S )Nr2   r3   i  )r4   r   )r5   r   r   r6   [   s    

zGAsyncContextManagerTestCase.test_contextmanager_finally.<locals>.woohoor2   r3   i  )r   r%   ZeroDivisionErrorr7   r4   )r   r6   r8   r   )r5   r   test_contextmanager_finallyX   s    
 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 )Nr   r   r   r   r   wheel   s    zHAsyncContextManagerTestCase.test_contextmanager_no_reraise.<locals>.wheefoo)r   r!   r/   r   r&   )r   r<   ctxr   r   r   test_contextmanager_no_reraisej   s    z:AsyncContextManagerTestCase.test_contextmanager_no_reraisec          	      sR   t dd }| }| I d H  | t |ttdd I d H  W d Q R X d S )Nc               S  s"   y
d V  W n   d V  Y nX d S )Nr   r   r   r   r   whoov   s    
zTAsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throw.<locals>.whoor=   )r   r!   r%   RuntimeErrorr   r&   )r   r@   r>   r   r   r   *test_contextmanager_trap_yield_after_throwt   s
    zFAsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throwc          	      s:   t dd }| }| t | I d H  W d Q R X d S )Nc               S  s   d S )Nr   r   r   r   r   r@      s    zKAsyncContextManagerTestCase.test_contextmanager_trap_no_yield.<locals>.whoo)r   r%   rA   r!   )r   r@   r>   r   r   r   !test_contextmanager_trap_no_yield   s    z=AsyncContextManagerTestCase.test_contextmanager_trap_no_yieldc          	      sN   t dd }| }| I d H  | t |d d d I d H  W d Q R X d S )Nc               S  s   d V  d V  d S )Nr   r   r   r   r   r@      s    zOAsyncContextManagerTestCase.test_contextmanager_trap_second_yield.<locals>.whoo)r   r!   r%   rA   r   )r   r@   r>   r   r   r   %test_contextmanager_trap_second_yield   s
    zAAsyncContextManagerTestCase.test_contextmanager_trap_second_yieldc          	      sN   t dd }| }| I d H  | t |td d I d H  W d Q R X d S )Nc               S  s(   y
d V  W n t k
r"   tY nX d S )N)rA   SyntaxErrorr   r   r   r   r@      s    
zLAsyncContextManagerTestCase.test_contextmanager_non_normalised.<locals>.whoo)r   r!   r%   rE   r   rA   )r   r@   r>   r   r   r   "test_contextmanager_non_normalised   s
    z>AsyncContextManagerTestCase.test_contextmanager_non_normalisedc          
      sx   g t  fdd}| 4 I d H 2} dg  |d | tdW d Q I d H R X  dddg d S )Nc           
     s^    d y
dV  W nD tk
rX }  z& | jd   dddg W d d } ~ X Y nX d S )Nr2   r3   r   i  )r4   r:   r   r7   )e)r   r5   r   r   r6      s    

zFAsyncContextManagerTestCase.test_contextmanager_except.<locals>.woohoor2   r3   i  )r   r7   r4   r:   )r   r6   r8   r   )r   r5   r   test_contextmanager_except   s    
z6AsyncContextManagerTestCase.test_contextmanager_exceptc                s   t dd }xtdtdfD ]}| jt|dn y(| 4 I d H 
 |W d Q I d H R X W n. tk
r } z| || W d d }~X Y nX | | d W d Q R X qW d S )Nc               S  s
   d V  d S )Nr   r   r   r   r   r6      s    zOAsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.woohoospamZham)typez was suppressed)r   StopIterationStopAsyncIterationZsubTestrJ   	Exceptionr    fail)r   r6   Zstop_excZexr   r   r   #test_contextmanager_except_stopiter   s    z?AsyncContextManagerTestCase.test_contextmanager_except_stopiterc                s   t dd }| t. | 4 I d H  dd  W d Q I d H R X W d Q R X | t* | 4 I d H 
 tW d Q I d H R X W d Q R X d S )Nc           
   S  sB   y
d V  W n2 t k
r< }  ztd|  | W d d } ~ X Y nX d S )Nzcaught )rM   rA   )excr   r   r   r6      s    
zQAsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerror.<locals>.woohoor2   r   )r   r%   rA   rL   )r   r6   r   r   r   %test_contextmanager_wrap_runtimeerror   s    "zAAsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerrorc             C   s"   dd }t |dddd }|S )Nc                 s    fdd}|S )Nc                s&   x    D ]\}}t| || q
W | S )N)itemssetattr)r   kv)kwr   r   decorate   s    z]AsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribs.<locals>.decorater   )rV   rW   r   )rV   r   attribs   s    zKAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribsbar)r=   c             S  s
   d V  d S )Nr   )rI   r   r   r   baz   s    zGAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.baz)r   )r   rX   rZ   r   r   r   _create_contextmanager_attribs   s    z:AsyncContextManagerTestCase._create_contextmanager_attribsc             C   s(   |   }| |jd | |jd d S )NrZ   rY   )r[   r7   r   r=   )r   rZ   r   r   r   test_contextmanager_attribs   s    z7AsyncContextManagerTestCase.test_contextmanager_attribsc             C   s   |   }| |jd d S )NzWhee!)r[   r7   __doc__)r   rZ   r   r   r   test_contextmanager_doc_attrib   s    z:AsyncContextManagerTestCase.test_contextmanager_doc_attribc          
      s<   |   d }| |jd |4 I d H  W d Q I d H R X d S )NzWhee!)r[   r7   r]   )r   rZ   r   r   r   *test_instance_docstring_given_cm_docstring   s    zFAsyncContextManagerTestCase.test_instance_docstring_given_cm_docstringc          
      sF   t dd }|ddddd4 I d H }| |d W d Q I d H R X d S )	Nc             S  s   | |||fV  d S )Nr   )r   r   r   kwdsr   r   r   r6      s    z9AsyncContextManagerTestCase.test_keywords.<locals>.woohoo      !   ,   )r   r   r   r`   )ra   rb   rc   rd   )r   r7   )r   r6   targetr   r   r   test_keywords   s    z)AsyncContextManagerTestCase.test_keywordsN)r   r   r   r   r9   r;   r?   rB   rC   rD   rF   rH   rO   rQ   r[   r\   r   Zrequires_docstringsr^   r_   rf   r   r   r   r   r1   H   s    

r1   c               @   sX   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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}y|W n   ||_|Y nX d S )Nc                s      S )N)stop)f)r   r   r   <lambda>      zETestAsyncExitStack.SyncAsyncExitStack.run_coroutine.<locals>.<lambda>)r   Zget_event_loopZensure_futureZadd_done_callbackZrun_foreverZ	exceptionresult__context__)r   ri   rP   r"   r   )r   r   run_coroutine  s    
z3TestAsyncExitStack.SyncAsyncExitStack.run_coroutinec             C   s   |  |  S )N)rn   aclose)r   r   r   r   r
     s    z+TestAsyncExitStack.SyncAsyncExitStack.closec             C   s   |  |  S )N)rn   r!   )r   r   r   r   	__enter__  s    z/TestAsyncExitStack.SyncAsyncExitStack.__enter__c             G   s   |  | j| S )N)rn   r   )r   exc_detailsr   r   r   __exit__!  s    z.TestAsyncExitStack.SyncAsyncExitStack.__exit__N)r   r   r   staticmethodrn   r
   rp   rr   r   r   r   r   SyncAsyncExitStack  s   rt   c             C   s(   t  | _t | j | | jj d S )N)r   r   r   r	   Z
addCleanupr
   )r   r   r   r   setUp&  s    
zTestAsyncExitStack.setUpc          
      s  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 }xpt|D ]d\}}|r|r|j|f||}n4|r|j|f| }n|r|j|f|}n
||}| || qdW xH|jD ]>}| |d j| | |d j|j | 	|d j
|j
 qW W d Q I d H R X |  | g  t 4 I d H Z}| t |jdd W d Q R X | t | jjd	d W d Q R X |j|d
d W d Q I d H R X |  ddd
ifg d S )Nr   )r2   )r2      r2   )Zexamplec                 s     | |f d S )N)r4   )r   r`   )rl   r   r   _exit6  s    z5TestAsyncExitStack.test_async_callback.<locals>._exit)argrv      )callbackrx   rx   )dictr   reversedpush_async_callbackr    _exit_callbacks__wrapped__ZassertNotEqualr   assertIsNoner]   r7   r%   r&   
exit_stack)r   Zexpectedrw   stackr   r`   ri   r   r   )rl   r   test_async_callback+  s>    
(z&TestAsyncExitStack.test_async_callbackc          
      s8  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 Q I d H R X d S )Nc                s    |   d S )N)r    )r(   rP   exc_tb)
exc_raisedr   r   r   _expect_excX  s    z7TestAsyncExitStack.test_async_push.<locals>._expect_excc                 s   dS )NTr   )rq   r   r   r   _suppress_excZ  s    z9TestAsyncExitStack.test_async_push.<locals>._suppress_excc                s"     |    |   | d S )N)r   )r(   rP   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 )N)	check_exc)r   r   r   r   r   __init__a  s    z;TestAsyncExitStack.test_async_push.<locals>.ExitCM.__init__c                s   |  d d S )NzShould not be called!)rN   )r   r   r   r   r!   c  s    z=TestAsyncExitStack.test_async_push.<locals>.ExitCM.__aenter__c                s   | j | I d H  d S )N)r   )r   rq   r   r   r   r   e  s    z<TestAsyncExitStack.test_async_push.<locals>.ExitCM.__aexit__N)r   r   r   r   r!   r   r   r   r   r   ExitCM`  s   r   r2   r   )r:   objectr   push_async_exitr    r~   __self__)r   r   r   r   r   r   cmr   )r   r   r   test_async_pushU  s*    





z"TestAsyncExitStack.test_async_pushc          
      s   G  fdddt }g  | }t 4 I d H T}|j fdd}| | ||I d H  | |jd d j|  d W d Q I d H R X | 	 dddd	g 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 )Nr2   )r4   )r   )rl   r   r   r!   |  s    zFTestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aenter__c                s     d d S )Nry   )r4   )r   rq   )rl   r   r   r   ~  s    zETestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aexit__N)r   r   r   r!   r   r   )rl   r   r   TestCM{  s   r   c                  s     d d S )N   )r4   r   )rl   r   r   rw     s    z:TestAsyncExitStack.test_async_enter_context.<locals>._exitr   r2   rv   ry   r   )
r   r   r}   ZassertIsNotNoneenter_async_contextr    r~   r   r4   r7   )r   r   r   r   rw   r   )rl   r   test_async_enter_contexty  s    
z+TestAsyncExitStack.test_async_enter_contextc          
      s  dd }d   fdd}yh|   4 I d H H}||t ||t ||t || ||t dd  W d Q I d H R X W nP tk
r } z2| |jt | |jjt | 	|jjj W d d }~X Y nX | 
d  d }| |t | |jt d S )Nc                s   | d S )Nr   )rP   r   r   r   	raise_exc  s    zHTestAsyncExitStack.test_async_exit_exception_chaining.<locals>.raise_excc                 s   |  dS )NTr   )rq   )saved_detailsr   r   suppress_exc  s    zKTestAsyncExitStack.test_async_exit_exception_chaining.<locals>.suppress_excr2   r   z0Expected IndexError, but no exception was raised)r   r}   
IndexErrorKeyErrorAttributeErrorr   
ValueErrorZassertIsInstancerm   r   rN   r:   )r   r   r   r   rP   Z	inner_excr   )r   r   "test_async_exit_exception_chaining  s&    
"
z5TestAsyncExitStack.test_async_exit_exception_chainingN)r   r   r   r   rt   r   ru   r   r   r   r   r   r   r   r   r   rg     s   *$rg   __main__)r   
contextlibr   r   r   r   Ztestr   ZunittestZtest.test_contextlibr   r   ZTestCaser   r1   rg   r   mainr   r   r   r   <module>   s   / = -