if value is not None:
raise ReturnValueIgnoredError(
"@gen.engine functions cannot return values: "
- "%r" % result)
+ "%r" % (value,))
assert value is None
deactivate()
runner = Runner(result, final_callback)
return
if result is not None:
raise ReturnValueIgnoredError(
- "@gen.engine functions cannot return values: %r" % result)
+ "@gen.engine functions cannot return values: %r" %
+ (result,))
deactivate()
# no yield, so we're done
return wrapper
def register_callback(self, key):
"""Adds ``key`` to the list of callbacks."""
if key in self.pending_callbacks:
- raise KeyReuseError("key %r is already pending" % key)
+ raise KeyReuseError("key %r is already pending" % (key,))
self.pending_callbacks.add(key)
def is_ready(self, key):
"""Returns true if a result is available for ``key``."""
if key not in self.pending_callbacks:
- raise UnknownKeyError("key %r is not pending" % key)
+ raise UnknownKeyError("key %r is not pending" % (key,))
return key in self.results
def set_result(self, key, result):
except Exception:
self.exc_info = sys.exc_info()
else:
- self.exc_info = (BadYieldError("yielded unknown object %r" % yielded),)
+ self.exc_info = (BadYieldError(
+ "yielded unknown object %r" % (yielded,)),)
finally:
self.running = False
self.stop()
self.run_gen(f)
+ def test_with_arg_tuple(self):
+ @gen.engine
+ def f():
+ (yield gen.Callback((1, 2)))((3, 4))
+ res = yield gen.Wait((1, 2))
+ self.assertEqual((3, 4), res)
+ self.stop()
+ self.run_gen(f)
+
def test_key_reuse(self):
@gen.engine
def f():
self.stop()
self.assertRaises(gen.KeyReuseError, self.run_gen, f)
+ def test_key_reuse_tuple(self):
+ @gen.engine
+ def f():
+ yield gen.Callback((1, 2))
+ yield gen.Callback((1, 2))
+ self.stop()
+ self.assertRaises(gen.KeyReuseError, self.run_gen, f)
+
def test_key_mismatch(self):
@gen.engine
def f():
self.stop()
self.assertRaises(gen.UnknownKeyError, self.run_gen, f)
+ def test_key_mismatch_tuple(self):
+ @gen.engine
+ def f():
+ yield gen.Callback((1, 2))
+ yield gen.Wait((2, 3))
+ self.stop()
+ self.assertRaises(gen.UnknownKeyError, self.run_gen, f)
+
def test_leaked_callback(self):
@gen.engine
def f():
self.stop()
self.assertRaises(gen.LeakedCallbackError, self.run_gen, f)
+ def test_leaked_callback_tuple(self):
+ @gen.engine
+ def f():
+ yield gen.Callback((1, 2))
+ self.stop()
+ self.assertRaises(gen.LeakedCallbackError, self.run_gen, f)
+
def test_parallel_callback(self):
@gen.engine
def f():
yield 42
self.assertRaises(gen.BadYieldError, self.run_gen, f)
+ def test_bogus_yield_tuple(self):
+ @gen.engine
+ def f():
+ yield (1, 2)
+ self.assertRaises(gen.BadYieldError, self.run_gen, f)
+
def test_reuse(self):
@gen.engine
def f():
with self.assertRaises(gen.ReturnValueIgnoredError):
self.run_gen(f)
+ def test_sync_raise_return_value_tuple(self):
+ @gen.engine
+ def f():
+ raise gen.Return((1, 2))
+
+ with self.assertRaises(gen.ReturnValueIgnoredError):
+ self.run_gen(f)
+
def test_async_raise_return_value(self):
@gen.engine
def f():
with self.assertRaises(gen.ReturnValueIgnoredError):
self.run_gen(f)
+ def test_async_raise_return_value_tuple(self):
+ @gen.engine
+ def f():
+ yield gen.Task(self.io_loop.add_callback)
+ raise gen.Return((1, 2))
+
+ with self.assertRaises(gen.ReturnValueIgnoredError):
+ self.run_gen(f)
+
def test_return_value(self):
# It is an error to apply @gen.engine to a function that returns
# a value.
with self.assertRaises(gen.ReturnValueIgnoredError):
self.run_gen(f)
+ def test_return_value_tuple(self):
+ # It is an error to apply @gen.engine to a function that returns
+ # a value.
+ @gen.engine
+ def f():
+ return (1, 2)
+
+ with self.assertRaises(gen.ReturnValueIgnoredError):
+ self.run_gen(f)
+
class GenCoroutineTest(AsyncTestCase):
def setUp(self):