o
    ¯br  ã                   @   sp   d Z ddl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 G dd„ deƒZG d	d
„ d
eƒZdS )z*
Tests for C{await} support in Deferreds.
é    N)ÚDeferredÚensureDeferredÚfailÚmaybeDeferredÚsucceed)ÚClock)ÚFailure)ÚTestCasec                   @   s   e Zd ZdZdS )ÚSampleExceptionz2
    A specific sample exception for testing.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úH/usr/lib/python3/dist-packages/twisted/internet/test/test_defer_await.pyr
      s    r
   c                   @   s`   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d„ Zdd„ Zdd„ ZdS )Ú
AwaitTestsz@
    Tests for using Deferreds in conjunction with PEP-492.
    c                 C   s"   t ƒ }| ¡ }|  |t|ƒ¡ dS )z<
        C{Deferred.__await__} returns an iterable.
        N)r   Ú	__await__ÚassertEqualÚiter)ÚselfÚdÚawaitedDeferredr   r   r   Útest_awaitReturnsIterable"   s   z$AwaitTests.test_awaitReturnsIterablec                    sX   ‡ fdd„}dd„ ‰ |ƒ }|   |tj¡ t |¡}|   |t¡ |  |¡}|  |d¡ dS )zU
        L{Deferred.fromCoroutine} will turn a coroutine into a L{Deferred}.
        c                  “   s$   �t dƒ} | I d H  ˆ ƒ I d H }|S )NÚbar©r   ©r   Úres©Úrun2r   r   Úrun/   s
   €
z2AwaitTests.test_deferredFromCoroutine.<locals>.runc                  Ó   ó   �t dƒ} | I d H }|S ©NÚfoor   r   r   r   r   r   5   ó   €
z3AwaitTests.test_deferredFromCoroutine.<locals>.run2r"   N)ÚassertIsInstanceÚtypesÚCoroutineTyper   ÚfromCoroutineÚsuccessResultOfr   )r   r   Úrr   r   r   r   r   Útest_deferredFromCoroutine*   s   

z%AwaitTests.test_deferredFromCoroutinec                 C   s.   dd„ }t  |ƒ ¡}|  |¡}|  |d¡ dS )zc
        L{Deferred.fromCoroutine} allows a function to C{await} on a
        L{Deferred}.
        c                  Ó   r    r!   r   r   r   r   r   r   L   r#   z"AwaitTests.test_basic.<locals>.runr"   N)r   r'   r(   r   ©r   r   r   r   r   r   r   Ú
test_basicF   s   
zAwaitTests.test_basicc                 C   s,   dd„ }t |ƒ ƒ}|  |¡}|  |d¡ dS )zS
        L{ensureDeferred} allows a function to C{await} on a L{Deferred}.
        c                  Ó   r    r!   r   r   r   r   r   r   Z   r#   z0AwaitTests.test_basicEnsureDeferred.<locals>.runr"   N)r   r(   r   r+   r   r   r   Útest_basicEnsureDeferredU   s   

z#AwaitTests.test_basicEnsureDeferredc                 C   sD   dd„ }t  |ƒ ¡}|  |¡}|  t|jƒt¡ |  |jjd¡ dS )zš
        An exception in a coroutine scheduled with L{Deferred.fromCoroutine}
        will cause the returned L{Deferred} to fire with a failure.
        c                  Ó   s   �t dƒ} | I d H  tdƒ‚)Nr"   úOh no!)r   Ú
ValueError©r   r   r   r   r   i   s   €
z&AwaitTests.test_exception.<locals>.run)r.   N)r   r'   ÚfailureResultOfr   ÚtypeÚvaluer/   Úargsr+   r   r   r   Útest_exceptionc   s
   
zAwaitTests.test_exceptionc                    sR   dd„ }t |ƒ‰ ‡ fdd„}|  t |ƒ ¡¡}|  d| ¡ ¡ |  d| ¡ ¡ dS )zé
        When a Deferred is awaited upon that has already failed with a Failure
        that has a traceback, both the place that the synchronous traceback
        comes from and the awaiting line are shown in the traceback.
        c                   S   s   t ƒ ‚©N)r
   r   r   r   r   Úraisesz   s   zCAwaitTests.test_synchronousDeferredFailureTraceback.<locals>.raisesc                   “   ó   �ˆ I d H S r6   r   r   ©Úitr   r   Údoomed   ó   €
zCAwaitTests.test_synchronousDeferredFailureTraceback.<locals>.doomedú, in doomed
z, in raises
N)r   r1   r   r'   ÚassertInÚgetTraceback)r   r7   r;   Úfailurer   r9   r   Ú(test_synchronousDeferredFailureTracebacks   s   z3AwaitTests.test_synchronousDeferredFailureTracebackc                    sj   dd„ }t ƒ ‰ ‡ fdd„}t  |ƒ ¡}|  |¡ ˆ  |ƒ ¡ |  |¡}|  d| ¡ ¡ |  d| ¡ ¡ dS )zâ
        When a Deferred is awaited upon that later fails with a Failure that
        has a traceback, both the place that the synchronous traceback comes
        from and the awaiting line are shown in the traceback.
        c                   S   s    zt ƒ ‚ t y   tƒ  Y S w r6   )r
   r   r   r   r   r   ÚreturnsFailureŽ   s
   
ÿzEAwaitTests.test_asyncDeferredFailureTraceback.<locals>.returnsFailurec                   “   r8   r6   r   r   r9   r   r   r;   –   r<   z=AwaitTests.test_asyncDeferredFailureTraceback.<locals>.doomedr=   z, in returnsFailure
N)r   r'   ÚassertNoResultÚerrbackr1   r>   r?   )r   rB   r;   Ústartedr@   r   r9   r   Ú"test_asyncDeferredFailureTraceback‡   s   

z-AwaitTests.test_asyncDeferredFailureTracebackc                    s¶   t ƒ ‰ g ‰‡ ‡fdd„‰‡ ‡‡fdd„}t |ƒ ¡}ˆ  d¡ |  ˆddg¡ ˆ  d¡ |  ˆg d	¢¡ ˆ  d¡ |  ˆg d	¢¡ ˆ  d¡ |  ˆg d
¢¡ |  |¡}|  |d¡ dS )z¢
        A coroutine scheduled with L{Deferred.fromCoroutine} that awaits a
        L{Deferred} suspends its execution until the inner L{Deferred} fires.
        c                  “   s:   �ˆ  d¡ tƒ } ˆ  d| jd¡ | I d H  ˆ  d¡ dS )Né   é   é   úYay!©Úappendr   Ú	callLaterÚcallbackr0   )ÚreactorÚsectionsr   r   Úrunone¨   s   €


z'AwaitTests.test_twoDeep.<locals>.runonec                  “   sP   �ˆ  d¡ ˆƒ I d H } ˆ  d¡ tƒ }ˆ  d|jd¡ |I d H  ˆ  d¡ | S )NrH   é   é   rK   )Úresultr   ©rO   rQ   rP   r   r   r   °   s   €



z$AwaitTests.test_twoDeep.<locals>.rungÍÌÌÌÌÌì?rH   rG   çš™™™™™¹?)rH   rG   rI   rR   )rH   rG   rI   rR   rS   rJ   N)r   r   r'   Úadvancer   r(   r+   r   rU   r   Útest_twoDeep    s   





zAwaitTests.test_twoDeepc                    s.   ‡ fdd„}ˆ   t |ƒ ¡¡}ˆ  |d¡ dS )zO
        Awaiting an already failed Deferred will raise the exception.
        c               
   “   sP   �zt tdƒƒI d H  W dS  ty' }  zˆ  | jd¡ W Y d } ~ dS d } ~ ww )NÚBoom)rY   rH   r   )r   r/   r   r4   )Úe©r   r   r   ÚtestÐ   s   €ý€þz%AwaitTests.test_reraise.<locals>.testrH   N)r(   r   r'   r   )r   r\   r   r   r[   r   Útest_reraiseË   s   zAwaitTests.test_reraisec                    sB   t ƒ ‰ ‡ fdd„}t |ƒ ¡}ˆ  d¡ |  |¡}|  |d¡ dS )zd
        Awaiting a paused & chained Deferred will give the result when it has
        one.
        c                  “   sD   �t ƒ } t ƒ ‰ |  ‡ fdd„¡ |  d ¡ ˆ dˆ jd¡ | I d H S )Nc                    s   ˆ S r6   r   )Úignored©Úd2r   r   Ú<lambda>å   s    z7AwaitTests.test_chained.<locals>.test.<locals>.<lambda>r   Úbye)r   ÚaddCallbackrN   rM   r0   ©rO   r_   r   r\   â   s   €

z%AwaitTests.test_chained.<locals>.testrV   rb   N)r   r   r'   rW   r(   r   )r   r\   r   r   r   rd   r   Útest_chainedÛ   s   	

zAwaitTests.test_chainedN)r   r   r   r   r   r*   r,   r-   r5   rA   rF   rX   r]   re   r   r   r   r   r      s    +r   )r   r%   Útwisted.internet.deferr   r   r   r   r   Útwisted.internet.taskr   Útwisted.python.failurer   Útwisted.trial.unittestr	   Ú	Exceptionr
   r   r   r   r   r   Ú<module>   s   