Repository URL to install this package:
# -*- coding: utf-8 -*-
"""
Test suite for PEP 380 implementation
adapted from original tests written by Greg Ewing
see <http://www.cosc.canterbury.ac.nz/greg.ewing/python/yield-from/YieldFrom-Python3.1.2-rev5.zip>
"""
import unittest
import inspect
from test.support import captured_stderr, disable_gc, gc_collect
from test import support
class TestPEP380Operation(unittest.TestCase):
"""
Test semantics.
"""
def test_delegation_of_initial_next_to_subgenerator(self):
"""
Test delegation of initial next() call to subgenerator
"""
trace = []
def g1():
trace.append("Starting g1")
yield from g2()
trace.append("Finishing g1")
def g2():
trace.append("Starting g2")
yield 42
trace.append("Finishing g2")
for x in g1():
trace.append("Yielded %s" % (x,))
self.assertEqual(trace,[
"Starting g1",
"Starting g2",
"Yielded 42",
"Finishing g2",
"Finishing g1",
])
def test_raising_exception_in_initial_next_call(self):
"""
Test raising exception in initial next() call
"""
trace = []
def g1():
try:
trace.append("Starting g1")
yield from g2()
finally:
trace.append("Finishing g1")
def g2():
try:
trace.append("Starting g2")
raise ValueError("spanish inquisition occurred")
finally:
trace.append("Finishing g2")
try:
for x in g1():
trace.append("Yielded %s" % (x,))
except ValueError as e:
self.assertEqual(e.args[0], "spanish inquisition occurred")
else:
self.fail("subgenerator failed to raise ValueError")
self.assertEqual(trace,[
"Starting g1",
"Starting g2",
"Finishing g2",
"Finishing g1",
])
def test_delegation_of_next_call_to_subgenerator(self):
"""
Test delegation of next() call to subgenerator
"""
trace = []
def g1():
trace.append("Starting g1")
yield "g1 ham"
yield from g2()
yield "g1 eggs"
trace.append("Finishing g1")
def g2():
trace.append("Starting g2")
yield "g2 spam"
yield "g2 more spam"
trace.append("Finishing g2")
for x in g1():
trace.append("Yielded %s" % (x,))
self.assertEqual(trace,[
"Starting g1",
"Yielded g1 ham",
"Starting g2",
"Yielded g2 spam",
"Yielded g2 more spam",
"Finishing g2",
"Yielded g1 eggs",
"Finishing g1",
])
def test_raising_exception_in_delegated_next_call(self):
"""
Test raising exception in delegated next() call
"""
trace = []
def g1():
try:
trace.append("Starting g1")
yield "g1 ham"
yield from g2()
yield "g1 eggs"
finally:
trace.append("Finishing g1")
def g2():
try:
trace.append("Starting g2")
yield "g2 spam"
raise ValueError("hovercraft is full of eels")
yield "g2 more spam"
finally:
trace.append("Finishing g2")
try:
for x in g1():
trace.append("Yielded %s" % (x,))
except ValueError as e:
self.assertEqual(e.args[0], "hovercraft is full of eels")
else:
self.fail("subgenerator failed to raise ValueError")
self.assertEqual(trace,[
"Starting g1",
"Yielded g1 ham",
"Starting g2",
"Yielded g2 spam",
"Finishing g2",
"Finishing g1",
])
def test_delegation_of_send(self):
"""
Test delegation of send()
"""
trace = []
def g1():
trace.append("Starting g1")
x = yield "g1 ham"
trace.append("g1 received %s" % (x,))
yield from g2()
x = yield "g1 eggs"
trace.append("g1 received %s" % (x,))
trace.append("Finishing g1")
def g2():
trace.append("Starting g2")
x = yield "g2 spam"
trace.append("g2 received %s" % (x,))
x = yield "g2 more spam"
trace.append("g2 received %s" % (x,))
trace.append("Finishing g2")
g = g1()
y = next(g)
x = 1
try:
while 1:
y = g.send(x)
trace.append("Yielded %s" % (y,))
x += 1
except StopIteration:
pass
self.assertEqual(trace,[
"Starting g1",
"g1 received 1",
"Starting g2",
"Yielded g2 spam",
"g2 received 2",
"Yielded g2 more spam",
"g2 received 3",
"Finishing g2",
"Yielded g1 eggs",
"g1 received 4",
"Finishing g1",
])
def test_handling_exception_while_delegating_send(self):
"""
Test handling exception while delegating 'send'
"""
trace = []
def g1():
trace.append("Starting g1")
x = yield "g1 ham"
trace.append("g1 received %s" % (x,))
yield from g2()
x = yield "g1 eggs"
trace.append("g1 received %s" % (x,))
trace.append("Finishing g1")
def g2():
trace.append("Starting g2")
x = yield "g2 spam"
trace.append("g2 received %s" % (x,))
raise ValueError("hovercraft is full of eels")
x = yield "g2 more spam"
trace.append("g2 received %s" % (x,))
trace.append("Finishing g2")
def run():
g = g1()
y = next(g)
x = 1
try:
while 1:
y = g.send(x)
trace.append("Yielded %s" % (y,))
x += 1
except StopIteration:
trace.append("StopIteration")
self.assertRaises(ValueError,run)
self.assertEqual(trace,[
"Starting g1",
"g1 received 1",
"Starting g2",
"Yielded g2 spam",
"g2 received 2",
])
def test_delegating_close(self):
"""
Test delegating 'close'
"""
trace = []
def g1():
try:
trace.append("Starting g1")
yield "g1 ham"
yield from g2()
yield "g1 eggs"
finally:
trace.append("Finishing g1")
def g2():
try:
trace.append("Starting g2")
yield "g2 spam"
yield "g2 more spam"
finally:
trace.append("Finishing g2")
g = g1()
for i in range(2):
x = next(g)
trace.append("Yielded %s" % (x,))
g.close()
self.assertEqual(trace,[
"Starting g1",
"Yielded g1 ham",
"Starting g2",
"Yielded g2 spam",
"Finishing g2",
"Finishing g1"
])
def test_handing_exception_while_delegating_close(self):
"""
Test handling exception while delegating 'close'
"""
trace = []
def g1():
try:
trace.append("Starting g1")
yield "g1 ham"
yield from g2()
yield "g1 eggs"
finally:
trace.append("Finishing g1")
def g2():
try:
trace.append("Starting g2")
yield "g2 spam"
yield "g2 more spam"
finally:
trace.append("Finishing g2")
raise ValueError("nybbles have exploded with delight")
try:
g = g1()
for i in range(2):
x = next(g)
trace.append("Yielded %s" % (x,))
g.close()
except ValueError as e:
self.assertEqual(e.args[0], "nybbles have exploded with delight")
self.assertIsInstance(e.__context__, GeneratorExit)
else:
self.fail("subgenerator failed to raise ValueError")
self.assertEqual(trace,[
"Starting g1",
"Yielded g1 ham",
"Starting g2",
"Yielded g2 spam",
"Finishing g2",
"Finishing g1",
])
def test_delegating_throw(self):
"""
Test delegating 'throw'
"""
trace = []
def g1():
try:
trace.append("Starting g1")
yield "g1 ham"
yield from g2()
yield "g1 eggs"
finally:
trace.append("Finishing g1")
def g2():
try:
trace.append("Starting g2")
yield "g2 spam"
yield "g2 more spam"
finally:
trace.append("Finishing g2")
try:
g = g1()
for i in range(2):
x = next(g)
trace.append("Yielded %s" % (x,))
e = ValueError("tomato ejected")
g.throw(e)
except ValueError as e:
self.assertEqual(e.args[0], "tomato ejected")
else:
self.fail("subgenerator failed to raise ValueError")
self.assertEqual(trace,[
"Starting g1",
"Yielded g1 ham",
"Starting g2",
"Yielded g2 spam",
"Finishing g2",
"Finishing g1",
])
def test_value_attribute_of_StopIteration_exception(self):
"""
Test 'value' attribute of StopIteration exception
"""
trace = []
Loading ...