o
    gE                     @   s   d dl Z d dlmZmZmZ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jZG dd deejZG dd dejZedkrde  dS dS )    N)asynccontextmanagerAbstractAsyncContextManagerAsyncExitStacknullcontextaclosingcontextmanager)support)TestBaseExitStackc                    s   	 t   fdd}|S )Nc               	      sT    | i |}t  }t | z||W |  t d  S |  t d  w N)asyncionew_event_loopset_event_loopZrun_until_completecloseset_event_loop_policy)argskwargscoroloopfunc P/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/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              	      sx   G dd dt }| }| | I d H | |4 I d H }| || W d   I d H  d S 1 I d H s5w   Y  d S )Nc                          e Zd Z fddZ  ZS )z@TestAbstractAsyncContextManager.test_enter.<locals>.DefaultEnterc                       t  j| I d H  d S r
   super	__aexit__selfr   	__class__r   r   r!          zJTestAbstractAsyncContextManager.test_enter.<locals>.DefaultEnter.__aexit____name__
__module____qualname__r!   __classcell__r   r   r$   r   DefaultEnter       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6   4 I d H  | 2 z3 d H W }|| |6 W d   I d H  qG1 I d H sBw   Y  W d    n1 sQw   Y  | |dg d S )Nc                   S     d V  d S r
   r   r   r   r   r   ctx-      
zUTestAbstractAsyncContextManager.test_async_gen_propagates_generator_exit.<locals>.ctxc                	     sH     4 I d H  dV  W d   I d H  d S 1 I d H sw   Y  d S )N   r   r   r4   r   r   gen1   s   .zUTestAbstractAsyncContextManager.test_async_gen_propagates_generator_exit.<locals>.gen   r6   )r   
ValueErrorassertRaisesappendassertEqual)r#   r8   Zretexcvalr   r7   r   (test_async_gen_propagates_generator_exit)   s    

(zHTestAbstractAsyncContextManager.test_async_gen_propagates_generator_exitc                 C   sF   G dd dt }| t |  W d    d S 1 sw   Y  d S )Nc                   @      e Zd ZdS )zKTestAbstractAsyncContextManager.test_exit_is_abstract.<locals>.MissingAexitNr(   r)   r*   r   r   r   r   MissingAexit@       rC   )r   r;   	TypeError)r#   rC   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/   H      zbTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratch.__aenter__c                    s   d S r
   r   )r#   exc_type	exc_value	tracebackr   r   r   r!   J   rH   zaTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.ManagerFromScratch.__aexit__Nr(   r)   r*   r/   r!   r   r   r   r   ManagerFromScratchG   s    rM   c                       r   )zQTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.DefaultEnterc                    r   r
   r   r"   r$   r   r   r!   P   r&   z[TestAbstractAsyncContextManager.test_structural_subclassing.<locals>.DefaultEnter.__aexit__r'   r   r   r$   r   r,   O   r-   r,   c                   @      e Zd ZdZdS )zOTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.NoneAenterN)r(   r)   r*   r/   r   r   r   r   
NoneAenterU       rO   c                   @   rN   )zNTestAbstractAsyncContextManager.test_structural_subclassing.<locals>.NoneAexitN)r(   r)   r*   r!   r   r   r   r   	NoneAexitZ   rP   rQ   )Z
assertTrue
issubclassr   assertFalse)r#   rM   r,   rO   rQ   r   r   r   test_structural_subclassingF   s   z;TestAbstractAsyncContextManager.test_structural_subclassingN)r(   r)   r*   r   r2   r@   rF   rT   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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  q:1 I d H s5w   Y  |  g d d S )Nc                     s      d dV    d d S N   *     r<   r   stater   r   woohooe   s   
zEAsyncContextManagerTestCase.test_contextmanager_plain.<locals>.woohoorW   rX   rW   rX   rY   )r   r=   r<   r#   r]   xr   r[   r   test_contextmanager_plainb   s   (z5AsyncContextManagerTestCase.test_contextmanager_plainc              
      s   g  t  fdd}| t0 | 4 I d H }|  dg | |d  | t 1 I d H s4w   Y  W d    n1 sCw   Y  |  g d d S )Nc                	     s0     d zdV  W   d d S   d w rV   rZ   r   r[   r   r   r]   s   s
   
zGAsyncContextManagerTestCase.test_contextmanager_finally.<locals>.woohoorW   rX   r^   )r   r;   ZeroDivisionErrorr=   r<   r_   r   r[   r   test_contextmanager_finallyp   s   
z7AsyncContextManagerTestCase.test_contextmanager_finallyc                    sD   t dd }| }| I d H  | |ttdd I d H  d S )Nc                   S  r3   r
   r   r   r   r   r   whee   r5   zHAsyncContextManagerTestCase.test_contextmanager_no_reraise.<locals>.wheefoo)r   r/   rS   r!   rE   )r#   rd   r4   r   r   r   test_contextmanager_no_reraise   s   
