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   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$   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   z‚twisted.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 