
    \d4                     $   d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ d Zd	 Z G d
 de          Z G d d          Zd Z G d deej                  Z G d deej                  Z G d dej                  ZdS )zI
Tests for L{twisted.internet.defer.deferredGenerator} and related APIs.
    N)deferreactortask)DeferreddeferredGeneratorinlineCallbacksreturnValuewaitForDeferred)runWithWarningsSuppressed)unittest)suppressc                  X    t                      } t          j        d| j        d           | S )Nr   hi)r   r   	callLatercallbackds    8lib/python3.11/site-packages/twisted/test/test_defgen.pygetThingr      s'    

AaT***H    c                  X    t                      fd} t          j        d|            S )Nc                  L                          t          d                     d S )NOMG)errbackZeroDivisionErrorr   s   r   CRAPzgetOwie.<locals>.CRAP    s$    			#E**+++++r   r   )r   r   r   )r   r   s    @r   getOwier      s?    

A, , , , , aHr   c                       e Zd ZdS )TerminalExceptionN)__name__
__module____qualname__ r   r   r   r   +   s        Dr   r   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
BaseDefgenTestsa  
    This class sets up a bunch of test cases which will test both
    deferredGenerator and inlineCallbacks based generators. The subclasses
    DeferredGeneratorTests and InlineCallbacksTests each provide the actual
    generator implementations tested.
    c                 \    |                                                      | j        d          S )z
        Test that a normal deferredGenerator works.  Tests yielding a
        deferred which callbacks, as well as a deferred errbacks. Also
        ensures returning a final value works.
        WOOSH)
_genBasicsaddCallbackassertEqualselfs    r   
testBasicszBaseDefgenTests.testBasics7   s'       ,,T-=wGGGr   c                 \    |                      |                                 t                    S )zp
        Ensure that a buggy generator properly signals a Failure
        condition on result deferred.
        )assertFailure	_genBuggyr   r+   s    r   	testBuggyzBaseDefgenTests.testBuggy@   s%    
 !!$.."2"24EFFFr   c                 \    |                                                      | j        d          S )z9Test that a generator which never yields results in None.N)_genNothingr)   r*   r+   s    r   testNothingzBaseDefgenTests.testNothingG   s)     !!--d.>EEEr   c                 \    |                                                      | j        d          S )z
        Create a Deferred Generator which yields a Deferred which fails and
        handles the exception which results.  Assert that the Deferred
        Generator does not errback its Deferred.
        N)_genHandledTerminalFailurer)   r*   r+   s    r   testHandledTerminalFailurez*BaseDefgenTests.testHandledTerminalFailureL   s)     ..00<<T=MtTTTr   c                     t          j                    }|                     |          }|                    t	          d                     |                    | j        d          S )z~
        Just like testHandledTerminalFailure, only with a Deferred which fires
        asynchronously with an error.
        Handled Terminal FailureN)r   r   _genHandledTerminalAsyncFailurer   r   r)   r*   )r,   r   deferredGeneratorResultDeferreds      r   testHandledTerminalAsyncFailurez/BaseDefgenTests.testHandledTerminalAsyncFailureT   sZ    
 N*.*N*Nq*Q*Q'			#$>??@@@.::4;KTRRRr   c                 \    |                                                      | j        d          S )zj
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        r   )_genStackUsager)   r*   r+   s    r   testStackUsagezBaseDefgenTests.testStackUsage^   s)    
 ""$$001A1EEEr   c                 \    |                                                      | j        d          S )zg
        Make sure we don't blow the stack when yielding immediately
        available values.
        r   )_genStackUsage2r)   r*   r+   s    r   testStackUsage2zBaseDefgenTests.testStackUsage2e   s)    
 ##%%11$2BAFFFr   N)r    r!   r"   __doc__r-   r1   r4   r7   r<   r?   rB   r#   r   r   r%   r%   /   s         H H HG G GF F F
U U US S SF F FG G G G Gr   r%   c                 L    t          t          d          gt          |           S )z
    Calls L{deferredGenerator} while suppressing the deprecation warning.

    @param f: Function to call
    @return: Return value of function.
    z7twisted.internet.defer.deferredGenerator was deprecatedmessage)r   SUPPRESSr   )fs    r   deprecatedDeferredGeneratorrI   m   s8     %T  	

 		  r   c                       e Zd Zed             Zed             Zed             Zed             Zed             Zd Z	 ee	          Z	d Z
 ee
          Z
