o
    b)                     @   s   d Z ddl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d Zd	d
 ZG dd deZG dd dZdd ZG dd deejZG dd deejZG dd dejZdS )zI
Tests for L{twisted.internet.defer.deferredGenerator} and related APIs.
    )deferreactor)DeferreddeferredGeneratorinlineCallbacksreturnValuewaitForDeferred)runWithWarningsSuppressed)unittest)suppressc                  C   s   t  } td| jd | S )Nr   hi)r   r   	callLatercallbackd r   :/usr/lib/python3/dist-packages/twisted/test/test_defgen.pygetThing   s   r   c                     s"   t    fdd} td|   S )Nc                      s     td d S )NOMG)errbackZeroDivisionErrorr   r   r   r   CRAP   s   zgetOwie.<locals>.CRAPr   )r   r   r   )r   r   r   r   getOwie   s   r   c                   @   s   e Zd ZdS )TerminalExceptionN)__name__
__module____qualname__r   r   r   r   r   *   s    r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	d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                 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selfr   r   r   
testBasics6   s   zBaseDefgenTests.testBasicsc                 C   s   |  |  tS )zp
        Ensure that a buggy generator properly signals a Failure
        condition on result deferred.
        )assertFailure	_genBuggyr   r#   r   r   r   	testBuggy?   s   zBaseDefgenTests.testBuggyc                 C   r   )z9Test that a generator which never yields results in None.N)_genNothingr!   r"   r#   r   r   r   testNothingF   s   zBaseDefgenTests.testNothingc                 C   r   )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#   r   r   r   testHandledTerminalFailureK   s   z*BaseDefgenTests.testHandledTerminalFailurec                 C   s.   t  }| |}|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   deferredGeneratorResultDeferredr   r   r   testHandledTerminalAsyncFailureS   s   
z/BaseDefgenTests.testHandledTerminalAsyncFailurec                 C   r   )zj
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        r   )_genStackUsager!   r"   r#   r   r   r   testStackUsage]      zBaseDefgenTests.testStackUsagec                 C   r   )zg
        Make sure we don't blow the stack when yielding immediately
        available values.
        r   )_genStackUsage2r!   r"   r#   r   r   r   testStackUsage2d   r3   zBaseDefgenTests.testStackUsage2N)r   r   r   __doc__r%   r(   r*   r,   r0   r2   r5   r   r   r   r   r   .   s    	
r   c                 C   s   t td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   )fr   r   r   deprecatedDeferredGeneratorl   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dd Z	ee	Z	dd Z
ee
Z
dd ZeddgZdS )DeferredGeneratorTestsc              
   c   s    t t }|V  | }| |d t t }|V  z|  W n ty; } z| t|d W Y d }~nd }~ww dV  d S Nr   r   r   )r   r   	getResultr"   r   r   str)r$   xower   r   r   r       s   

z!DeferredGeneratorTests._genBasicsc                 c   s    t t V  dd  d S N   r   )r   r   r#   r   r   r   r'      s   z DeferredGeneratorTests._genBuggyc                 c       d S Nr   r#   r   r   r   r)      s   z"DeferredGeneratorTests._genNothingc                 c   s>    t ttd}|V  z|  W d S  ty   Y d S w Nr-   )r   r   failr   r>   r$   r@   r   r   r   r+      s   z1DeferredGeneratorTests._genHandledTerminalFailurec                 c   s4    t |}|V  z|  W d S  ty   Y d S w rF   )r   r>   r   )r$   r   r@   r   r   r   r.      s   z6DeferredGeneratorTests._genHandledTerminalAsyncFailurec                 c   s6    t dD ]}ttd}|V  | }qdV  d S Ni  rD   r   )ranger   r   succeedr>   rI   r   r   r   r1      s   

z%DeferredGeneratorTests._genStackUsagec                 c   s     t dD ]}dV  qdV  d S rJ   )rK   rI   r   r   r   r4      s   
z&DeferredGeneratorTests._genStackUsage2c                 C   s   dd }t |}| | tS )zZ
        Ensure that yielding a Deferred directly is trapped as an
        error.
        c                   s   s    t  V  d S rF   r   r   r   r   r   _genDeferred   s   zADeferredGeneratorTests.testDeferredYielding.<locals>._genDeferred)r;   r&   	TypeError)r$   rN   r   r   r   testDeferredYielding   s   z+DeferredGeneratorTests.testDeferredYieldingz5twisted.internet.defer.waitForDeferred was deprecatedr7   N)r   r   r   r;   r    r'   r)   r+   r.   r1   r4   rP   r9   r   r   r   r   r   r<   ~   s$    




r<   c                   @   s   e Zd Zdd ZeeZdd ZeeZdd ZeeZdd ZeeZd	d
 ZeeZdd Z	ee	Z	dd Z
