blob: 4bbdc3b82daa527e4c06e25f336087fba4fac2f4 [file] [log] [blame]
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001import ast
2import dis
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003import os
4import sys
5import unittest
Benjamin Peterson9ed37432012-07-08 11:13:36 -07006import weakref
7
8from test import support
Tim Peters400cbc32006-02-28 18:44:41 +00009
10def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000011 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000012 return t
13 elif isinstance(t, list):
14 return [to_tuple(e) for e in t]
15 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000016 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
17 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000018 if t._fields is None:
19 return tuple(result)
20 for f in t._fields:
21 result.append(to_tuple(getattr(t, f)))
22 return tuple(result)
23
Neal Norwitzee9b10a2008-03-31 05:29:39 +000024
Tim Peters400cbc32006-02-28 18:44:41 +000025# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030026# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000027exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050028 # None
29 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090030 # Module docstring
31 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000032 # FunctionDef
33 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090034 # FunctionDef with docstring
35 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050036 # FunctionDef with arg
37 "def f(a): pass",
38 # FunctionDef with arg and default value
39 "def f(a=0): pass",
40 # FunctionDef with varargs
41 "def f(*args): pass",
42 # FunctionDef with kwargs
43 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090044 # FunctionDef with all kind of args and docstring
45 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000046 # ClassDef
47 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090048 # ClassDef with docstring
49 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050050 # ClassDef, new style class
51 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000052 # Return
53 "def f():return 1",
54 # Delete
55 "del v",
56 # Assign
57 "v = 1",
58 # AugAssign
59 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000060 # For
61 "for v in v:pass",
62 # While
63 "while v:pass",
64 # If
65 "if v:pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050066 # With
67 "with x as y: pass",
68 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000069 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000070 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000071 # TryExcept
72 "try:\n pass\nexcept Exception:\n pass",
73 # TryFinally
74 "try:\n pass\nfinally:\n pass",
75 # Assert
76 "assert v",
77 # Import
78 "import sys",
79 # ImportFrom
80 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000081 # Global
82 "global v",
83 # Expr
84 "1",
85 # Pass,
86 "pass",
87 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040088 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000089 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040090 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +000091 # for statements with naked tuples (see http://bugs.python.org/issue6704)
92 "for a,b in c: pass",
93 "[(a,b) for a,b in c]",
94 "((a,b) for a,b in c)",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050095 "((a,b) for (a,b) in c)",
96 # Multiline generator expression (test for .lineno & .col_offset)
97 """(
98 (
99 Aa
100 ,
101 Bb
102 )
103 for
104 Aa
105 ,
106 Bb in Cc
107 )""",
108 # dictcomp
109 "{a : b for w in x for m in p if g}",
110 # dictcomp with naked tuple
111 "{a : b for v,w in x}",
112 # setcomp
113 "{r for l in x if g}",
114 # setcomp with naked tuple
115 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400116 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900117 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400118 # AsyncFor
119 "async def f():\n async for e in i: 1\n else: 2",
120 # AsyncWith
121 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400122 # PEP 448: Additional Unpacking Generalizations
123 "{**{1:2}, 2:3}",
124 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700125 # Asynchronous comprehensions
126 "async def f():\n [i async for b in c]",
Tim Peters400cbc32006-02-28 18:44:41 +0000127]
128
129# These are compiled through "single"
130# because of overlap with "eval", it just tests what
131# can't be tested with "eval"
132single_tests = [
133 "1+2"
134]
135
136# These are compiled through "eval"
137# It should test all expressions
138eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500139 # None
140 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000141 # BoolOp
142 "a and b",
143 # BinOp
144 "a + b",
145 # UnaryOp
146 "not v",
147 # Lambda
148 "lambda:None",
149 # Dict
150 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500151 # Empty dict
152 "{}",
153 # Set
154 "{None,}",
155 # Multiline dict (test for .lineno & .col_offset)
156 """{
157 1
158 :
159 2
160 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000161 # ListComp
162 "[a for b in c if d]",
163 # GeneratorExp
164 "(a for b in c if d)",
165 # Yield - yield expressions can't work outside a function
166 #
167 # Compare
168 "1 < 2 < 3",
169 # Call
170 "f(1,2,c=3,*d,**e)",
Tim Peters400cbc32006-02-28 18:44:41 +0000171 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000172 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000173 # Str
174 "'string'",
175 # Attribute
176 "a.b",
177 # Subscript
178 "a[b:c]",
179 # Name
180 "v",
181 # List
182 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500183 # Empty list
184 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000185 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000186 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500187 # Tuple
188 "(1,2,3)",
189 # Empty tuple
190 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000191 # Combination
192 "a.b.c.d(a.b[1:2])",
193
Tim Peters400cbc32006-02-28 18:44:41 +0000194]
195
196# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
197# excepthandler, arguments, keywords, alias
198
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000199class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000200
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500201 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000202 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000203 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000204 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000205 node_pos = (ast_node.lineno, ast_node.col_offset)
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500206 self.assertTrue(node_pos >= parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000207 parent_pos = (ast_node.lineno, ast_node.col_offset)
208 for name in ast_node._fields:
209 value = getattr(ast_node, name)
210 if isinstance(value, list):
211 for child in value:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500212 self._assertTrueorder(child, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000213 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500214 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000215
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500216 def test_AST_objects(self):
217 x = ast.AST()
218 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700219 x.foobar = 42
220 self.assertEqual(x.foobar, 42)
221 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500222
223 with self.assertRaises(AttributeError):
224 x.vararg
225
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500226 with self.assertRaises(TypeError):
227 # "_ast.AST constructor takes 0 positional arguments"
228 ast.AST(2)
229
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700230 def test_AST_garbage_collection(self):
231 class X:
232 pass
233 a = ast.AST()
234 a.x = X()
235 a.x.a = a
236 ref = weakref.ref(a.x)
237 del a
238 support.gc_collect()
239 self.assertIsNone(ref())
240
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000241 def test_snippets(self):
242 for input, output, kind in ((exec_tests, exec_results, "exec"),
243 (single_tests, single_results, "single"),
244 (eval_tests, eval_results, "eval")):
245 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400246 with self.subTest(action="parsing", input=i):
247 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
248 self.assertEqual(to_tuple(ast_tree), o)
249 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100250 with self.subTest(action="compiling", input=i, kind=kind):
251 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000252
Benjamin Peterson78565b22009-06-28 19:19:51 +0000253 def test_slice(self):
254 slc = ast.parse("x[::]").body[0].value.slice
255 self.assertIsNone(slc.upper)
256 self.assertIsNone(slc.lower)
257 self.assertIsNone(slc.step)
258
259 def test_from_import(self):
260 im = ast.parse("from . import y").body[0]
261 self.assertIsNone(im.module)
262
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400263 def test_non_interned_future_from_ast(self):
264 mod = ast.parse("from __future__ import division")
265 self.assertIsInstance(mod.body[0], ast.ImportFrom)
266 mod.body[0].module = " __future__ ".strip()
267 compile(mod, "<test>", "exec")
268
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000269 def test_base_classes(self):
270 self.assertTrue(issubclass(ast.For, ast.stmt))
271 self.assertTrue(issubclass(ast.Name, ast.expr))
272 self.assertTrue(issubclass(ast.stmt, ast.AST))
273 self.assertTrue(issubclass(ast.expr, ast.AST))
274 self.assertTrue(issubclass(ast.comprehension, ast.AST))
275 self.assertTrue(issubclass(ast.Gt, ast.AST))
276
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500277 def test_field_attr_existence(self):
278 for name, item in ast.__dict__.items():
279 if isinstance(item, type) and name != 'AST' and name[0].isupper():
280 x = item()
281 if isinstance(x, ast.AST):
282 self.assertEqual(type(x._fields), tuple)
283
284 def test_arguments(self):
285 x = ast.arguments()
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500286 self.assertEqual(x._fields, ('args', 'vararg', 'kwonlyargs',
287 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500288
289 with self.assertRaises(AttributeError):
290 x.vararg
291
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700292 x = ast.arguments(*range(1, 7))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500293 self.assertEqual(x.vararg, 2)
294
295 def test_field_attr_writable(self):
296 x = ast.Num()
297 # We can assign to _fields
298 x._fields = 666
299 self.assertEqual(x._fields, 666)
300
301 def test_classattrs(self):
302 x = ast.Num()
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300303 self.assertEqual(x._fields, ('value',))
304
305 with self.assertRaises(AttributeError):
306 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500307
308 with self.assertRaises(AttributeError):
309 x.n
310
311 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300312 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500313 self.assertEqual(x.n, 42)
314
315 with self.assertRaises(AttributeError):
316 x.lineno
317
318 with self.assertRaises(AttributeError):
319 x.foobar
320
321 x = ast.Num(lineno=2)
322 self.assertEqual(x.lineno, 2)
323
324 x = ast.Num(42, lineno=0)
325 self.assertEqual(x.lineno, 0)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300326 self.assertEqual(x._fields, ('value',))
327 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500328 self.assertEqual(x.n, 42)
329
330 self.assertRaises(TypeError, ast.Num, 1, 2)
331 self.assertRaises(TypeError, ast.Num, 1, 2, lineno=0)
332
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300333 self.assertEqual(ast.Num(42).n, 42)
334 self.assertEqual(ast.Num(4.25).n, 4.25)
335 self.assertEqual(ast.Num(4.25j).n, 4.25j)
336 self.assertEqual(ast.Str('42').s, '42')
337 self.assertEqual(ast.Bytes(b'42').s, b'42')
338 self.assertIs(ast.NameConstant(True).value, True)
339 self.assertIs(ast.NameConstant(False).value, False)
340 self.assertIs(ast.NameConstant(None).value, None)
341
342 self.assertEqual(ast.Constant(42).value, 42)
343 self.assertEqual(ast.Constant(4.25).value, 4.25)
344 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
345 self.assertEqual(ast.Constant('42').value, '42')
346 self.assertEqual(ast.Constant(b'42').value, b'42')
347 self.assertIs(ast.Constant(True).value, True)
348 self.assertIs(ast.Constant(False).value, False)
349 self.assertIs(ast.Constant(None).value, None)
350 self.assertIs(ast.Constant(...).value, ...)
351
352 def test_realtype(self):
353 self.assertEqual(type(ast.Num(42)), ast.Constant)
354 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
355 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
356 self.assertEqual(type(ast.Str('42')), ast.Constant)
357 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
358 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
359 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
360 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
361 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
362
363 def test_isinstance(self):
364 self.assertTrue(isinstance(ast.Num(42), ast.Num))
365 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
366 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
367 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
368 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
369 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
370 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
371 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
372 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
373
374 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
375 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
376 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
377 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
378 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
379 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
380 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
381 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
382 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
383
384 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
385 self.assertFalse(isinstance(ast.Num(42), ast.Str))
386 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
387 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
388 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
389
390 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
391 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
392 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
393 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
394 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
395
396 self.assertFalse(isinstance(ast.Constant(), ast.Num))
397 self.assertFalse(isinstance(ast.Constant(), ast.Str))
398 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
399 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
400 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
401
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200402 class S(str): pass
403 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
404 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
405
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300406 def test_subclasses(self):
407 class N(ast.Num):
408 def __init__(self, *args, **kwargs):
409 super().__init__(*args, **kwargs)
410 self.z = 'spam'
411 class N2(ast.Num):
412 pass
413
414 n = N(42)
415 self.assertEqual(n.n, 42)
416 self.assertEqual(n.z, 'spam')
417 self.assertEqual(type(n), N)
418 self.assertTrue(isinstance(n, N))
419 self.assertTrue(isinstance(n, ast.Num))
420 self.assertFalse(isinstance(n, N2))
421 self.assertFalse(isinstance(ast.Num(42), N))
422 n = N(n=42)
423 self.assertEqual(n.n, 42)
424 self.assertEqual(type(n), N)
425
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500426 def test_module(self):
427 body = [ast.Num(42)]
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300428 x = ast.Module(body)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500429 self.assertEqual(x.body, body)
430
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000431 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100432 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500433 x = ast.BinOp()
434 self.assertEqual(x._fields, ('left', 'op', 'right'))
435
436 # Random attribute allowed too
437 x.foobarbaz = 5
438 self.assertEqual(x.foobarbaz, 5)
439
440 n1 = ast.Num(1)
441 n3 = ast.Num(3)
442 addop = ast.Add()
443 x = ast.BinOp(n1, addop, n3)
444 self.assertEqual(x.left, n1)
445 self.assertEqual(x.op, addop)
446 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500447
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500448 x = ast.BinOp(1, 2, 3)
449 self.assertEqual(x.left, 1)
450 self.assertEqual(x.op, 2)
451 self.assertEqual(x.right, 3)
452
Georg Brandl0c77a822008-06-10 16:37:50 +0000453 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000454 self.assertEqual(x.left, 1)
455 self.assertEqual(x.op, 2)
456 self.assertEqual(x.right, 3)
457 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000458
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500459 # node raises exception when given too many arguments
460 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500461 # node raises exception when given too many arguments
462 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000463
464 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000465 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000466 self.assertEqual(x.left, 1)
467 self.assertEqual(x.op, 2)
468 self.assertEqual(x.right, 3)
469 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000470
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500471 # Random kwargs also allowed
472 x = ast.BinOp(1, 2, 3, foobarbaz=42)
473 self.assertEqual(x.foobarbaz, 42)
474
475 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000476 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000477 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500478 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000479
480 def test_pickling(self):
481 import pickle
482 mods = [pickle]
483 try:
484 import cPickle
485 mods.append(cPickle)
486 except ImportError:
487 pass
488 protocols = [0, 1, 2]
489 for mod in mods:
490 for protocol in protocols:
491 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
492 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000493 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000494
Benjamin Peterson5b066812010-11-20 01:38:49 +0000495 def test_invalid_sum(self):
496 pos = dict(lineno=2, col_offset=3)
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300497 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000498 with self.assertRaises(TypeError) as cm:
499 compile(m, "<test>", "exec")
500 self.assertIn("but got <_ast.expr", str(cm.exception))
501
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500502 def test_invalid_identitifer(self):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300503 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500504 ast.fix_missing_locations(m)
505 with self.assertRaises(TypeError) as cm:
506 compile(m, "<test>", "exec")
507 self.assertIn("identifier must be of type str", str(cm.exception))
508
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000509 def test_empty_yield_from(self):
510 # Issue 16546: yield from value is not optional.
511 empty_yield_from = ast.parse("def f():\n yield from g()")
512 empty_yield_from.body[0].body[0].value.value = None
513 with self.assertRaises(ValueError) as cm:
514 compile(empty_yield_from, "<test>", "exec")
515 self.assertIn("field value is required", str(cm.exception))
516
Oren Milman7dc46d82017-09-30 20:16:24 +0300517 @support.cpython_only
518 def test_issue31592(self):
519 # There shouldn't be an assertion failure in case of a bad
520 # unicodedata.normalize().
521 import unicodedata
522 def bad_normalize(*args):
523 return None
524 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
525 self.assertRaises(TypeError, ast.parse, '\u03D5')
526
Georg Brandl0c77a822008-06-10 16:37:50 +0000527
528class ASTHelpers_Test(unittest.TestCase):
529
530 def test_parse(self):
531 a = ast.parse('foo(1 + 1)')
532 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
533 self.assertEqual(ast.dump(a), ast.dump(b))
534
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400535 def test_parse_in_error(self):
536 try:
537 1/0
538 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400539 with self.assertRaises(SyntaxError) as e:
540 ast.literal_eval(r"'\U'")
541 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400542
Georg Brandl0c77a822008-06-10 16:37:50 +0000543 def test_dump(self):
544 node = ast.parse('spam(eggs, "and cheese")')
545 self.assertEqual(ast.dump(node),
546 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300547 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], "
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300548 "keywords=[]))])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000549 )
550 self.assertEqual(ast.dump(node, annotate_fields=False),
551 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300552 "Constant('and cheese')], []))])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000553 )
554 self.assertEqual(ast.dump(node, include_attributes=True),
555 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
556 "lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300557 "lineno=1, col_offset=5), Constant(value='and cheese', lineno=1, "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400558 "col_offset=11)], keywords=[], "
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300559 "lineno=1, col_offset=0), lineno=1, col_offset=0)])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000560 )
561
562 def test_copy_location(self):
563 src = ast.parse('1 + 1', mode='eval')
564 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
565 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300566 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0), '
567 'op=Add(), right=Constant(value=2, lineno=1, col_offset=4), lineno=1, '
Georg Brandl0c77a822008-06-10 16:37:50 +0000568 'col_offset=0))'
569 )
570
571 def test_fix_missing_locations(self):
572 src = ast.parse('write("spam")')
573 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400574 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000575 self.assertEqual(src, ast.fix_missing_locations(src))
576 self.assertEqual(ast.dump(src, include_attributes=True),
577 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300578 "lineno=1, col_offset=0), args=[Constant(value='spam', lineno=1, "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400579 "col_offset=6)], keywords=[], "
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500580 "lineno=1, col_offset=0), lineno=1, col_offset=0), "
Georg Brandl0c77a822008-06-10 16:37:50 +0000581 "Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300582 "col_offset=0), args=[Constant(value='eggs', lineno=1, col_offset=0)], "
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400583 "keywords=[], lineno=1, "
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300584 "col_offset=0), lineno=1, col_offset=0)])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000585 )
586
587 def test_increment_lineno(self):
588 src = ast.parse('1 + 1', mode='eval')
589 self.assertEqual(ast.increment_lineno(src, n=3), src)
590 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300591 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0), '
592 'op=Add(), right=Constant(value=1, lineno=4, col_offset=4), lineno=4, '
Georg Brandl0c77a822008-06-10 16:37:50 +0000593 'col_offset=0))'
594 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000595 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000596 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000597 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
598 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300599 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0), '
600 'op=Add(), right=Constant(value=1, lineno=4, col_offset=4), lineno=4, '
Georg Brandl619e7ba2011-01-09 07:38:51 +0000601 'col_offset=0))'
602 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000603
604 def test_iter_fields(self):
605 node = ast.parse('foo()', mode='eval')
606 d = dict(ast.iter_fields(node.body))
607 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400608 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000609
610 def test_iter_child_nodes(self):
611 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
612 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
613 iterator = ast.iter_child_nodes(node.body)
614 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300615 self.assertEqual(next(iterator).value, 23)
616 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000617 self.assertEqual(ast.dump(next(iterator)),
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300618 "keyword(arg='eggs', value=Constant(value='leek'))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000619 )
620
621 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300622 node = ast.parse('"""line one\n line two"""')
623 self.assertEqual(ast.get_docstring(node),
624 'line one\nline two')
625
626 node = ast.parse('class foo:\n """line one\n line two"""')
627 self.assertEqual(ast.get_docstring(node.body[0]),
628 'line one\nline two')
629
Georg Brandl0c77a822008-06-10 16:37:50 +0000630 node = ast.parse('def foo():\n """line one\n line two"""')
631 self.assertEqual(ast.get_docstring(node.body[0]),
632 'line one\nline two')
633
Yury Selivanov2f07a662015-07-23 08:54:35 +0300634 node = ast.parse('async def foo():\n """spam\n ham"""')
635 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300636
637 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800638 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300639 node = ast.parse('x = "not docstring"')
640 self.assertIsNone(ast.get_docstring(node))
641 node = ast.parse('def foo():\n pass')
642 self.assertIsNone(ast.get_docstring(node))
643
644 node = ast.parse('class foo:\n pass')
645 self.assertIsNone(ast.get_docstring(node.body[0]))
646 node = ast.parse('class foo:\n x = "not docstring"')
647 self.assertIsNone(ast.get_docstring(node.body[0]))
648 node = ast.parse('class foo:\n def bar(self): pass')
649 self.assertIsNone(ast.get_docstring(node.body[0]))
650
651 node = ast.parse('def foo():\n pass')
652 self.assertIsNone(ast.get_docstring(node.body[0]))
653 node = ast.parse('def foo():\n x = "not docstring"')
654 self.assertIsNone(ast.get_docstring(node.body[0]))
655
656 node = ast.parse('async def foo():\n pass')
657 self.assertIsNone(ast.get_docstring(node.body[0]))
658 node = ast.parse('async def foo():\n x = "not docstring"')
659 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300660
Georg Brandl0c77a822008-06-10 16:37:50 +0000661 def test_literal_eval(self):
662 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
663 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
664 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000665 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000666 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000667 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200668 self.assertEqual(ast.literal_eval('6'), 6)
669 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000670 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000671 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200672 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
673 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
674 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
675 self.assertRaises(ValueError, ast.literal_eval, '++6')
676 self.assertRaises(ValueError, ast.literal_eval, '+True')
677 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000678
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200679 def test_literal_eval_complex(self):
680 # Issue #4907
681 self.assertEqual(ast.literal_eval('6j'), 6j)
682 self.assertEqual(ast.literal_eval('-6j'), -6j)
683 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
684 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
685 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
686 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
687 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
688 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
689 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
690 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
691 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
692 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
693 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
694 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
695 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
696 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
697 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
698 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000699
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100700 def test_bad_integer(self):
701 # issue13436: Bad error message with invalid numeric values
702 body = [ast.ImportFrom(module='time',
703 names=[ast.alias(name='sleep')],
704 level=None,
705 lineno=None, col_offset=None)]
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300706 mod = ast.Module(body)
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100707 with self.assertRaises(ValueError) as cm:
708 compile(mod, 'test', 'exec')
709 self.assertIn("invalid integer value: None", str(cm.exception))
710
Berker Peksag0a5bd512016-04-29 19:50:02 +0300711 def test_level_as_none(self):
712 body = [ast.ImportFrom(module='time',
713 names=[ast.alias(name='sleep')],
714 level=None,
715 lineno=0, col_offset=0)]
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300716 mod = ast.Module(body)
Berker Peksag0a5bd512016-04-29 19:50:02 +0300717 code = compile(mod, 'test', 'exec')
718 ns = {}
719 exec(code, ns)
720 self.assertIn('sleep', ns)
721
Georg Brandl0c77a822008-06-10 16:37:50 +0000722
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500723class ASTValidatorTests(unittest.TestCase):
724
725 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
726 mod.lineno = mod.col_offset = 0
727 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300728 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500729 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300730 else:
731 with self.assertRaises(exc) as cm:
732 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500733 self.assertIn(msg, str(cm.exception))
734
735 def expr(self, node, msg=None, *, exc=ValueError):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300736 mod = ast.Module([ast.Expr(node)])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500737 self.mod(mod, msg, exc=exc)
738
739 def stmt(self, stmt, msg=None):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300740 mod = ast.Module([stmt])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500741 self.mod(mod, msg)
742
743 def test_module(self):
744 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
745 self.mod(m, "must have Load context", "single")
746 m = ast.Expression(ast.Name("x", ast.Store()))
747 self.mod(m, "must have Load context", "eval")
748
749 def _check_arguments(self, fac, check):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700750 def arguments(args=None, vararg=None,
751 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500752 defaults=None, kw_defaults=None):
753 if args is None:
754 args = []
755 if kwonlyargs is None:
756 kwonlyargs = []
757 if defaults is None:
758 defaults = []
759 if kw_defaults is None:
760 kw_defaults = []
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700761 args = ast.arguments(args, vararg, kwonlyargs, kw_defaults,
762 kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500763 return fac(args)
764 args = [ast.arg("x", ast.Name("x", ast.Store()))]
765 check(arguments(args=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500766 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500767 check(arguments(defaults=[ast.Num(3)]),
768 "more positional defaults than args")
769 check(arguments(kw_defaults=[ast.Num(4)]),
770 "length of kwonlyargs is not the same as kw_defaults")
771 args = [ast.arg("x", ast.Name("x", ast.Load()))]
772 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
773 "must have Load context")
774 args = [ast.arg("a", ast.Name("x", ast.Load())),
775 ast.arg("b", ast.Name("y", ast.Load()))]
776 check(arguments(kwonlyargs=args,
777 kw_defaults=[None, ast.Name("x", ast.Store())]),
778 "must have Load context")
779
780 def test_funcdef(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700781 a = ast.arguments([], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300782 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500783 self.stmt(f, "empty body on FunctionDef")
784 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300785 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500786 self.stmt(f, "must have Load context")
787 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300788 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500789 self.stmt(f, "must have Load context")
790 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300791 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500792 self._check_arguments(fac, self.stmt)
793
794 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400795 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500796 if bases is None:
797 bases = []
798 if keywords is None:
799 keywords = []
800 if body is None:
801 body = [ast.Pass()]
802 if decorator_list is None:
803 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400804 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300805 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500806 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
807 "must have Load context")
808 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
809 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500810 self.stmt(cls(body=[]), "empty body on ClassDef")
811 self.stmt(cls(body=[None]), "None disallowed")
812 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
813 "must have Load context")
814
815 def test_delete(self):
816 self.stmt(ast.Delete([]), "empty targets on Delete")
817 self.stmt(ast.Delete([None]), "None disallowed")
818 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
819 "must have Del context")
820
821 def test_assign(self):
822 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
823 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
824 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
825 "must have Store context")
826 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
827 ast.Name("y", ast.Store())),
828 "must have Load context")
829
830 def test_augassign(self):
831 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
832 ast.Name("y", ast.Load()))
833 self.stmt(aug, "must have Store context")
834 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
835 ast.Name("y", ast.Store()))
836 self.stmt(aug, "must have Load context")
837
838 def test_for(self):
839 x = ast.Name("x", ast.Store())
840 y = ast.Name("y", ast.Load())
841 p = ast.Pass()
842 self.stmt(ast.For(x, y, [], []), "empty body on For")
843 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
844 "must have Store context")
845 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
846 "must have Load context")
847 e = ast.Expr(ast.Name("x", ast.Store()))
848 self.stmt(ast.For(x, y, [e], []), "must have Load context")
849 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
850
851 def test_while(self):
852 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
853 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
854 "must have Load context")
855 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
856 [ast.Expr(ast.Name("x", ast.Store()))]),
857 "must have Load context")
858
859 def test_if(self):
860 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
861 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
862 self.stmt(i, "must have Load context")
863 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
864 self.stmt(i, "must have Load context")
865 i = ast.If(ast.Num(3), [ast.Pass()],
866 [ast.Expr(ast.Name("x", ast.Store()))])
867 self.stmt(i, "must have Load context")
868
869 def test_with(self):
870 p = ast.Pass()
871 self.stmt(ast.With([], [p]), "empty items on With")
872 i = ast.withitem(ast.Num(3), None)
873 self.stmt(ast.With([i], []), "empty body on With")
874 i = ast.withitem(ast.Name("x", ast.Store()), None)
875 self.stmt(ast.With([i], [p]), "must have Load context")
876 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
877 self.stmt(ast.With([i], [p]), "must have Store context")
878
879 def test_raise(self):
880 r = ast.Raise(None, ast.Num(3))
881 self.stmt(r, "Raise with cause but no exception")
882 r = ast.Raise(ast.Name("x", ast.Store()), None)
883 self.stmt(r, "must have Load context")
884 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
885 self.stmt(r, "must have Load context")
886
887 def test_try(self):
888 p = ast.Pass()
889 t = ast.Try([], [], [], [p])
890 self.stmt(t, "empty body on Try")
891 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
892 self.stmt(t, "must have Load context")
893 t = ast.Try([p], [], [], [])
894 self.stmt(t, "Try has neither except handlers nor finalbody")
895 t = ast.Try([p], [], [p], [p])
896 self.stmt(t, "Try has orelse but no except handlers")
897 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
898 self.stmt(t, "empty body on ExceptHandler")
899 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
900 self.stmt(ast.Try([p], e, [], []), "must have Load context")
901 e = [ast.ExceptHandler(None, "x", [p])]
902 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
903 self.stmt(t, "must have Load context")
904 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
905 self.stmt(t, "must have Load context")
906
907 def test_assert(self):
908 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
909 "must have Load context")
910 assrt = ast.Assert(ast.Name("x", ast.Load()),
911 ast.Name("y", ast.Store()))
912 self.stmt(assrt, "must have Load context")
913
914 def test_import(self):
915 self.stmt(ast.Import([]), "empty names on Import")
916
917 def test_importfrom(self):
918 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +0300919 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500920 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
921
922 def test_global(self):
923 self.stmt(ast.Global([]), "empty names on Global")
924
925 def test_nonlocal(self):
926 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
927
928 def test_expr(self):
929 e = ast.Expr(ast.Name("x", ast.Store()))
930 self.stmt(e, "must have Load context")
931
932 def test_boolop(self):
933 b = ast.BoolOp(ast.And(), [])
934 self.expr(b, "less than 2 values")
935 b = ast.BoolOp(ast.And(), [ast.Num(3)])
936 self.expr(b, "less than 2 values")
937 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
938 self.expr(b, "None disallowed")
939 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
940 self.expr(b, "must have Load context")
941
942 def test_unaryop(self):
943 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
944 self.expr(u, "must have Load context")
945
946 def test_lambda(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700947 a = ast.arguments([], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500948 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
949 "must have Load context")
950 def fac(args):
951 return ast.Lambda(args, ast.Name("x", ast.Load()))
952 self._check_arguments(fac, self.expr)
953
954 def test_ifexp(self):
955 l = ast.Name("x", ast.Load())
956 s = ast.Name("y", ast.Store())
957 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -0500958 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500959
960 def test_dict(self):
961 d = ast.Dict([], [ast.Name("x", ast.Load())])
962 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500963 d = ast.Dict([ast.Name("x", ast.Load())], [None])
964 self.expr(d, "None disallowed")
965
966 def test_set(self):
967 self.expr(ast.Set([None]), "None disallowed")
968 s = ast.Set([ast.Name("x", ast.Store())])
969 self.expr(s, "must have Load context")
970
971 def _check_comprehension(self, fac):
972 self.expr(fac([]), "comprehension with no generators")
973 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700974 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500975 self.expr(fac([g]), "must have Store context")
976 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700977 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500978 self.expr(fac([g]), "must have Load context")
979 x = ast.Name("x", ast.Store())
980 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700981 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500982 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700983 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500984 self.expr(fac([g]), "must have Load context")
985
986 def _simple_comp(self, fac):
987 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700988 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500989 self.expr(fac(ast.Name("x", ast.Store()), [g]),
990 "must have Load context")
991 def wrap(gens):
992 return fac(ast.Name("x", ast.Store()), gens)
993 self._check_comprehension(wrap)
994
995 def test_listcomp(self):
996 self._simple_comp(ast.ListComp)
997
998 def test_setcomp(self):
999 self._simple_comp(ast.SetComp)
1000
1001 def test_generatorexp(self):
1002 self._simple_comp(ast.GeneratorExp)
1003
1004 def test_dictcomp(self):
1005 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001006 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001007 c = ast.DictComp(ast.Name("x", ast.Store()),
1008 ast.Name("y", ast.Load()), [g])
1009 self.expr(c, "must have Load context")
1010 c = ast.DictComp(ast.Name("x", ast.Load()),
1011 ast.Name("y", ast.Store()), [g])
1012 self.expr(c, "must have Load context")
1013 def factory(comps):
1014 k = ast.Name("x", ast.Load())
1015 v = ast.Name("y", ast.Load())
1016 return ast.DictComp(k, v, comps)
1017 self._check_comprehension(factory)
1018
1019 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001020 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1021 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001022
1023 def test_compare(self):
1024 left = ast.Name("x", ast.Load())
1025 comp = ast.Compare(left, [ast.In()], [])
1026 self.expr(comp, "no comparators")
1027 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1028 self.expr(comp, "different number of comparators and operands")
1029 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001030 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001031 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001032 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001033
1034 def test_call(self):
1035 func = ast.Name("x", ast.Load())
1036 args = [ast.Name("y", ast.Load())]
1037 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001038 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001039 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001040 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001041 self.expr(call, "None disallowed")
1042 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001043 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001044 self.expr(call, "must have Load context")
1045
1046 def test_num(self):
1047 class subint(int):
1048 pass
1049 class subfloat(float):
1050 pass
1051 class subcomplex(complex):
1052 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001053 for obj in "0", "hello":
1054 self.expr(ast.Num(obj))
1055 for obj in subint(), subfloat(), subcomplex():
1056 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001057
1058 def test_attribute(self):
1059 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1060 self.expr(attr, "must have Load context")
1061
1062 def test_subscript(self):
1063 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1064 ast.Load())
1065 self.expr(sub, "must have Load context")
1066 x = ast.Name("x", ast.Load())
1067 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1068 ast.Load())
1069 self.expr(sub, "must have Load context")
1070 s = ast.Name("x", ast.Store())
1071 for args in (s, None, None), (None, s, None), (None, None, s):
1072 sl = ast.Slice(*args)
1073 self.expr(ast.Subscript(x, sl, ast.Load()),
1074 "must have Load context")
1075 sl = ast.ExtSlice([])
1076 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1077 sl = ast.ExtSlice([ast.Index(s)])
1078 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1079
1080 def test_starred(self):
1081 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1082 ast.Store())
1083 assign = ast.Assign([left], ast.Num(4))
1084 self.stmt(assign, "must have Store context")
1085
1086 def _sequence(self, fac):
1087 self.expr(fac([None], ast.Load()), "None disallowed")
1088 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1089 "must have Load context")
1090
1091 def test_list(self):
1092 self._sequence(ast.List)
1093
1094 def test_tuple(self):
1095 self._sequence(ast.Tuple)
1096
Benjamin Peterson442f2092012-12-06 17:41:04 -05001097 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001098 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001099
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001100 def test_stdlib_validates(self):
1101 stdlib = os.path.dirname(ast.__file__)
1102 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1103 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1104 for module in tests:
1105 fn = os.path.join(stdlib, module)
1106 with open(fn, "r", encoding="utf-8") as fp:
1107 source = fp.read()
Victor Stinnerd502a072013-03-22 00:06:20 +01001108 mod = ast.parse(source, fn)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001109 compile(mod, fn, "exec")
1110
1111
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001112class ConstantTests(unittest.TestCase):
1113 """Tests on the ast.Constant node type."""
1114
1115 def compile_constant(self, value):
1116 tree = ast.parse("x = 123")
1117
1118 node = tree.body[0].value
1119 new_node = ast.Constant(value=value)
1120 ast.copy_location(new_node, node)
1121 tree.body[0].value = new_node
1122
1123 code = compile(tree, "<string>", "exec")
1124
1125 ns = {}
1126 exec(code, ns)
1127 return ns['x']
1128
Victor Stinnerbe59d142016-01-27 00:39:12 +01001129 def test_validation(self):
1130 with self.assertRaises(TypeError) as cm:
1131 self.compile_constant([1, 2, 3])
1132 self.assertEqual(str(cm.exception),
1133 "got an invalid type in Constant: list")
1134
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001135 def test_singletons(self):
1136 for const in (None, False, True, Ellipsis, b'', frozenset()):
1137 with self.subTest(const=const):
1138 value = self.compile_constant(const)
1139 self.assertIs(value, const)
1140
1141 def test_values(self):
1142 nested_tuple = (1,)
1143 nested_frozenset = frozenset({1})
1144 for level in range(3):
1145 nested_tuple = (nested_tuple, 2)
1146 nested_frozenset = frozenset({nested_frozenset, 2})
1147 values = (123, 123.0, 123j,
1148 "unicode", b'bytes',
1149 tuple("tuple"), frozenset("frozenset"),
1150 nested_tuple, nested_frozenset)
1151 for value in values:
1152 with self.subTest(value=value):
1153 result = self.compile_constant(value)
1154 self.assertEqual(result, value)
1155
1156 def test_assign_to_constant(self):
1157 tree = ast.parse("x = 1")
1158
1159 target = tree.body[0].targets[0]
1160 new_target = ast.Constant(value=1)
1161 ast.copy_location(new_target, target)
1162 tree.body[0].targets[0] = new_target
1163
1164 with self.assertRaises(ValueError) as cm:
1165 compile(tree, "string", "exec")
1166 self.assertEqual(str(cm.exception),
1167 "expression which can't be assigned "
1168 "to in Store context")
1169
1170 def test_get_docstring(self):
1171 tree = ast.parse("'docstring'\nx = 1")
1172 self.assertEqual(ast.get_docstring(tree), 'docstring')
1173
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001174 def get_load_const(self, tree):
1175 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1176 # instructions
1177 co = compile(tree, '<string>', 'exec')
1178 consts = []
1179 for instr in dis.get_instructions(co):
1180 if instr.opname == 'LOAD_CONST':
1181 consts.append(instr.argval)
1182 return consts
1183
1184 @support.cpython_only
1185 def test_load_const(self):
1186 consts = [None,
1187 True, False,
1188 124,
1189 2.0,
1190 3j,
1191 "unicode",
1192 b'bytes',
1193 (1, 2, 3)]
1194
Victor Stinnera2724092016-02-08 18:17:58 +01001195 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1196 code += '\nx = ...'
1197 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001198
1199 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001200 self.assertEqual(self.get_load_const(tree),
1201 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001202
1203 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001204 for assign, const in zip(tree.body, consts):
1205 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001206 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001207 ast.copy_location(new_node, assign.value)
1208 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001209
Victor Stinnera2724092016-02-08 18:17:58 +01001210 self.assertEqual(self.get_load_const(tree),
1211 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001212
1213 def test_literal_eval(self):
1214 tree = ast.parse("1 + 2")
1215 binop = tree.body[0].value
1216
1217 new_left = ast.Constant(value=10)
1218 ast.copy_location(new_left, binop.left)
1219 binop.left = new_left
1220
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001221 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001222 ast.copy_location(new_right, binop.right)
1223 binop.right = new_right
1224
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001225 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001226
1227
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001228def main():
1229 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001230 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001231 if sys.argv[1:] == ['-g']:
1232 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1233 (eval_tests, "eval")):
1234 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001235 for statement in statements:
1236 tree = ast.parse(statement, "?", kind)
1237 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001238 print("]")
1239 print("main()")
1240 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001241 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001242
1243#### EVERYTHING BELOW IS GENERATED #####
1244exec_results = [
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001245('Module', [('Expr', (1, 0), ('Constant', (1, 0), None))]),
1246('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring'))]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001247('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None)]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001248('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring'))], [], None)]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001249('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, []), [('Pass', (1, 10))], [], None)]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001250('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, [('Constant', (1, 8), 0)]), [('Pass', (1, 12))], [], None)]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001251('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None), [], [], None, []), [('Pass', (1, 14))], [], None)]),
1252('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None), []), [('Pass', (1, 17))], [], None)]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001253('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None), ('arg', (1, 9), 'b', None), ('arg', (1, 14), 'c', None), ('arg', (1, 22), 'd', None), ('arg', (1, 28), 'e', None)], ('arg', (1, 35), 'args', None), [('arg', (1, 41), 'f', None)], [('Constant', (1, 43), 42)], ('arg', (1, 49), 'kwargs', None), [('Constant', (1, 11), 1), ('Constant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()'))], [], None)]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001254('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001255('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C'))], [])]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001256('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001257('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1))], [], None)]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001258('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001259('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1))]),
1260('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1))]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001261('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]),
1262('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
1263('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
1264('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))])]),
1265('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))])]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001266('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string')], []), None)]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001267('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])]),
1268('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])]),
1269('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
1270('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
1271('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
1272('Module', [('Global', (1, 0), ['v'])]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001273('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1))]),
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001274('Module', [('Pass', (1, 0))]),
1275('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [])]),
1276('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [])]),
1277('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [])]),
1278('Module', [('Expr', (1, 0), ('ListComp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)]))]),
1279('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)]))]),
1280('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 12), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)]))]),
1281('Module', [('Expr', (1, 0), ('GeneratorExp', (2, 4), ('Tuple', (3, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))]),
1282('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))]),
1283('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))]),
1284('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))]),
1285('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))]),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001286('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function')), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None)]),
1287('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1))], [('Expr', (3, 7), ('Constant', (3, 7), 2))])], [], None)]),
1288('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1))])], [], None)]),
1289('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2)], [('Dict', (1, 3), [('Constant', (1, 4), 1)], [('Constant', (1, 6), 2)]), ('Constant', (1, 12), 3)]))]),
1290('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1), ('Constant', (1, 6), 2)]), ('Load',)), ('Constant', (1, 10), 3)]))]),
guoci90fc8982018-09-11 17:45:45 -04001291('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 2), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None)]),
Tim Peters400cbc32006-02-28 18:44:41 +00001292]
1293single_results = [
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001294('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1), ('Add',), ('Constant', (1, 2), 2)))]),
Tim Peters400cbc32006-02-28 18:44:41 +00001295]
1296eval_results = [
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001297('Expression', ('Constant', (1, 0), None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001298('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1299('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1300('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001301('Expression', ('Lambda', (1, 0), ('arguments', [], None, [], [], None, []), ('Constant', (1, 7), None))),
1302('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1)], [('Constant', (1, 4), 2)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001303('Expression', ('Dict', (1, 0), [], [])),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001304('Expression', ('Set', (1, 0), [('Constant', (1, 1), None)])),
1305('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1)], [('Constant', (4, 10), 2)])),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001306('Expression', ('ListComp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])),
1307('Expression', ('GeneratorExp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001308('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2), ('Constant', (1, 8), 3)])),
1309('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1), ('Constant', (1, 4), 2), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])),
1310('Expression', ('Constant', (1, 0), 10)),
1311('Expression', ('Constant', (1, 0), 'string')),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001312('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1313('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001314('Expression', ('Name', (1, 0), 'v', ('Load',))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001315('Expression', ('List', (1, 0), [('Constant', (1, 1), 1), ('Constant', (1, 3), 2), ('Constant', (1, 5), 3)], ('Load',))),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001316('Expression', ('List', (1, 0), [], ('Load',))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001317('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1), ('Constant', (1, 2), 2), ('Constant', (1, 4), 3)], ('Load',))),
1318('Expression', ('Tuple', (1, 1), [('Constant', (1, 1), 1), ('Constant', (1, 3), 2), ('Constant', (1, 5), 3)], ('Load',))),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001319('Expression', ('Tuple', (1, 0), [], ('Load',))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001320('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12), 1), ('Constant', (1, 14), 2), None), ('Load',))], [])),
Tim Peters400cbc32006-02-28 18:44:41 +00001321]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001322main()