| 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() |