From 5e22afce41de8c87071d8fc149a6ba3cd8762819 Mon Sep 17 00:00:00 2001 From: Damien George 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 0000000000..e345703d74 --- /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 0000000000..f555ace99a --- /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 9eccfd816c..5af0c5d955 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 6072a3e0b3..d00b18c969 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 error ValueError diff --git a/tests/basics/del_global.py b/tests/basics/del_global.py index 77d11cb3c4..d740357b03 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 ddff5ebd44..58a8f7caa7 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 2ae0183f8b..e5cbbac060 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 10e01dea06..0e8ec592c9 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 b416493dce..cbd5d3a4ac 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 96b8c28dce..2b390ea98b 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 ce32b10b1b..def6aeb6aa 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 ca2a5e6704..2aebe1b048 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 1157ff8b29..e0b07c3ad6 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 c03580442d..3095441ad0 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 cb920c0946..422d7463af 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