From 5e22afce41de8c87071d8fc149a6ba3cd8762819 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Tue, 11 Oct 2016 12:30:32 +1100
Subject: [PATCH] tests: Improve test coverage of py/compile.c.

---
 tests/basics/async_def.py       | 16 ++++++++++++++++
 tests/basics/async_def.py.exp   |  3 +++
 tests/basics/async_with.py      |  4 +++-
 tests/basics/async_with.py.exp  |  1 +
 tests/basics/del_global.py      |  5 +++++
 tests/basics/for_range.py       |  5 +++++
 tests/basics/syntaxerror.py     |  4 ++++
 tests/basics/unpack1.py         |  1 +
 tests/cmdline/repl_basic.py     |  1 +
 tests/cmdline/repl_basic.py.exp |  2 ++
 tests/import/import2a.py        |  3 +++
 tests/micropython/viper_args.py |  8 ++++++++
 tests/misc/non_compliant.py     |  6 ++++++
 tests/misc/non_compliant.py.exp |  1 +
 tests/run-tests                 |  2 +-
 15 files changed, 60 insertions(+), 2 deletions(-)
 create mode 100644 tests/basics/async_def.py
 create mode 100644 tests/basics/async_def.py.exp

diff --git a/tests/basics/async_def.py b/tests/basics/async_def.py
new file mode 100644
index 000000000..e345703d7
--- /dev/null
+++ b/tests/basics/async_def.py
@@ -0,0 +1,16 @@
+# test async def
+
+def dec(f):
+    print('decorator')
+    return f
+
+# test definition with a decorator
+@dec
+async def foo():
+    print('foo')
+
+coro = foo()
+try:
+    coro.send(None)
+except StopIteration:
+    print('StopIteration')
diff --git a/tests/basics/async_def.py.exp b/tests/basics/async_def.py.exp
new file mode 100644
index 000000000..f555ace99
--- /dev/null
+++ b/tests/basics/async_def.py.exp
@@ -0,0 +1,3 @@
+decorator
+foo
+StopIteration
diff --git a/tests/basics/async_with.py b/tests/basics/async_with.py
index 9eccfd816..5af0c5d95 100644
--- a/tests/basics/async_with.py
+++ b/tests/basics/async_with.py
@@ -3,6 +3,7 @@
 class AContext:
     async def __aenter__(self):
         print('enter')
+        return 1
     async def __aexit__(self, exc_type, exc, tb):
         print('exit', exc_type, exc)
 
@@ -17,7 +18,8 @@ except StopIteration:
     print('finished')
 
 async def g():
-    async with AContext():
+    async with AContext() as ac:
+        print(ac)
         raise ValueError('error')
 
 o = g()
diff --git a/tests/basics/async_with.py.exp b/tests/basics/async_with.py.exp
index 6072a3e0b..d00b18c96 100644
--- a/tests/basics/async_with.py.exp
+++ b/tests/basics/async_with.py.exp
@@ -3,5 +3,6 @@ body
 exit None None
 finished
 enter
+1
 exit <class 'ValueError'> error
 ValueError
diff --git a/tests/basics/del_global.py b/tests/basics/del_global.py
index 77d11cb3c..d740357b0 100644
--- a/tests/basics/del_global.py
+++ b/tests/basics/del_global.py
@@ -54,3 +54,8 @@ try:
     print(c)
 except NameError:
     print("NameError")
+
+a = 1
+b = 2
+c = 3
+del (a, (b, c))
diff --git a/tests/basics/for_range.py b/tests/basics/for_range.py
index ddff5ebd4..58a8f7caa 100644
--- a/tests/basics/for_range.py
+++ b/tests/basics/for_range.py
@@ -34,6 +34,11 @@ try:
         print(x)
 except TypeError:
     print('TypeError')
+try:
+    for x in range(start=0, end=1):
+        print(x)
+except TypeError:
+    print('TypeError')
 try:
     for x in range(0, 1, step=1):
         print(x)
diff --git a/tests/basics/syntaxerror.py b/tests/basics/syntaxerror.py
index 2ae0183f8..e5cbbac06 100644
--- a/tests/basics/syntaxerror.py
+++ b/tests/basics/syntaxerror.py
@@ -49,6 +49,9 @@ test_syntax("f[0]**2 = 1")
 # can't assign to empty tuple
 test_syntax("() = 1")
 