ee
Z
dd Zdd Zdd Zdd Zdd ZdS )InlineCallbacksTestsc              
   c   sd    t  V }| |d zt V  W n ty+ } z| t|d W Y d }~nd }~ww td d S r=   )r   r"   r   r   r?   r   )r$   r@   rB   r   r   r   r       s   zInlineCallbacksTests._genBasicsc                 c   s    t  V  dd  d S rC   rM   r#   r   r   r   r'      s   zInlineCallbacksTests._genBuggyc                 c   rE   rF   r   r#   r   r   r   r)      s   z InlineCallbacksTests._genNothingc                 c   s.    zt tdV  W d S  ty   Y d S w rG   )r   rH   r   r#   r   r   r   r+      s   z/InlineCallbacksTests._genHandledTerminalFailurec                 c   s$    z|V  W d S  t y   Y d S w rF   )r   )r$   r   r   r   r   r.      s   z4InlineCallbacksTests._genHandledTerminalAsyncFailurec                 c   s(    t dD ]}tdV  qtd d S rJ   )rK   r   rL   r   rI   r   r   r   r1     s   z#InlineCallbacksTests._genStackUsagec                 c   s"    t dD ]}dV  qtd d S rJ   )rK   r   rI   r   r   r   r4   
  s   z$InlineCallbacksTests._genStackUsage2c                 C       d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                   s   s    dV  t d d S N   r   r   r   r   r   _test     z8InlineCallbacksTests.testYieldNonDeferred.<locals>._testrT   r   r!   r"   )r$   rV   r   r   r   testYieldNonDeferred  s   	z)InlineCallbacksTests.testYieldNonDeferredc                 C   rR   )z9Ensure a standard python return results in a None result.c                   s   s    dV  d S rS   r   r   r   r   r   	_noReturn(  s   z9InlineCallbacksTests.testReturnNoValue.<locals>._noReturnNrX   )r$   rZ   r   r   r   testReturnNoValue%     z&InlineCallbacksTests.testReturnNoValuec                 C   rR   )zEnsure that returnValue works.c                   s   s    dV  t d d S )NrT      rU   r   r   r   r   _return3  rW   z5InlineCallbacksTests.testReturnValue.<locals>._returnr]   rX   )r$   r^   r   r   r   testReturnValue0  r\   z$InlineCallbacksTests.testReturnValuec                 C   ,   d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                   S   s   dS rS   r   r   r   r   r   _noYieldA  s   z>InlineCallbacksTests.test_nonGeneratorReturn.<locals>._noYieldr   Nr   assertInr?   assertRaisesrO   r$   ra   r   r   r   test_nonGeneratorReturn;     z,InlineCallbacksTests.test_nonGeneratorReturnc                 C   r`   )z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator calls L{returnValue}.
        c                   S   s   t d d S rS   rU   r   r   r   r   ra   N  s   zCInlineCallbacksTests.test_nonGeneratorReturnValue.<locals>._noYieldr   Nrb   re   r   r   r   test_nonGeneratorReturnValueH  rg   z1InlineCallbacksTests.test_nonGeneratorReturnValueN)r   r   r   r    r   r'   r)   r+   r.   r1   r4   rY   r[   r_   rf   rh   r   r   r   r   rQ      s(    rQ   c                   @   s    e Zd ZdZdd Zdd ZdS )DeprecateDeferredGeneratorTestszY
    Tests that L{DeferredGeneratorTests} and L{waitForDeferred} are
    deprecated.
    c                 C   sV   t dd }| | jg}| t|d | |d d t | |d d d dS )	z5
        L{deferredGenerator} is deprecated.
        c                   s   s    d V  d S rF   r   r   r   r   r   decoratedFunctiona  s   
z[DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated.<locals>.decoratedFunctionrD   r   categoryr8   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$   rj   warningsr   r   r   rm   \  s   

z@DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecatedc                 C   sX   t  }t| | | jg}| t|d | |d d t | |d d d dS )z3
        L{waitForDeferred} is deprecated.
        rD   r   rk   r8   ztwisted.internet.defer.waitForDeferred was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   r   rl   test_waitForDeferredDeprecatedr"   rn   ro   )r$   r   rp   r   r   r   rq   o  s   
z>DeprecateDeferredGeneratorTests.test_waitForDeferredDeprecatedN)r   r   r   r6   rm   rq   r   r   r   r   ri   V  s    ri   N)r6   twisted.internetr   r   twisted.internet.deferr   r   r   r   r   twisted.python.utilr	   twisted.trialr
   twisted.trial.utilr   r9   r   r   	Exceptionr   r   r;   TestCaser<   rQ   SynchronousTestCaseri   r   r   r   r   <module>   s   >W 