o
    >h(                     @   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                   @   sV   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S )YieldFromTestsz@
    Tests for using Deferreds in conjunction with PEP-380.
    returnNc                 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   /var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-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/         r2   )resultr   r6   r8   r7   r   r   r   v   s   



z(YieldFromTests.test_twoDeep.<locals>.rung?r/   r.   皙?)r/   r.   r0   r9   )r/   r.   r0   r9   r:   r1   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   rC   r   r   rB   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   addCallbackr5   r4   r   r6   rF   r   rC      s   

z)YieldFromTests.test_chained.<locals>.testr=   rI   N)r   r   r!   r>   r   r   )r   rC   r   r   r   rK   r   test_chained   s   


zYieldFromTests.test_chained)r	   N)__name__
__module____qualname____doc__r   r"   r$   r-   r?   rD   rL   r   r   r   r   r      s    





+r   )rP   r   twisted.internet.deferr   r   r   r   twisted.internet.taskr   twisted.trial.unittestr   r   r   r   r   r   <module>   s   