python-2.5.2/win32/Lib/test/test_ast.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 import sys, itertools
       
     2 import _ast
       
     3 
       
     4 def to_tuple(t):
       
     5     if t is None or isinstance(t, (basestring, int, long, complex)):
       
     6         return t
       
     7     elif isinstance(t, list):
       
     8         return [to_tuple(e) for e in t]
       
     9     result = [t.__class__.__name__]
       
    10     if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
       
    11         result.append((t.lineno, t.col_offset))
       
    12     if t._fields is None:
       
    13         return tuple(result)
       
    14     for f in t._fields:
       
    15         result.append(to_tuple(getattr(t, f)))
       
    16     return tuple(result)
       
    17 
       
    18 # These tests are compiled through "exec"
       
    19 # There should be atleast one test per statement
       
    20 exec_tests = [
       
    21     # FunctionDef
       
    22     "def f(): pass",
       
    23     # ClassDef
       
    24     "class C:pass",
       
    25     # Return
       
    26     "def f():return 1",
       
    27     # Delete
       
    28     "del v",
       
    29     # Assign
       
    30     "v = 1",
       
    31     # AugAssign
       
    32     "v += 1",
       
    33     # Print
       
    34     "print >>f, 1, ",
       
    35     # For
       
    36     "for v in v:pass",
       
    37     # While
       
    38     "while v:pass",
       
    39     # If
       
    40     "if v:pass",
       
    41     # Raise
       
    42     "raise Exception, 'string'",
       
    43     # TryExcept
       
    44     "try:\n  pass\nexcept Exception:\n  pass",
       
    45     # TryFinally
       
    46     "try:\n  pass\nfinally:\n  pass",
       
    47     # Assert
       
    48     "assert v",
       
    49     # Import
       
    50     "import sys",
       
    51     # ImportFrom
       
    52     "from sys import v",
       
    53     # Exec
       
    54     "exec 'v'",
       
    55     # Global
       
    56     "global v",
       
    57     # Expr
       
    58     "1",
       
    59     # Pass,
       
    60     "pass",
       
    61     # Break
       
    62     "break",
       
    63     # Continue
       
    64     "continue",
       
    65 ]
       
    66 
       
    67 # These are compiled through "single"
       
    68 # because of overlap with "eval", it just tests what
       
    69 # can't be tested with "eval"
       
    70 single_tests = [
       
    71     "1+2"
       
    72 ]
       
    73 
       
    74 # These are compiled through "eval"
       
    75 # It should test all expressions
       
    76 eval_tests = [
       
    77   # BoolOp
       
    78   "a and b",
       
    79   # BinOp
       
    80   "a + b",
       
    81   # UnaryOp
       
    82   "not v",
       
    83   # Lambda
       
    84   "lambda:None",
       
    85   # Dict
       
    86   "{ 1:2 }",
       
    87   # ListComp
       
    88   "[a for b in c if d]",
       
    89   # GeneratorExp
       
    90   "(a for b in c if d)",
       
    91   # Yield - yield expressions can't work outside a function
       
    92   #
       
    93   # Compare
       
    94   "1 < 2 < 3",
       
    95   # Call
       
    96   "f(1,2,c=3,*d,**e)",
       
    97   # Repr
       
    98   "`v`",
       
    99   # Num
       
   100   "10L",
       
   101   # Str
       
   102   "'string'",
       
   103   # Attribute
       
   104   "a.b",
       
   105   # Subscript
       
   106   "a[b:c]",
       
   107   # Name
       
   108   "v",
       
   109   # List
       
   110   "[1,2,3]",
       
   111   # Tuple
       
   112   "1,2,3",
       
   113   # Combination
       
   114   "a.b.c.d(a.b[1:2])",
       
   115 
       
   116 ]
       
   117 
       
   118 # TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
       
   119 # excepthandler, arguments, keywords, alias
       
   120 
       
   121 if __name__=='__main__' and sys.argv[1:] == ['-g']:
       
   122     for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
       
   123                              (eval_tests, "eval")):
       
   124         print kind+"_results = ["
       
   125         for s in statements:
       
   126             print repr(to_tuple(compile(s, "?", kind, 0x400)))+","
       
   127         print "]"
       
   128     print "run_tests()"
       
   129     raise SystemExit
       
   130 
       
   131 def test_order(ast_node, parent_pos):
       
   132 
       
   133     if not isinstance(ast_node, _ast.AST) or ast_node._fields == None:
       
   134         return
       
   135     if isinstance(ast_node, (_ast.expr, _ast.stmt, _ast.excepthandler)):
       
   136         node_pos = (ast_node.lineno, ast_node.col_offset)
       
   137         assert node_pos >= parent_pos, (node_pos, parent_pos)
       
   138         parent_pos = (ast_node.lineno, ast_node.col_offset)
       
   139     for name in ast_node._fields:
       
   140         value = getattr(ast_node, name)
       
   141         if isinstance(value, list):
       
   142             for child in value:
       
   143                 test_order(child, parent_pos)
       
   144         elif value != None:
       
   145             test_order(value, parent_pos)
       
   146 
       
   147 def run_tests():
       
   148     for input, output, kind in ((exec_tests, exec_results, "exec"),
       
   149                                 (single_tests, single_results, "single"),
       
   150                                 (eval_tests, eval_results, "eval")):
       
   151         for i, o in itertools.izip(input, output):
       
   152             ast_tree = compile(i, "?", kind, 0x400)
       
   153             assert to_tuple(ast_tree) == o
       
   154             test_order(ast_tree, (0, 0))
       
   155 
       
   156 #### EVERYTHING BELOW IS GENERATED #####
       
   157 exec_results = [
       
   158 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Pass', (1, 9))], [])]),
       
   159 ('Module', [('ClassDef', (1, 0), 'C', [], [('Pass', (1, 8))])]),
       
   160 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, []), [('Return', (1, 8), ('Num', (1, 15), 1))], [])]),
       
   161 ('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
       
   162 ('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
       
   163 ('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Num', (1, 5), 1))]),
       
   164 ('Module', [('Print', (1, 0), ('Name', (1, 8), 'f', ('Load',)), [('Num', (1, 11), 1)], False)]),
       
   165 ('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]),
       
   166 ('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
       
   167 ('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
       
   168 ('Module', [('Raise', (1, 0), ('Name', (1, 6), 'Exception', ('Load',)), ('Str', (1, 17), 'string'), None)]),
       
   169 ('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('excepthandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))], 3, 0)], [])]),
       
   170 ('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]),
       
   171 ('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
       
   172 ('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
       
   173 ('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
       
   174 ('Module', [('Exec', (1, 0), ('Str', (1, 5), 'v'), None, None)]),
       
   175 ('Module', [('Global', (1, 0), ['v'])]),
       
   176 ('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]),
       
   177 ('Module', [('Pass', (1, 0))]),
       
   178 ('Module', [('Break', (1, 0))]),
       
   179 ('Module', [('Continue', (1, 0))]),
       
   180 ]
       
   181 single_results = [
       
   182 ('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
       
   183 ]
       
   184 eval_results = [
       
   185 ('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
       
   186 ('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
       
   187 ('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
       
   188 ('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, []), ('Name', (1, 7), 'None', ('Load',)))),
       
   189 ('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])),
       
   190 ('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',))])])),
       
   191 ('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',))])])),
       
   192 ('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])),
       
   193 ('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',)))),
       
   194 ('Expression', ('Repr', (1, 0), ('Name', (1, 1), 'v', ('Load',)))),
       
   195 ('Expression', ('Num', (1, 0), 10L)),
       
   196 ('Expression', ('Str', (1, 0), 'string')),
       
   197 ('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
       
   198 ('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
       
   199 ('Expression', ('Name', (1, 0), 'v', ('Load',))),
       
   200 ('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
       
   201 ('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))),
       
   202 ('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)),
       
   203 ]
       
   204 run_tests()