d Z ed	
          gZdS )DeferredGeneratorTestsc              #     K   t          t                                }|V  |                                }|                     |d           t          t	                                }|V  	 |                                 n:# t
          $ r-}|                     t          |          d           Y d }~nd }~ww xY wdV  d S Nr   r   r'   )r
   r   	getResultr*   r   r   str)r,   xowes       r   r(   z!DeferredGeneratorTests._genBasics   s       HJJ''KKMMD!!!WYY''	,LLNNNN  	, 	, 	,SVVU++++++++	,s   ,B 
B8#B33B8c              #   N   K   t          t                                V  ddz   d S N   r   )r
   r   r+   s    r   r0   z DeferredGeneratorTests._genBuggy   s+      hjj)))))	Qr   c              #   
   K   d S Nr#   r+   s    r   r3   z"DeferredGeneratorTests._genNothing   s      	 	r   c              #      K   t          t          j        t          d                              }|V  	 |                                 d S # t          $ r Y d S w xY wNr9   )r
   r   failr   rN   r,   rP   s     r   r6   z1DeferredGeneratorTests._genHandledTerminalFailure   sh      EJ'89S'T'TUUVV	KKMMMMM  	 	 	DD	s   A 
AAc              #   |   K   t          |          }|V  	 |                                 d S # t          $ r Y d S w xY wrW   )r
   rN   r   )r,   r   rP   s      r   r:   z6DeferredGeneratorTests._genHandledTerminalAsyncFailure   sT      A	KKMMMMM  	 	 	DD	s   - 
;;c              #      K   t          d          D ];}t          t          j        d                    }|V  |                                }<dV  d S Ni  rU   r   )ranger
   r   succeedrN   r[   s     r   r>   z%DeferredGeneratorTests._genStackUsage   sW      t 	 	Aa 0 011AGGGAAr   c              #   >   K   t          d          D ]}dV  dV  d S r^   )r_   r[   s     r   rA   z&DeferredGeneratorTests._genStackUsage2   s3      t 	 	AGGGGr   c                 l    d }t          |          }|                      |            t                    S )zZ
        Ensure that yielding a Deferred directly is trapped as an
        error.
        c               3   *   K   t                      V  d S rW   r   r#   r   r   _genDeferredzADeferredGeneratorTests.testDeferredYielding.<locals>._genDeferred   s      **r   )rI   r/   	TypeError)r,   re   s     r   testDeferredYieldingz+DeferredGeneratorTests.testDeferredYielding   s<    	 	 	 3<@@!!,,..)<<<r   z5twisted.internet.defer.waitForDeferred was deprecatedrE   N)r    r!   r"   rI   r(   r0   r3   r6   r:   r>   rA   rg   rG   r   r#   r   r   rK   rK      s        !  ! " !  !  !  !  !  !  !  !    10@@N   21/BBO= = = 	STTTHHHr   rK   c                       e Zd Zd Z ee          Zd Z ee          Zd Z ee          Zd Z ee          Zd Z ee          Zd Z	 ee	          Z	d Z
 ee
          Z
d Zd	 Zd
 Zd Zd Zd Zd ZdS )InlineCallbacksTestsc              #     K   t                      V }|                     |d           	 t                      V  n:# t          $ r-}|                     t	          |          d           Y d }~nd }~ww xY wt          d           d S rM   )r   r*   r   r   rO   r	   )r,   rP   rR   s      r   r(   zInlineCallbacksTests._genBasics   s      **D!!!	,))OOOO  	, 	, 	,SVVU++++++++	,Gs   ; 
A2#A--A2c              #   4   K   t                      V  ddz   d S rT   rd   r+   s    r   r0   zInlineCallbacksTests._genBuggy   s#      jj	Ar   c              #   
   K   d S rW   r#   r+   s    r   r3   z InlineCallbacksTests._genNothing   s      	 	r   c              #   t   K   	 t          j        t          d                    V  d S # t          $ r Y d S w xY wrY   )r   rZ   r   r+   s    r   r6   z/InlineCallbacksTests._genHandledTerminalFailure   sS      	*./IJJKKKKKKK  	 	 	DD	s   #) 
77c              #   6   K   	 |V  d S # t           $ r Y d S w xY wrW   )r   )r,   r   s     r   r:   z4InlineCallbacksTests._genHandledTerminalAsyncFailure   s:      	GGGGG  	 	 	DD	s   
 