"z:AsyncContextManagerTestCase.test_contextmanager_no_reraisec                    sj   t dd }| }| I d H  | t |ttdd I d H  W d    d S 1 s.w   Y  d S )Nc                   S  s"   zd V  W d S    d V  Y d S r
   r   r   r   r   r   whoo   s
   zTAsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throw.<locals>.whoore   )r   r/   r;   RuntimeErrorr!   rE   r#   rg   r4   r   r   r   *test_contextmanager_trap_yield_after_throw   s   
"zFAsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throwc                    sR   t dd }| }| t | I d H  W d    d S 1 s"w   Y  d S )Nc                   S  s   d S )NFr   r   r   r   r   rg      s   zKAsyncContextManagerTestCase.test_contextmanager_trap_no_yield.<locals>.whoo)r   r;   rh   r/   ri   r   r   r   !test_contextmanager_trap_no_yield   s   
"z=AsyncContextManagerTestCase.test_contextmanager_trap_no_yieldc                    sf   t dd }| }| I d H  | t |d d d I d H  W d    d S 1 s,w   Y  d S )Nc                   S  s   d V  d V  d S r
   r   r   r   r   r   rg      s   
zOAsyncContextManagerTestCase.test_contextmanager_trap_second_yield.<locals>.whoo)r   r/   r;   rh   r!   ri   r   r   r   %test_contextmanager_trap_second_yield   s   
"zAAsyncContextManagerTestCase.test_contextmanager_trap_second_yieldc                    sf   t dd }| }| I d H  | t |td d I d H  W d    d S 1 s,w   Y  d S )Nc                   S  s"   zd V  W d S  t y   tw r
   )rh   SyntaxErrorr   r   r   r   rg      s   zLAsyncContextManagerTestCase.test_contextmanager_non_normalised.<locals>.whoo)r   r/   r;   rm   r!   rh   ri   r   r   r   "test_contextmanager_non_normalised   s   
"z>AsyncContextManagerTestCase.test_contextmanager_non_normalisedc              	      s~   g t  fdd}| 4 I d H } dg  |d | td1 I d H s0w   Y   g d d S )Nc               
     s`    d zdV  W d S  ty/ }  z | jd   g d W Y d } ~ d S d } ~ ww )NrW   rX   r   r^   )r<   rb   r   r=   )er#   r\   r   r   r]      s   
zFAsyncContextManagerTestCase.test_contextmanager_except.<locals>.woohoorW   rX   rY   r^   )r   r=   r<   rb   r_   r   rp   r   test_contextmanager_except   s   
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 ]R}| jt|d	@ z| 4 I d H  |1 I d H sAw   Y  W n ty_ } z| || W Y d }~nd }~ww | | d
 W d    q%1 srw   Y  q%d S )Nc                   S  r3   r
   r   r   r   r   r   r]      r5   zOAsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.woohooc                   @   rA   )z^AsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.StopIterationSubclassNrB   r   r   r   r   StopIterationSubclass   rD   rr   c                   @   rA   )zcAsyncContextManagerTestCase.test_contextmanager_except_stopiter.<locals>.StopAsyncIterationSubclassNrB   r   r   r   r   StopAsyncIterationSubclass   rD   rs   spamZham)typez was suppressed)r   StopIterationStopAsyncIterationZsubTestru   	Exceptionr.   fail)r#   r]   rr   rs   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   I d H  q.1 I d H s)w   Y  W d    n1 s8w   Y  | t | 4 I d H  t1 I d H sSw   Y  W d    d S 1 scw   Y  d S )Nc               
   S  s8   zd V  W d S  t y }  ztd|  | d } ~ ww )Nzcaught )rx   rh   r>   r   r   r   r]      s   zQAsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerror.<locals>.woohoorW   r   )r   r;   rh   rw   r#   r]   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"      D ]
\}}t| || q| S r
   )itemssetattr)r   kvkwr   r   decorate   s   z]AsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribs.<locals>.decorater   )r   r   r   r   r   attribs   s   zKAsyncContextManagerTestCase._create_contextmanager_attribs.<locals>.attribsbar)re   c                 S  s   	 d V  d S r
   r   )rt   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   r=   r(   re   r#   r   r   r   r   test_contextmanager_attribs  s   z7AsyncContextManagerTestCase.test_contextmanager_attribsc                 C   s   |   }| |jd d S NzWhee!r   r=   __doc__r   r   r   r   test_contextmanager_doc_attrib  s   z:AsyncContextManagerTestCase.test_contextmanager_doc_attribc              	      sZ   |   d }| |jd |4 I d H  W d   I d H  d S 1 I d H s&w   Y  d S r   r   r   r   r   r   *test_instance_docstring_given_cm_docstring  s   .zFAsyncContextManagerTestCase.test_instance_docstring_given_cm_docstringc              	      sd   t dd }|ddddd4 I d H }| |d W d   I d H  d S 1 I d H s+w   Y  d S )	Nc                 S  s   | |||fV  d S r
   r   r#   r   r   kwdsr   r   r   r]      s   z9AsyncContextManagerTestCase.test_keywords.<locals>.woohoor6   r9   !   ,   r   )r6   r9   r   r   r   r=   )r#   r]   targetr   r   r   test_keywords  s   
.z)AsyncContextManagerTestCase.test_keywordsc                    sZ   d dt  fdd}|  fdd I d H  d  d d S )Nr   c                    s4   d7  }  d7  d V   d8    |  d S NrW   )r=   )before)depthncolsr#   r   r   r]   +  s   z:AsyncContextManagerTestCase.test_recursive.<locals>.woohooc                      s    dk r I d H  d S d S )N
   r   r   )r   	recursiver   r   r   7  s   z=AsyncContextManagerTestCase.test_recursive.<locals>.recursiver   r   r}   r   )r   r   r   r#   r   test_recursive&  s   z*AsyncContextManagerTestCase.test_recursiveN)r(   r)   r*   r   ra   rc   rf   rj   rk   rl   rn   rq   r{   r~   r   r   r   requires_docstringsr   r   r   r   r   r   r   r   rU   `   s@    


	

	







