B
    18\7                 @   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 )z5Decorator to turn an async function into a test case.c           	      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 ^/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/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   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.   )
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(   r2   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>.woohoor4   r5   i  )r   assertEqualr6   )r   r8   xr   )r7   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 )Nr4   r5   i  )r6   r   )r7   r   r   r8   [   s    

zGAsyncContextManagerTestCase.test_contextmanager_finally.<locals>.woohoor4   r5   i  )r   r&   ZeroDivisionErrorr9   r6   )r   r8   r:   r   )r7   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!   r1   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   rB   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   rB      s    zKAsyncContextManagerTestCase.test_contextmanager_trap_no_yield.<locals>.whoo)r   r&   rC   r!   )r   rB   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   rB      s    zOAsyncContextManagerTestCase.test_contextmanager_trap_second_yield.<locals>.whoo)r   r!   r&   rC   r   )r   rB   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)rC   SyntaxErrorr   r   r   r   rB      s    
zLAsyncContextManagerTestCase.test_contextmanager_non_normalised.<locals>.whoo)r   r!   r&   rG   r   rC   )r   rB   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 )Nr4   r5   r   i  )r6   r<   r   r9   )e)r   r7   r   r   r8      s    

zFAsyncContextManagerTestCase.test_contextmanager_except.<locals>.woohoor4   r5   i  )r   r9   r6   r<   )r   r8   r:   r   )r   r7   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   r8      s    zOAsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.woohoospamZham)typez was suppressed)r   StopIterationStopAsyncIterationsubTestrL   	Exceptionr    fail)r   r8   Zstop_exc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 )rP   rC   )excr   r   r   r8      s    
zQAsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerror.<locals>.woohoor4   r   )r   r&   rC   rN   )r   r8   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   )rZ   r[   r   )rZ   r   attribs   s    zKAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribsbar)r?   c             S  s
   dV  dS )zWhee!Nr   )rK   r   r   r   baz   s    zGAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.baz)r   )r   r\   r^   r   r   r   _create_contextmanager_attribs   s    z:AsyncContextManagerTestCase._create_contextmanager_attribsc             C   s(   |   }| |jd | |jd d S )Nr^   r]   )r_   r9   r   r?   )r   r^   r   r   r   test_contextmanager_attribs   s    z7AsyncContextManagerTestCase.test_contextmanager_attribsc             C   s   |   }| |jd d S )NzWhee!)r_   r9   __doc__)r   r^   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_   r9   ra   )r   r^   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   r8      s    z9AsyncContextManagerTestCase.test_keywords.<locals>.woohoo      !   ,   )r   r   r   rd   )re   rf   rg   rh   )r   r9   )r   r8   targetr   r   r   test_keywords   s    z)AsyncContextManagerTestCase.test_keywordsN)r   r   r   r   r;   r=   rA   rD   rE   rF   rH   rJ   rS   rU   r_   r`   r   requires_docstringsrb   rc   rj   r   r   r   r   r3   H   s    

r3   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_forever	exceptionresult__context__)r   rn   rT   r#   r   )r   r   run_coroutine  s    
z3TestAsyncExitStack.SyncAsyncExitStack.run_coroutinec             C   s   |  |  S )N)rt   aclose)r   r   r   r   r
     s    z+TestAsyncExitStack.SyncAsyncExitStack.closec             C   s   |  |  S )N)rt   r!   )r   r   r   r   	__enter__  s    z/TestAsyncExitStack.SyncAsyncExitStack.__enter__c             G   s   |  | j| S )N)rt   r   )r   exc_detailsr   r   r   __exit__!  s    z.TestAsyncExitStack.SyncAsyncExitStack.__exit__N)r   r   r   staticmethodrt   r
   rv   rx   r   r   r   r   SyncAsyncExitStack  s   rz   c             C   s(   t  | _t | j | | jj d S )N)r   r   r   r	   
addCleanupr
   )r   r   r   r   setUp&  s    
zTestAsyncExitStack.setUpc          
      s6  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 |  | d S )Nr   )r4   )r4      r4   )Zexamplec                 s     | |f dS )zTest metadata propagationN)r6   )r   rd   )rr   r   r   _exit6  s    z5TestAsyncExitStack.test_async_callback.<locals>._exit)dictr   reversedpush_async_callbackr    _exit_callbacks__wrapped__assertNotEqualr   assertIsNonera   r9   )r   expectedr~   stackr   rd   rn   r   r   )rr   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)   rT   exc_tb)
exc_raisedr   r   r   _expect_excO  s    z7TestAsyncExitStack.test_async_push.<locals>._expect_excc                 s   dS )NTr   )rw   r   r   r   _suppress_excQ  s    z9TestAsyncExitStack.test_async_push.<locals>._suppress_excc                s"     |    |   | d S )N)r   )r)   rT   r   )r   r   r   
_expect_okS  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__X  s    z;TestAsyncExitStack.test_async_push.<locals>.ExitCM.__init__c                s   |  d d S )NzShould not be called!)rQ   )r   r   r   r   r!   Z  s    z=TestAsyncExitStack.test_async_push.<locals>.ExitCM.__aenter__c                s   | j | I d H  d S )N)r   )r   rw   r   r   r   r   \  s    z<TestAsyncExitStack.test_async_push.<locals>.ExitCM.__aexit__N)r   r   r   r   r!   r   r   r   r   r   ExitCMW  s   r   r4   r   )r<   object
exit_stackpush_async_exitr    r   __self__)r   r   r   r   r   r   cmr   )r   r   r   test_async_pushL  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 )Nr4   )r6   )r   )rr   r   r   r!   s  s    zFTestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aenter__c                s     d d S )N   )r6   )r   rw   )rr   r   r   r   u  s    zETestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aexit__N)r   r   r   r!   r   r   )rr   r   r   TestCMr  s   r   c                  s     d d S )N   )r6   r   )rr   r   r   r~   |  s    z:TestAsyncExitStack.test_async_enter_context.<locals>._exitr   r4   r}   r   r   )
r   r   r   assertIsNotNoneenter_async_contextr    r   r   r6   r9   )r   r   r   r   r~   r   )rr   r   test_async_enter_contextp  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   )rT   r   r   r   	raise_exc  s    zHTestAsyncExitStack.test_async_exit_exception_chaining.<locals>.raise_excc                 s   |  dS )NTr   )rw   )saved_detailsr   r   suppress_exc  s    zKTestAsyncExitStack.test_async_exit_exception_chaining.<locals>.suppress_excr4   r   z0Expected IndexError, but no exception was raised)r   r   
IndexErrorKeyErrorAttributeErrorr   
ValueErrorassertIsInstancers   r   rQ   r<   )r   r   r   r   rT   Z	inner_excr   )r   r   "test_async_exit_exception_chaining  s&    
"
z5TestAsyncExitStack.test_async_exit_exception_chainingN)r   r   r   r   rz   r   r|   r   r   r   r   r   r   r   r   r   rl     s   !$rl   __main__)r   
contextlibr   r   r   r   testr   unittestZtest.test_contextlibr   r   TestCaser   r3   rl   r   mainr   r   r   r   <module>   s   / = $