10a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport test.test_support 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gaocompiler = test.test_support.import_module('compiler', deprecated=True) 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom compiler.ast import flatten 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os, sys, time, unittest 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom random import random 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom StringIO import StringIO 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# How much time in seconds can pass before we print a 'Still working' message. 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao_PRINT_WORKING_MSG_INTERVAL = 5 * 60 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass TrivialContext(object): 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __enter__(self): 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __exit__(self, *exc_info): 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass CompilerTest(unittest.TestCase): 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testCompileLibrary(self): 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # A simple but large test. Compile all the code in the 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # standard library and its test suite. This doesn't verify 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # that any of the code is correct, merely the compiler is able 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # to generate some kind of code for it. 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # warning: if 'os' or 'test_support' are moved in some other dir, 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # they should be changed here. 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao libdir = os.path.dirname(os.__file__) 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao testdir = os.path.dirname(test.test_support.__file__) 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for dir in [testdir]: 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for basename in "test_os.py",: 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Print still working message since this test can be really slow 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if next_time <= time.time(): 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print >>sys.__stdout__, \ 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' testCompileLibrary still working, be patient...' 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao sys.__stdout__.flush() 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not basename.endswith(".py"): 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao continue 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not TEST_ALL and random() < 0.98: 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao continue 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = os.path.join(dir, basename) 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if test.test_support.verbose: 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print "compiling", path 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f = open(path, "U") 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao buf = f.read() 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao f.close() 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if "badsyntax" in basename or "bad_coding" in basename: 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(SyntaxError, compiler.compile, 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao buf, basename, "exec") 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao compiler.compile(buf, basename, "exec") 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except Exception, e: 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao args = list(e.args) 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao args.append("in file %s]" % basename) 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #args[0] += "[in file %s]" % basename 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao e.args = tuple(args) 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testNewClassSyntax(self): 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao compiler.compile("class foo():pass\n\n","<string>","exec") 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testYieldExpr(self): 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao compiler.compile("def g(): yield\n\n", "<string>", "exec") 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testKeywordAfterStarargs(self): 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def f(*args, **kwargs): 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual((args, kwargs), ((2,3), {'x': 1, 'y': 4})) 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('f(x=1, *(2, 3), y=4)', '<string>', 'exec') 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in {'f': f} 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(SyntaxError, compiler.parse, "foo(a=1, b)") 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(SyntaxError, compiler.parse, "foo(1, *args, 3)") 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testTryExceptFinally(self): 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test that except and finally clauses in one try stmt are recognized 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile("try:\n 1//0\nexcept:\n e = 1\nfinally:\n f = 1", 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "<string>", "exec") 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dct = {} 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in dct 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct.get('e'), 1) 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct.get('f'), 1) 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testDefaultArgs(self): 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(SyntaxError, compiler.parse, "def foo(a=1, b): pass") 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testDocstrings(self): 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('"doc"', '<string>', 'exec') 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn('__doc__', c.co_names) 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('def f():\n "doc"', '<string>', 'exec') 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao g = {} 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in g 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(g['f'].__doc__, "doc") 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testLineNo(self): 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test that all nodes except Module have a correct lineno attribute. 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao filename = __file__ 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if filename.endswith((".pyc", ".pyo")): 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao filename = filename[:-1] 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao tree = compiler.parseFile(filename) 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.check_lineno(tree) 1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def check_lineno(self, node): 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self._check_lineno(node) 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except AssertionError: 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print node.__class__, node.lineno 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def _check_lineno(self, node): 1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not node.__class__ in NOLINENO: 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIsInstance(node.lineno, int, 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "lineno=%s on %s" % (node.lineno, node.__class__)) 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(node.lineno > 0, 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "lineno=%s on %s" % (node.lineno, node.__class__)) 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for child in node.getChildNodes(): 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.check_lineno(child) 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testFlatten(self): 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(flatten([1, [2]]), [1, 2]) 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(flatten((1, (2,))), [1, 2]) 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testNestedScope(self): 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('def g():\n' 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' a = 1\n' 1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' def f(): return a + 2\n' 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' return f()\n' 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'result = g()', 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'exec') 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dct = {} 1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in dct 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct.get('result'), 3) 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testGenExp(self): 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('list((i,j) for i in range(3) if i < 3' 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' for j in range(4) if j > 2)', 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'eval') 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), [(0, 3), (1, 3), (2, 3)]) 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testSetLiteral(self): 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{1, 2, 3}', '<string>', 'eval') 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1,2,3}) 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{1, 2, 3,}', '<string>', 'eval') 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1,2,3}) 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testDictLiteral(self): 1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{1:2, 2:3, 3:4}', '<string>', 'eval') 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1:2, 2:3, 3:4}) 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{1:2, 2:3, 3:4,}', '<string>', 'eval') 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1:2, 2:3, 3:4}) 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testSetComp(self): 1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{x for x in range(1, 4)}', '<string>', 'eval') 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1, 2, 3}) 1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{x * y for x in range(3) if x != 0' 1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' for y in range(4) if y != 0}', 1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'eval') 1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1, 2, 3, 4, 6}) 1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testDictComp(self): 1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{x:x+1 for x in range(1, 4)}', '<string>', 'eval') 1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {1:2, 2:3, 3:4}) 1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('{(x, y) : y for x in range(2) if x != 0' 1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' for y in range(3) if y != 0}', 1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'eval') 1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(eval(c), {(1, 2): 2, (1, 1): 1}) 1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testWith(self): 1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # SF bug 1638243 1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('from __future__ import with_statement\n' 1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'def f():\n' 1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' with TrivialContext():\n' 1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' return 1\n' 1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'result = f()', 1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'exec' ) 1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dct = {'TrivialContext': TrivialContext} 1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in dct 1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct.get('result'), 1) 1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testWithAss(self): 1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('from __future__ import with_statement\n' 1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'def f():\n' 1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' with TrivialContext() as tc:\n' 1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' return 1\n' 1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'result = f()', 1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'exec' ) 1960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dct = {'TrivialContext': TrivialContext} 1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in dct 1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct.get('result'), 1) 1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testWithMult(self): 2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao events = [] 2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Ctx: 2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, n): 2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.n = n 2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __enter__(self): 2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao events.append(self.n) 2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __exit__(self, *args): 2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('from __future__ import with_statement\n' 2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'def f():\n' 2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' with Ctx(1) as tc, Ctx(2) as tc2:\n' 2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ' return 1\n' 2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'result = f()', 2140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'exec' ) 2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dct = {'Ctx': Ctx} 2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in dct 2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct.get('result'), 1) 2190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(events, [1, 2]) 2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testGlobal(self): 2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao code = compiler.compile('global x\nx=1', '<string>', 'exec') 2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d1 = {'__builtins__': {}} 2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d2 = {} 2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec code in d1, d2 2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # x should be in the globals dict 2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d1.get('x'), 1) 2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testPrintFunction(self): 2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = compiler.compile('from __future__ import print_function\n' 2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'print("a", "b", sep="**", end="++", ' 2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'file=output)', 2330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '<string>', 2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'exec' ) 2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dct = {'output': StringIO()} 2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao exec c in dct 2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dct['output'].getvalue(), 'a**b++') 2380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def _testErrEnc(self, src, text, offset): 2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao compile(src, "", "exec") 2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except SyntaxError, e: 2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(e.offset, offset) 2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(e.text, text) 2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def testSourceCodeEncodingsError(self): 2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test SyntaxError with encoding definition 2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao sjis = "print '\x83\x70\x83\x43\x83\x5c\x83\x93', '\n" 2490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ascii = "print '12345678', '\n" 2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao encdef = "#! -*- coding: ShiftJIS -*-\n" 2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # ascii source without encdef 2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self._testErrEnc(ascii, ascii, 19) 2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # ascii source with encdef 2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self._testErrEnc(encdef+ascii, ascii, 19) 2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # non-ascii source with encdef 2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self._testErrEnc(encdef+sjis, sjis, 19) 2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # ShiftJIS source without encdef 2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self._testErrEnc(sjis, sjis, 19) 2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2650a8c90248264a8b26970b4473770bcc3df8515fJosh GaoNOLINENO = (compiler.ast.Module, compiler.ast.Stmt, compiler.ast.Discard) 2660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao############################################################################### 2680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# code below is just used to trigger some possible errors, for the benefit of 2690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# testLineNo 2700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao############################################################################### 2710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2720a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass Toto: 2730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """docstring""" 2740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 2750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2760a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoa, b = 2, 3 2770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao[c, d] = 5, 6 2780a8c90248264a8b26970b4473770bcc3df8515fJosh Gaol = [(x, y) for x, y in zip(range(5), range(5,10))] 2790a8c90248264a8b26970b4473770bcc3df8515fJosh Gaol[0] 2800a8c90248264a8b26970b4473770bcc3df8515fJosh Gaol[3:4] 2810a8c90248264a8b26970b4473770bcc3df8515fJosh Gaod = {'a': 2} 2820a8c90248264a8b26970b4473770bcc3df8515fJosh Gaod = {} 2830a8c90248264a8b26970b4473770bcc3df8515fJosh Gaod = {x: y for x, y in zip(range(5), range(5,10))} 2840a8c90248264a8b26970b4473770bcc3df8515fJosh Gaos = {x for x in range(10)} 2850a8c90248264a8b26970b4473770bcc3df8515fJosh Gaos = {1} 2860a8c90248264a8b26970b4473770bcc3df8515fJosh Gaot = () 2870a8c90248264a8b26970b4473770bcc3df8515fJosh Gaot = (1, 2) 2880a8c90248264a8b26970b4473770bcc3df8515fJosh Gaol = [] 2890a8c90248264a8b26970b4473770bcc3df8515fJosh Gaol = [1, 2] 2900a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif l: 2910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 2920a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoelse: 2930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao a, b = b, a 2940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2950a8c90248264a8b26970b4473770bcc3df8515fJosh Gaotry: 2960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao print yo 2970a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoexcept: 2980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao yo = 3 2990a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoelse: 3000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao yo += 3 3010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3020a8c90248264a8b26970b4473770bcc3df8515fJosh Gaotry: 3030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao a += b 3040a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofinally: 3050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao b = 0 3060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3070a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom math import * 3080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao############################################################################### 3100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef test_main(): 3120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao global TEST_ALL 3130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao TEST_ALL = test.test_support.is_resource_enabled("cpu") 3140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao test.test_support.run_unittest(CompilerTest) 3150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3160a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoif __name__ == "__main__": 3170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao test_main() 318