summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_ast.py28
-rw-r--r--Lib/test/test_builtin.py41
2 files changed, 60 insertions, 9 deletions
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 5346b39..f3c7229 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -357,6 +357,34 @@ class AST_Tests(unittest.TestCase):
tree = ast.parse(snippet)
compile(tree, '<string>', 'exec')
+ def test_optimization_levels__debug__(self):
+ cases = [(-1, '__debug__'), (0, '__debug__'), (1, False), (2, False)]
+ for (optval, expected) in cases:
+ with self.subTest(optval=optval, expected=expected):
+ res = ast.parse("__debug__", optimize=optval)
+ self.assertIsInstance(res.body[0], ast.Expr)
+ if isinstance(expected, bool):
+ self.assertIsInstance(res.body[0].value, ast.Constant)
+ self.assertEqual(res.body[0].value.value, expected)
+ else:
+ self.assertIsInstance(res.body[0].value, ast.Name)
+ self.assertEqual(res.body[0].value.id, expected)
+
+ def test_optimization_levels_const_folding(self):
+ folded = ('Expr', (1, 0, 1, 5), ('Constant', (1, 0, 1, 5), 3, None))
+ not_folded = ('Expr', (1, 0, 1, 5),
+ ('BinOp', (1, 0, 1, 5),
+ ('Constant', (1, 0, 1, 1), 1, None),
+ ('Add',),
+ ('Constant', (1, 4, 1, 5), 2, None)))
+
+ cases = [(-1, not_folded), (0, not_folded), (1, folded), (2, folded)]
+ for (optval, expected) in cases:
+ with self.subTest(optval=optval):
+ tree = ast.parse("1 + 2", optimize=optval)
+ res = to_tuple(tree.body[0])
+ self.assertEqual(res, expected)
+
def test_invalid_position_information(self):
invalid_linenos = [
(10, 1), (-10, -11), (10, -11), (-5, -2), (-5, 1)
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index f5a5c03..ee3ba6a 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -369,16 +369,17 @@ class BuiltinTest(unittest.TestCase):
(1, False, 'doc', False, False),
(2, False, None, False, False)]
for optval, *expected in values:
+ with self.subTest(optval=optval):
# test both direct compilation and compilation via AST
- codeobjs = []
- codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
- tree = ast.parse(codestr)
- codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
- for code in codeobjs:
- ns = {}
- exec(code, ns)
- rv = ns['f']()
- self.assertEqual(rv, tuple(expected))
+ codeobjs = []
+ codeobjs.append(compile(codestr, "<test>", "exec", optimize=optval))
+ tree = ast.parse(codestr)
+ codeobjs.append(compile(tree, "<test>", "exec", optimize=optval))
+ for code in codeobjs:
+ ns = {}
+ exec(code, ns)
+ rv = ns['f']()
+ self.assertEqual(rv, tuple(expected))
def test_compile_top_level_await_no_coro(self):
"""Make sure top level non-await codes get the correct coroutine flags"""
@@ -517,6 +518,28 @@ class BuiltinTest(unittest.TestCase):
exec(co, glob)
self.assertEqual(type(glob['ticker']()), AsyncGeneratorType)
+ def test_compile_ast(self):
+ args = ("a*(1+2)", "f.py", "exec")
+ raw = compile(*args, flags = ast.PyCF_ONLY_AST).body[0]
+ opt = compile(*args, flags = ast.PyCF_OPTIMIZED_AST).body[0]
+
+ for tree in (raw, opt):
+ self.assertIsInstance(tree.value, ast.BinOp)
+ self.assertIsInstance(tree.value.op, ast.Mult)
+ self.assertIsInstance(tree.value.left, ast.Name)
+ self.assertEqual(tree.value.left.id, 'a')
+
+ raw_right = raw.value.right # expect BinOp(1, '+', 2)
+ self.assertIsInstance(raw_right, ast.BinOp)
+ self.assertIsInstance(raw_right.left, ast.Constant)
+ self.assertEqual(raw_right.left.value, 1)
+ self.assertIsInstance(raw_right.right, ast.Constant)
+ self.assertEqual(raw_right.right.value, 2)
+
+ opt_right = opt.value.right # expect Constant(3)
+ self.assertIsInstance(opt_right, ast.Constant)
+ self.assertEqual(opt_right.value, 3)
+
def test_delattr(self):
sys.spam = 1
delattr(sys, 'spam')