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