# Path: src/petmail/eventual.py
# def eventually(cb, *args, **kwargs):
#     """This is the eventual-send operation, used as a plan-coordination
#     primitive. The callable will be invoked (with args and kwargs) in a later
#     reactor turn. Doing 'eventually(a); eventually(b)' guarantees that a will
#     be called before b.
# 
#     Any exceptions that occur in the callable will be logged with log.err().
#     If you really want to ignore them, be sure to provide a callable that
#     catches those exceptions.
# 
#     This function returns None. If you care to know when the callable was
#     run, be sure to provide a callable that notifies somebody.
#     """
#     _theSimpleQueue.append(cb, args, kwargs)
# 
# def fireEventually(value=None):
#     """This returns a Deferred which will fire in a later reactor turn, after
#     the current call stack has been completed, and after all other deferreds
#     previously scheduled with callEventually().
#     """
#     d = defer.Deferred()
#     eventually(d.callback, value)
#     return d
# 
# def flushEventualQueue(value=None):
#     """This returns a Deferred which fires when the eventual-send queue is
#     finally empty. This is useful to wait upon as the last step of a Trial
#     test method. If an argument is provided, the Deferred will fire with it,
#     making this useful at the end of a unit test:
# 
#         d = some_stuff_that_uses_eventual_sends()
#         d.addBoth(flushEventualQueue)
#         return d
#     """
#     d = _theSimpleQueue.flush()
#     d.addBoth(lambda _: value)
#     return d


from twisted.trial import unittest
from ..eventual import eventually, fireEventually, flushEventualQueue



class TestEventual(unittest.TestCase):

    def tearDown(self):
        return flushEventualQueue()

    def testSend(self):
        results = []
        eventually(results.append, 1)
        self.failIf(results)
        def _check():
            self.failUnlessEqual(results, [1])
        eventually(_check)
        def _check2():
            self.failUnlessEqual(results, [1,2])

# Path: src/petmail/eventual.py
# def eventually(cb, *args, **kwargs):
#     """This is the eventual-send operation, used as a plan-coordination
#     primitive. The callable will be invoked (with args and kwargs) in a later
#     reactor turn. Doing 'eventually(a); eventually(b)' guarantees that a will
#     be called before b.
# 
#     Any exceptions that occur in the callable will be logged with log.err().
#     If you really want to ignore them, be sure to provide a callable that
#     catches those exceptions.
# 
#     This function returns None. If you care to know when the callable was
#     run, be sure to provide a callable that notifies somebody.
#     """
#     _theSimpleQueue.append(cb, args, kwargs)
# 
# def fireEventually(value=None):
#     """This returns a Deferred which will fire in a later reactor turn, after
#     the current call stack has been completed, and after all other deferreds
#     previously scheduled with callEventually().
#     """
#     d = defer.Deferred()
#     eventually(d.callback, value)
#     return d
# 
# def flushEventualQueue(value=None):
#     """This returns a Deferred which fires when the eventual-send queue is
#     finally empty. This is useful to wait upon as the last step of a Trial
#     test method. If an argument is provided, the Deferred will fire with it,
#     making this useful at the end of a unit test:
# 
#         d = some_stuff_that_uses_eventual_sends()
#         d.addBoth(flushEventualQueue)
#         return d
#     """
#     d = _theSimpleQueue.flush()
#     d.addBoth(lambda _: value)
#     return d


# Path: src/petmail/test/test_eventual.py
from twisted.trial import unittest
from ..eventual import eventually, fireEventually, flushEventualQueue




class TestEventual(unittest.TestCase):

    def tearDown(self):
        return flushEventualQueue()

    def testSend(self):
        results = []
        eventually(results.append, 1)
        self.failIf(results)
        def _check():
            self.failUnlessEqual(results, [1])
        eventually(_check)
        def _check2():
            self.failUnlessEqual(results, [1,2])

        eventually(results.append, 2)