U
     T‚gÝ  ã                   @   sœ   d Z ddlmZmZ ddl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dd„ ZG dd„ d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ÚwaitForDeferred)ÚrunWithWarningsSuppressed)Úunittest)Úsuppressc                  C   s   t ƒ } t d| jd¡ | S )Nr   Úhi)r   r   Ú	callLaterÚcallback©Úd© r   ú</tmp/pip-unpacked-wheel-1_7di8ic/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                 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   ÚdeprecatedDeferredGenerator#   s    ÿÿùr   c                   @   sX   e 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d„ Z
edd�gZdS )ÚDeferredGeneratorTestsc                    s    t ‡ fdd„ƒ}|ƒ  ˆ 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.
        c               
   3   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   ÚWOOSH)r   r   Ú	getResultÚassertEqualr   r   Ústr)ÚxZowÚe©Úselfr   r   Ú
_genBasics=   s    

"z5DeferredGeneratorTests.testBasics.<locals>._genBasicsr!   ©r   ÚaddCallbackr#   )r(   r)   r   r'   r   Ú
testBasics6   s    z!DeferredGeneratorTests.testBasicsc                 C   s   t dd„ ƒ}|  |ƒ t¡S )z°
        Ensure that a generator that produces an exception signals
        a Failure condition on result deferred by converting the exception to
        a L{Failure}.
        c                   s   s   t tƒ ƒV  dd  d S )Né   r   )r   r   r   r   r   r   Ú_genProduceExceptionW   s    zJDeferredGeneratorTests.testProducesException.<locals>._genProduceException)r   ÚassertFailurer   )r(   r.   r   r   r   ÚtestProducesExceptionP   s    
z,DeferredGeneratorTests.testProducesExceptionc                 C   s   t dd„ ƒ}|ƒ  | jd¡S )z9Test that a generator which never yields results in None.c                   s   s   d S ©Nr   r   r   r   r   Ú_genNothinga   s    z7DeferredGeneratorTests.testNothing.<locals>._genNothingNr*   )r(   r2   r   r   r   ÚtestNothing^   s    
z"DeferredGeneratorTests.testNothingc                 C   s   t dd„ ƒ}|ƒ  | 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.
        c                  s   s>   t t tdƒ¡ƒ} | V  z|  ¡  W n tk
r8   Y nX d S )NúHandled Terminal Failure)r   r   Zfailr   r"   ©r%   r   r   r   Ú_genHandledTerminalFailureo   s    ÿzUDeferredGeneratorTests.testHandledTerminalFailure.<locals>._genHandledTerminalFailureNr*   )r(   r6   r   r   r   ÚtestHandledTerminalFailureh   s    

z1DeferredGeneratorTests.testHandledTerminalFailurec                 C   s8   t dd„ ƒ}t ¡ }||ƒ}| tdƒ¡ | | jd¡S )z~
        Just like testHandledTerminalFailure, only with a Deferred which fires
        asynchronously with an error.
        c                 s   s4   t | ƒ}|V  z| ¡  W n tk
r.   Y nX d S r1   )r   r"   r   )r   r%   r   r   r   Ú_genHandledTerminalAsyncFailure‚   s    z_DeferredGeneratorTests.testHandledTerminalAsyncFailure.<locals>._genHandledTerminalAsyncFailurer4   N)r   r   r   r   r   r+   r#   )r(   r8   r   ZdeferredGeneratorResultDeferredr   r   r   ÚtestHandledTerminalAsyncFailure|   s    
z6DeferredGeneratorTests.testHandledTerminalAsyncFailurec                 C   s   t dd„ ƒ}|ƒ  | jd¡S )zj
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        c                  s   s4   t dƒD ] } tt d¡ƒ} | V  |  ¡ } qdV  d S ©Niˆ  r-   r   )Úranger   r   Zsucceedr"   r5   r   r   r   Ú_genStackUsage–   s
    
z=DeferredGeneratorTests.testStackUsage.<locals>._genStackUsager   r*   )r(   r<   r   r   r   ÚtestStackUsage�   s    
z%DeferredGeneratorTests.testStackUsagec                 C   s   t dd„ ƒ}|ƒ  | jd¡S )zg
        Make sure we don't blow the stack when yielding immediately
        available values.
        c                  s   s   t dƒD ]
} dV  qdV  d S r:   )r;   r5   r   r   r   Ú_genStackUsage2§   s    z?DeferredGeneratorTests.testStackUsage2.<locals>._genStackUsage2r   r*   )r(   r>   r   r   r   ÚtestStackUsage2¡   s    
z&DeferredGeneratorTests.testStackUsage2c                 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 r1   )r   r   r   r   r   Ú_genDeferred·   s    zADeferredGeneratorTests.testDeferredYielding.<locals>._genDeferred)r   r/   Ú	TypeError)r(   r@   r   r   r   ÚtestDeferredYielding°   s    z+DeferredGeneratorTests.testDeferredYieldingz5twisted.internet.defer.waitForDeferred was deprecatedr   N)r   r   r   r,   r0   r3   r7   r9   r=   r?   rB   r   r	   r   r   r   r   r    5   s   
ÿr    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 r1   r   r   r   r   r   ÚdecoratedFunctionÎ   s    z[DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated.<locals>.decoratedFunctionr-   r   Úcategoryr   z„twisted.internet.defer.deferredGenerator was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   ÚflushWarningsÚ test_deferredGeneratorDeprecatedr#   ÚlenÚDeprecationWarning)r(   rD   Úwarningsr   r   r   rG   É   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.
        r-   r   rE   r   z‚twisted.internet.defer.waitForDeferred was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   r   rF   Útest_waitForDeferredDeprecatedr#   rH   rI   )r(   r   rJ   r   r   r   rK   Ü   s    
þz>DeprecateDeferredGeneratorTests.test_waitForDeferredDeprecatedN)r   r   r   Ú__doc__rG   rK   r   r   r   r   rC   Ã   s   rC   N)rL   Ztwisted.internetr   r   Ztwisted.internet.deferr   r   r   Ztwisted.python.utilr   Ztwisted.trialr   Ztwisted.trial.utilr	   r   r   r   Ú	Exceptionr   r   ZTestCaser    ZSynchronousTestCaserC   r   r   r   r   Ú<module>   s   
 