summaryrefslogtreecommitdiff
path: root/tests/basics/syntaxerror.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/basics/syntaxerror.py')
-rw-r--r--tests/basics/syntaxerror.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/basics/syntaxerror.py b/tests/basics/syntaxerror.py
new file mode 100644
index 000000000..f53b2c41d
--- /dev/null
+++ b/tests/basics/syntaxerror.py
@@ -0,0 +1,89 @@
+# test syntax errors
+
+def test_syntax(code):
+ try:
+ exec(code)
+ print("no SyntaxError")
+ except SyntaxError:
+ print("SyntaxError")
+
+# can't assign to literals
+test_syntax("1 = 2")
+test_syntax("'' = 1")
+test_syntax("{} = 1")
+
+# can't assign to comprehension
+test_syntax("(i for i in a) = 1")
+
+# can't assign to function
+test_syntax("f() = 1")
+
+# can't assign to power
+test_syntax("f**2 = 1")
+
+# can't assign to power of composite
+test_syntax("f[0]**2 = 1")
+
+# can't assign to empty tuple
+test_syntax("() = 1")
+
+# can't have multiple *x on LHS
+test_syntax("*a, *b = c")
+
+# can't do augmented assignment to tuple
+test_syntax("a, b += c")
+test_syntax("(a, b) += c")
+
+# can't do augmented assignment to list
+test_syntax("[a, b] += c")
+
+# non-default argument can't follow default argument
+test_syntax("def f(a=1, b): pass")
+
+# can't delete these things
+test_syntax("del ()")
+test_syntax("del f()")
+test_syntax("del f[0]**2")
+test_syntax("del (a for a in a)")
+
+# must be in a "loop"
+test_syntax("break")
+test_syntax("continue")
+
+# must be in a function
+test_syntax("return")
+test_syntax("yield")
+test_syntax("nonlocal a")
+
+# errors on uPy but shouldn't
+#test_syntax("global a; global a")
+#test_syntax("def f():\n a = 1\n global a")
+
+# default except must be last
+test_syntax("try:\n a\nexcept:\n pass\nexcept:\n pass")
+
+# can't have multiple * or **
+test_syntax("f(*a, *b)")
+test_syntax("f(**a, **b)")
+
+# LHS of keywords must be id's
+test_syntax("f(1=2)")
+
+# non-keyword after keyword
+test_syntax("f(a=1, 2)")
+
+# doesn't error on uPy but should
+#test_syntax("f(1, i for i in i)")
+
+# all elements of dict/set must be pairs or singles
+test_syntax("{1:2, 3}")
+test_syntax("{1, 2:3}")
+
+# can't mix non-bytes with bytes when concatenating
+test_syntax("'abc' b'def'")
+
+# can't reuse same name for argument
+test_syntax("def f(a, a): pass")
+
+# nonlocal must exist in outer function/class scope
+test_syntax("def f():\n def g():\n nonlocal a")