U
    n5{i(  ã                   @   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                   @   sr   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„Zddœdd„Zddœdd„Z	ddœdd„Z
dS )ÚYieldFromTestsz@
    Tests for using Deferreds in conjunction with PEP-380.
    N)Úreturnc                 C   sJ   dd„ }|ƒ }|   |tj¡ t|ƒ}|   |t¡ |  |¡}|  |d¡ dS )zM
        L{ensureDeferred} will turn a coroutine into a L{Deferred}.
        c                  s   s   t dƒ} | E d H }|S ©NÚfoo©r   ©ÚdÚres© r   úN/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/internet/test/test_defer_yieldfrom.pyÚrun   s    
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   s   t dƒ} | E d H }|S r
   r   r   r   r   r   r   6   s    
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   s   t dƒ} | E d H }|S r
   r   r   r   r   r   r   M   s    
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ƒ‚d S )Nr   úOh no!)r   Ú
ValueError©r   r   r   r   r   \   s    
z*YieldFromTests.test_exception.<locals>.run)r$   N)r   r   Z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¡ |  ˆddd	d
g¡ ˆ  d¡ |  ˆddd	d
g¡ ˆ  d¡ |  ˆddd	d
dg¡ |  |¡}|  |d¡ dS )r#   c                  3   s8   ˆ  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   sN   ˆ  d¡ ˆƒ E d H } ˆ  d¡ tƒ }ˆ  d|jd ¡ |E d H  ˆ  d¡ | S )Nr,   é   é   r/   )Úresultr   ©r3   r5   r4   r   r   r   v   s    



z(YieldFromTests.test_twoDeep.<locals>.rungÍÌÌÌÌÌì?r,   r+   çš™™™™™¹?r-   r6   r7   r.   N)r   r   r   Úadvancer   r   r!   r   r9   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   sR   zt tdƒƒE d H  W n6 tk
rL }  zˆ  | jd¡ W Y ¢dS d } ~ X Y nX dS )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   r@   r   r   r?   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   sF   t ƒ } t ƒ ‰ |  ‡ fdd„¡ |  d ¡ ˆ dˆ jd¡ | E d H }|S )Nc                    s   ˆ S )Nr   )Zignored©Zd2r   r   Ú<lambda>«   ó    z;YieldFromTests.test_chained.<locals>.test.<locals>.<lambda>r   Úbye)r   ZaddCallbackr2   r1   r   ©r3   rB   r   r@   ¨   s    

z)YieldFromTests.test_chained.<locals>.testr:   rE   N)r   r   r   r;   r   r   )r   r@   r   r   r   rF   r   Útest_chained¡   s    


zYieldFromTests.test_chained)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r"   r*   r<   rA   rG   r   r   r   r   r      s   +r   )rK   r   Ztwisted.internet.deferr   r   r   r   Ztwisted.internet.taskr   Ztwisted.trial.unittestr   r   r   r   r   r   Ú<module>   s
   