From 96baaa68a4430efd585f2186976cfa473ca73bfc Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Tue, 17 Jan 2017 00:17:44 +1100
Subject: [PATCH] tests: Update tests, and add new ones, for recent generator
 tweaks.

---
 tests/basics/gen_yield_from_throw2.py     | 15 +++++++-----
 tests/basics/gen_yield_from_throw2.py.exp |  3 ---
 tests/basics/gen_yield_from_throw3.py     | 30 +++++++++++++++++++++++
 tests/run-tests                           |  2 +-
 4 files changed, 40 insertions(+), 10 deletions(-)
 delete mode 100644 tests/basics/gen_yield_from_throw2.py.exp
 create mode 100644 tests/basics/gen_yield_from_throw3.py

diff --git a/tests/basics/gen_yield_from_throw2.py b/tests/basics/gen_yield_from_throw2.py
index 2cff9e08b..0abfdd8cc 100644
--- a/tests/basics/gen_yield_from_throw2.py
+++ b/tests/basics/gen_yield_from_throw2.py
@@ -1,5 +1,5 @@
-# uPy differs from CPython for this test
-# generator ignored GeneratorExit
+# generator ignores a thrown GeneratorExit (this is allowed)
+
 def gen():
     try:
         yield 123
@@ -7,9 +7,12 @@ def gen():
         print('GeneratorExit')
     yield 456
         
+# thrown a class
 g = gen()
 print(next(g))
-try:
-    g.throw(GeneratorExit)
-except RuntimeError:
-    print('RuntimeError')
+print(g.throw(GeneratorExit))
+
+# thrown an instance
+g = gen()
+print(next(g))
+print(g.throw(GeneratorExit()))
diff --git a/tests/basics/gen_yield_from_throw2.py.exp b/tests/basics/gen_yield_from_throw2.py.exp
deleted file mode 100644
index d5805b494..000000000
--- a/tests/basics/gen_yield_from_throw2.py.exp
+++ /dev/null
@@ -1,3 +0,0 @@
-123
-GeneratorExit
-RuntimeError
diff --git a/tests/basics/gen_yield_from_throw3.py b/tests/basics/gen_yield_from_throw3.py
new file mode 100644
index 000000000..0f6c7c842
--- /dev/null
+++ b/tests/basics/gen_yield_from_throw3.py
@@ -0,0 +1,30 @@
+# yield-from a user-defined generator with a throw() method
+
+class Iter:
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        return 1
+
+    def throw(self, x):
+        print('throw', x)
+        return 456
+
+def gen():
+    yield from Iter()
+
+# calling close() should not call throw()
+g = gen()
+print(next(g))
+g.close()
+
+# can throw a non-exception object
+g = gen()
+print(next(g))
+print(g.throw(123))
+
+# throwing an exception class just injects that class
+g = gen()
+print(next(g))
+print(g.throw(ZeroDivisionError))
diff --git a/tests/run-tests b/tests/run-tests
index 91282667d..b835047a2 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -281,7 +281,7 @@ def run_tests(pyb, tests, args):
     # Some tests are known to fail with native emitter
     # Remove them from the below when they work
     if args.emit == 'native':
-        skip_tests.update({'basics/%s.py' % t for t in 'gen_yield_from gen_yield_from_close gen_yield_from_ducktype gen_yield_from_exc gen_yield_from_iter gen_yield_from_send gen_yield_from_stopped gen_yield_from_throw gen_yield_from_throw2 generator1 generator2 generator_args generator_close generator_closure generator_exc generator_return generator_send'.split()}) # require yield
+        skip_tests.update({'basics/%s.py' % t for t in 'gen_yield_from gen_yield_from_close gen_yield_from_ducktype gen_yield_from_exc gen_yield_from_iter gen_yield_from_send gen_yield_from_stopped gen_yield_from_throw gen_yield_from_throw2 gen_yield_from_throw3 generator1 generator2 generator_args generator_close generator_closure generator_exc generator_return generator_send'.split()}) # require yield
         skip_tests.update({'basics/%s.py' % t for t in 'bytes_gen class_store_class globals_del string_join'.split()}) # require yield
         skip_tests.update({'basics/async_%s.py' % t for t in 'def await await2 for for2 with with2'.split()}) # require yield
         skip_tests.update({'basics/%s.py' % t for t in 'try_reraise try_reraise2'.split()}) # require raise_varargs
-- 
GitLab