1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys, itertools, unittest
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport ast
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef to_tuple(t):
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if t is None or isinstance(t, (basestring, int, long, complex)):
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return t
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    elif isinstance(t, list):
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return [to_tuple(e) for e in t]
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    result = [t.__class__.__name__]
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        result.append((t.lineno, t.col_offset))
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if t._fields is None:
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return tuple(result)
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    for f in t._fields:
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        result.append(to_tuple(getattr(t, f)))
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    return tuple(result)
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# These tests are compiled through "exec"
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# There should be atleast one test per statement
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexec_tests = [
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # None
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "None",
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # FunctionDef
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f(): pass",
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # FunctionDef with arg
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f(a): pass",
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # FunctionDef with arg and default value
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f(a=0): pass",
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # FunctionDef with varargs
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f(*args): pass",
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # FunctionDef with kwargs
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f(**kwargs): pass",
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # FunctionDef with all kind of args
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f(a, b=1, c=None, d=[], e={}, *args, **kwargs): pass",
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # ClassDef
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "class C:pass",
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # ClassDef, new style class
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "class C(object): pass",
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Return
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "def f():return 1",
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Delete
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "del v",
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Assign
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "v = 1",
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # AugAssign
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "v += 1",
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Print
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "print >>f, 1, ",
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # For
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "for v in v:pass",
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # While
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "while v:pass",
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # If
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "if v:pass",
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Raise
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "raise Exception, 'string'",
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # TryExcept
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "try:\n  pass\nexcept Exception:\n  pass",
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # TryFinally
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "try:\n  pass\nfinally:\n  pass",
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Assert
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "assert v",
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Import
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "import sys",
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # ImportFrom
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "from sys import v",
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Exec
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "exec 'v'",
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Global
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "global v",
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Expr
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "1",
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Pass,
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "pass",
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Break
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "break",
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Continue
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "continue",
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # for statements with naked tuples (see http://bugs.python.org/issue6704)
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "for a,b in c: pass",
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "[(a,b) for a,b in c]",
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "((a,b) for a,b in c)",
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "((a,b) for (a,b) in c)",
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Multiline generator expression (test for .lineno & .col_offset)
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """(
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    Aa
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ,
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh       Bb
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    )
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    for
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    Aa
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ,
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    Bb in Cc
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    )""",
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # dictcomp
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "{a : b for w in x for m in p if g}",
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # dictcomp with naked tuple
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "{a : b for v,w in x}",
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # setcomp
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "{r for l in x if g}",
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # setcomp with naked tuple
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "{r for l,m in x}",
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# These are compiled through "single"
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# because of overlap with "eval", it just tests what
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# can't be tested with "eval"
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehsingle_tests = [
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    "1+2"
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# These are compiled through "eval"
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# It should test all expressions
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieheval_tests = [
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # None
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "None",
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # BoolOp
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "a and b",
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # BinOp
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "a + b",
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # UnaryOp
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "not v",
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Lambda
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "lambda:None",
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Dict
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "{ 1:2 }",
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Empty dict
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "{}",
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Set
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "{None,}",
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Multiline dict (test for .lineno & .col_offset)
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  """{
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh      1
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        :
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          2
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh     }""",
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # ListComp
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "[a for b in c if d]",
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # GeneratorExp
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "(a for b in c if d)",
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Yield - yield expressions can't work outside a function
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  #
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Compare
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "1 < 2 < 3",
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Call
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "f(1,2,c=3,*d,**e)",
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Repr
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "`v`",
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Num
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "10L",
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Str
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "'string'",
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Attribute
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "a.b",
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Subscript
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "a[b:c]",
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Name
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "v",
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # List
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "[1,2,3]",
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Empty list
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "[]",
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Tuple
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "1,2,3",
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Tuple
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "(1,2,3)",
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Empty tuple
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "()",
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  # Combination
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh  "a.b.c.d(a.b[1:2])",
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# excepthandler, arguments, keywords, alias
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass AST_Tests(unittest.TestCase):
181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def _assertTrueorder(self, ast_node, parent_pos):
183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return
185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            node_pos = (ast_node.lineno, ast_node.col_offset)
187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(node_pos >= parent_pos)
188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parent_pos = (ast_node.lineno, ast_node.col_offset)
189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for name in ast_node._fields:
190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            value = getattr(ast_node, name)
191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if isinstance(value, list):
192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for child in value:
193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self._assertTrueorder(child, parent_pos)
194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            elif value is not None:
195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._assertTrueorder(value, parent_pos)
196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_AST_objects(self):
198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.AST()
199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, ())
200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x.vararg
203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x.foobar = 21
206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ast.AST(lineno=2)
209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(TypeError):
211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # "_ast.AST constructor takes 0 positional arguments"
212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ast.AST(2)
213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_snippets(self):
215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for input, output, kind in ((exec_tests, exec_results, "exec"),
216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                    (single_tests, single_results, "single"),
217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                    (eval_tests, eval_results, "eval")):
218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for i, o in itertools.izip(input, output):
219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertEqual(to_tuple(ast_tree), o)
221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._assertTrueorder(ast_tree, (0, 0))
222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_slice(self):
224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        slc = ast.parse("x[::]").body[0].value.slice
225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsNone(slc.upper)
226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsNone(slc.lower)
227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(slc.step, ast.Name)
228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(slc.step.id, "None")
229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_from_import(self):
231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        im = ast.parse("from . import y").body[0]
232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsNone(im.module)
233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_non_interned_future_from_ast(self):
235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        mod = ast.parse("from __future__ import division")
236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIsInstance(mod.body[0], ast.ImportFrom)
237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        mod.body[0].module = " __future__ ".strip()
238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        compile(mod, "<test>", "exec")
239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_base_classes(self):
241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(ast.For, ast.stmt))
242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(ast.Name, ast.expr))
243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(ast.stmt, ast.AST))
244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(ast.expr, ast.AST))
245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(ast.comprehension, ast.AST))
246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(issubclass(ast.Gt, ast.AST))
247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_field_attr_existence(self):
249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for name, item in ast.__dict__.iteritems():
250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if isinstance(item, type) and name != 'AST' and name[0].isupper():
251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                x = item()
252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if isinstance(x, ast.AST):
253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.assertEqual(type(x._fields), tuple)
254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_arguments(self):
256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.arguments()
257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, ('args', 'vararg', 'kwarg', 'defaults'))
258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x.vararg
261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.arguments(1, 2, 3, 4)
263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.vararg, 2)
264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_field_attr_writable(self):
266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Num()
267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # We can assign to _fields
268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x._fields = 666
269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, 666)
270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_classattrs(self):
272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Num()
273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, ('n',))
274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x.n
277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Num(42)
279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.n, 42)
280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x.lineno
283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(AttributeError):
285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x.foobar
286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Num(lineno=2)
288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.lineno, 2)
289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Num(42, lineno=0)
291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.lineno, 0)
292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, ('n',))
293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.n, 42)
294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, ast.Num, 1, 2)
296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, ast.Num, 1, 2, lineno=0)
297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_module(self):
299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        body = [ast.Num(42)]
300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Module(body)
301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.body, body)
302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nodeclasses(self):
304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Zero arguments constructor explicitely allowed
305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.BinOp()
306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, ('left', 'op', 'right'))
307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Random attribute allowed too
309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x.foobarbaz = 5
310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.foobarbaz, 5)
311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        n1 = ast.Num(1)
313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        n3 = ast.Num(3)
314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        addop = ast.Add()
315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.BinOp(n1, addop, n3)
316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.left, n1)
317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.op, addop)
318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.right, n3)
319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.BinOp(1, 2, 3)
321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.left, 1)
322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.op, 2)
323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.right, 3)
324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.BinOp(1, 2, 3, lineno=0)
326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.left, 1)
327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.op, 2)
328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.right, 3)
329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.lineno, 0)
330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # node raises exception when not given enough arguments
332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, ast.BinOp, 1, 2)
333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # node raises exception when given too many arguments
334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # node raises exception when not given enough arguments
336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, ast.BinOp, 1, 2, lineno=0)
337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # node raises exception when given too many arguments
338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # can set attributes through kwargs too
341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.BinOp(left=1, op=2, right=3, lineno=0)
342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.left, 1)
343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.op, 2)
344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.right, 3)
345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.lineno, 0)
346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Random kwargs also allowed
348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.BinOp(1, 2, 3, foobarbaz=42)
349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x.foobarbaz, 42)
350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_no_fields(self):
352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # this used to fail because Sub._fields was None
353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x = ast.Sub()
354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(x._fields, ())
355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_pickling(self):
357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        import pickle
358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        mods = [pickle]
359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            import cPickle
361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            mods.append(cPickle)
362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ImportError:
363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        protocols = [0, 1, 2]
365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for mod in mods:
366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for protocol in protocols:
367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ast2 = mod.loads(mod.dumps(ast, protocol))
369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    self.assertEqual(to_tuple(ast2), to_tuple(ast))
370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_identitifer(self):
372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        m = ast.Module([ast.Expr(ast.Name(u"x", ast.Load()))])
373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ast.fix_missing_locations(m)
374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(TypeError) as cm:
375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            compile(m, "<test>", "exec")
376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIn("identifier must be of type str", str(cm.exception))
377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_string(self):
379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        m = ast.Module([ast.Expr(ast.Str(43))])
380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ast.fix_missing_locations(m)
381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(TypeError) as cm:
382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            compile(m, "<test>", "exec")
383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIn("string must be of type str or uni", str(cm.exception))
384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ASTHelpers_Test(unittest.TestCase):
387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parse(self):
389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        a = ast.parse('foo(1 + 1)')
390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(a), ast.dump(b))
392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dump(self):
394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        node = ast.parse('spam(eggs, "and cheese")')
395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(node),
396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "args=[Name(id='eggs', ctx=Load()), Str(s='and cheese')], "
398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "keywords=[], starargs=None, kwargs=None))])"
399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(node, annotate_fields=False),
401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Str('and cheese')], [], None, None))])"
403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(node, include_attributes=True),
405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "lineno=1, col_offset=5), Str(s='and cheese', lineno=1, "
408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "col_offset=11)], keywords=[], starargs=None, kwargs=None, "
409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "lineno=1, col_offset=0), lineno=1, col_offset=0)])"
410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_copy_location(self):
413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        src = ast.parse('1 + 1', mode='eval')
414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        src.body.right = ast.copy_location(ast.Num(2), src.body.right)
415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(src, include_attributes=True),
416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'Expression(body=BinOp(left=Num(n=1, lineno=1, col_offset=0), '
417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'op=Add(), right=Num(n=2, lineno=1, col_offset=4), lineno=1, '
418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'col_offset=0))'
419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_fix_missing_locations(self):
422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        src = ast.parse('write("spam")')
423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                          [ast.Str('eggs')], [], None, None)))
425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(src, ast.fix_missing_locations(src))
426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(src, include_attributes=True),
427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, "
429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "col_offset=6)], keywords=[], starargs=None, kwargs=None, "
430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "lineno=1, col_offset=0), lineno=1, col_offset=0), "
431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], "
433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "keywords=[], starargs=None, kwargs=None, lineno=1, "
434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "col_offset=0), lineno=1, col_offset=0)])"
435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_increment_lineno(self):
438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        src = ast.parse('1 + 1', mode='eval')
439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.increment_lineno(src, n=3), src)
440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(src, include_attributes=True),
441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'col_offset=0))'
444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # issue10869: do not increment lineno of root twice
446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        src = ast.parse('1 + 1', mode='eval')
447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(src, include_attributes=True),
449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'col_offset=0))'
452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_iter_fields(self):
455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        node = ast.parse('foo()', mode='eval')
456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        d = dict(ast.iter_fields(node.body))
457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(d.pop('func').id, 'foo')
458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(d, {'keywords': [], 'kwargs': None,
459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                             'args': [], 'starargs': None})
460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_iter_child_nodes(self):
462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        iterator = ast.iter_child_nodes(node.body)
465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(next(iterator).id, 'spam')
466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(next(iterator).n, 23)
467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(next(iterator).n, 42)
468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.dump(next(iterator)),
469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "keyword(arg='eggs', value=Str(s='leek'))"
470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_get_docstring(self):
473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        node = ast.parse('def foo():\n  """line one\n  line two"""')
474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.get_docstring(node.body[0]),
475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         'line one\nline two')
476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_literal_eval(self):
478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, ast.literal_eval, 'foo()')
482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_literal_eval_issue4907(self):
484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.literal_eval('2j'), 2j)
485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.literal_eval('10 + 2j'), 10 + 2j)
486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ast.literal_eval('1.5 - 2j'), 1.5 - 2j)
487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, ast.literal_eval, '2 + (3 + 4j)')
488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    with test_support.check_py3k_warnings(("backquote not supported",
492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                             SyntaxWarning)):
493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        test_support.run_unittest(AST_Tests, ASTHelpers_Test)
494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef main():
496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if __name__ != '__main__':
497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return
498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if sys.argv[1:] == ['-g']:
499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                 (eval_tests, "eval")):
501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print kind+"_results = ["
502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for s in statements:
503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                print repr(to_tuple(compile(s, "?", kind, 0x400)))+","
504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print "]"
505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        print "main()"
506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raise SystemExit
507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#### EVERYTHING BELOW IS GENERATED #####
510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehexec_results = [
511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Expr', (1, 0), ('Name', (1, 0), 'None', ('Load',)))]),
512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Pass', (1, 9))], [])]),
513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('Name', (1, 6), 'a', ('Param',))], None, None, []), [('Pass', (1, 10))], [])]),
514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('Name', (1, 6), 'a', ('Param',))], None, None, [('Num', (1, 8), 0)]), [('Pass', (1, 12))], [])]),
515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], 'args', None, []), [('Pass', (1, 14))], [])]),
516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, 'kwargs', []), [('Pass', (1, 17))], [])]),
517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('Name', (1, 6), 'a', ('Param',)), ('Name', (1, 9), 'b', ('Param',)), ('Name', (1, 14), 'c', ('Param',)), ('Name', (1, 22), 'd', ('Param',)), ('Name', (1, 28), 'e', ('Param',))], 'args', 'kwargs', [('Num', (1, 11), 1), ('Name', (1, 16), 'None', ('Load',)), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Pass', (1, 52))], [])]),
518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('ClassDef', (1, 0), 'C', [], [('Pass', (1, 8))], [])]),
519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [('Pass', (1, 17))], [])]),
520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Return', (1, 8), ('Num', (1, 15), 1))], [])]),
521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Num', (1, 5), 1))]),
524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Print', (1, 0), ('Name', (1, 8), 'f', ('Load',)), [('Num', (1, 11), 1)], False)]),
525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]),
526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Raise', (1, 0), ('Name', (1, 6), 'Exception', ('Load',)), ('Str', (1, 17), 'string'), None)]),
529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])]),
530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]),
531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Exec', (1, 0), ('Str', (1, 5), 'v'), None, None)]),
535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Global', (1, 0), ['v'])]),
536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]),
537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Pass', (1, 0))]),
538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Break', (1, 0))]),
539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Continue', (1, 0))]),
540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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))], [])]),
541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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',)), [])]))]),
542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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',)), [])]))]),
543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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',)), [])]))]),
544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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',)), [])]))]),
545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Expr', (1, 0), ('DictComp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), []), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))])]))]),
546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Expr', (1, 0), ('DictComp', (1, 1), ('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',)), [])]))]),
547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Expr', (1, 0), ('SetComp', (1, 1), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))])]))]),
548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Module', [('Expr', (1, 0), ('SetComp', (1, 1), ('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',)), [])]))]),
549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehsingle_results = [
551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieheval_results = [
554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Name', (1, 0), 'None', ('Load',))),
555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, []), ('Name', (1, 7), 'None', ('Load',)))),
559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])),
560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Dict', (1, 0), [], [])),
561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Set', (1, 0), [('Name', (1, 1), 'None', ('Load',))])),
562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Dict', (1, 0), [('Num', (2, 6), 1)], [('Num', (4, 10), 2)])),
563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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',))])])),
564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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',))])])),
565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])),
566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Num', (1, 2), 1), ('Num', (1, 4), 2)], [('keyword', 'c', ('Num', (1, 8), 3))], ('Name', (1, 11), 'd', ('Load',)), ('Name', (1, 15), 'e', ('Load',)))),
567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Repr', (1, 0), ('Name', (1, 1), 'v', ('Load',)))),
568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Num', (1, 0), 10L)),
569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Str', (1, 0), 'string')),
570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Name', (1, 0), 'v', ('Load',))),
573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('List', (1, 0), [], ('Load',))),
575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))),
576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Tuple', (1, 1), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('Expression', ('Tuple', (1, 0), [], ('Load',))),
578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh('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', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [], None, None)),
579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehmain()
581