o
    ¯bð  ã                   @   sP   d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
 G dd„ de
ƒZdS )z/
Tests for C{yield from} support in Deferreds.
é    N)ÚDeferredÚensureDeferredÚfailÚsucceed)ÚClock)ÚTestCasec                   @   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 )ÚYieldFromTestsz@
    Tests for using Deferreds in conjunction with PEP-380.
    c                 C   sJ   dd„ }|ƒ }|   |tj¡ t|ƒ}|   |t¡ |  |¡}|  |d¡ dS )zM
        L{ensureDeferred} will turn a coroutine into a L{Deferred}.
        c                  s   ó   � t dƒ} | E d H }|S ©NÚfoo©r   ©ÚdÚres© r   úL/usr/lib/python3/dist-packages/twisted/internet/test/test_defer_yieldfrom.pyÚrun   ó   €
z/YieldFromTests.test_ensureDeferred.<locals>.runr   N)ÚassertIsInstanceÚtypesÚGeneratorTyper   r   ÚsuccessResultOfÚassertEqual©Úselfr   Úrr   r   r   r   r   Útest_ensureDeferred   s   
z"YieldFromTests.test_ensureDeferredc                    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                  3   s$   � t dƒ} | E d H  ˆ ƒ E d H }|S )NÚbarr   r   ©Úrun2r   r   r   0   s
   €
z6YieldFromTests.test_DeferredfromCoroutine.<locals>.runc                  s   r	   r
   r   r   r   r   r   r   6   r   z7YieldFromTests.test_DeferredfromCoroutine.<locals>.run2r   N)r   r   r   r   ÚfromCoroutiner   r   r   r   r   r   Útest_DeferredfromCoroutine+   s   

z)YieldFromTests.test_DeferredfromCoroutinec                 C   s.   dd„ }t  |ƒ ¡}|  |¡}|  |d¡ dS )ze
        L{Deferred.fromCoroutine} allows a function to C{yield from} a
        L{Deferred}.
        c                  s   r	   r
   r   r   r   r   r   r   M   r   z&YieldFromTests.test_basic.<locals>.runr   N)r   r    r   r   ©r   r   r   r   r   r   r   Ú
test_basicG   s   
zYieldFromTests.test_basicc                 C   sD   dd„ }t  |ƒ ¡}|  |¡}|  t|jƒt¡ |  |jjd¡ dS )úš
        An exception in a generator scheduled with L{Deferred.fromCoroutine}
        will cause the returned L{Deferred} to fire with a failure.
        c                  s   s   � t dƒ} | E d H  tdƒ‚)Nr   úOh no!)r   Ú
ValueError©r   r   r   r   r   \   s   €
z*YieldFromTests.test_exception.<locals>.run)r%   N)r   r    ÚfailureResultOfr   ÚtypeÚvaluer&   Úargsr"   r   r   r   Útest_exceptionV   s
   
zYieldFromTests.test_exceptionc                    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 )r$   c                  3   s:   � ˆ  d¡ tƒ } ˆ  d| jd ¡ | E d H  ˆ  d¡ dS )Né   é   é   úYay!©Úappendr   Ú	callLaterÚcallbackr'   )ÚreactorÚsectionsr   r   Úrunonen   s   €


z+YieldFromTests.test_twoDeep.<locals>.runonec                  3   sP   � ˆ  d¡ ˆƒ E d H } ˆ  d¡ tƒ }ˆ  d|jd ¡ |E d H  ˆ  d¡ | S )Nr.   é   é   r1   )Úresultr   ©r5   r7   r6   r   r   r   v   s   €



z(YieldFromTests.test_twoDeep.<locals>.rungÍÌÌÌÌÌì?r.   r-   çš™™™™™¹?)r.   r-   r/   r8   )r.   r-   r/   r8   r9   r0   N)r   r   r    Úadvancer   r   r"   r   r;   r   Útest_twoDeepf   s   





zYieldFromTests.test_twoDeepc                    s.   ‡ fdd„}ˆ   t |ƒ ¡¡}ˆ  |d¡ dS )zT
        Yielding from an already failed Deferred will raise the exception.
        c               
   3   sP   � zt tdƒƒE d H  W dS  ty' }  zˆ  | jd¡ W Y d } ~ dS d } ~ ww )NÚBoom)r?   r.   r   )r   r&   r   r+   )Úe©r   r   r   Útest–   s   €ý€þz)YieldFromTests.test_reraise.<locals>.testr.   N)r   r   r    r   )r   rB   r   r   rA   r   Útest_reraise‘   s   zYieldFromTests.test_reraisec                    sB   t ƒ ‰ ‡ fdd„}t |ƒ ¡}ˆ  d¡ |  |¡}|  |d¡ dS )zi
        Yielding from a paused & chained Deferred will give the result when it
        has one.
        c                  3   sH   � t ƒ } t ƒ ‰ |  ‡ fdd„¡ |  d ¡ ˆ dˆ jd¡ | E d H }|S )Nc                    s   ˆ S )Nr   )Úignored©Úd2r   r   Ú<lambda>«   s    z;YieldFromTests.test_chained.<locals>.test.<locals>.<lambda>r   Úbye)r   ÚaddCallbackr4   r3   r   ©r5   rE   r   rB   ¨   s   €

z)YieldFromTests.test_chained.<locals>.testr<   rH   N)r   r   r    r=   r   r   )r   rB   r   r   r   rJ   r   Útest_chained¡   s   


zYieldFromTests.test_chainedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r#   r,   r>   rC   rK   r   r   r   r   r      s    +r   )rO   r   Útwisted.internet.deferr   r   r   r   Útwisted.internet.taskr   Útwisted.trial.unittestr   r   r   r   r   r   Ú<module>   s   