summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tulip/futures_test.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/tulip/futures_test.py b/tulip/futures_test.py
index 6c59edc..7834fec 100644
--- a/tulip/futures_test.py
+++ b/tulip/futures_test.py
@@ -5,6 +5,10 @@ import unittest
from . import futures
+def _fakefunc(f):
+ return f
+
+
class FutureTests(unittest.TestCase):
def testInitialState(self):
@@ -31,6 +35,9 @@ class FutureTests(unittest.TestCase):
def testResult(self):
f = futures.Future()
+ self.assertRaises(futures.InvalidStateError, f.result)
+ self.assertRaises(futures.InvalidTimeoutError, f.result, 10)
+
f.set_result(42)
self.assertFalse(f.cancelled())
self.assertFalse(f.running())
@@ -44,6 +51,9 @@ class FutureTests(unittest.TestCase):
def testException(self):
exc = RuntimeError()
f = futures.Future()
+ self.assertRaises(futures.InvalidStateError, f.exception)
+ self.assertRaises(futures.InvalidTimeoutError, f.exception, 10)
+
f.set_exception(exc)
self.assertFalse(f.cancelled())
self.assertFalse(f.running())
@@ -70,6 +80,60 @@ class FutureTests(unittest.TestCase):
# The second "yield from f" does not yield f.
self.assertEqual(next(g), ('C', 42)) # yield 'C', y.
+ def testRepr(self):
+ f_pending = futures.Future()
+ self.assertEqual(repr(f_pending), 'Future<PENDING>')
+
+ f_cancelled = futures.Future()
+ f_cancelled.cancel()
+ self.assertEqual(repr(f_cancelled), 'Future<CANCELLED>')
+
+ f_result = futures.Future()
+ f_result.set_result(4)
+ self.assertEqual(repr(f_result), 'Future<result=4>')
+
+ f_exception = futures.Future()
+ f_exception.set_exception(RuntimeError())
+ self.assertEqual(repr(f_exception), 'Future<exception=RuntimeError()>')
+
+ f_few_callbacks = futures.Future()
+ f_few_callbacks.add_done_callback(_fakefunc)
+ self.assertIn('Future<PENDING, [<function _fakefunc',
+ repr(f_few_callbacks))
+
+ f_many_callbacks = futures.Future()
+ for i in range(20):
+ f_many_callbacks.add_done_callback(_fakefunc)
+ r = repr(f_many_callbacks)
+ self.assertIn('Future<PENDING, [<function _fakefunc', r)
+ self.assertIn('<18 more>', r)
+
+ def testCopyState(self):
+ # Test the internal _copy_state method since it's being directly
+ # invoked in other modules.
+ f = futures.Future()
+ f.set_result(10)
+
+ newf = futures.Future()
+ newf._copy_state(f)
+ self.assertTrue(newf.done())
+ self.assertEqual(newf.result(), 10)
+
+ f_exception = futures.Future()
+ f_exception.set_exception(RuntimeError())
+
+ newf_exception = futures.Future()
+ newf_exception._copy_state(f_exception)
+ self.assertTrue(newf_exception.done())
+ self.assertRaises(RuntimeError, newf_exception.result)
+
+ f_cancelled = futures.Future()
+ f_cancelled.cancel()
+
+ newf_cancelled = futures.Future()
+ newf_cancelled._copy_state(f_cancelled)
+ self.assertTrue(newf_cancelled.cancelled())
+
# A fake event loop for tests. All it does is implement a call_soon method
# that immediately invokes the given function.