rU   c                   @   s>   e Zd Zejdd Zedd Zedd Zedd Z	d	S )
AclosingTestCasec                 C   s    t j}t d }| |j| d S r
   )r   r   r=   )r#   Zcm_docstringobjr   r   r   test_instance_docsD  s   z#AclosingTestCase.test_instance_docsc              	      s   g  G  fddd}| }|   g  t|4 I d H }|  || W d   I d H  q91 I d H s4w   Y  |   dg d S )Nc                          e Zd Z fddZdS )z)AclosingTestCase.test_aclosing.<locals>.Cc                         d d S r   rZ   rG   r[   r   r   acloseN     z0AclosingTestCase.test_aclosing.<locals>.C.acloseNr(   r)   r*   r   r   r[   r   r   CM      r   rW   )r=   r   r#   r   r`   yr   r[   r   test_aclosingJ  s   (zAclosingTestCase.test_aclosingc              
      s   g  G  fddd}| }|   g  | t0 t|4 I d H }|  || dd  W d   I d H  qC1 I d H s>w   Y  W d    n1 sMw   Y  |   dg d S )Nc                       r   )z/AclosingTestCase.test_aclosing_error.<locals>.Cc                    r   r   rZ   rG   r[   r   r   r   Z  r   z6AclosingTestCase.test_aclosing_error.<locals>.C.acloseNr   r   r[   r   r   r   Y  r   r   rW   r   )r=   r;   rb   r   r   r   r[   r   test_aclosing_errorV  s   
(z$AclosingTestCase.test_aclosing_errorc              
      s   g  t  fddfdd}| }|  g  | t; t|4 I d H  }| || | d| I d H  dd  W d   I d H  qS1 I d H sNw   Y  W d    n1 s]w   Y  |  dg d S )Nc                	   3   s&    zd V  W   d d S   d w r   rZ   r   r[   r   r   sync_resourceh  s   z>AclosingTestCase.test_aclosing_bpo41229.<locals>.sync_resourcec                     s:      dV  dV  W d    d S 1 sw   Y  d S )Nr   r   )r   r   r   agenfunco  s
   "z9AclosingTestCase.test_aclosing_bpo41229.<locals>.agenfuncr   rW   r   )r   r=   r;   rb   r   	__anext__)r#   r   r`   r   r   )r\   r   r   test_aclosing_bpo41229d  s    
(z'AclosingTestCase.test_aclosing_bpo41229N)
r(   r)   r*   r   r   r   r   r   r   r   r   r   r   r   r   B  s    


r   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                    s\   t   t | }| fdd    | }|s | S |j}z|   ||_|)Nc                    s      S r
   )stop)fr   r   r   <lambda>  s    zETestAsyncExitStack.SyncAsyncExitStack.run_coroutine.<locals>.<lambda>)r   Zget_event_loopZensure_futureadd_done_callbackZrun_forever	exceptionresult__context__)r   r   r>   r1   r   r   r   run_coroutine  s   