c              #   x   K   t          d          D ]}t          j        d          V  t          d           d S r^   )r_   r   r`   r	   r[   s     r   r>   z#InlineCallbacksTests._genStackUsage  sC      t 	# 	#A-""""""Ar   c              #   T   K   t          d          D ]}dV  t          d           d S r^   )r_   r	   r[   s     r   rA   z$InlineCallbacksTests._genStackUsage2  s5      t 	 	AGGGGAr   c                 l    d }t          |          } |                                | j        d          S )z
        Ensure that yielding a non-deferred passes it back as the
        result of the yield expression.

        @return: A L{twisted.internet.defer.Deferred}
        @rtype: L{twisted.internet.defer.Deferred}
        c               3   0   K   dV  t          d           d S N   r	   r#   r   r   _testz8InlineCallbacksTests.testYieldNonDeferred.<locals>._test        GGGNNNNNr   rt   r   r)   r*   )r,   rv   s     r   testYieldNonDeferredz)InlineCallbacksTests.testYieldNonDeferred  s?    	 	 	  &&uww""4#3Q777r   c                 l    d }t          |          } |                                | j        d          S )z9Ensure a standard python return results in a None result.c               3      K   dV  d S rs   r#   r#   r   r   	_noReturnz9InlineCallbacksTests.testReturnNoValue.<locals>._noReturn)  s      GGGFr   Nrx   )r,   r|   s     r   testReturnNoValuez&InlineCallbacksTests.testReturnNoValue&  s?    	 	 	 $I..	y{{&&t'7>>>r   c                 l    d }t          |          } |                                | j        d          S )zEnsure that returnValue works.c               3   0   K   dV  t          d           d S )Nrt      ru   r#   r   r   _returnz5InlineCallbacksTests.testReturnValue.<locals>._return4  rw   r   r   rx   )r,   r   s     r   testReturnValuez$InlineCallbacksTests.testReturnValue1  s?    	 	 	 "'**wyy$$T%5q999r   c           	          d }t          |          }|                     dt          |                     t          |                               dS )z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator returns something other than a generator.
        c                      dS rs   r#   r#   r   r   _noYieldz>InlineCallbacksTests.test_nonGeneratorReturn.<locals>._noYieldB  s    1r   r   Nr   assertInrO   assertRaisesrf   r,   r   s     r   test_nonGeneratorReturnz,InlineCallbacksTests.test_nonGeneratorReturn<  sS    	 	 	 #8,,'T->->y(-S-S)T)TUUUUUr   c           	          d }t          |          }|                     dt          |                     t          |                               dS )z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator calls L{returnValue}.
        c                  $    t          d           d S rs   ru   r#   r   r   r   zCInlineCallbacksTests.test_nonGeneratorReturnValue.<locals>._noYieldO  s    NNNNNr   r   Nr   r   s     r   test_nonGeneratorReturnValuez1InlineCallbacksTests.test_nonGeneratorReturnValueI  sS    	 	 	 #8,,'T->->y(-S-S)T)TUUUUUr   c                 d   t          j                    t          fd            t          fd            } |            }                    d           |                     |          }|                     d|           |                     d|           |                     d|           dS )z
        When one inlineCallbacks calls another, the internal L{_DefGen_Return}
        flow control exception raised by calling L{defer.returnValue} doesn't
        leak into tracebacks captured in the caller.
        c               3   X   K   t          j         d          V  t          d           dS )zG
            This is the inner function using returnValue.
            r   z"actual-value-not-used-for-the-testN)r   
deferLaterr	   clocks   r   _returnszOInlineCallbacksTests.test_internalDefGenReturnValueDoesntLeak.<locals>._returns^  s6      
 /%+++++<=====r   c               3      K   	               V  t          d          # t           $ r t          j                    cY S w xY w)Nzboom returnValuer   	traceback
