14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys, itertools, unittest
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport ast
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef to_tuple(t):
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if t is None or isinstance(t, (basestring, int, long, complex)):
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return t
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif isinstance(t, list):
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return [to_tuple(e) for e in t]
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    result = [t.__class__.__name__]
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result.append((t.lineno, t.col_offset))
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if t._fields is None:
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return tuple(result)
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for f in t._fields:
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result.append(to_tuple(getattr(t, f)))
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return tuple(result)
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# These tests are compiled through "exec"
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# There should be atleast one test per statement
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexec_tests = [
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # None
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "None",
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # FunctionDef
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f(): pass",
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # FunctionDef with arg
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f(a): pass",
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # FunctionDef with arg and default value
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f(a=0): pass",
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # FunctionDef with varargs
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f(*args): pass",
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # FunctionDef with kwargs
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f(**kwargs): pass",
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # FunctionDef with all kind of args
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f(a, b=1, c=None, d=[], e={}, *args, **kwargs): pass",
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # ClassDef
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "class C:pass",
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # ClassDef, new style class
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "class C(object): pass",
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Return
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "def f():return 1",
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Delete
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "del v",
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Assign
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "v = 1",
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # AugAssign
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "v += 1",
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Print
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "print >>f, 1, ",
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # For
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "for v in v:pass",
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # While
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "while v:pass",
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # If
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "if v:pass",
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Raise
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "raise Exception, 'string'",
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # TryExcept
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "try:\n  pass\nexcept Exception:\n  pass",
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # TryFinally
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "try:\n  pass\nfinally:\n  pass",
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Assert
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "assert v",
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Import
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "import sys",
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # ImportFrom
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "from sys import v",
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Exec
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "exec 'v'",
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Global
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "global v",
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Expr
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "1",
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Pass,
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "pass",
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Break
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "break",
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Continue
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "continue",
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # for statements with naked tuples (see http://bugs.python.org/issue6704)
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "for a,b in c: pass",
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "[(a,b) for a,b in c]",
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "((a,b) for a,b in c)",
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "((a,b) for (a,b) in c)",
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Multiline generator expression (test for .lineno & .col_offset)
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """(
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Aa
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ,
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao       Bb
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    )
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Aa
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ,
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Bb in Cc
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    )""",
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # dictcomp
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "{a : b for w in x for m in p if g}",
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # dictcomp with naked tuple
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "{a : b for v,w in x}",
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # setcomp
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "{r for l in x if g}",
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # setcomp with naked tuple
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "{r for l,m in x}",
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# These are compiled through "single"
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# because of overlap with "eval", it just tests what
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# can't be tested with "eval"
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosingle_tests = [
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "1+2"
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# These are compiled through "eval"
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# It should test all expressions
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoeval_tests = [
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # None
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "None",
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # BoolOp
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "a and b",
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # BinOp
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "a + b",
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # UnaryOp
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "not v",
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Lambda
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "lambda:None",
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Dict
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "{ 1:2 }",
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Empty dict
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "{}",
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Set
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "{None,}",
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Multiline dict (test for .lineno & .col_offset)
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  """{
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao      1
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        :
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao          2
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao     }""",
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # ListComp
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "[a for b in c if d]",
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # GeneratorExp
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "(a for b in c if d)",
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Yield - yield expressions can't work outside a function
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  #
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Compare
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "1 < 2 < 3",
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Call
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "f(1,2,c=3,*d,**e)",
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Repr
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "`v`",
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Num
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "10L",
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Str
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "'string'",
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Attribute
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "a.b",
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Subscript
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "a[b:c]",
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Name
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "v",
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # List
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "[1,2,3]",
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Empty list
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "[]",
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Tuple
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "1,2,3",
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Tuple
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "(1,2,3)",
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Empty tuple
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "()",
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  # Combination
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  "a.b.c.d(a.b[1:2])",
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# excepthandler, arguments, keywords, alias
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass AST_Tests(unittest.TestCase):
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _assertTrueorder(self, ast_node, parent_pos):
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            node_pos = (ast_node.lineno, ast_node.col_offset)
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(node_pos >= parent_pos)
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parent_pos = (ast_node.lineno, ast_node.col_offset)
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for name in ast_node._fields:
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            value = getattr(ast_node, name)
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(value, list):
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for child in value:
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self._assertTrueorder(child, parent_pos)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif value is not None:
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._assertTrueorder(value, parent_pos)
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_AST_objects(self):
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.AST()
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, ())
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x.vararg
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x.foobar = 21
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ast.AST(lineno=2)
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(TypeError):
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # "_ast.AST constructor takes 0 positional arguments"
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ast.AST(2)
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_snippets(self):
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for input, output, kind in ((exec_tests, exec_results, "exec"),
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                    (single_tests, single_results, "single"),
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                    (eval_tests, eval_results, "eval")):
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i, o in itertools.izip(input, output):
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(to_tuple(ast_tree), o)
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self._assertTrueorder(ast_tree, (0, 0))
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_slice(self):
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        slc = ast.parse("x[::]").body[0].value.slice
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsNone(slc.upper)
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsNone(slc.lower)
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(slc.step, ast.Name)
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(slc.step.id, "None")
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_from_import(self):
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        im = ast.parse("from . import y").body[0]
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsNone(im.module)
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_non_interned_future_from_ast(self):
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mod = ast.parse("from __future__ import division")
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(mod.body[0], ast.ImportFrom)
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mod.body[0].module = " __future__ ".strip()
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        compile(mod, "<test>", "exec")
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_base_classes(self):
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ast.For, ast.stmt))
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ast.Name, ast.expr))
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ast.stmt, ast.AST))
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ast.expr, ast.AST))
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ast.comprehension, ast.AST))
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ast.Gt, ast.AST))
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_field_attr_existence(self):
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for name, item in ast.__dict__.iteritems():
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(item, type) and name != 'AST' and name[0].isupper():
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                x = item()
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(x, ast.AST):
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(type(x._fields), tuple)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_arguments(self):
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.arguments()
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, ('args', 'vararg', 'kwarg', 'defaults'))
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x.vararg
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.arguments(1, 2, 3, 4)
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.vararg, 2)
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_field_attr_writable(self):
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Num()
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # We can assign to _fields
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x._fields = 666
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, 666)
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_classattrs(self):
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Num()
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, ('n',))
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x.n
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Num(42)
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.n, 42)
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x.lineno
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(AttributeError):
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x.foobar
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Num(lineno=2)
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.lineno, 2)
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Num(42, lineno=0)
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.lineno, 0)
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, ('n',))
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.n, 42)
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ast.Num, 1, 2)
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ast.Num, 1, 2, lineno=0)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_module(self):
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        body = [ast.Num(42)]
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Module(body)
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.body, body)
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nodeclasses(self):
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Zero arguments constructor explicitely allowed
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.BinOp()
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, ('left', 'op', 'right'))
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Random attribute allowed too
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x.foobarbaz = 5
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.foobarbaz, 5)
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n1 = ast.Num(1)
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n3 = ast.Num(3)
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        addop = ast.Add()
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.BinOp(n1, addop, n3)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.left, n1)
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.op, addop)
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.right, n3)
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.BinOp(1, 2, 3)
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.left, 1)
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.op, 2)
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.right, 3)
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.BinOp(1, 2, 3, lineno=0)
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.left, 1)
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.op, 2)
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.right, 3)
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.lineno, 0)
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # node raises exception when not given enough arguments
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ast.BinOp, 1, 2)
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # node raises exception when given too many arguments
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # node raises exception when not given enough arguments
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ast.BinOp, 1, 2, lineno=0)
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # node raises exception when given too many arguments
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # can set attributes through kwargs too
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.BinOp(left=1, op=2, right=3, lineno=0)
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.left, 1)
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.op, 2)
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.right, 3)
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.lineno, 0)
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Random kwargs also allowed
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.BinOp(1, 2, 3, foobarbaz=42)
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x.foobarbaz, 42)
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_no_fields(self):
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # this used to fail because Sub._fields was None
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = ast.Sub()
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x._fields, ())
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pickling(self):
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import pickle
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mods = [pickle]
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import cPickle
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            mods.append(cPickle)
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ImportError:
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        protocols = [0, 1, 2]
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for mod in mods:
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for protocol in protocols:
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ast2 = mod.loads(mod.dumps(ast, protocol))
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(to_tuple(ast2), to_tuple(ast))
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_identitifer(self):
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = ast.Module([ast.Expr(ast.Name(u"x", ast.Load()))])
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ast.fix_missing_locations(m)
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(TypeError) as cm:
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            compile(m, "<test>", "exec")
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("identifier must be of type str", str(cm.exception))
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_invalid_string(self):
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = ast.Module([ast.Expr(ast.Str(43))])
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ast.fix_missing_locations(m)
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.assertRaises(TypeError) as cm:
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            compile(m, "<test>", "exec")
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("string must be of type str or uni", str(cm.exception))
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ASTHelpers_Test(unittest.TestCase):
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse(self):
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = ast.parse('foo(1 + 1)')
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(a), ast.dump(b))
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_dump(self):
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        node = ast.parse('spam(eggs, "and cheese")')
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(node),
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "args=[Name(id='eggs', ctx=Load()), Str(s='and cheese')], "
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "keywords=[], starargs=None, kwargs=None))])"
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(node, annotate_fields=False),
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Str('and cheese')], [], None, None))])"
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(node, include_attributes=True),
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "lineno=1, col_offset=5), Str(s='and cheese', lineno=1, "
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "col_offset=11)], keywords=[], starargs=None, kwargs=None, "
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "lineno=1, col_offset=0), lineno=1, col_offset=0)])"
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_copy_location(self):
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        src = ast.parse('1 + 1', mode='eval')
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        src.body.right = ast.copy_location(ast.Num(2), src.body.right)
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(src, include_attributes=True),
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Expression(body=BinOp(left=Num(n=1, lineno=1, col_offset=0), '
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'op=Add(), right=Num(n=2, lineno=1, col_offset=4), lineno=1, '
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'col_offset=0))'
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_fix_missing_locations(self):
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        src = ast.parse('write("spam")')
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                          [ast.Str('eggs')], [], None, None)))
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(src, ast.fix_missing_locations(src))
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(src, include_attributes=True),
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, "
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "col_offset=6)], keywords=[], starargs=None, kwargs=None, "
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "lineno=1, col_offset=0), lineno=1, col_offset=0), "
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], "
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "keywords=[], starargs=None, kwargs=None, lineno=1, "
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "col_offset=0), lineno=1, col_offset=0)])"
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_increment_lineno(self):
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        src = ast.parse('1 + 1', mode='eval')
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.increment_lineno(src, n=3), src)
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(src, include_attributes=True),
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'col_offset=0))'
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # issue10869: do not increment lineno of root twice
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        src = ast.parse('1 + 1', mode='eval')
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(src, include_attributes=True),
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'col_offset=0))'
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_iter_fields(self):
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        node = ast.parse('foo()', mode='eval')
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = dict(ast.iter_fields(node.body))
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop('func').id, 'foo')
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {'keywords': [], 'kwargs': None,
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             'args': [], 'starargs': None})
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_iter_child_nodes(self):
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        iterator = ast.iter_child_nodes(node.body)
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(next(iterator).id, 'spam')
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(next(iterator).n, 23)
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(next(iterator).n, 42)
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.dump(next(iterator)),
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "keyword(arg='eggs', value=Str(s='leek'))"
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_get_docstring(self):
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        node = ast.parse('def foo():\n  """line one\n  line two"""')
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.get_docstring(node.body[0]),
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'line one\nline two')
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_literal_eval(self):
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ast.literal_eval, 'foo()')
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_literal_eval_issue4907(self):
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.literal_eval('2j'), 2j)
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.literal_eval('10 + 2j'), 10 + 2j)
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ast.literal_eval('1.5 - 2j'), 1.5 - 2j)
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, ast.literal_eval, '2 + (3 + 4j)')
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with test_support.check_py3k_warnings(("backquote not supported",
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                             SyntaxWarning)):
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_support.run_unittest(AST_Tests, ASTHelpers_Test)
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef main():
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if __name__ != '__main__':
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if sys.argv[1:] == ['-g']:
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 (eval_tests, "eval")):
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print kind+"_results = ["
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for s in statements:
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print repr(to_tuple(compile(s, "?", kind, 0x400)))+","
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "]"
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print "main()"
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise SystemExit
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#### EVERYTHING BELOW IS GENERATED #####
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexec_results = [
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Expr', (1, 0), ('Name', (1, 0), 'None', ('Load',)))]),
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Pass', (1, 9))], [])]),
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('Name', (1, 6), 'a', ('Param',))], None, None, []), [('Pass', (1, 10))], [])]),
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('Name', (1, 6), 'a', ('Param',))], None, None, [('Num', (1, 8), 0)]), [('Pass', (1, 12))], [])]),
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], 'args', None, []), [('Pass', (1, 14))], [])]),
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, 'kwargs', []), [('Pass', (1, 17))], [])]),
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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))], [])]),
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('ClassDef', (1, 0), 'C', [], [('Pass', (1, 8))], [])]),
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [('Pass', (1, 17))], [])]),
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Return', (1, 8), ('Num', (1, 15), 1))], [])]),
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Num', (1, 5), 1))]),
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Print', (1, 0), ('Name', (1, 8), 'f', ('Load',)), [('Num', (1, 11), 1)], False)]),
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]),
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Raise', (1, 0), ('Name', (1, 6), 'Exception', ('Load',)), ('Str', (1, 17), 'string'), None)]),
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])]),
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]),
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Exec', (1, 0), ('Str', (1, 5), 'v'), None, None)]),
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Global', (1, 0), ['v'])]),
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]),
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Pass', (1, 0))]),
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Break', (1, 0))]),
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Module', [('Continue', (1, 0))]),
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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))], [])]),
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)), [])]))]),
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)), [])]))]),
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)), [])]))]),
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)), [])]))]),
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',))])]))]),
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)), [])]))]),
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',))])]))]),
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)), [])]))]),
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosingle_results = [
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoeval_results = [
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Name', (1, 0), 'None', ('Load',))),
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, []), ('Name', (1, 7), 'None', ('Load',)))),
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])),
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Dict', (1, 0), [], [])),
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Set', (1, 0), [('Name', (1, 1), 'None', ('Load',))])),
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Dict', (1, 0), [('Num', (2, 6), 1)], [('Num', (4, 10), 2)])),
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',))])])),
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',))])])),
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])),
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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',)))),
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Repr', (1, 0), ('Name', (1, 1), 'v', ('Load',)))),
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Num', (1, 0), 10L)),
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Str', (1, 0), 'string')),
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Name', (1, 0), 'v', ('Load',))),
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('List', (1, 0), [], ('Load',))),
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))),
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Tuple', (1, 1), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('Expression', ('Tuple', (1, 0), [], ('Load',))),
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao('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)),
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomain()
581