14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Python test set -- part 1, grammar.
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# This just tests whether the parser accepts them all.
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import run_unittest, check_syntax_error, \
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                              check_py3k_warnings
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# testing import *
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom sys import *
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TokenTests(unittest.TestCase):
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testBackslash(self):
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Backslash means line continuation:
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 \
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        + 1
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, 2, 'backslash for line continuation')
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Backslash does not means continuation in comments :\
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, 0, 'backslash ending comment')
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testPlainIntegers(self):
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(0xff, 255)
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(0377, 255)
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(2147483647, 017777777777)
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # "0x" is not a valid literal
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(SyntaxError, eval, "0x")
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from sys import maxint
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if maxint == 2147483647:
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(-2147483647-1, -020000000000)
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # XXX -2147483648
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(037777777777 > 0)
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(0xffffffff > 0)
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for s in '2147483648', '040000000000', '0x100000000':
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x = eval(s)
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except OverflowError:
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.fail("OverflowError on huge integer literal %r" % s)
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif maxint == 9223372036854775807:
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(-9223372036854775807-1, -01000000000000000000000)
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(01777777777777777777777 > 0)
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(0xffffffffffffffff > 0)
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for s in '9223372036854775808', '02000000000000000000000', \
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                     '0x10000000000000000':
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    x = eval(s)
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except OverflowError:
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.fail("OverflowError on huge integer literal %r" % s)
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail('Weird maxint value %r' % maxint)
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testLongIntegers(self):
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0L
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0l
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0xffffffffffffffffL
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0xffffffffffffffffl
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 077777777777777777L
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 077777777777777777l
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 123456789012345678901234567890L
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 123456789012345678901234567890l
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testFloats(self):
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3.14
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 314.
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0.314
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # XXX x = 000.314
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = .314
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3e14
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3E14
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3e-14
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3e+14
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3.e14
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = .3e14
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 3.1e4
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testStringLiterals(self):
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = ''; y = ""; self.assertTrue(len(x) == 0 and x == y)
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = '\''; y = "'"; self.assertTrue(len(x) == 1 and x == y and ord(x) == 39)
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = '"'; y = "\""; self.assertTrue(len(x) == 1 and x == y and ord(x) == 34)
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = "doesn't \"shrink\" does it"
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = 'doesn\'t "shrink" does it'
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(len(x) == 24 and x == y)
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = "does \"shrink\" doesn't it"
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = 'does "shrink" doesn\'t it'
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(len(x) == 24 and x == y)
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = """
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe "quick"
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbrown fox
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmjumps over
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe 'lazy' dog.
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n'
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = '''
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe "quick"
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbrown fox
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmjumps over
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe 'lazy' dog.
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm'''
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = "\n\
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe \"quick\"\n\
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbrown fox\n\
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmjumps over\n\
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe 'lazy' dog.\n\
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = '\n\
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmThe \"quick\"\n\
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmbrown fox\n\
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmjumps over\n\
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe \'lazy\' dog.\n\
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm'
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass GrammarTests(unittest.TestCase):
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # XXX can't test in a script -- this rule is only used when interactive
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # file_input: (NEWLINE | stmt)* ENDMARKER
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Being tested as this very moment this very module
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # expr_input: testlist NEWLINE
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # XXX Hard to test -- used only in calls to input()
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testEvalInput(self):
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # testlist ENDMARKER
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = eval('1, 0 or 1')
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testFuncdef(self):
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### 'def' NAME parameters ':' suite
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### parameters: '(' [varargslist] ')'
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' ('**'|'*' '*') NAME]
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ###            | ('**'|'*' '*') NAME)
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ###            | fpdef ['=' test] (',' fpdef ['=' test])* [',']
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### fpdef: NAME | '(' fplist ')'
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### fplist: fpdef (',' fpdef)* [',']
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### arglist: (argument ',')* (argument | *' test [',' '**' test] | '**' test)
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### argument: [test '='] test   # Really [keyword '='] test
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f1(): pass
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f1()
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f1(*())
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f1(*(), **{})
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f2(one_argument): pass
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f3(two, arguments): pass
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Silence Py3k warning
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec('def f4(two, (compound, (argument, list))): pass')
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec('def f5((compound, first), two): pass')
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(f2.func_code.co_varnames, ('one_argument',))
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(f3.func_code.co_varnames, ('two', 'arguments'))
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if sys.platform.startswith('java'):
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(f4.func_code.co_varnames,
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   ('two', '(compound, (argument, list))', 'compound', 'argument',
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                'list',))
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(f5.func_code.co_varnames,
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                   ('(compound, first)', 'two', 'compound', 'first'))
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(f4.func_code.co_varnames,
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  ('two', '.1', 'compound', 'argument',  'list'))
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(f5.func_code.co_varnames,
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  ('.0', 'two', 'compound', 'first'))
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def a1(one_arg,): pass
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def a2(two, args,): pass
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def v0(*rest): pass
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def v1(a, *rest): pass
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def v2(a, b, *rest): pass
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Silence Py3k warning
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec('def v3(a, (b, c), *rest): return a, b, c, rest')
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f1()
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f2(1)
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f2(1,)
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f3(1, 2)
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f3(1, 2,)
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f4(1, (2, (3, 4)))
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v0()
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v0(1)
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v0(1,)
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v0(1,2)
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v0(1,2,3,4,5,6,7,8,9,0)
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1(1)
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1(1,)
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1(1,2)
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1(1,2,3)
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v1(1,2,3,4,5,6,7,8,9,0)
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2(1,2)
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2(1,2,3)
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2(1,2,3,4)
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v2(1,2,3,4,5,6,7,8,9,0)
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v3(1,(2,3))
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v3(1,(2,3),4)
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v3(1,(2,3),4,5,6,7,8,9,0)
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # ceval unpacks the formal arguments into the first argcount names;
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # thus, the names nested inside tuples must appear after these names.
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if sys.platform.startswith('java'):
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(v3.func_code.co_varnames, ('a', '(b, c)', 'rest', 'b', 'c'))
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(v3.func_code.co_varnames, ('a', '.1', 'rest', 'b', 'c'))
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(v3(1, (2, 3), 4), (1, 2, 3, (4,)))
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d01(a=1): pass
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01()
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01(1)
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01(*(1,))
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01(**{'a':2})
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d11(a, b=1): pass
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d11(1)
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d11(1, 2)
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d11(1, **{'b':2})
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d21(a, b, c=1): pass
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21(1, 2)
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21(1, 2, 3)
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21(*(1, 2, 3))
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21(1, *(2, 3))
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21(1, 2, *(3,))
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21(1, 2, **{'c':3})
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d02(a=1, b=2): pass
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02()
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02(1)
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02(1, 2)
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02(*(1, 2))
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02(1, *(2,))
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02(1, **{'b':2})
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02(**{'a': 1, 'b': 2})
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d12(a, b=1, c=2): pass
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12(1)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12(1, 2)
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12(1, 2, 3)
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d22(a, b, c=1, d=2): pass
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22(1, 2)
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22(1, 2, 3)
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22(1, 2, 3, 4)
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d01v(a=1, *rest): pass
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01v()
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01v(1)
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01v(1, 2)
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01v(*(1, 2, 3, 4))
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01v(*(1,))
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d01v(**{'a':2})
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d11v(a, b=1, *rest): pass
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d11v(1)
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d11v(1, 2)
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d11v(1, 2, 3)
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d21v(a, b, c=1, *rest): pass
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21v(1, 2)
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21v(1, 2, 3)
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21v(1, 2, 3, 4)
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21v(*(1, 2, 3, 4))
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d21v(1, 2, **{'c': 3})
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d02v(a=1, b=2, *rest): pass
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02v()
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02v(1)
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02v(1, 2)
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02v(1, 2, 3)
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02v(1, *(2, 3, 4))
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d02v(**{'a': 1, 'b': 2})
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d12v(a, b=1, c=2, *rest): pass
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(1)
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(1, 2)
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(1, 2, 3)
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(1, 2, 3, 4)
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(*(1, 2, 3, 4))
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(1, 2, *(3, 4, 5))
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d12v(1, *(2,), **{'c': 3})
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def d22v(a, b, c=1, d=2, *rest): pass
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(1, 2)
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(1, 2, 3)
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(1, 2, 3, 4)
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(1, 2, 3, 4, 5)
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(*(1, 2, 3, 4))
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(1, 2, *(3, 4, 5))
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d22v(1, *(2, 3), **{'d': 4})
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Silence Py3k warning
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec('def d31v((x)): pass')
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec('def d32v((x,)): pass')
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d31v(1)
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d32v((1,))
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # keyword arguments after *arglist
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f(*args, **kwargs):
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return args, kwargs
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(f(1, x=2, *[3, 4], y=5), ((1, 3, 4),
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                                    {'x':2, 'y':5}))
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(SyntaxError, eval, "f(1, *(2,3), 4)")
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(SyntaxError, eval, "f(1, x=2, *(3,4), x=5)")
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Check ast errors in *args and *kwargs
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "f(*g(1=2))")
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "f(**g(1=2))")
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testLambdef(self):
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### lambdef: 'lambda' [varargslist] ':' test
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l1 = lambda : 0
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(l1(), 0)
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l2 = lambda : a[d] # XXX just testing the expression
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l3 = lambda : [2 < x for x in [-1, 3, 0L]]
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(l3(), [0, 1, 0])
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l4 = lambda x = lambda y = lambda z=1 : z : y() : x()
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(l4(), 1)
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l5 = lambda x, y, z=2: x + y + z
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(l5(1, 2), 5)
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(l5(1, 2, 3), 6)
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "lambda x: x = 2")
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "lambda (None,): None")
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### stmt: simple_stmt | compound_stmt
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Tested below
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testSimpleStmt(self):
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### simple_stmt: small_stmt (';' small_stmt)* [';']
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1; pass; del x
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def foo():
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # verify statements that end with semi-colons
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x = 1; pass; del x;
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        foo()
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### small_stmt: expr_stmt | print_stmt  | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt | exec_stmt
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Tested below
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testExprStmt(self):
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # (exprlist '=')* exprlist
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        1
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        1, 2, 3
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1, 2, 3
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = y = z = 1, 2, 3
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x, y, z = 1, 2, 3
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4)
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "x + 1 = 1")
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "a + 1 = b + 2")
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testPrintStmt(self):
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'print' (test ',')* [test]
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import StringIO
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Can't test printing to real stdout without comparing output
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # which is not available in unittest.
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        save_stdout = sys.stdout
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdout = StringIO.StringIO()
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print 1, 2, 3
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print 1, 2, 3,
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print 0 or 1, 0 or 1,
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print 0 or 1
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'print' '>>' test ','
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> sys.stdout, 1, 2, 3
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> sys.stdout, 1, 2, 3,
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> sys.stdout
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> sys.stdout, 0 or 1, 0 or 1,
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> sys.stdout, 0 or 1
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # test printing to an instance
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Gulp:
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def write(self, msg): pass
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        gulp = Gulp()
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> gulp, 1, 2, 3
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> gulp, 1, 2, 3,
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> gulp
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> gulp, 0 or 1, 0 or 1,
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        print >> gulp, 0 or 1
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # test print >> None
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def driver():
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            oldstdout = sys.stdout
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            sys.stdout = Gulp()
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tellme(Gulp())
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                tellme()
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            finally:
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                sys.stdout = oldstdout
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # we should see this once
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def tellme(file=sys.stdout):
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print >> file, 'hello world'
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        driver()
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # we should not see this at all
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def tellme(file=None):
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print >> file, 'goodbye universe'
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        driver()
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sys.stdout.getvalue(), '''\
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1 2 3
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1 2 3
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1 1 1
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1 2 3
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1 2 3
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm1 1 1
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhello world
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm''')
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.stdout = save_stdout
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # syntax errors
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, 'print ,')
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, 'print >> x,')
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testDelStmt(self):
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'del' exprlist
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        abc = [1,2,3]
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x, y, z = abc
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        xyz = x, y, z
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del abc
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del x, y, (z, xyz)
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testPassStmt(self):
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'pass'
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        pass
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Tested below
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testBreakStmt(self):
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'break'
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while 1: break
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testContinueStmt(self):
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'continue'
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        i = 1
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while i: i = 0; continue
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = ""
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while not msg:
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            msg = "ok"
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                continue
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                msg = "continue failed to continue inside try"
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            except:
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                msg = "continue inside try called except block"
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if msg != "ok":
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail(msg)
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        msg = ""
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while not msg:
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            msg = "finally block not called"
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            try:
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                continue
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            finally:
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                msg = "ok"
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if msg != "ok":
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail(msg)
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_break_continue_loop(self):
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This test warrants an explanation. It is a test specifically for SF bugs
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # #463359 and #462937. The bug is that a 'break' statement executed or
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # exception raised inside a try/except inside a loop, *after* a continue
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # statement has been executed in that loop, will cause the wrong number of
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # arguments to be popped off the stack and the instruction pointer reset to
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # a very small number (usually 0.) Because of this, the following test
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # *must* written as a function, and the tracking vars *must* be function
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # arguments with default values. Otherwise, the test will loop and loop.
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_inner(extra_burning_oil = 1, count=0):
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            big_hippo = 2
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            while big_hippo:
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                count += 1
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    if extra_burning_oil and big_hippo == 1:
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        extra_burning_oil -= 1
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        break
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    big_hippo -= 1
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    continue
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except:
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if count > 2 or big_hippo != 1:
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.fail("continue then break in try/except in loop broken!")
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_inner()
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testReturn(self):
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'return' [testlist]
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def g1(): return
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def g2(): return 1
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g1()
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = g2()
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "class foo:return 1")
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testYield(self):
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "class foo:yield 1")
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testRaise(self):
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'raise' test [',' test]
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try: raise RuntimeError, 'just testing'
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except RuntimeError: pass
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try: raise KeyboardInterrupt
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except KeyboardInterrupt: pass
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testImport(self):
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'import' dotted_as_names
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import sys
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import time, sys
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names)
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from time import time
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from time import (time)
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # not testable inside a function, but already done at top of the module
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # from sys import *
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from sys import path, argv
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from sys import (path, argv)
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from sys import (path, argv,)
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testGlobal(self):
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'global' NAME (',' NAME)*
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        global a
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        global a, b
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        global one, two, three, four, five, six, seven, eight, nine, ten
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testExec(self):
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'exec' expr ['in' expr [',' expr]]
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        z = None
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del z
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec 'z=1+1\n'
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if z != 2: self.fail('exec \'z=1+1\'\\n')
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del z
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec 'z=1+1'
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if z != 2: self.fail('exec \'z=1+1\'')
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        z = None
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del z
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import types
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if hasattr(types, "UnicodeType"):
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exec r"""if 1:
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exec u'z=1+1\n'
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if z != 2: self.fail('exec u\'z=1+1\'\\n')
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            del z
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            exec u'z=1+1'
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if z != 2: self.fail('exec u\'z=1+1\'')"""
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g = {}
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec 'z = 1' in g
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '__builtins__' in g: del g['__builtins__']
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if g != {'z': 1}: self.fail('exec \'z = 1\' in g')
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g = {}
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        l = {}
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exec 'global a; a = 1; b = 2' in g, l
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '__builtins__' in g: del g['__builtins__']
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if '__builtins__' in l: del l['__builtins__']
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (g, l) != ({'a':1}, {'b':2}):
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail('exec ... in g (%s), l (%s)' %(g,l))
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testAssert(self):
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # assertTruestmt: 'assert' test [',' test]
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert 1
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert 1, 1
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert lambda x:x
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        assert 1, lambda x:x+1
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            assert 0, "msg"
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except AssertionError, e:
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(e.args[0], "msg")
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if __debug__:
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.fail("AssertionError not raised by assert 0")
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Tested below
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testIf(self):
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1: pass
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1: pass
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: pass
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 0: pass
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif 0: pass
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 0: pass
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif 0: pass
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif 0: pass
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif 0: pass
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: pass
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testWhile(self):
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'while' test ':' suite ['else' ':' suite]
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while 0: pass
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while 0: pass
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: pass
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Issue1920: "while 0" is optimized away,
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # ensure that the "else" clause is still present.
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 0
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        while 0:
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x = 1
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x = 2
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, 2)
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testFor(self):
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for i in 1, 2, 3: pass
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for i, j, k in (): pass
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: pass
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Squares:
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, max):
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.max = max
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.sofar = []
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __len__(self): return len(self.sofar)
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getitem__(self, i):
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not 0 <= i < self.max: raise IndexError
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n = len(self.sofar)
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                while n <= i:
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self.sofar.append(n*n)
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    n = n+1
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return self.sofar[i]
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        n = 0
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for x in Squares(10): n = n+x
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if n != 285:
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail('for over growing sequence')
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = []
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for x, in [(1,), (2,), (3,)]:
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            result.append(x)
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(result, [1, 2, 3])
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testTry(self):
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ###         | 'try' ':' suite 'finally' ':' suite
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### except_clause: 'except' [expr [('as' | ',') expr]]
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            1/0
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except ZeroDivisionError:
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try: 1/0
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except EOFError: pass
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError as msg: pass
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except RuntimeError, msg: pass
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except: pass
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else: pass
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try: 1/0
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except (EOFError, TypeError, ZeroDivisionError): pass
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try: 1/0
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except (EOFError, TypeError, ZeroDivisionError), msg: pass
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try: pass
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally: pass
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testSuite(self):
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1: pass
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1:
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1:
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            #
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testTest(self):
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### and_test ('or' and_test)*
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### and_test: not_test ('and' not_test)*
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### not_test: 'not' not_test | comparison
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not 1: pass
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 and 1: pass
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 or 1: pass
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not not not 1: pass
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not 1 and 1 and 1: pass
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testComparison(self):
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### comparison: expr (comp_op expr)*
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1: pass
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (1 == 1)
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 == 1: pass
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 != 1: pass
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 < 1: pass
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 > 1: pass
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 <= 1: pass
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 >= 1: pass
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 is 1: pass
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 is not 1: pass
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 in (): pass
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 not in (): pass
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if 1 < 1 > 1 == 1 >= 1 <= 1 != 1 in 1 not in 1 is 1 is not 1: pass
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Silence Py3k warning
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if eval('1 <> 1'): pass
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if eval('1 < 1 > 1 == 1 >= 1 <= 1 <> 1 != 1 in 1 not in 1 is 1 is not 1'): pass
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testBinaryMaskOps(self):
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 & 1
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 ^ 1
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 | 1
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testShiftOps(self):
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 << 1
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 >> 1
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 << 1 >> 1
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testAdditiveOps(self):
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 + 1
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 - 1 - 1
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 - 1 + 1 - 1 + 1
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testMultiplicativeOps(self):
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 * 1
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 / 1
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 % 1
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 1 / 1 * 1 % 1
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testUnaryOps(self):
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = +1
7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = -1
7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = ~1
7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = ~1 ^ 1 & 1 | 1 & 1 ^ -1
7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = -1*1/1 + 1*1 - ---1*1
7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testSelectors(self):
7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME
7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### subscript: expr | [expr] ':' [expr]
7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import sys, time
7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = sys.path[0]
7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = time.time()
7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = sys.modules['time'].time()
7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = '01234'
7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = a[0]
7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        c = a[-1]
7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[0:5]
7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[:5]
7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[0:]
7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[:]
7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[-5:]
7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[:-1]
7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = a[-4:-3]
7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # A rough test of SF bug 1333982.  http://python.org/sf/1333982
7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # The testing here is fairly incomplete.
7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Test cases should include: commas with 1 and 2 colons
7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d = {}
7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d[1] = 1
7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d[1,] = 2
7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d[1,2] = 3
7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        d[1,2,3] = 4
7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        L = list(d)
7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        L.sort()
7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(str(L), '[1, (1,), (1, 2), (1, 2, 3)]')
7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testAtoms(self):
7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING
7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ### dictorsetmaker: (test ':' test (',' test ':' test)* [',']) | (test (',' test)* [','])
7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (1)
7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (1 or 2 or 3)
7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (1 or 2 or 3, 2, 3)
7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = []
7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [1]
7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [1 or 2 or 3]
7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [1 or 2 or 3, 2, 3]
7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = []
7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {}
7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one': 1}
7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one': 1,}
7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one' or 'two': 1 or 2}
7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one': 1, 'two': 2}
7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one': 1, 'two': 2,}
7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one'}
7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one', 1,}
7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {'one', 'two', 'three'}
7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {2, 3, 4,}
7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Silence Py3k warning
7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = eval('`x`')
7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = eval('`1 or 2 or 3`')
7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(eval('`1,2`'), '(1, 2)')
7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = x
7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 'x'
7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 123
7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### exprlist: expr (',' expr)* [',']
7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### testlist: test (',' test)* [',']
7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # These have been exercised enough above
7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testClassdef(self):
7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # 'class' NAME ['(' [testlist] ')'] ':' suite
7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class B: pass
7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class B2(): pass
7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C1(B): pass
7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C2(B): pass
7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class D(C1, C2, B): pass
7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def meth1(self): pass
7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def meth2(self, arg): pass
7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def meth3(self, a1, a2): pass
7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # decorators: decorator+
8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # decorated: decorators (classdef | funcdef)
8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def class_decorator(x):
8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            x.decorated = True
8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return x
8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        @class_decorator
8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class G:
8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(G.decorated, True)
8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testDictcomps(self):
8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # dictorsetmaker: ( (test ':' test (comp_for |
8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        #                                   (',' test ':' test)* [','])) |
8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        #                   (test (comp_for | (',' test)* [','])) )
8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        nums = [1, 2, 3]
8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual({i:i+1 for i in nums}, {1: 2, 2: 3, 3: 4})
8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testListcomps(self):
8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # list comprehension tests
8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        nums = [1, 2, 3, 4, 5]
8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        strs = ["Apple", "Banana", "Coconut"]
8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        spcs = ["  Apple", " Banana ", "Coco  nut  "]
8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([s.strip() for s in spcs], ['Apple', 'Banana', 'Coco  nut'])
8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([3 * x for x in nums], [3, 6, 9, 12, 15])
8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([x for x in nums if x > 2], [3, 4, 5])
8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([(i, s) for i in nums for s in strs],
8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         [(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'),
8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'),
8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'),
8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'),
8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')])
8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([(i, s) for i in nums for s in [f for f in strs if "n" in f]],
8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         [(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'),
8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'),
8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (5, 'Banana'), (5, 'Coconut')])
8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)],
8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         [[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]])
8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_in_func(l):
8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return [None < x < 3 for x in l if x > 2]
8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(test_in_func(nums), [False, False, False])
8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_nested_front():
8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual([[y for y in [x, x + 1]] for x in [1,3,5]],
8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             [[1, 2], [3, 4], [5, 6]])
8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_nested_front()
8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "[i, s for i in nums for s in strs]")
8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "[x if y]")
8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suppliers = [
8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (1, "Boeing"),
8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (2, "Ford"),
8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (3, "Macdonalds")
8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parts = [
8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (10, "Airliner"),
8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (20, "Engine"),
8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (30, "Cheeseburger")
8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suppart = [
8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (1, 10), (1, 20), (2, 20), (3, 30)
8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [
8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm          (sname, pname)
8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for (sno, sname) in suppliers
8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm              for (pno, pname) in parts
8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for (sp_sno, sp_pno) in suppart
8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  if sno == sp_sno and pno == sp_pno
8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ]
8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'),
8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                             ('Macdonalds', 'Cheeseburger')])
8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testGenexps(self):
8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # generator expression tests
8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g = ([x for x in range(10)] for x in range(1))
8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(g.next(), [x for x in range(10)])
8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            g.next()
8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail('should produce StopIteration exception')
8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except StopIteration:
8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = 1
8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            g = (a for d in a)
8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            g.next()
8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail('should produce TypeError')
8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list((x, y) for x in 'abcd' for y in 'abcd'), [(x, y) for x in 'abcd' for y in 'abcd'])
8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list((x, y) for x in 'ab' for y in 'xy'), [(x, y) for x in 'ab' for y in 'xy'])
9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a = [x for x in range(10)]
9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        b = (x for x in (y for y in a))
9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(b), sum([x for x in range(10)]))
9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x**2 for x in range(10)), sum([x**2 for x in range(10)]))
9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x*x for x in range(10) if x%2), sum([x*x for x in range(10) if x%2]))
9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x for x in (y for y in range(10))), sum([x for x in range(10)]))
9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x for x in (y for y in (z for z in range(10)))), sum([x for x in range(10)]))
9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x for x in [y for y in (z for z in range(10))]), sum([x for x in range(10)]))
9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True)) if True), sum([x for x in range(10)]))
9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True) if False) if True), 0)
9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "foo(x for x in range(10), 100)")
9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        check_syntax_error(self, "foo(100, x for x in range(10))")
9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testComprehensionSpecials(self):
9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # test for outmost iterable precomputation
9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 10; g = (i for i in range(x)); x = 5
9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(list(g)), 10)
9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This should hold, since we're only precomputing outmost iterable.
9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x))
9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 5; t = True;
9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([(i,j) for i in range(10) for j in range(5)], list(g))
9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Grammar allows multiple adjacent 'if's in listcomps and genexps,
9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # even though it's silly. Make sure it works (ifelse broke this.)
9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([ x for x in range(10) if x % 2 if x % 3 ], [1, 5, 7])
9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(x for x in range(10) if x % 2 if x % 3), [1, 5, 7])
9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # verify unpacking single element tuples in listcomp/genexp.
9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([x for x, in [(4,), (5,), (6,)]], [4, 5, 6])
9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(x for x, in [(7,), (8,), (9,)]), [7, 8, 9])
9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_with_statement(self):
9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class manager(object):
9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __enter__(self):
9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (1, 2)
9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __exit__(self, *args):
9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with manager():
9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with manager() as x:
9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with manager() as (x, y):
9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with manager(), manager():
9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with manager() as x, manager() as y:
9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with manager() as x, manager():
9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testIfElseExpr(self):
9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Test ifelse expressions in various cases
9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def _checkeval(msg, ret):
9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            "helper to check that evaluation of expressions is done correctly"
9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            print x
9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ret
9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True])
9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True])
9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual([ x(False) for x in (lambda x: False if x else True, lambda x: True if x else False) if x(False) ], [True])
9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5)
9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5)
9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((5 and 6 if 0 else 1), 1)
9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(((5 and 6) if 0 else 1), 1)
9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((5 and (6 if 1 else 1)), 6)
9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3)
9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1)
9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5)
9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((not 5 if 1 else 1), False)
9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((not 5 if 0 else 1), 1)
9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((6 + 1 if 1 else 2), 7)
9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((6 - 1 if 1 else 2), 5)
9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((6 * 2 if 1 else 4), 12)
9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((6 / 2 if 1 else 3), 3)
9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((6 < 4 if 0 else 2), 2)
9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_paren_evaluation(self):
9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(16 // (4 // 2), 8)
9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((16 // 4) // 2, 2)
9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(16 // 4 // 2, 2)
9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(False is (2 is 3))
9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse((False is 2) is 3)
9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(False is 2 is 3)
9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    with check_py3k_warnings(
9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ("backquote not supported", SyntaxWarning),
9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ("tuple parameter unpacking has been removed", SyntaxWarning),
9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ("parenthesized argument names are invalid", SyntaxWarning),
9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ("classic int division", DeprecationWarning),
9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            (".+ not supported in 3.x", DeprecationWarning)):
9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        run_unittest(TokenTests, GrammarTests)
9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
1000