mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
178 lines
5.9 KiB
Python
178 lines
5.9 KiB
Python
import sys, itertools
|
|
|
|
def to_tuple(t):
|
|
if t is None or isinstance(t, (basestring, int, long, complex)):
|
|
return t
|
|
elif isinstance(t, list):
|
|
return [to_tuple(e) for e in t]
|
|
result = [t.__class__.__name__]
|
|
if t._fields is None:
|
|
return tuple(result)
|
|
for f in t._fields:
|
|
result.append(to_tuple(getattr(t, f)))
|
|
return tuple(result)
|
|
|
|
# These tests are compiled through "exec"
|
|
# There should be atleast one test per statement
|
|
exec_tests = [
|
|
# FunctionDef
|
|
"def f(): pass",
|
|
# ClassDef
|
|
"class C:pass",
|
|
# Return
|
|
"def f():return 1",
|
|
# Delete
|
|
"del v",
|
|
# Assign
|
|
"v = 1",
|
|
# AugAssign
|
|
"v += 1",
|
|
# Print
|
|
"print >>f, 1, ",
|
|
# For
|
|
"for v in v:pass",
|
|
# While
|
|
"while v:pass",
|
|
# If
|
|
"if v:pass",
|
|
# Raise
|
|
"raise Exception, 'string'",
|
|
# TryExcept
|
|
"try:\n pass\nexcept Exception:\n pass",
|
|
# TryFinally
|
|
"try:\n pass\nfinally:\n pass",
|
|
# Assert
|
|
"assert v",
|
|
# Import
|
|
"import sys",
|
|
# ImportFrom
|
|
"from sys import v",
|
|
# Exec
|
|
"exec 'v'",
|
|
# Global
|
|
"global v",
|
|
# Expr
|
|
"1",
|
|
# Pass,
|
|
"pass",
|
|
# Break
|
|
"break",
|
|
# Continue
|
|
"continue",
|
|
]
|
|
|
|
# These are compiled through "single"
|
|
# because of overlap with "eval", it just tests what
|
|
# can't be tested with "eval"
|
|
single_tests = [
|
|
"1+2"
|
|
]
|
|
|
|
# These are compiled through "eval"
|
|
# It should test all expressions
|
|
eval_tests = [
|
|
# BoolOp
|
|
"a and b",
|
|
# BinOp
|
|
"a + b",
|
|
# UnaryOp
|
|
"not v",
|
|
# Lambda
|
|
"lambda:None",
|
|
# Dict
|
|
"{ 1:2 }",
|
|
# ListComp
|
|
"[a for b in c if d]",
|
|
# GeneratorExp
|
|
"(a for b in c if d)",
|
|
# Yield - yield expressions can't work outside a function
|
|
#
|
|
# Compare
|
|
"1 < 2 < 3",
|
|
# Call
|
|
"f(1,2,c=3,*d,**e)",
|
|
# Repr
|
|
"`v`",
|
|
# Num
|
|
"10L",
|
|
# Str
|
|
"'string'",
|
|
# Attribute
|
|
"a.b",
|
|
# Subscript
|
|
"a[b:c]",
|
|
# Name
|
|
"v",
|
|
# List
|
|
"[1,2,3]",
|
|
# Tuple
|
|
"1,2,3"
|
|
]
|
|
|
|
# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
|
|
# excepthandler, arguments, keywords, alias
|
|
|
|
if __name__=='__main__' and sys.argv[1:] == ['-g']:
|
|
for statements, kind in ((exec_tests, "exec"), (single_tests, "single"), (eval_tests, "eval")):
|
|
print kind+"_results = ["
|
|
for s in statements:
|
|
print repr(to_tuple(compile(s, "?", kind, 0x400)))+","
|
|
print "]"
|
|
print "run_tests()"
|
|
raise SystemExit
|
|
|
|
def run_tests():
|
|
for input, output, kind in ((exec_tests, exec_results, "exec"),
|
|
(single_tests, single_results, "single"),
|
|
(eval_tests, eval_results, "eval")):
|
|
for i, o in itertools.izip(input, output):
|
|
assert to_tuple(compile(i, "?", kind, 0x400)) == o
|
|
|
|
#### EVERYTHING BELOW IS GENERATED #####
|
|
exec_results = [
|
|
('Module', [('FunctionDef', 'f', ('arguments', [], None, None, []), [('Pass',)], [])]),
|
|
('Module', [('ClassDef', 'C', [], [('Pass',)])]),
|
|
('Module', [('FunctionDef', 'f', ('arguments', [], None, None, []), [('Return', ('Num', 1))], [])]),
|
|
('Module', [('Delete', [('Name', 'v', ('Del',))])]),
|
|
('Module', [('Assign', [('Name', 'v', ('Store',))], ('Num', 1))]),
|
|
('Module', [('AugAssign', ('Name', 'v', ('Load',)), ('Add',), ('Num', 1))]),
|
|
('Module', [('Print', ('Name', 'f', ('Load',)), [('Num', 1)], False)]),
|
|
('Module', [('For', ('Name', 'v', ('Store',)), ('Name', 'v', ('Load',)), [('Pass',)], [])]),
|
|
('Module', [('While', ('Name', 'v', ('Load',)), [('Pass',)], [])]),
|
|
('Module', [('If', ('Name', 'v', ('Load',)), [('Pass',)], [])]),
|
|
('Module', [('Raise', ('Name', 'Exception', ('Load',)), ('Str', 'string'), None)]),
|
|
('Module', [('TryExcept', [('Pass',)], [('excepthandler', ('Name', 'Exception', ('Load',)), None, [('Pass',)])], [])]),
|
|
('Module', [('TryFinally', [('Pass',)], [('Pass',)])]),
|
|
('Module', [('Assert', ('Name', 'v', ('Load',)), None)]),
|
|
('Module', [('Import', [('alias', 'sys', None)])]),
|
|
('Module', [('ImportFrom', 'sys', [('alias', 'v', None)], 0)]),
|
|
('Module', [('Exec', ('Str', 'v'), None, None)]),
|
|
('Module', [('Global', ['v'])]),
|
|
('Module', [('Expr', ('Num', 1))]),
|
|
('Module', [('Pass',)]),
|
|
('Module', [('Break',)]),
|
|
('Module', [('Continue',)]),
|
|
]
|
|
single_results = [
|
|
('Interactive', [('Expr', ('BinOp', ('Num', 1), ('Add',), ('Num', 2)))]),
|
|
]
|
|
eval_results = [
|
|
('Expression', ('BoolOp', ('And',), [('Name', 'a', ('Load',)), ('Name', 'b', ('Load',))])),
|
|
('Expression', ('BinOp', ('Name', 'a', ('Load',)), ('Add',), ('Name', 'b', ('Load',)))),
|
|
('Expression', ('UnaryOp', ('Not',), ('Name', 'v', ('Load',)))),
|
|
('Expression', ('Lambda', ('arguments', [], None, None, []), ('Name', 'None', ('Load',)))),
|
|
('Expression', ('Dict', [('Num', 1)], [('Num', 2)])),
|
|
('Expression', ('ListComp', ('Name', 'a', ('Load',)), [('comprehension', ('Name', 'b', ('Store',)), ('Name', 'c', ('Load',)), [('Name', 'd', ('Load',))])])),
|
|
('Expression', ('GeneratorExp', ('Name', 'a', ('Load',)), [('comprehension', ('Name', 'b', ('Store',)), ('Name', 'c', ('Load',)), [('Name', 'd', ('Load',))])])),
|
|
('Expression', ('Compare', ('Num', 1), [('Lt',), ('Lt',)], [('Num', 2), ('Num', 3)])),
|
|
('Expression', ('Call', ('Name', 'f', ('Load',)), [('Num', 1), ('Num', 2)], [('keyword', 'c', ('Num', 3))], ('Name', 'd', ('Load',)), ('Name', 'e', ('Load',)))),
|
|
('Expression', ('Repr', ('Name', 'v', ('Load',)))),
|
|
('Expression', ('Num', 10L)),
|
|
('Expression', ('Str', 'string')),
|
|
('Expression', ('Attribute', ('Name', 'a', ('Load',)), 'b', ('Load',))),
|
|
('Expression', ('Subscript', ('Name', 'a', ('Load',)), ('Slice', ('Name', 'b', ('Load',)), ('Name', 'c', ('Load',)), None), ('Load',))),
|
|
('Expression', ('Name', 'v', ('Load',))),
|
|
('Expression', ('List', [('Num', 1), ('Num', 2), ('Num', 3)], ('Load',))),
|
|
('Expression', ('Tuple', [('Num', 1), ('Num', 2), ('Num', 3)], ('Load',))),
|
|
]
|
|
run_tests()
|