o
    Òó·i°  ã                   @   s|   d Z ddlZddl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 G dd	„ d	eƒZG d
d„ deƒZdS )z*
Tests for C{await} support in Deferreds.
é    N)ÚNoReturn)Ú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   úlC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/test/test_defer_await.pyr      s    r   c                   @   st   e Zd ZdZddd„Zddd„Zddd	„Zdd
d„Zddd„Zddd„Z	ddd„Z
ddd„Zddd„Zddd„ZdS )Ú
AwaitTestsz@
    Tests for using Deferreds in conjunction with PEP-492.
    ÚreturnNc                 C   s"   t ƒ }| ¡ }|  |t|ƒ¡ dS )z<
        C{Deferred.__await__} returns an iterable.
        N)r   Ú	__await__ÚassertEqualÚiter)ÚselfÚdZawaitedDeferredr   r   r   Útest_awaitReturnsIterable$   s   z$AwaitTests.test_awaitReturnsIterablec                    sd   dt f‡ fdd„}dt fdd„‰ |ƒ }|  |tj¡ t |¡}|  |t¡ |  |¡}|  |d¡ dS )zU
        L{Deferred.fromCoroutine} will turn a coroutine into a L{Deferred}.
        r   c                  “   s$   �t dƒ} | I d H  ˆ ƒ I d H }|S )NÚbar©r   ©r   Úres©Úrun2r   r   Úrun1   s
   €
z2AwaitTests.test_deferredFromCoroutine.<locals>.runc                  Ó   ó   �t dƒ} | I d H }|S ©NÚfoor   r   r   r   r   r   7   ó   €
z3AwaitTests.test_deferredFromCoroutine.<locals>.run2r#   N)ÚstrZassertIsInstanceÚtypesÚCoroutineTyper   ÚfromCoroutineÚsuccessResultOfr   )r   r    Úrr   r   r   r   r   Útest_deferredFromCoroutine,   s   

z%AwaitTests.test_deferredFromCoroutinec                 C   s4   dt fdd„}t |ƒ ¡}|  |¡}|  |d¡ dS )zc
        L{Deferred.fromCoroutine} allows a function to C{await} on a
        L{Deferred}.
        r   c                  Ó   r!   r"   r   r   r   r   r   r    N   r$   z"AwaitTests.test_basic.<locals>.runr#   N)r%   r   r(   r)   r   ©r   r    r   r   r   r   r   Ú
test_basicH   s   
zAwaitTests.test_basicc                 C   s2   dt fdd„}t|ƒ ƒ}|  |¡}|  |d¡ dS )zS
        L{ensureDeferred} allows a function to C{await} on a L{Deferred}.
        r   c                  Ó   r!   r"   r   r   r   r   r   r    \   r$   z0AwaitTests.test_basicEnsureDeferred.<locals>.runr#   N)r%   r   r)   r   r,   r   r   r   Útest_basicEnsureDeferredW   s   

z#AwaitTests.test_basicEnsureDeferredc                 C   sJ   dt f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.
        r   c                  Ó   s   �t dƒ} | I d H  tdƒ‚)Nr#   úOh no!)r   Ú
ValueError©r   r   r   r   r    k   s   €
z&AwaitTests.test_exception.<locals>.run)r/   N)	r   r   r(   ÚfailureResultOfr   ÚtypeÚvaluer0   Úargsr,   r   r   r   Útest_exceptione   s
   
zAwaitTests.test_exceptionc                    sV   d	dd„}t |ƒ‰ d	‡ 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.
        r   Nc                   S   s   t ƒ ‚©N)r   r   r   r   r   Úraises|   s   zCAwaitTests.test_synchronousDeferredFailureTraceback.<locals>.raisesc                   “   ó   �ˆ I d H S r7   r   r   ©Úitr   r   Údoomed�   ó   €
zCAwaitTests.test_synchronousDeferredFailureTraceback.<locals>.doomedú, in doomed
z, in raises
©r   N)r   r2   r   r(   ÚassertInÚgetTraceback)r   r8   r<   Úfailurer   r:   r   Ú(test_synchronousDeferredFailureTracebacku   s   
z3AwaitTests.test_synchronousDeferredFailureTracebackc                    sr   dt fdd„}tƒ ‰ d	‡ 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.
        r   c                   S   s    zt ƒ ‚ t y   tƒ  Y S w r7   )r   r	   r   r   r   r   ÚreturnsFailure�   s
   
ÿzEAwaitTests.test_asyncDeferredFailureTraceback.<locals>.returnsFailureNc                   “   r9   r7   r   r   r:   r   r   r<   ˜   r=   z=AwaitTests.test_asyncDeferredFailureTraceback.<locals>.doomedr>   z, in returnsFailure
r?   )r	   r   r(   ZassertNoResultZerrbackr2   r@   rA   )r   rD   r<   ÚstartedrB   r   r:   r   Ú"test_asyncDeferredFailureTraceback‰   s   

z-AwaitTests.test_asyncDeferredFailureTracebackc                    sÂ   t ƒ ‰ g ‰dtf‡ ‡fdd„‰dtf‡ ‡‡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.
        r   c                  “   s:   �ˆ  d¡ tƒ } ˆ  d| jd¡ | I d H  ˆ  d¡ dS )Né   é   é   úYay!©Úappendr   Ú	callLaterÚcallbackr1   )Ú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   r(   Úadvancer   r)   r,   r   rU   r   Útest_twoDeep¢   s   





zAwaitTests.test_twoDeepc                    s4   dt f‡ fdd„}ˆ  t |ƒ ¡¡}ˆ  |d¡ dS )zO
        Awaiting an already failed Deferred will raise the exception.
        r   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   r0   r   r5   )Úe©r   r   r   ÚtestÒ   s   €ý€þz%AwaitTests.test_reraise.<locals>.testrH   N)Úintr)   r   r(   r   )r   r\   r   r   r[   r   Útest_reraiseÍ   s   zAwaitTests.test_reraisec                    sD   t ƒ ‰ d‡ fdd„}t |ƒ ¡}ˆ  d¡ |  |¡}|  |d¡ dS )zd
        Awaiting a paused & chained Deferred will give the result when it has
        one.
        r   Nc                  “   sD   �t ƒ } t ƒ ‰ |  ‡ fdd„¡ |  d ¡ ˆ dˆ jd¡ | I d H S )Nc                    s   ˆ S r7   r   )Zignored©Zd2r   r   Ú<lambda>ç   s    z7AwaitTests.test_chained.<locals>.test.<locals>.<lambda>r   Úbye)r   ZaddCallbackrN   rM   r1   ©rO   r_   r   r\   ä   s   €

z%AwaitTests.test_chained.<locals>.testrV   ra   r?   )r   r   r(   rW   r)   r   )r   r\   r   r   r   rb   r   Útest_chainedÝ   s   	

zAwaitTests.test_chainedr?   )r   r   r   r   r   r+   r-   r.   r6   rC   rF   rX   r^   rc   r   r   r   r   r      s    








+r   )r   r&   Ztyping_extensionsr   Ztwisted.internet.deferr   r   r   r   r   Ztwisted.internet.taskr   Ztwisted.python.failurer	   Ztwisted.trial.unittestr
   Ú	Exceptionr   r   r   r   r   r   Ú<module>   s   