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