format_excr   s   r   _raiseszNInlineCallbacksTests.test_internalDefGenReturnValueDoesntLeak.<locals>._raisesf  s]      .hjj   '(:;;;$ . . . +-----.     A A r   _DefGen_ReturnBDuring handling of the above exception, another exception occurredz/test_defgen.TerminalException: boom returnValueNr   Clockr   advancesuccessResultOfassertNotInr   r,   r   r   tbr   r   s       @@r   (test_internalDefGenReturnValueDoesntLeakz=InlineCallbacksTests.test_internalDefGenReturnValueDoesntLeakV  s     
		> 	> 	> 	> 
	> 
	. 	. 	. 	. 
	. GIIa!!!$$ 	)2...PRT	
 	
 	
 	GLLLLLr   c                 d   t          j                    t          fd            t          fd            } |            }                    d           |                     |          }|                     d|           |                     d|           |                     d|           dS )a  
        When one inlineCallbacks calls another, the internal L{StopIteration}
        flow control exception generated when the inner generator returns
        doesn't leak into tracebacks captured in the caller.

        This is similar to C{test_internalDefGenReturnValueDoesntLeak} but the
        inner function uses the "normal" return statemement rather than the
        C{returnValue} helper.
        c               3   :   K   t          j         d          V  dS )Nr   r   )r   r   r   s   r   r   zKInlineCallbacksTests.test_internalStopIterationDoesntLeak.<locals>._returns  s$      /%+++++1r   c               3      K   	               V  t          d          # t           $ r t          j                    cY S w xY w)Nzboom normal returnr   r   s   r   r   zJInlineCallbacksTests.test_internalStopIterationDoesntLeak.<locals>._raises  s]      .hjj   '(<===$ . . . +-----.r   r   StopIterationr   z1test_defgen.TerminalException: boom normal returnNr   r   s       @@r   $test_internalStopIterationDoesntLeakz9InlineCallbacksTests.test_internalStopIterationDoesntLeak{  s     
		 	 	 	 
	 
	. 	. 	. 	. 
	. GIIa!!!$$ 	"---PRT	
 	
 	
 	I2NNNNNr   N)r    r!   r"   r(   r   r0   r3   r6   r:   r>   rA   ry   r}   r   r   r   r   r   r#   r   r   ri   ri      sp       
 
 
 !,,J    	**I   "/+..K   "11K!L!L   '6o6U&V&V#   %_^44N   &oo66O8 8 8"	? 	? 	?	: 	: 	:V V VV V V#M #M #MJ$O $O $O $O $Or   ri   c                       e Zd ZdZd Zd ZdS )DeprecateDeferredGeneratorTestszY
    Tests that L{DeferredGeneratorTests} and L{waitForDeferred} are
    deprecated.
    c                 4   t           d             }|                     | j        g          }|                     t	          |          d           |                     |d         d         t
                     |                     |d         d         d           dS )z5
        L{deferredGenerator} is deprecated.
        c               3      K   d V  d S rW   r#   r#   r   r   decoratedFunctionz[DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated.<locals>.decoratedFunction  s      JJJJJr   rU   r   categoryrF   ztwisted.internet.defer.deferredGenerator was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   flushWarnings test_deferredGeneratorDeprecatedr*   lenDeprecationWarning)r,   r   warningss      r   r   z@DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated  s    
 
	 	 
		 %%t'L&MNNX***!Z02DEEEQK	"=	
 	
 	
 	
 	
r   c                 N   t                      }t          |           |                     | j        g          }|                     t          |          d           |                     |d         d         t                     |                     |d         d         d           dS )z3
        L{waitForDeferred} is deprecated.
        rU   r   r   rF   ztwisted.internet.defer.waitForDeferred was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   r
   r   test_waitForDeferredDeprecatedr*   r   r   )r,   r   r   s      r   r   z>DeprecateDeferredGeneratorTests.test_waitForDeferredDeprecated  s     JJ%%t'J&KLLX***!Z02DEEEQK	"=	
 	
 	
 	
 	
r   N)r    r!   r"   rC   r   r   r#   r   r   r   r     s<         

 
 
&
 
 
 
 
r   r   )rC   r   twisted.internetr   r   r   twisted.internet.deferr   r   r   r	   r
   twisted.python.utilr   twisted.trialr   twisted.trial.utilr   rG   r   r   	Exceptionr   r%   rI   TestCaserK   ri   SynchronousTestCaser   r#   r   r   <module>r      s        1 1 1 1 1 1 1 1 1 1              : 9 9 9 9 9 " " " " " " 3 3 3 3 3 3    	 	 	 	 		 	 	 	;G ;G ;G ;G ;G ;G ;G ;G|  $T T T T T_h.? T T TnIO IO IO IO IO?H,= IO IO IOX(
 (
 (
 (
 (
h&B (
 (
 (
 (
 (
r   