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