z3TestAsyncExitStack.SyncAsyncExitStack.run_coroutinec                 C      |  |  S r
   )r   r   rG   r   r   r   r        z+TestAsyncExitStack.SyncAsyncExitStack.closec                 C   r   r
   )r   r/   rG   r   r   r   	__enter__  r   z/TestAsyncExitStack.SyncAsyncExitStack.__enter__c                 G   s   |  | j| S r
   )r   r!   r#   exc_detailsr   r   r   __exit__  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   rG   r   r   r   setUp  s   
zTestAsyncExitStack.setUpc              	      sL  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 k}t|D ]8\}}|rG|rG|j|g|R i |}n|rS|j|g|R  }n|r_|j|fi |}n||}| || q2|jD ]}| |d j| | |d j|j | 	|d j
|j
 qnW d   I d H  q1 I d H sw   Y  |  | g  t 4 I d H `}| t |jdd W d    n1 sw   Y  | t | jjd	d W d    n1 sw   Y  | t |j|d
d W d    n	1 sw   Y  W d   I d H  q1 I d H sw   Y  |  g  d S )Nr   )rW   )rW      rW   )Zexamplec                     s   	   | |f d S r
   rZ   )r   r   r   r   r   _exit  s   z5TestAsyncExitStack.test_async_callback.<locals>._exit)argr      )callbackr   )dictr   reversedpush_async_callbackr.   _exit_callbacks__wrapped__ZassertNotEqualr(   assertIsNoner   r=   r;   rE   
exit_stack)r#   Zexpectedr   stackr   r   r   r   r   r   r   test_async_callback  sP   

( ,z&TestAsyncExitStack.test_async_callbackc              	      sV  t   fdd}dd }fdd}G dd dt} 4 I d H z}|| |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  d S 1 I d H sw   Y  d S )Nc                    s    |   d S r
   )r.   rI   r>   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  rH   z9TestAsyncExitStack.test_async_push.<locals>._suppress_excc                    s$     |    |   | d S r
   )r   r   rG   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!)ry   rG   r   r   r   r/     r   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   r   rW   r   )rb   objectr   push_async_exitr.   r   __self__)r#   r   r   r   r   r   cmr   r   r   test_async_push  s.   






.z"TestAsyncExitStack.test_async_pushc              	      s   G  fdddt }g  | }t 4 I d H 2}|j fdd}| | ||I d H  | |jd d j|  d W d   I d H  qT1 I d H sOw   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                    r   r   rZ   rG   r   r   r   r/     r   zFTestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aenter__c                    r   )Nr   rZ   r   r   r   r   r!     r   zETestAsyncExitStack.test_async_enter_context.<locals>.TestCM.__aexit__NrL   r   r   r   r   TestCM  s    r   c                      r   )N   rZ   r   r   r   r   r     s   z:TestAsyncExitStack.test_async_enter_context.<locals>._exitr   rW   r   )rW   r   r   r   )
r   r   r   ZassertIsNotNoneenter_async_contextr.   r   r   r<   r=   )r#   r   r   r   r   r   r   r   test_async_enter_context  s   
(	z+TestAsyncExitStack.test_async_enter_contextc              
      s   dd }d   fdd}zA|   4 I d H ,}||t ||t ||t || ||t dd  W d   I d H  qM1 I d H sHw   Y  W n) tyw } z| |jt | |jjt | 	|jjj W Y d }~n
d }~ww | 
d  d }| |t | |jt d S )Nc                    s   | r
   r   r|   r   r   r   	raise_exc  rH   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_excrW   r   z0Expected IndexError, but no exception was raised)r   r   
IndexErrorKeyErrorAttributeErrorr   r:   ZassertIsInstancer   r   ry   rb   )r#   r   r   r   r>   Z	inner_excr   r   r   "test_async_exit_exception_chaining  s0   

(
z5TestAsyncExitStack.test_async_exit_exception_chainingN)r(   r)   r*   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ~  s    
*
#
r   c                   @   s   e Zd Zedd ZdS )TestAsyncNullcontextc              	      sd   G dd d}| }t |4 I d H }| || W d   I d H  d S 1 I d H s+w   Y  d S )Nc                   @   rA   )z6TestAsyncNullcontext.test_async_nullcontext.<locals>.CNrB   r   r   r   r   r   /  rD   r   )r   r.   )r#   r   cZc_inr   r   r   test_async_nullcontext-  s   .z+TestAsyncNullcontext.test_async_nullcontextN)r(   r)   r*   r   r   r   r   r   r   r   ,  s    r   __main__)r   
contextlibr   r   r   r   r   r   r   testr   ZunittestZtest.test_contextlibr	   r   ZTestCaser   rU   r   r   r   r(   mainr   r   r   r   <module>   s"     E c< /