+# can't have *x on RHS
+test_syntax("x = *x")
+
 # can't have multiple *x on LHS
 test_syntax("*a, *b = c")
 
@@ -76,6 +79,7 @@ test_syntax("continue")
 test_syntax("return")
 test_syntax("yield")
 test_syntax("nonlocal a")
+test_syntax("await 1")
 
 # error on uPy, warning on CPy
 #test_syntax("def f():\n a = 1\n global a")
diff --git a/tests/basics/unpack1.py b/tests/basics/unpack1.py
index 10e01dea0..0e8ec592c 100644
--- a/tests/basics/unpack1.py
+++ b/tests/basics/unpack1.py
@@ -12,6 +12,7 @@ a, b, c = range(3); print(a, b, c)
 (a,) = range(1); print(a)
 (a, b) = range(2); print(a, b)
 (a, b, c) = range(3); print(a, b, c)
+(a, (b, c)) = [-1, range(2)]; print(a, b, c)
 
 # lists
 
diff --git a/tests/cmdline/repl_basic.py b/tests/cmdline/repl_basic.py
index b416493dc..cbd5d3a4a 100644
--- a/tests/cmdline/repl_basic.py
+++ b/tests/cmdline/repl_basic.py
@@ -1,3 +1,4 @@
 # basic REPL tests
 print(1)
 
+2
diff --git a/tests/cmdline/repl_basic.py.exp b/tests/cmdline/repl_basic.py.exp
index 96b8c28dc..2b390ea98 100644
--- a/tests/cmdline/repl_basic.py.exp
+++ b/tests/cmdline/repl_basic.py.exp
@@ -5,4 +5,6 @@ Use \.\+
 1
 >>> print(1)
 1
+>>> 2
+2
 >>> 
diff --git a/tests/import/import2a.py b/tests/import/import2a.py
index ce32b10b1..def6aeb6a 100644
--- a/tests/import/import2a.py
+++ b/tests/import/import2a.py
@@ -1,2 +1,5 @@
 from import1b import var
 print(var)
+
+from import1b import var as var2
+print(var2)
diff --git a/tests/micropython/viper_args.py b/tests/micropython/viper_args.py
index ca2a5e670..2aebe1b04 100644
--- a/tests/micropython/viper_args.py
+++ b/tests/micropython/viper_args.py
@@ -26,3 +26,11 @@ def f4(x1:int, x2:int, x3:int, x4:int):
 f4(1, 2, 3, 4)
 
 # only up to 4 arguments currently supported
+
+# test compiling *x, **x, * args (currently unsupported at runtime)
+@micropython.viper
+def f(*x, **y):
+    pass
+@micropython.viper
+def f(*):
+    pass
diff --git a/tests/misc/non_compliant.py b/tests/misc/non_compliant.py
index 1157ff8b2..e0b07c3ad 100644
--- a/tests/misc/non_compliant.py
+++ b/tests/misc/non_compliant.py
@@ -3,6 +3,12 @@
 import array
 import ustruct
 
+# when super can't find self
+try:
+    exec('def f(): super()')
+except SyntaxError:
+    print('SyntaxError')
+
 # array deletion not implemented
 try:
     a = array.array('b', (1, 2, 3))
diff --git a/tests/misc/non_compliant.py.exp b/tests/misc/non_compliant.py.exp
index c03580442..3095441ad 100644
--- a/tests/misc/non_compliant.py.exp
+++ b/tests/misc/non_compliant.py.exp
@@ -1,3 +1,4 @@
+SyntaxError
 TypeError
 NotImplementedError
 True
diff --git a/tests/run-tests b/tests/run-tests
index cb920c094..422d7463a 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -273,7 +273,7 @@ def run_tests(pyb, tests, args):
     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 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 'await await2 for for2 with with2'.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
         skip_tests.update({'basics/%s.py' % t for t in 'with_break with_continue with_return'.split()}) # require complete with support
         skip_tests.add('basics/array_construct2.py') # requires generators
-- 
GitLab