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   