ó
¶ß•Ec           @   s  d  d l  m Z m Z d  d l Z d  d l m Z d  d l m Z m Z d  d l	 m
 Z
 m Z m Z d  d l m Z d „  Z d „  Z d	 e f d
 „  ƒ  YZ d d d „  ƒ  YZ d e e j f d „  ƒ  YZ d Z e j d k rë e d Un d e j f d „  ƒ  YZ d S(   iÿÿÿÿ(   t
   generatorst   nested_scopesN(   t   reactor(   t   unittestt   util(   t   waitForDeferredt   deferredGeneratort   Deferred(   t   deferc          C   s#   t  ƒ  }  t j d |  j d ƒ |  S(   Ni    t   hi(   R   R   t	   callLatert   callback(   t   d(    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   getThing   s    	c             s,   t  ƒ  ‰  ‡  f d †  }  t j d |  ƒ ˆ  S(   Nc              s   ˆ  j  t d ƒ ƒ d  S(   Nt   OMG(   t   errbackt   ZeroDivisionError(    (   R   (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   CRAP   s    i    (   R   R   R
   (   R   (    (   R   s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   getOwie   s    	t   TerminalExceptionc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR      s   t   BaseDefgenTestsc           B   sM   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   s  
    This class sets up a bunch of test cases which will test both
    deferredGenerator and inlineCallbacks based generators. The subclasses
    DeferredGeneratorTests and InlineCallbacksTests each provide the actual
    generator implementations tested.
    c         C   s   |  j  ƒ  j |  j d ƒ S(   sÅ   
        Test that a normal deferredGenerator works.  Tests yielding a
        deferred which callbacks, as well as a deferred errbacks. Also
        ensures returning a final value works.
        t   WOOSH(   t
   _genBasicst   addCallbackt   assertEqual(   t   self(    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt
   testBasics&   s    c         C   s   |  j  |  j ƒ  t ƒ S(   sp   
        Ensure that a buggy generator properly signals a Failure
        condition on result deferred.
        (   t   assertFailuret	   _genBuggyR   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt	   testBuggy/   s    c         C   s   |  j  ƒ  j |  j d ƒ S(   s9   Test that a generator which never yields results in None.N(   t   _genNothingR   R   t   None(   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   testNothing6   s    c         C   s   |  j  ƒ  j |  j d ƒ S(   sÍ   
        Create a Deferred Generator which yields a Deferred which fails and
        handles the exception which results.  Assert that the Deferred
        Generator does not errback its Deferred.
        N(   t   _genHandledTerminalFailureR   R   R!   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   testHandledTerminalFailure;   s    c         C   sA   t  j ƒ  } |  j | ƒ } | j t d ƒ ƒ | j |  j d ƒ S(   s~   
        Just like testHandledTerminalFailure, only with a Deferred which fires
        asynchronously with an error.
        s   Handled Terminal FailureN(   R   R   t   _genHandledTerminalAsyncFailureR   R   R   R   R!   (   R   R   t   deferredGeneratorResultDeferred(    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   testHandledTerminalAsyncFailureC   s
    c         C   s   |  j  ƒ  j |  j d ƒ S(   sj   
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        i    (   t   _genStackUsageR   R   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   testStackUsageN   s    c         C   s   |  j  ƒ  j |  j d ƒ S(   sg   
        Make sure we don't blow the stack when yielding immediately
        available values.
        i    (   t   _genStackUsage2R   R   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   testStackUsage2U   s    (
   R   R   t   __doc__R   R   R"   R$   R'   R)   R+   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR      s   							t   DeferredGeneratorTestsc           B   s¤   e  Z d  „  Z e e ƒ Z d „  Z e e ƒ Z d „  Z e e ƒ Z d „  Z e e ƒ Z d „  Z e e ƒ Z d „  Z e e ƒ Z d „  Z	 e e	 ƒ Z	 d „  Z
 RS(   c         c   s‡   t  t ƒ  ƒ } | V| j ƒ  } |  j | d ƒ t  t ƒ  ƒ } | Vy | j ƒ  Wn) t k
 r} } |  j t | ƒ d ƒ n Xd Vd  S(   NR	   R   R   (   R   R   t	   getResultt   assertEqualsR   R   t   str(   R   t   xt   owt   e(    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR   b   s    c         c   s   t  t ƒ  ƒ Vd d d  S(   Ni   i    (   R   R   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR   t   s    c         c   s   d  S(   N(    (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR    z   s    c         c   sF   t  t j t d ƒ ƒ ƒ } | Vy | j ƒ  Wn t k
 rA n Xd  S(   Ns   Handled Terminal Failure(   R   R   t   failR   R.   (   R   R1   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR#   ~   s    c         c   s7   t  | ƒ } | Vy | j ƒ  Wn t k
 r2 n Xd  S(   N(   R   R.   R   (   R   R   R1   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR%   ˆ   s    c         c   sF   x: t  d ƒ D], } t t j d ƒ ƒ } | V| j ƒ  } q Wd Vd  S(   Niˆ  i   i    (   t   rangeR   R   t   succeedR.   (   R   R1   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR(   ’   s
    c         c   s%   x t  d ƒ D] } d Vq Wd Vd  S(   Niˆ  i   i    (   R5   (   R   R1   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR*   ›   s    	c         C   s(   d „  } t  | ƒ } |  j | ƒ  t ƒ S(   sZ   
        Ensure that yielding a Deferred directly is trapped as an
        error.
        c           s   s   t  ƒ  Vd  S(   N(   R   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   _genDeferredª   s    (   R   R   t	   TypeError(   R   R7   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   testDeferredYielding¤   s    	(   R   R   R   R   R   R    R#   R%   R(   R*   R9   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR-   _   s   							sì	  
from twisted.internet.defer import inlineCallbacks, returnValue

class InlineCallbacksTests(BaseDefgenTests, unittest.TestCase):
    # First provide all the generator impls necessary for BaseDefgenTests

    def _genBasics(self):

        x = yield getThing()

        self.assertEquals(x, "hi")

        try:
            ow = yield getOwie()
        except ZeroDivisionError, e:
            self.assertEquals(str(e), 'OMG')
        returnValue("WOOSH")
    _genBasics = inlineCallbacks(_genBasics)

    def _genBuggy(self):
        yield getThing()
        1/0
    _genBuggy = inlineCallbacks(_genBuggy)


    def _genNothing(self):
        if 0: yield 1
    _genNothing = inlineCallbacks(_genNothing)


    def _genHandledTerminalFailure(self):
        try:
            x = yield defer.fail(TerminalException("Handled Terminal Failure"))
        except TerminalException:
            pass
    _genHandledTerminalFailure = inlineCallbacks(_genHandledTerminalFailure)


    def _genHandledTerminalAsyncFailure(self, d):
        try:
            x = yield d
        except TerminalException:
            pass
    _genHandledTerminalAsyncFailure = inlineCallbacks(
        _genHandledTerminalAsyncFailure)


    def _genStackUsage(self):
        for x in range(5000):
            # Test with yielding a deferred
            x = yield defer.succeed(1)
        returnValue(0)
    _genStackUsage = inlineCallbacks(_genStackUsage)

    def _genStackUsage2(self):
        for x in range(5000):
            # Test with yielding a random value
            yield 1
        returnValue(0)
    _genStackUsage2 = inlineCallbacks(_genStackUsage2)

    # Tests unique to inlineCallbacks

    def testYieldNonDeferrred(self):
        """
        Ensure that yielding a non-deferred passes it back as the
        result of the yield expression.
        """
        def _test():
            x = yield 5
            returnValue(5)
        _test = inlineCallbacks(_test)

        return _test().addCallback(self.assertEqual, 5)

    def testReturnNoValue(self):
        """Ensure a standard python return results in a None result."""
        def _noReturn():
            yield 5
            return
        _noReturn = inlineCallbacks(_noReturn)

        return _noReturn().addCallback(self.assertEqual, None)

    def testReturnValue(self):
        """Ensure that returnValue works."""
        def _return():
            yield 5
            returnValue(6)
        _return = inlineCallbacks(_return)

        return _return().addCallback(self.assertEqual, 6)

i   i   t   InlineCallbacksTestsc           B   s   e  Z d  Z d „  Z RS(   s)   defer.defgen doesn't run on python < 2.5.c         C   s   d  S(   N(    (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   test_everything  s    (   R   R   t   skipR;   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyR:     s   (    (   i   i   (   t
   __future__R    R   t   syst   twisted.internetR   t   twisted.trialR   R   t   twisted.internet.deferR   R   R   R   R   R   t	   ExceptionR   R   t   TestCaseR-   t   inlineCallbacksTestsSourcet   version_infoR:   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/test/test_defgen.pyt   <module>   s   		
A²