
    Vh(                     V    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e
      Zy)z/
Tests for C{yield from} support in Deferreds.
    N)DeferredensureDeferredfailsucceed)Clock)TestCasec                   H    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
y)YieldFromTestsz@
    Tests for using Deferreds in conjunction with PEP-380.
    Nc                     d } |       }| j                  |t        j                         t        |      }| j                  |t               | j                  |      }| j                  |d       y)zM
        L{ensureDeferred} will turn a coroutine into a L{Deferred}.
        c               3   <   K   t        d      } | E d {   }|S 7 wNfoor   dress     Z/home/dcms/DCMS/lib/python3.12/site-packages/twisted/internet/test/test_defer_yieldfrom.pyrunz/YieldFromTests.test_ensureDeferred.<locals>.run         A,CJ    r   N)assertIsInstancetypesGeneratorTyper   r   successResultOfassertEqual)selfr   rr   r   s        r   test_ensureDeferredz"YieldFromTests.test_ensureDeferred   sd    
	 Ea!4!45 1a* ""1%e$    c                     fd}d  |       }| j                  |t        j                         t        j                  |      }| j                  |t               | j                  |      }| j                  |d       y)zU
        L{Deferred.fromCoroutine} will turn a coroutine into a L{Deferred}.
        c               3   `   K   t        d      } | E d {            E d {   }|S 7 7 w)Nbarr   )r   r   run2s     r   r   z6YieldFromTests.test_DeferredfromCoroutine.<locals>.run0   s/     ALL!V#CJ #s   .*.,..c               3   <   K   t        d      } | E d {   }|S 7 wr   r   r   s     r   r#   z7YieldFromTests.test_DeferredfromCoroutine.<locals>.run26   r   r   r   N)r   r   r   r   fromCoroutiner   r   )r   r   r   r   r   r#   s        @r   test_DeferredfromCoroutinez)YieldFromTests.test_DeferredfromCoroutine+   sp    
		 Ea!4!45 ""1%a* ""1%e$r   c                     d }t        j                   |             }| j                  |      }| j                  |d       y)ze
        L{Deferred.fromCoroutine} allows a function to C{yield from} a
        L{Deferred}.
        c               3   <   K   t        d      } | E d {   }|S 7 wr   r   r   s     r   r   z&YieldFromTests.test_basic.<locals>.runM   r   r   r   N)r   r%   r   r   r   r   r   r   s       r   
test_basiczYieldFromTests.test_basicG   s;    	
 ""35)""1%e$r   c                     d }t        j                   |             }| j                  |      }| j                  t	        |j
                        t               | j                  |j
                  j                  d       y)
        An exception in a generator scheduled with L{Deferred.fromCoroutine}
        will cause the returned L{Deferred} to fire with a failure.
        c               3   N   K   t        d      } | E d {    t        d      7 w)Nr   Oh no!)r   
ValueError)r   s    r   r   z*YieldFromTests.test_exception.<locals>.run\   s&     ALLX&& s   %#%)r.   N)r   r%   failureResultOfr   typevaluer/   argsr)   s       r   test_exceptionzYieldFromTests.test_exceptionV   s[    	'
 ""35)""1%cii*55r   c                    t               g fdfd}t        j                   |             }j                  d       | j	                  ddg       j                  d       | j	                  g d       j                  d       | j	                  g d       j                  d       | j	                  g d       | j                  |      }| j	                  |d	       y
)r,   c               3      K   j                  d       t               } j                  d| j                  d        | E d {    j                  d       y7 w)N         Yay!appendr   	callLatercallback)r   reactorsectionss    r   runonez+YieldFromTests.test_twoDeep.<locals>.runonen   sK     OOA
AaT2LLOOA s   >AAAc               3      K   j                  d               E d {   } j                  d       t               }j                  d|j                  d        |E d {    j                  d       | S 7 Y7 w)Nr8         r;   )resultr   r?   rA   r@   s     r   r   z(YieldFromTests.test_twoDeep.<locals>.runv   si     OOA &(FOOA
AaT2LLOOAM ) s"   A=A9AA=!A;"A=;A=g?r8   r7   皙?)r8   r7   r9   rC   )r8   r7   r9   rC   rD   r:   N)r   r   r%   advancer   r   )r   r   r   r   r?   rA   r@   s       @@@r   test_twoDeepzYieldFromTests.test_twoDeepf   s    
 '		 ""35)Aq6*<0<0?3""1%f%r   c                       fd} j                  t        j                   |                   } j                  |d       y)zT
        Yielding from an already failed Deferred will raise the exception.
        c               3      K   	 t        t        d            E d {    y7 # t        $ r&} j                  | j                  d       Y d } ~ yd } ~ ww xY ww)NBoom)rK   r8   r   )r   r/   r   r3   )er   s    r   testz)YieldFromTests.test_reraise.<locals>.test   sO     
6 2333 	 4   3s6   A$ "$ A$ 	AA	AAAr8   N)r   r   r%   r   )r   rM   r   s   `  r   test_reraisezYieldFromTests.test_reraise   s7    
	 ""8#9#9$&#ABa r   c                     t               fd}t        j                   |             }j                  d       | j	                  |      }| j                  |d       y)zi
        Yielding from a paused & chained Deferred will give the result when it
        has one.
        c               3      K   t               } t               | j                  fd       | j                  d        j                  dj                  d       | E d {   }|S 7 w)Nc                     S )N )ignoredd2s    r   <lambda>z;YieldFromTests.test_chained.<locals>.test.<locals>.<lambda>   s    " r   r   bye)r   addCallbackr>   r=   )r   r   rT   r?   s     @r   rM   z)YieldFromTests.test_chained.<locals>.test   sU     
ABMM,-JJtae4,CJ s   AA) A'!A)rF   rV   N)r   r   r%   rG   r   r   )r   rM   r   r   r?   s       @r   test_chainedzYieldFromTests.test_chained   sQ    
 '	 ""46*""1%e$r   )returnN)__name__
__module____qualname____doc__r   r&   r*   r4   rH   rN   rX   rR   r   r   r
   r
      s+    %,%8%6 )&V! %r   r
   )r]   r   twisted.internet.deferr   r   r   r   twisted.internet.taskr   twisted.trial.unittestr   r
   rR   r   r   <module>ra      s)   
  J J ' +f%X f%r   