U
    
W[)                     @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZ ddl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.
    )divisionabsolute_import)reactor)unittest)waitForDeferreddeferredGeneratorDeferred)inlineCallbacksreturnValue)defer)suppress)runWithWarningsSuppressedc                  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   s   |   | 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   
testBasics/   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   	testBuggy8   s    zBaseDefgenTests.testBuggyc                 C   s   |   | jdS )z9Test that a generator which never yields results in None.N)_genNothingr"   r#   r$   r   r   r   testNothing?   s    zBaseDefgenTests.testNothingc                 C   s   |   | 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$   r   r   r   testHandledTerminalFailureD   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   ZdeferredGeneratorResultDeferredr   r   r   testHandledTerminalAsyncFailureL   s    
 z/BaseDefgenTests.testHandledTerminalAsyncFailurec                 C   s   |   | jdS )zj
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        r   )_genStackUsager"   r#   r$   r   r   r   testStackUsageW   s    zBaseDefgenTests.testStackUsagec                 C   s   |   | jdS )zg
        Make sure we don't blow the stack when yielding immediately
        available values.
        r   )_genStackUsage2r"   r#   r$   r   r   r   testStackUsage2^   s    zBaseDefgenTests.testStackUsage2N)r   r   r   __doc__r&   r)   r+   r-   r0   r2   r4   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   deprecatedDeferredGeneratorg   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 n2 tk
rr } z| t|d W 5 d }~X Y nX dV  d S Nr   r   r    )r   r   	getResultr#   r   r   str)r%   xZower   r   r   r!   x   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   s   d S Nr   r$   r   r   r   r*      s    z"DeferredGeneratorTests._genNothingc                 c   s>   t ttd}|V  z|  W n tk
r8   Y nX d S Nr.   )r   r   failr   r=   r%   r?   r   r   r   r,      s    z1DeferredGeneratorTests._genHandledTerminalFailurec                 c   s4   t |}|V  z|  W n tk
r.   Y nX d S rC   )r   r=   r   )r%   r   r?   r   r   r   r/      s    z6DeferredGeneratorTests._genHandledTerminalAsyncFailurec                 c   s4   t dD ] }ttd}|V  | }qdV  d S Ni  rB   r   )ranger   r   succeedr=   rF   r   r   r   r1      s
    
z%DeferredGeneratorTests._genStackUsagec                 c   s   t dD ]
}dV  qdV  d S rG   )rH   rF   r   r   r   r3      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 rC   r   r   r   r   r   _genDeferred   s    zADeferredGeneratorTests.testDeferredYielding.<locals>._genDeferred)r:   r'   	TypeError)r%   rK   r   r   r   testDeferredYielding   s    z+DeferredGeneratorTests.testDeferredYieldingz5twisted.internet.defer.waitForDeferred was deprecatedr6   N)r   r   r   r:   r!   r(   r*   r,   r/   r1   r3   rM   r8   r   r   r   r   r   r;   u   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   s`   t  V }| |d zt V  W n2 tk
rR } z| t|d W 5 d }~X Y nX td d S r<   )r   r#   r   r   r>   r
   )r%   r?   r@   r   r   r   r!      s    "zInlineCallbacksTests._genBasicsc                 c   s   t  V  dd  d S rA   rJ   r$   r   r   r   r(      s    zInlineCallbacksTests._genBuggyc                 c   s   d S rC   r   r$   r   r   r   r*      s    z InlineCallbacksTests._genNothingc                 c   s.   zt tdV  W n tk
r(   Y nX d S rD   )r   rE   r   r$   r   r   r   r,      s    z/InlineCallbacksTests._genHandledTerminalFailurec                 c   s$   z
|V  W n t k
r   Y nX d S rC   )r   )r%   r   r   r   r   r/      s    
z4InlineCallbacksTests._genHandledTerminalAsyncFailurec                 c   s&   t dD ]}tdV  qtd d S rG   )rH   r   rI   r
   rF   r   r   r   r1      s    z#InlineCallbacksTests._genStackUsagec                 c   s    t dD ]
}dV  qtd d S rG   )rH   r
   rF   r   r   r   r3      s    z$InlineCallbacksTests._genStackUsage2c                 C   s    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  s    z8InlineCallbacksTests.testYieldNonDeferred.<locals>._testrP   r	   r"   r#   )r%   rR   r   r   r   testYieldNonDeferred	  s    z)InlineCallbacksTests.testYieldNonDeferredc                 C   s    dd }t |}| | jdS )z9Ensure a standard python return results in a None result.c                   s   s
   dV  d S rO   r   r   r   r   r   	_noReturn  s    z9InlineCallbacksTests.testReturnNoValue.<locals>._noReturnNrS   )r%   rU   r   r   r   testReturnNoValue  s    z&InlineCallbacksTests.testReturnNoValuec                 C   s    dd }t |}| | jdS )zEnsure that returnValue works.c                   s   s   dV  t d d S )NrP      rQ   r   r   r   r   _return#  s    z5InlineCallbacksTests.testReturnValue.<locals>._returnrW   rS   )r%   rX   r   r   r   testReturnValue!  s    z$InlineCallbacksTests.testReturnValuec                 C   s,   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 rO   r   r   r   r   r   _noYield0  s    z>InlineCallbacksTests.test_nonGeneratorReturn.<locals>._noYieldr	   Nr	   ZassertInr>   ZassertRaisesrL   r%   rZ   r   r   r   test_nonGeneratorReturn+  s
    z,InlineCallbacksTests.test_nonGeneratorReturnc                 C   s,   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 calls L{returnValue}.
        c                   S   s   t d d S rO   rQ   r   r   r   r   rZ   =  s    zCInlineCallbacksTests.test_nonGeneratorReturnValue.<locals>._noYieldr	   Nr[   r\   r   r   r   test_nonGeneratorReturnValue8  s
    z1InlineCallbacksTests.test_nonGeneratorReturnValueN)r   r   r   r!   r	   r(   r*   r,   r/   r1   r3   rT   rV   rY   r]   r^   r   r   r   r   rN      s*   	
rN   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 rC   r   r   r   r   r   decoratedFunctionP  s    z[DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated.<locals>.decoratedFunctionrB   r   categoryr7   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`   warningsr   r   r   rc   L  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.
        rB   r   ra   r7   ztwisted.internet.defer.waitForDeferred was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   r   rb   test_waitForDeferredDeprecatedr#   rd   re   )r%   r   rf   r   r   r   rg   ]  s    
z>DeprecateDeferredGeneratorTests.test_waitForDeferredDeprecatedN)r   r   r   r5   rc   rg   r   r   r   r   r_   F  s   r_   N)r5   Z
__future__r   r   Ztwisted.internetr   Ztwisted.trialr   Ztwisted.internet.deferr   r   r   r	   r
   r   Ztwisted.trial.utilr   r8   Ztwisted.python.utilr   r   r   	Exceptionr   r   r:   ZTestCaser;   rN   ZSynchronousTestCaser_   r   r   r   r   <module>   s    
@Xy