summaryrefslogtreecommitdiffstatshomepage
path: root/tests
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-03-23 21:48:29 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-03-26 15:40:58 +0200
commit962b1cd1b120d777636ce8195d14f3d686e96619 (patch)
treeba8b703fb70d32457e8f2cbeb176ec7b822cfa9f /tests
parent4b2b7ceca7915d014a191d3776bc29bdbc5faf02 (diff)
downloadmicropython-962b1cd1b120d777636ce8195d14f3d686e96619.tar.gz
micropython-962b1cd1b120d777636ce8195d14f3d686e96619.zip
objgenerator: Implement return with value and .close() method.
Return with value gets converted to StopIteration(value). Implementation keeps optimizing against creating of possibly unneeded exception objects, so there're considerable refactoring to implement these features.
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/generator-return.py10
-rw-r--r--tests/basics/generator_close.py59
2 files changed, 69 insertions, 0 deletions
diff --git a/tests/basics/generator-return.py b/tests/basics/generator-return.py
new file mode 100644
index 0000000000..a3ac88575e
--- /dev/null
+++ b/tests/basics/generator-return.py
@@ -0,0 +1,10 @@
+def gen():
+ yield 1
+ return 42
+
+g = gen()
+print(next(g))
+try:
+ print(next(g))
+except StopIteration as e:
+ print(repr(e))
diff --git a/tests/basics/generator_close.py b/tests/basics/generator_close.py
new file mode 100644
index 0000000000..aa563f2a8a
--- /dev/null
+++ b/tests/basics/generator_close.py
@@ -0,0 +1,59 @@
+def gen1():
+ yield 1
+ yield 2
+
+# Test that it's possible to close just created gen
+g = gen1()
+print(g.close())
+try:
+ next(g)
+except StopIteration:
+ print("StopIteration")
+
+# Test that it's possible to close gen in progress
+g = gen1()
+print(next(g))
+print(g.close())
+try:
+ next(g)
+ print("No StopIteration")
+except StopIteration:
+ print("StopIteration")
+
+# Test that it's possible to close finished gen
+g = gen1()
+print(list(g))
+print(g.close())
+try:
+ next(g)
+ print("No StopIteration")
+except StopIteration:
+ print("StopIteration")
+
+
+# Throwing StopIteration in response to close() is ok
+def gen2():
+ try:
+ yield 1
+ yield 2
+ except:
+ raise StopIteration
+
+g = gen2()
+next(g)
+print(g.close())
+
+# Any other exception is propagated to the .close() caller
+def gen3():
+ try:
+ yield 1
+ yield 2
+ except:
+ raise ValueError
+
+g = gen3()
+next(g)
+try:
+ print(g.close())
+except ValueError:
+ print("ValueError")