17db96d56Sopenharmony_ci# Python test set -- part 1, grammar. 27db96d56Sopenharmony_ci# This just tests whether the parser accepts them all. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci# NOTE: When you run this test as a script from the command line, you 57db96d56Sopenharmony_ci# get warnings about certain hex/oct constants. Since those are 67db96d56Sopenharmony_ci# issued by the parser, you can't suppress them by adding a 77db96d56Sopenharmony_ci# filterwarnings() call to this module. Therefore, to shut up the 87db96d56Sopenharmony_ci# regression test, the filterwarnings() call has been added to 97db96d56Sopenharmony_ci# regrtest.py. 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cifrom test.test_support import check_syntax_error 127db96d56Sopenharmony_ciimport unittest 137db96d56Sopenharmony_ciimport sys 147db96d56Sopenharmony_ci# testing import * 157db96d56Sopenharmony_cifrom sys import * 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ciclass TokenTests(unittest.TestCase): 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci def testBackslash(self): 207db96d56Sopenharmony_ci # Backslash means line continuation: 217db96d56Sopenharmony_ci x = 1 \ 227db96d56Sopenharmony_ci + 1 237db96d56Sopenharmony_ci self.assertEquals(x, 2, 'backslash for line continuation') 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci # Backslash does not means continuation in comments :\ 267db96d56Sopenharmony_ci x = 0 277db96d56Sopenharmony_ci self.assertEquals(x, 0, 'backslash ending comment') 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci def testPlainIntegers(self): 307db96d56Sopenharmony_ci self.assertEquals(0xff, 255) 317db96d56Sopenharmony_ci self.assertEquals(0377, 255) 327db96d56Sopenharmony_ci self.assertEquals(2147483647, 017777777777) 337db96d56Sopenharmony_ci # "0x" is not a valid literal 347db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "0x") 357db96d56Sopenharmony_ci from sys import maxint 367db96d56Sopenharmony_ci if maxint == 2147483647: 377db96d56Sopenharmony_ci self.assertEquals(-2147483647-1, -020000000000) 387db96d56Sopenharmony_ci # XXX -2147483648 397db96d56Sopenharmony_ci self.assert_(037777777777 > 0) 407db96d56Sopenharmony_ci self.assert_(0xffffffff > 0) 417db96d56Sopenharmony_ci for s in '2147483648', '040000000000', '0x100000000': 427db96d56Sopenharmony_ci try: 437db96d56Sopenharmony_ci x = eval(s) 447db96d56Sopenharmony_ci except OverflowError: 457db96d56Sopenharmony_ci self.fail("OverflowError on huge integer literal %r" % s) 467db96d56Sopenharmony_ci elif maxint == 9223372036854775807: 477db96d56Sopenharmony_ci self.assertEquals(-9223372036854775807-1, -01000000000000000000000) 487db96d56Sopenharmony_ci self.assert_(01777777777777777777777 > 0) 497db96d56Sopenharmony_ci self.assert_(0xffffffffffffffff > 0) 507db96d56Sopenharmony_ci for s in '9223372036854775808', '02000000000000000000000', \ 517db96d56Sopenharmony_ci '0x10000000000000000': 527db96d56Sopenharmony_ci try: 537db96d56Sopenharmony_ci x = eval(s) 547db96d56Sopenharmony_ci except OverflowError: 557db96d56Sopenharmony_ci self.fail("OverflowError on huge integer literal %r" % s) 567db96d56Sopenharmony_ci else: 577db96d56Sopenharmony_ci self.fail('Weird maxint value %r' % maxint) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci def testLongIntegers(self): 607db96d56Sopenharmony_ci x = 0L 617db96d56Sopenharmony_ci x = 0l 627db96d56Sopenharmony_ci x = 0xffffffffffffffffL 637db96d56Sopenharmony_ci x = 0xffffffffffffffffl 647db96d56Sopenharmony_ci x = 077777777777777777L 657db96d56Sopenharmony_ci x = 077777777777777777l 667db96d56Sopenharmony_ci x = 123456789012345678901234567890L 677db96d56Sopenharmony_ci x = 123456789012345678901234567890l 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci def testFloats(self): 707db96d56Sopenharmony_ci x = 3.14 717db96d56Sopenharmony_ci x = 314. 727db96d56Sopenharmony_ci x = 0.314 737db96d56Sopenharmony_ci # XXX x = 000.314 747db96d56Sopenharmony_ci x = .314 757db96d56Sopenharmony_ci x = 3e14 767db96d56Sopenharmony_ci x = 3E14 777db96d56Sopenharmony_ci x = 3e-14 787db96d56Sopenharmony_ci x = 3e+14 797db96d56Sopenharmony_ci x = 3.e14 807db96d56Sopenharmony_ci x = .3e14 817db96d56Sopenharmony_ci x = 3.1e4 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci def testStringLiterals(self): 847db96d56Sopenharmony_ci x = ''; y = ""; self.assert_(len(x) == 0 and x == y) 857db96d56Sopenharmony_ci x = '\''; y = "'"; self.assert_(len(x) == 1 and x == y and ord(x) == 39) 867db96d56Sopenharmony_ci x = '"'; y = "\""; self.assert_(len(x) == 1 and x == y and ord(x) == 34) 877db96d56Sopenharmony_ci x = "doesn't \"shrink\" does it" 887db96d56Sopenharmony_ci y = 'doesn\'t "shrink" does it' 897db96d56Sopenharmony_ci self.assert_(len(x) == 24 and x == y) 907db96d56Sopenharmony_ci x = "does \"shrink\" doesn't it" 917db96d56Sopenharmony_ci y = 'does "shrink" doesn\'t it' 927db96d56Sopenharmony_ci self.assert_(len(x) == 24 and x == y) 937db96d56Sopenharmony_ci x = """ 947db96d56Sopenharmony_ciThe "quick" 957db96d56Sopenharmony_cibrown fox 967db96d56Sopenharmony_cijumps over 977db96d56Sopenharmony_cithe 'lazy' dog. 987db96d56Sopenharmony_ci""" 997db96d56Sopenharmony_ci y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n' 1007db96d56Sopenharmony_ci self.assertEquals(x, y) 1017db96d56Sopenharmony_ci y = ''' 1027db96d56Sopenharmony_ciThe "quick" 1037db96d56Sopenharmony_cibrown fox 1047db96d56Sopenharmony_cijumps over 1057db96d56Sopenharmony_cithe 'lazy' dog. 1067db96d56Sopenharmony_ci''' 1077db96d56Sopenharmony_ci self.assertEquals(x, y) 1087db96d56Sopenharmony_ci y = "\n\ 1097db96d56Sopenharmony_ciThe \"quick\"\n\ 1107db96d56Sopenharmony_cibrown fox\n\ 1117db96d56Sopenharmony_cijumps over\n\ 1127db96d56Sopenharmony_cithe 'lazy' dog.\n\ 1137db96d56Sopenharmony_ci" 1147db96d56Sopenharmony_ci self.assertEquals(x, y) 1157db96d56Sopenharmony_ci y = '\n\ 1167db96d56Sopenharmony_ciThe \"quick\"\n\ 1177db96d56Sopenharmony_cibrown fox\n\ 1187db96d56Sopenharmony_cijumps over\n\ 1197db96d56Sopenharmony_cithe \'lazy\' dog.\n\ 1207db96d56Sopenharmony_ci' 1217db96d56Sopenharmony_ci self.assertEquals(x, y) 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ciclass GrammarTests(unittest.TestCase): 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE 1277db96d56Sopenharmony_ci # XXX can't test in a script -- this rule is only used when interactive 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci # file_input: (NEWLINE | stmt)* ENDMARKER 1307db96d56Sopenharmony_ci # Being tested as this very moment this very module 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci # expr_input: testlist NEWLINE 1337db96d56Sopenharmony_ci # XXX Hard to test -- used only in calls to input() 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci def testEvalInput(self): 1367db96d56Sopenharmony_ci # testlist ENDMARKER 1377db96d56Sopenharmony_ci x = eval('1, 0 or 1') 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci def testFuncdef(self): 1407db96d56Sopenharmony_ci ### 'def' NAME parameters ':' suite 1417db96d56Sopenharmony_ci ### parameters: '(' [varargslist] ')' 1427db96d56Sopenharmony_ci ### varargslist: (fpdef ['=' test] ',')* ('*' NAME [',' ('**'|'*' '*') NAME] 1437db96d56Sopenharmony_ci ### | ('**'|'*' '*') NAME) 1447db96d56Sopenharmony_ci ### | fpdef ['=' test] (',' fpdef ['=' test])* [','] 1457db96d56Sopenharmony_ci ### fpdef: NAME | '(' fplist ')' 1467db96d56Sopenharmony_ci ### fplist: fpdef (',' fpdef)* [','] 1477db96d56Sopenharmony_ci ### arglist: (argument ',')* (argument | *' test [',' '**' test] | '**' test) 1487db96d56Sopenharmony_ci ### argument: [test '='] test # Really [keyword '='] test 1497db96d56Sopenharmony_ci def f1(): pass 1507db96d56Sopenharmony_ci f1() 1517db96d56Sopenharmony_ci f1(*()) 1527db96d56Sopenharmony_ci f1(*(), **{}) 1537db96d56Sopenharmony_ci def f2(one_argument): pass 1547db96d56Sopenharmony_ci def f3(two, arguments): pass 1557db96d56Sopenharmony_ci def f4(two, (compound, (argument, list))): pass 1567db96d56Sopenharmony_ci def f5((compound, first), two): pass 1577db96d56Sopenharmony_ci self.assertEquals(f2.func_code.co_varnames, ('one_argument',)) 1587db96d56Sopenharmony_ci self.assertEquals(f3.func_code.co_varnames, ('two', 'arguments')) 1597db96d56Sopenharmony_ci if sys.platform.startswith('java'): 1607db96d56Sopenharmony_ci self.assertEquals(f4.func_code.co_varnames, 1617db96d56Sopenharmony_ci ('two', '(compound, (argument, list))', 'compound', 'argument', 1627db96d56Sopenharmony_ci 'list',)) 1637db96d56Sopenharmony_ci self.assertEquals(f5.func_code.co_varnames, 1647db96d56Sopenharmony_ci ('(compound, first)', 'two', 'compound', 'first')) 1657db96d56Sopenharmony_ci else: 1667db96d56Sopenharmony_ci self.assertEquals(f4.func_code.co_varnames, 1677db96d56Sopenharmony_ci ('two', '.1', 'compound', 'argument', 'list')) 1687db96d56Sopenharmony_ci self.assertEquals(f5.func_code.co_varnames, 1697db96d56Sopenharmony_ci ('.0', 'two', 'compound', 'first')) 1707db96d56Sopenharmony_ci def a1(one_arg,): pass 1717db96d56Sopenharmony_ci def a2(two, args,): pass 1727db96d56Sopenharmony_ci def v0(*rest): pass 1737db96d56Sopenharmony_ci def v1(a, *rest): pass 1747db96d56Sopenharmony_ci def v2(a, b, *rest): pass 1757db96d56Sopenharmony_ci def v3(a, (b, c), *rest): return a, b, c, rest 1767db96d56Sopenharmony_ci 1777db96d56Sopenharmony_ci f1() 1787db96d56Sopenharmony_ci f2(1) 1797db96d56Sopenharmony_ci f2(1,) 1807db96d56Sopenharmony_ci f3(1, 2) 1817db96d56Sopenharmony_ci f3(1, 2,) 1827db96d56Sopenharmony_ci f4(1, (2, (3, 4))) 1837db96d56Sopenharmony_ci v0() 1847db96d56Sopenharmony_ci v0(1) 1857db96d56Sopenharmony_ci v0(1,) 1867db96d56Sopenharmony_ci v0(1,2) 1877db96d56Sopenharmony_ci v0(1,2,3,4,5,6,7,8,9,0) 1887db96d56Sopenharmony_ci v1(1) 1897db96d56Sopenharmony_ci v1(1,) 1907db96d56Sopenharmony_ci v1(1,2) 1917db96d56Sopenharmony_ci v1(1,2,3) 1927db96d56Sopenharmony_ci v1(1,2,3,4,5,6,7,8,9,0) 1937db96d56Sopenharmony_ci v2(1,2) 1947db96d56Sopenharmony_ci v2(1,2,3) 1957db96d56Sopenharmony_ci v2(1,2,3,4) 1967db96d56Sopenharmony_ci v2(1,2,3,4,5,6,7,8,9,0) 1977db96d56Sopenharmony_ci v3(1,(2,3)) 1987db96d56Sopenharmony_ci v3(1,(2,3),4) 1997db96d56Sopenharmony_ci v3(1,(2,3),4,5,6,7,8,9,0) 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ci # ceval unpacks the formal arguments into the first argcount names; 2027db96d56Sopenharmony_ci # thus, the names nested inside tuples must appear after these names. 2037db96d56Sopenharmony_ci if sys.platform.startswith('java'): 2047db96d56Sopenharmony_ci self.assertEquals(v3.func_code.co_varnames, ('a', '(b, c)', 'rest', 'b', 'c')) 2057db96d56Sopenharmony_ci else: 2067db96d56Sopenharmony_ci self.assertEquals(v3.func_code.co_varnames, ('a', '.1', 'rest', 'b', 'c')) 2077db96d56Sopenharmony_ci self.assertEquals(v3(1, (2, 3), 4), (1, 2, 3, (4,))) 2087db96d56Sopenharmony_ci def d01(a=1): pass 2097db96d56Sopenharmony_ci d01() 2107db96d56Sopenharmony_ci d01(1) 2117db96d56Sopenharmony_ci d01(*(1,)) 2127db96d56Sopenharmony_ci d01(**{'a':2}) 2137db96d56Sopenharmony_ci def d11(a, b=1): pass 2147db96d56Sopenharmony_ci d11(1) 2157db96d56Sopenharmony_ci d11(1, 2) 2167db96d56Sopenharmony_ci d11(1, **{'b':2}) 2177db96d56Sopenharmony_ci def d21(a, b, c=1): pass 2187db96d56Sopenharmony_ci d21(1, 2) 2197db96d56Sopenharmony_ci d21(1, 2, 3) 2207db96d56Sopenharmony_ci d21(*(1, 2, 3)) 2217db96d56Sopenharmony_ci d21(1, *(2, 3)) 2227db96d56Sopenharmony_ci d21(1, 2, *(3,)) 2237db96d56Sopenharmony_ci d21(1, 2, **{'c':3}) 2247db96d56Sopenharmony_ci def d02(a=1, b=2): pass 2257db96d56Sopenharmony_ci d02() 2267db96d56Sopenharmony_ci d02(1) 2277db96d56Sopenharmony_ci d02(1, 2) 2287db96d56Sopenharmony_ci d02(*(1, 2)) 2297db96d56Sopenharmony_ci d02(1, *(2,)) 2307db96d56Sopenharmony_ci d02(1, **{'b':2}) 2317db96d56Sopenharmony_ci d02(**{'a': 1, 'b': 2}) 2327db96d56Sopenharmony_ci def d12(a, b=1, c=2): pass 2337db96d56Sopenharmony_ci d12(1) 2347db96d56Sopenharmony_ci d12(1, 2) 2357db96d56Sopenharmony_ci d12(1, 2, 3) 2367db96d56Sopenharmony_ci def d22(a, b, c=1, d=2): pass 2377db96d56Sopenharmony_ci d22(1, 2) 2387db96d56Sopenharmony_ci d22(1, 2, 3) 2397db96d56Sopenharmony_ci d22(1, 2, 3, 4) 2407db96d56Sopenharmony_ci def d01v(a=1, *rest): pass 2417db96d56Sopenharmony_ci d01v() 2427db96d56Sopenharmony_ci d01v(1) 2437db96d56Sopenharmony_ci d01v(1, 2) 2447db96d56Sopenharmony_ci d01v(*(1, 2, 3, 4)) 2457db96d56Sopenharmony_ci d01v(*(1,)) 2467db96d56Sopenharmony_ci d01v(**{'a':2}) 2477db96d56Sopenharmony_ci def d11v(a, b=1, *rest): pass 2487db96d56Sopenharmony_ci d11v(1) 2497db96d56Sopenharmony_ci d11v(1, 2) 2507db96d56Sopenharmony_ci d11v(1, 2, 3) 2517db96d56Sopenharmony_ci def d21v(a, b, c=1, *rest): pass 2527db96d56Sopenharmony_ci d21v(1, 2) 2537db96d56Sopenharmony_ci d21v(1, 2, 3) 2547db96d56Sopenharmony_ci d21v(1, 2, 3, 4) 2557db96d56Sopenharmony_ci d21v(*(1, 2, 3, 4)) 2567db96d56Sopenharmony_ci d21v(1, 2, **{'c': 3}) 2577db96d56Sopenharmony_ci def d02v(a=1, b=2, *rest): pass 2587db96d56Sopenharmony_ci d02v() 2597db96d56Sopenharmony_ci d02v(1) 2607db96d56Sopenharmony_ci d02v(1, 2) 2617db96d56Sopenharmony_ci d02v(1, 2, 3) 2627db96d56Sopenharmony_ci d02v(1, *(2, 3, 4)) 2637db96d56Sopenharmony_ci d02v(**{'a': 1, 'b': 2}) 2647db96d56Sopenharmony_ci def d12v(a, b=1, c=2, *rest): pass 2657db96d56Sopenharmony_ci d12v(1) 2667db96d56Sopenharmony_ci d12v(1, 2) 2677db96d56Sopenharmony_ci d12v(1, 2, 3) 2687db96d56Sopenharmony_ci d12v(1, 2, 3, 4) 2697db96d56Sopenharmony_ci d12v(*(1, 2, 3, 4)) 2707db96d56Sopenharmony_ci d12v(1, 2, *(3, 4, 5)) 2717db96d56Sopenharmony_ci d12v(1, *(2,), **{'c': 3}) 2727db96d56Sopenharmony_ci def d22v(a, b, c=1, d=2, *rest): pass 2737db96d56Sopenharmony_ci d22v(1, 2) 2747db96d56Sopenharmony_ci d22v(1, 2, 3) 2757db96d56Sopenharmony_ci d22v(1, 2, 3, 4) 2767db96d56Sopenharmony_ci d22v(1, 2, 3, 4, 5) 2777db96d56Sopenharmony_ci d22v(*(1, 2, 3, 4)) 2787db96d56Sopenharmony_ci d22v(1, 2, *(3, 4, 5)) 2797db96d56Sopenharmony_ci d22v(1, *(2, 3), **{'d': 4}) 2807db96d56Sopenharmony_ci def d31v((x)): pass 2817db96d56Sopenharmony_ci d31v(1) 2827db96d56Sopenharmony_ci def d32v((x,)): pass 2837db96d56Sopenharmony_ci d32v((1,)) 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci # keyword arguments after *arglist 2867db96d56Sopenharmony_ci def f(*args, **kwargs): 2877db96d56Sopenharmony_ci return args, kwargs 2887db96d56Sopenharmony_ci self.assertEquals(f(1, x=2, *[3, 4], y=5), ((1, 3, 4), 2897db96d56Sopenharmony_ci {'x':2, 'y':5})) 2907db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "f(1, *(2,3), 4)") 2917db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "f(1, x=2, *(3,4), x=5)") 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci # Check ast errors in *args and *kwargs 2947db96d56Sopenharmony_ci check_syntax_error(self, "f(*g(1=2))") 2957db96d56Sopenharmony_ci check_syntax_error(self, "f(**g(1=2))") 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci def testLambdef(self): 2987db96d56Sopenharmony_ci ### lambdef: 'lambda' [varargslist] ':' test 2997db96d56Sopenharmony_ci l1 = lambda : 0 3007db96d56Sopenharmony_ci self.assertEquals(l1(), 0) 3017db96d56Sopenharmony_ci l2 = lambda : a[d] # XXX just testing the expression 3027db96d56Sopenharmony_ci l3 = lambda : [2 < x for x in [-1, 3, 0L]] 3037db96d56Sopenharmony_ci self.assertEquals(l3(), [0, 1, 0]) 3047db96d56Sopenharmony_ci l4 = lambda x = lambda y = lambda z=1 : z : y() : x() 3057db96d56Sopenharmony_ci self.assertEquals(l4(), 1) 3067db96d56Sopenharmony_ci l5 = lambda x, y, z=2: x + y + z 3077db96d56Sopenharmony_ci self.assertEquals(l5(1, 2), 5) 3087db96d56Sopenharmony_ci self.assertEquals(l5(1, 2, 3), 6) 3097db96d56Sopenharmony_ci check_syntax_error(self, "lambda x: x = 2") 3107db96d56Sopenharmony_ci check_syntax_error(self, "lambda (None,): None") 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci ### stmt: simple_stmt | compound_stmt 3137db96d56Sopenharmony_ci # Tested below 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci def testSimpleStmt(self): 3167db96d56Sopenharmony_ci ### simple_stmt: small_stmt (';' small_stmt)* [';'] 3177db96d56Sopenharmony_ci x = 1; pass; del x 3187db96d56Sopenharmony_ci def foo(): 3197db96d56Sopenharmony_ci # verify statements that end with semi-colons 3207db96d56Sopenharmony_ci x = 1; pass; del x; 3217db96d56Sopenharmony_ci foo() 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci ### small_stmt: expr_stmt | print_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt | exec_stmt 3247db96d56Sopenharmony_ci # Tested below 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def testExprStmt(self): 3277db96d56Sopenharmony_ci # (exprlist '=')* exprlist 3287db96d56Sopenharmony_ci 1 3297db96d56Sopenharmony_ci 1, 2, 3 3307db96d56Sopenharmony_ci x = 1 3317db96d56Sopenharmony_ci x = 1, 2, 3 3327db96d56Sopenharmony_ci x = y = z = 1, 2, 3 3337db96d56Sopenharmony_ci x, y, z = 1, 2, 3 3347db96d56Sopenharmony_ci abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4) 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci check_syntax_error(self, "x + 1 = 1") 3377db96d56Sopenharmony_ci check_syntax_error(self, "a + 1 = b + 2") 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci def testPrintStmt(self): 3407db96d56Sopenharmony_ci # 'print' (test ',')* [test] 3417db96d56Sopenharmony_ci import StringIO 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci # Can't test printing to real stdout without comparing output 3447db96d56Sopenharmony_ci # which is not available in unittest. 3457db96d56Sopenharmony_ci save_stdout = sys.stdout 3467db96d56Sopenharmony_ci sys.stdout = StringIO.StringIO() 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci print 1, 2, 3 3497db96d56Sopenharmony_ci print 1, 2, 3, 3507db96d56Sopenharmony_ci print 3517db96d56Sopenharmony_ci print 0 or 1, 0 or 1, 3527db96d56Sopenharmony_ci print 0 or 1 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci # 'print' '>>' test ',' 3557db96d56Sopenharmony_ci print >> sys.stdout, 1, 2, 3 3567db96d56Sopenharmony_ci print >> sys.stdout, 1, 2, 3, 3577db96d56Sopenharmony_ci print >> sys.stdout 3587db96d56Sopenharmony_ci print >> sys.stdout, 0 or 1, 0 or 1, 3597db96d56Sopenharmony_ci print >> sys.stdout, 0 or 1 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci # test printing to an instance 3627db96d56Sopenharmony_ci class Gulp: 3637db96d56Sopenharmony_ci def write(self, msg): pass 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci gulp = Gulp() 3667db96d56Sopenharmony_ci print >> gulp, 1, 2, 3 3677db96d56Sopenharmony_ci print >> gulp, 1, 2, 3, 3687db96d56Sopenharmony_ci print >> gulp 3697db96d56Sopenharmony_ci print >> gulp, 0 or 1, 0 or 1, 3707db96d56Sopenharmony_ci print >> gulp, 0 or 1 3717db96d56Sopenharmony_ci 3727db96d56Sopenharmony_ci # test print >> None 3737db96d56Sopenharmony_ci def driver(): 3747db96d56Sopenharmony_ci oldstdout = sys.stdout 3757db96d56Sopenharmony_ci sys.stdout = Gulp() 3767db96d56Sopenharmony_ci try: 3777db96d56Sopenharmony_ci tellme(Gulp()) 3787db96d56Sopenharmony_ci tellme() 3797db96d56Sopenharmony_ci finally: 3807db96d56Sopenharmony_ci sys.stdout = oldstdout 3817db96d56Sopenharmony_ci 3827db96d56Sopenharmony_ci # we should see this once 3837db96d56Sopenharmony_ci def tellme(file=sys.stdout): 3847db96d56Sopenharmony_ci print >> file, 'hello world' 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci driver() 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ci # we should not see this at all 3897db96d56Sopenharmony_ci def tellme(file=None): 3907db96d56Sopenharmony_ci print >> file, 'goodbye universe' 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci driver() 3937db96d56Sopenharmony_ci 3947db96d56Sopenharmony_ci self.assertEqual(sys.stdout.getvalue(), '''\ 3957db96d56Sopenharmony_ci1 2 3 3967db96d56Sopenharmony_ci1 2 3 3977db96d56Sopenharmony_ci1 1 1 3987db96d56Sopenharmony_ci1 2 3 3997db96d56Sopenharmony_ci1 2 3 4007db96d56Sopenharmony_ci1 1 1 4017db96d56Sopenharmony_cihello world 4027db96d56Sopenharmony_ci''') 4037db96d56Sopenharmony_ci sys.stdout = save_stdout 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ci # syntax errors 4067db96d56Sopenharmony_ci check_syntax_error(self, 'print ,') 4077db96d56Sopenharmony_ci check_syntax_error(self, 'print >> x,') 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci def testDelStmt(self): 4107db96d56Sopenharmony_ci # 'del' exprlist 4117db96d56Sopenharmony_ci abc = [1,2,3] 4127db96d56Sopenharmony_ci x, y, z = abc 4137db96d56Sopenharmony_ci xyz = x, y, z 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ci del abc 4167db96d56Sopenharmony_ci del x, y, (z, xyz) 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci def testPassStmt(self): 4197db96d56Sopenharmony_ci # 'pass' 4207db96d56Sopenharmony_ci pass 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci # flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt 4237db96d56Sopenharmony_ci # Tested below 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci def testBreakStmt(self): 4267db96d56Sopenharmony_ci # 'break' 4277db96d56Sopenharmony_ci while 1: break 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci def testContinueStmt(self): 4307db96d56Sopenharmony_ci # 'continue' 4317db96d56Sopenharmony_ci i = 1 4327db96d56Sopenharmony_ci while i: i = 0; continue 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci msg = "" 4357db96d56Sopenharmony_ci while not msg: 4367db96d56Sopenharmony_ci msg = "ok" 4377db96d56Sopenharmony_ci try: 4387db96d56Sopenharmony_ci continue 4397db96d56Sopenharmony_ci msg = "continue failed to continue inside try" 4407db96d56Sopenharmony_ci except: 4417db96d56Sopenharmony_ci msg = "continue inside try called except block" 4427db96d56Sopenharmony_ci if msg != "ok": 4437db96d56Sopenharmony_ci self.fail(msg) 4447db96d56Sopenharmony_ci 4457db96d56Sopenharmony_ci msg = "" 4467db96d56Sopenharmony_ci while not msg: 4477db96d56Sopenharmony_ci msg = "finally block not called" 4487db96d56Sopenharmony_ci try: 4497db96d56Sopenharmony_ci continue 4507db96d56Sopenharmony_ci finally: 4517db96d56Sopenharmony_ci msg = "ok" 4527db96d56Sopenharmony_ci if msg != "ok": 4537db96d56Sopenharmony_ci self.fail(msg) 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci def test_break_continue_loop(self): 4567db96d56Sopenharmony_ci # This test warrants an explanation. It is a test specifically for SF bugs 4577db96d56Sopenharmony_ci # #463359 and #462937. The bug is that a 'break' statement executed or 4587db96d56Sopenharmony_ci # exception raised inside a try/except inside a loop, *after* a continue 4597db96d56Sopenharmony_ci # statement has been executed in that loop, will cause the wrong number of 4607db96d56Sopenharmony_ci # arguments to be popped off the stack and the instruction pointer reset to 4617db96d56Sopenharmony_ci # a very small number (usually 0.) Because of this, the following test 4627db96d56Sopenharmony_ci # *must* written as a function, and the tracking vars *must* be function 4637db96d56Sopenharmony_ci # arguments with default values. Otherwise, the test will loop and loop. 4647db96d56Sopenharmony_ci 4657db96d56Sopenharmony_ci def test_inner(extra_burning_oil = 1, count=0): 4667db96d56Sopenharmony_ci big_hippo = 2 4677db96d56Sopenharmony_ci while big_hippo: 4687db96d56Sopenharmony_ci count += 1 4697db96d56Sopenharmony_ci try: 4707db96d56Sopenharmony_ci if extra_burning_oil and big_hippo == 1: 4717db96d56Sopenharmony_ci extra_burning_oil -= 1 4727db96d56Sopenharmony_ci break 4737db96d56Sopenharmony_ci big_hippo -= 1 4747db96d56Sopenharmony_ci continue 4757db96d56Sopenharmony_ci except: 4767db96d56Sopenharmony_ci raise 4777db96d56Sopenharmony_ci if count > 2 or big_hippo <> 1: 4787db96d56Sopenharmony_ci self.fail("continue then break in try/except in loop broken!") 4797db96d56Sopenharmony_ci test_inner() 4807db96d56Sopenharmony_ci 4817db96d56Sopenharmony_ci def testReturn(self): 4827db96d56Sopenharmony_ci # 'return' [testlist] 4837db96d56Sopenharmony_ci def g1(): return 4847db96d56Sopenharmony_ci def g2(): return 1 4857db96d56Sopenharmony_ci g1() 4867db96d56Sopenharmony_ci x = g2() 4877db96d56Sopenharmony_ci check_syntax_error(self, "class foo:return 1") 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci def testYield(self): 4907db96d56Sopenharmony_ci check_syntax_error(self, "class foo:yield 1") 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ci def testRaise(self): 4937db96d56Sopenharmony_ci # 'raise' test [',' test] 4947db96d56Sopenharmony_ci try: raise RuntimeError, 'just testing' 4957db96d56Sopenharmony_ci except RuntimeError: pass 4967db96d56Sopenharmony_ci try: raise KeyboardInterrupt 4977db96d56Sopenharmony_ci except KeyboardInterrupt: pass 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci def testImport(self): 5007db96d56Sopenharmony_ci # 'import' dotted_as_names 5017db96d56Sopenharmony_ci import sys 5027db96d56Sopenharmony_ci import time, sys 5037db96d56Sopenharmony_ci # 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names) 5047db96d56Sopenharmony_ci from time import time 5057db96d56Sopenharmony_ci from time import (time) 5067db96d56Sopenharmony_ci # not testable inside a function, but already done at top of the module 5077db96d56Sopenharmony_ci # from sys import * 5087db96d56Sopenharmony_ci from sys import path, argv 5097db96d56Sopenharmony_ci from sys import (path, argv) 5107db96d56Sopenharmony_ci from sys import (path, argv,) 5117db96d56Sopenharmony_ci 5127db96d56Sopenharmony_ci def testGlobal(self): 5137db96d56Sopenharmony_ci # 'global' NAME (',' NAME)* 5147db96d56Sopenharmony_ci global a 5157db96d56Sopenharmony_ci global a, b 5167db96d56Sopenharmony_ci global one, two, three, four, five, six, seven, eight, nine, ten 5177db96d56Sopenharmony_ci 5187db96d56Sopenharmony_ci def testExec(self): 5197db96d56Sopenharmony_ci # 'exec' expr ['in' expr [',' expr]] 5207db96d56Sopenharmony_ci z = None 5217db96d56Sopenharmony_ci del z 5227db96d56Sopenharmony_ci exec 'z=1+1\n' 5237db96d56Sopenharmony_ci if z != 2: self.fail('exec \'z=1+1\'\\n') 5247db96d56Sopenharmony_ci del z 5257db96d56Sopenharmony_ci exec 'z=1+1' 5267db96d56Sopenharmony_ci if z != 2: self.fail('exec \'z=1+1\'') 5277db96d56Sopenharmony_ci z = None 5287db96d56Sopenharmony_ci del z 5297db96d56Sopenharmony_ci import types 5307db96d56Sopenharmony_ci if hasattr(types, "UnicodeType"): 5317db96d56Sopenharmony_ci exec r"""if 1: 5327db96d56Sopenharmony_ci exec u'z=1+1\n' 5337db96d56Sopenharmony_ci if z != 2: self.fail('exec u\'z=1+1\'\\n') 5347db96d56Sopenharmony_ci del z 5357db96d56Sopenharmony_ci exec u'z=1+1' 5367db96d56Sopenharmony_ci if z != 2: self.fail('exec u\'z=1+1\'')""" 5377db96d56Sopenharmony_ci g = {} 5387db96d56Sopenharmony_ci exec 'z = 1' in g 5397db96d56Sopenharmony_ci if g.has_key('__builtins__'): del g['__builtins__'] 5407db96d56Sopenharmony_ci if g != {'z': 1}: self.fail('exec \'z = 1\' in g') 5417db96d56Sopenharmony_ci g = {} 5427db96d56Sopenharmony_ci l = {} 5437db96d56Sopenharmony_ci 5447db96d56Sopenharmony_ci import warnings 5457db96d56Sopenharmony_ci warnings.filterwarnings("ignore", "global statement", module="<string>") 5467db96d56Sopenharmony_ci exec 'global a; a = 1; b = 2' in g, l 5477db96d56Sopenharmony_ci if g.has_key('__builtins__'): del g['__builtins__'] 5487db96d56Sopenharmony_ci if l.has_key('__builtins__'): del l['__builtins__'] 5497db96d56Sopenharmony_ci if (g, l) != ({'a':1}, {'b':2}): 5507db96d56Sopenharmony_ci self.fail('exec ... in g (%s), l (%s)' %(g,l)) 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci def testAssert(self): 5537db96d56Sopenharmony_ci # assert_stmt: 'assert' test [',' test] 5547db96d56Sopenharmony_ci assert 1 5557db96d56Sopenharmony_ci assert 1, 1 5567db96d56Sopenharmony_ci assert lambda x:x 5577db96d56Sopenharmony_ci assert 1, lambda x:x+1 5587db96d56Sopenharmony_ci try: 5597db96d56Sopenharmony_ci assert 0, "msg" 5607db96d56Sopenharmony_ci except AssertionError, e: 5617db96d56Sopenharmony_ci self.assertEquals(e.args[0], "msg") 5627db96d56Sopenharmony_ci else: 5637db96d56Sopenharmony_ci if __debug__: 5647db96d56Sopenharmony_ci self.fail("AssertionError not raised by assert 0") 5657db96d56Sopenharmony_ci 5667db96d56Sopenharmony_ci ### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef 5677db96d56Sopenharmony_ci # Tested below 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_ci def testIf(self): 5707db96d56Sopenharmony_ci # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] 5717db96d56Sopenharmony_ci if 1: pass 5727db96d56Sopenharmony_ci if 1: pass 5737db96d56Sopenharmony_ci else: pass 5747db96d56Sopenharmony_ci if 0: pass 5757db96d56Sopenharmony_ci elif 0: pass 5767db96d56Sopenharmony_ci if 0: pass 5777db96d56Sopenharmony_ci elif 0: pass 5787db96d56Sopenharmony_ci elif 0: pass 5797db96d56Sopenharmony_ci elif 0: pass 5807db96d56Sopenharmony_ci else: pass 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci def testWhile(self): 5837db96d56Sopenharmony_ci # 'while' test ':' suite ['else' ':' suite] 5847db96d56Sopenharmony_ci while 0: pass 5857db96d56Sopenharmony_ci while 0: pass 5867db96d56Sopenharmony_ci else: pass 5877db96d56Sopenharmony_ci 5887db96d56Sopenharmony_ci # Issue1920: "while 0" is optimized away, 5897db96d56Sopenharmony_ci # ensure that the "else" clause is still present. 5907db96d56Sopenharmony_ci x = 0 5917db96d56Sopenharmony_ci while 0: 5927db96d56Sopenharmony_ci x = 1 5937db96d56Sopenharmony_ci else: 5947db96d56Sopenharmony_ci x = 2 5957db96d56Sopenharmony_ci self.assertEquals(x, 2) 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci def testFor(self): 5987db96d56Sopenharmony_ci # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] 5997db96d56Sopenharmony_ci for i in 1, 2, 3: pass 6007db96d56Sopenharmony_ci for i, j, k in (): pass 6017db96d56Sopenharmony_ci else: pass 6027db96d56Sopenharmony_ci class Squares: 6037db96d56Sopenharmony_ci def __init__(self, max): 6047db96d56Sopenharmony_ci self.max = max 6057db96d56Sopenharmony_ci self.sofar = [] 6067db96d56Sopenharmony_ci def __len__(self): return len(self.sofar) 6077db96d56Sopenharmony_ci def __getitem__(self, i): 6087db96d56Sopenharmony_ci if not 0 <= i < self.max: raise IndexError 6097db96d56Sopenharmony_ci n = len(self.sofar) 6107db96d56Sopenharmony_ci while n <= i: 6117db96d56Sopenharmony_ci self.sofar.append(n*n) 6127db96d56Sopenharmony_ci n = n+1 6137db96d56Sopenharmony_ci return self.sofar[i] 6147db96d56Sopenharmony_ci n = 0 6157db96d56Sopenharmony_ci for x in Squares(10): n = n+x 6167db96d56Sopenharmony_ci if n != 285: 6177db96d56Sopenharmony_ci self.fail('for over growing sequence') 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_ci result = [] 6207db96d56Sopenharmony_ci for x, in [(1,), (2,), (3,)]: 6217db96d56Sopenharmony_ci result.append(x) 6227db96d56Sopenharmony_ci self.assertEqual(result, [1, 2, 3]) 6237db96d56Sopenharmony_ci 6247db96d56Sopenharmony_ci def testTry(self): 6257db96d56Sopenharmony_ci ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] 6267db96d56Sopenharmony_ci ### | 'try' ':' suite 'finally' ':' suite 6277db96d56Sopenharmony_ci ### except_clause: 'except' [expr [('as' | ',') expr]] 6287db96d56Sopenharmony_ci try: 6297db96d56Sopenharmony_ci 1/0 6307db96d56Sopenharmony_ci except ZeroDivisionError: 6317db96d56Sopenharmony_ci pass 6327db96d56Sopenharmony_ci else: 6337db96d56Sopenharmony_ci pass 6347db96d56Sopenharmony_ci try: 1/0 6357db96d56Sopenharmony_ci except EOFError: pass 6367db96d56Sopenharmony_ci except TypeError as msg: pass 6377db96d56Sopenharmony_ci except RuntimeError, msg: pass 6387db96d56Sopenharmony_ci except: pass 6397db96d56Sopenharmony_ci else: pass 6407db96d56Sopenharmony_ci try: 1/0 6417db96d56Sopenharmony_ci except (EOFError, TypeError, ZeroDivisionError): pass 6427db96d56Sopenharmony_ci try: 1/0 6437db96d56Sopenharmony_ci except (EOFError, TypeError, ZeroDivisionError), msg: pass 6447db96d56Sopenharmony_ci try: pass 6457db96d56Sopenharmony_ci finally: pass 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci def testSuite(self): 6487db96d56Sopenharmony_ci # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT 6497db96d56Sopenharmony_ci if 1: pass 6507db96d56Sopenharmony_ci if 1: 6517db96d56Sopenharmony_ci pass 6527db96d56Sopenharmony_ci if 1: 6537db96d56Sopenharmony_ci # 6547db96d56Sopenharmony_ci # 6557db96d56Sopenharmony_ci # 6567db96d56Sopenharmony_ci pass 6577db96d56Sopenharmony_ci pass 6587db96d56Sopenharmony_ci # 6597db96d56Sopenharmony_ci pass 6607db96d56Sopenharmony_ci # 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci def testTest(self): 6637db96d56Sopenharmony_ci ### and_test ('or' and_test)* 6647db96d56Sopenharmony_ci ### and_test: not_test ('and' not_test)* 6657db96d56Sopenharmony_ci ### not_test: 'not' not_test | comparison 6667db96d56Sopenharmony_ci if not 1: pass 6677db96d56Sopenharmony_ci if 1 and 1: pass 6687db96d56Sopenharmony_ci if 1 or 1: pass 6697db96d56Sopenharmony_ci if not not not 1: pass 6707db96d56Sopenharmony_ci if not 1 and 1 and 1: pass 6717db96d56Sopenharmony_ci if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass 6727db96d56Sopenharmony_ci 6737db96d56Sopenharmony_ci def testComparison(self): 6747db96d56Sopenharmony_ci ### comparison: expr (comp_op expr)* 6757db96d56Sopenharmony_ci ### comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' 6767db96d56Sopenharmony_ci if 1: pass 6777db96d56Sopenharmony_ci x = (1 == 1) 6787db96d56Sopenharmony_ci if 1 == 1: pass 6797db96d56Sopenharmony_ci if 1 != 1: pass 6807db96d56Sopenharmony_ci if 1 <> 1: pass 6817db96d56Sopenharmony_ci if 1 < 1: pass 6827db96d56Sopenharmony_ci if 1 > 1: pass 6837db96d56Sopenharmony_ci if 1 <= 1: pass 6847db96d56Sopenharmony_ci if 1 >= 1: pass 6857db96d56Sopenharmony_ci if 1 is 1: pass 6867db96d56Sopenharmony_ci if 1 is not 1: pass 6877db96d56Sopenharmony_ci if 1 in (): pass 6887db96d56Sopenharmony_ci if 1 not in (): pass 6897db96d56Sopenharmony_ci if 1 < 1 > 1 == 1 >= 1 <= 1 <> 1 != 1 in 1 not in 1 is 1 is not 1: pass 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_ci def testBinaryMaskOps(self): 6927db96d56Sopenharmony_ci x = 1 & 1 6937db96d56Sopenharmony_ci x = 1 ^ 1 6947db96d56Sopenharmony_ci x = 1 | 1 6957db96d56Sopenharmony_ci 6967db96d56Sopenharmony_ci def testShiftOps(self): 6977db96d56Sopenharmony_ci x = 1 << 1 6987db96d56Sopenharmony_ci x = 1 >> 1 6997db96d56Sopenharmony_ci x = 1 << 1 >> 1 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci def testAdditiveOps(self): 7027db96d56Sopenharmony_ci x = 1 7037db96d56Sopenharmony_ci x = 1 + 1 7047db96d56Sopenharmony_ci x = 1 - 1 - 1 7057db96d56Sopenharmony_ci x = 1 - 1 + 1 - 1 + 1 7067db96d56Sopenharmony_ci 7077db96d56Sopenharmony_ci def testMultiplicativeOps(self): 7087db96d56Sopenharmony_ci x = 1 * 1 7097db96d56Sopenharmony_ci x = 1 / 1 7107db96d56Sopenharmony_ci x = 1 % 1 7117db96d56Sopenharmony_ci x = 1 / 1 * 1 % 1 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ci def testUnaryOps(self): 7147db96d56Sopenharmony_ci x = +1 7157db96d56Sopenharmony_ci x = -1 7167db96d56Sopenharmony_ci x = ~1 7177db96d56Sopenharmony_ci x = ~1 ^ 1 & 1 | 1 & 1 ^ -1 7187db96d56Sopenharmony_ci x = -1*1/1 + 1*1 - ---1*1 7197db96d56Sopenharmony_ci 7207db96d56Sopenharmony_ci def testSelectors(self): 7217db96d56Sopenharmony_ci ### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME 7227db96d56Sopenharmony_ci ### subscript: expr | [expr] ':' [expr] 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci import sys, time 7257db96d56Sopenharmony_ci c = sys.path[0] 7267db96d56Sopenharmony_ci x = time.time() 7277db96d56Sopenharmony_ci x = sys.modules['time'].time() 7287db96d56Sopenharmony_ci a = '01234' 7297db96d56Sopenharmony_ci c = a[0] 7307db96d56Sopenharmony_ci c = a[-1] 7317db96d56Sopenharmony_ci s = a[0:5] 7327db96d56Sopenharmony_ci s = a[:5] 7337db96d56Sopenharmony_ci s = a[0:] 7347db96d56Sopenharmony_ci s = a[:] 7357db96d56Sopenharmony_ci s = a[-5:] 7367db96d56Sopenharmony_ci s = a[:-1] 7377db96d56Sopenharmony_ci s = a[-4:-3] 7387db96d56Sopenharmony_ci # A rough test of SF bug 1333982. https://python.org/sf/1333982 7397db96d56Sopenharmony_ci # The testing here is fairly incomplete. 7407db96d56Sopenharmony_ci # Test cases should include: commas with 1 and 2 colons 7417db96d56Sopenharmony_ci d = {} 7427db96d56Sopenharmony_ci d[1] = 1 7437db96d56Sopenharmony_ci d[1,] = 2 7447db96d56Sopenharmony_ci d[1,2] = 3 7457db96d56Sopenharmony_ci d[1,2,3] = 4 7467db96d56Sopenharmony_ci L = list(d) 7477db96d56Sopenharmony_ci L.sort() 7487db96d56Sopenharmony_ci self.assertEquals(str(L), '[1, (1,), (1, 2), (1, 2, 3)]') 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ci def testAtoms(self): 7517db96d56Sopenharmony_ci ### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING 7527db96d56Sopenharmony_ci ### dictmaker: test ':' test (',' test ':' test)* [','] 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ci x = (1) 7557db96d56Sopenharmony_ci x = (1 or 2 or 3) 7567db96d56Sopenharmony_ci x = (1 or 2 or 3, 2, 3) 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci x = [] 7597db96d56Sopenharmony_ci x = [1] 7607db96d56Sopenharmony_ci x = [1 or 2 or 3] 7617db96d56Sopenharmony_ci x = [1 or 2 or 3, 2, 3] 7627db96d56Sopenharmony_ci x = [] 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ci x = {} 7657db96d56Sopenharmony_ci x = {'one': 1} 7667db96d56Sopenharmony_ci x = {'one': 1,} 7677db96d56Sopenharmony_ci x = {'one' or 'two': 1 or 2} 7687db96d56Sopenharmony_ci x = {'one': 1, 'two': 2} 7697db96d56Sopenharmony_ci x = {'one': 1, 'two': 2,} 7707db96d56Sopenharmony_ci x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6} 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ci x = `x` 7737db96d56Sopenharmony_ci x = `1 or 2 or 3` 7747db96d56Sopenharmony_ci self.assertEqual(`1,2`, '(1, 2)') 7757db96d56Sopenharmony_ci 7767db96d56Sopenharmony_ci x = x 7777db96d56Sopenharmony_ci x = 'x' 7787db96d56Sopenharmony_ci x = 123 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci ### exprlist: expr (',' expr)* [','] 7817db96d56Sopenharmony_ci ### testlist: test (',' test)* [','] 7827db96d56Sopenharmony_ci # These have been exercised enough above 7837db96d56Sopenharmony_ci 7847db96d56Sopenharmony_ci def testClassdef(self): 7857db96d56Sopenharmony_ci # 'class' NAME ['(' [testlist] ')'] ':' suite 7867db96d56Sopenharmony_ci class B: pass 7877db96d56Sopenharmony_ci class B2(): pass 7887db96d56Sopenharmony_ci class C1(B): pass 7897db96d56Sopenharmony_ci class C2(B): pass 7907db96d56Sopenharmony_ci class D(C1, C2, B): pass 7917db96d56Sopenharmony_ci class C: 7927db96d56Sopenharmony_ci def meth1(self): pass 7937db96d56Sopenharmony_ci def meth2(self, arg): pass 7947db96d56Sopenharmony_ci def meth3(self, a1, a2): pass 7957db96d56Sopenharmony_ci # decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE 7967db96d56Sopenharmony_ci # decorators: decorator+ 7977db96d56Sopenharmony_ci # decorated: decorators (classdef | funcdef) 7987db96d56Sopenharmony_ci def class_decorator(x): 7997db96d56Sopenharmony_ci x.decorated = True 8007db96d56Sopenharmony_ci return x 8017db96d56Sopenharmony_ci @class_decorator 8027db96d56Sopenharmony_ci class G: 8037db96d56Sopenharmony_ci pass 8047db96d56Sopenharmony_ci self.assertEqual(G.decorated, True) 8057db96d56Sopenharmony_ci 8067db96d56Sopenharmony_ci def testListcomps(self): 8077db96d56Sopenharmony_ci # list comprehension tests 8087db96d56Sopenharmony_ci nums = [1, 2, 3, 4, 5] 8097db96d56Sopenharmony_ci strs = ["Apple", "Banana", "Coconut"] 8107db96d56Sopenharmony_ci spcs = [" Apple", " Banana ", "Coco nut "] 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci self.assertEqual([s.strip() for s in spcs], ['Apple', 'Banana', 'Coco nut']) 8137db96d56Sopenharmony_ci self.assertEqual([3 * x for x in nums], [3, 6, 9, 12, 15]) 8147db96d56Sopenharmony_ci self.assertEqual([x for x in nums if x > 2], [3, 4, 5]) 8157db96d56Sopenharmony_ci self.assertEqual([(i, s) for i in nums for s in strs], 8167db96d56Sopenharmony_ci [(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'), 8177db96d56Sopenharmony_ci (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'), 8187db96d56Sopenharmony_ci (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'), 8197db96d56Sopenharmony_ci (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'), 8207db96d56Sopenharmony_ci (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')]) 8217db96d56Sopenharmony_ci self.assertEqual([(i, s) for i in nums for s in [f for f in strs if "n" in f]], 8227db96d56Sopenharmony_ci [(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'), 8237db96d56Sopenharmony_ci (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'), 8247db96d56Sopenharmony_ci (5, 'Banana'), (5, 'Coconut')]) 8257db96d56Sopenharmony_ci self.assertEqual([(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)], 8267db96d56Sopenharmony_ci [[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]]) 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_ci def test_in_func(l): 8297db96d56Sopenharmony_ci return [None < x < 3 for x in l if x > 2] 8307db96d56Sopenharmony_ci 8317db96d56Sopenharmony_ci self.assertEqual(test_in_func(nums), [False, False, False]) 8327db96d56Sopenharmony_ci 8337db96d56Sopenharmony_ci def test_nested_front(): 8347db96d56Sopenharmony_ci self.assertEqual([[y for y in [x, x + 1]] for x in [1,3,5]], 8357db96d56Sopenharmony_ci [[1, 2], [3, 4], [5, 6]]) 8367db96d56Sopenharmony_ci 8377db96d56Sopenharmony_ci test_nested_front() 8387db96d56Sopenharmony_ci 8397db96d56Sopenharmony_ci check_syntax_error(self, "[i, s for i in nums for s in strs]") 8407db96d56Sopenharmony_ci check_syntax_error(self, "[x if y]") 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_ci suppliers = [ 8437db96d56Sopenharmony_ci (1, "Boeing"), 8447db96d56Sopenharmony_ci (2, "Ford"), 8457db96d56Sopenharmony_ci (3, "Macdonalds") 8467db96d56Sopenharmony_ci ] 8477db96d56Sopenharmony_ci 8487db96d56Sopenharmony_ci parts = [ 8497db96d56Sopenharmony_ci (10, "Airliner"), 8507db96d56Sopenharmony_ci (20, "Engine"), 8517db96d56Sopenharmony_ci (30, "Cheeseburger") 8527db96d56Sopenharmony_ci ] 8537db96d56Sopenharmony_ci 8547db96d56Sopenharmony_ci suppart = [ 8557db96d56Sopenharmony_ci (1, 10), (1, 20), (2, 20), (3, 30) 8567db96d56Sopenharmony_ci ] 8577db96d56Sopenharmony_ci 8587db96d56Sopenharmony_ci x = [ 8597db96d56Sopenharmony_ci (sname, pname) 8607db96d56Sopenharmony_ci for (sno, sname) in suppliers 8617db96d56Sopenharmony_ci for (pno, pname) in parts 8627db96d56Sopenharmony_ci for (sp_sno, sp_pno) in suppart 8637db96d56Sopenharmony_ci if sno == sp_sno and pno == sp_pno 8647db96d56Sopenharmony_ci ] 8657db96d56Sopenharmony_ci 8667db96d56Sopenharmony_ci self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'), 8677db96d56Sopenharmony_ci ('Macdonalds', 'Cheeseburger')]) 8687db96d56Sopenharmony_ci 8697db96d56Sopenharmony_ci def testGenexps(self): 8707db96d56Sopenharmony_ci # generator expression tests 8717db96d56Sopenharmony_ci g = ([x for x in range(10)] for x in range(1)) 8727db96d56Sopenharmony_ci self.assertEqual(g.next(), [x for x in range(10)]) 8737db96d56Sopenharmony_ci try: 8747db96d56Sopenharmony_ci g.next() 8757db96d56Sopenharmony_ci self.fail('should produce StopIteration exception') 8767db96d56Sopenharmony_ci except StopIteration: 8777db96d56Sopenharmony_ci pass 8787db96d56Sopenharmony_ci 8797db96d56Sopenharmony_ci a = 1 8807db96d56Sopenharmony_ci try: 8817db96d56Sopenharmony_ci g = (a for d in a) 8827db96d56Sopenharmony_ci g.next() 8837db96d56Sopenharmony_ci self.fail('should produce TypeError') 8847db96d56Sopenharmony_ci except TypeError: 8857db96d56Sopenharmony_ci pass 8867db96d56Sopenharmony_ci 8877db96d56Sopenharmony_ci self.assertEqual(list((x, y) for x in 'abcd' for y in 'abcd'), [(x, y) for x in 'abcd' for y in 'abcd']) 8887db96d56Sopenharmony_ci self.assertEqual(list((x, y) for x in 'ab' for y in 'xy'), [(x, y) for x in 'ab' for y in 'xy']) 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ci a = [x for x in range(10)] 8917db96d56Sopenharmony_ci b = (x for x in (y for y in a)) 8927db96d56Sopenharmony_ci self.assertEqual(sum(b), sum([x for x in range(10)])) 8937db96d56Sopenharmony_ci 8947db96d56Sopenharmony_ci self.assertEqual(sum(x**2 for x in range(10)), sum([x**2 for x in range(10)])) 8957db96d56Sopenharmony_ci self.assertEqual(sum(x*x for x in range(10) if x%2), sum([x*x for x in range(10) if x%2])) 8967db96d56Sopenharmony_ci self.assertEqual(sum(x for x in (y for y in range(10))), sum([x for x in range(10)])) 8977db96d56Sopenharmony_ci self.assertEqual(sum(x for x in (y for y in (z for z in range(10)))), sum([x for x in range(10)])) 8987db96d56Sopenharmony_ci self.assertEqual(sum(x for x in [y for y in (z for z in range(10))]), sum([x for x in range(10)])) 8997db96d56Sopenharmony_ci 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)])) 9007db96d56Sopenharmony_ci self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True) if False) if True), 0) 9017db96d56Sopenharmony_ci check_syntax_error(self, "foo(x for x in range(10), 100)") 9027db96d56Sopenharmony_ci check_syntax_error(self, "foo(100, x for x in range(10))") 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci def testComprehensionSpecials(self): 9057db96d56Sopenharmony_ci # test for outmost iterable precomputation 9067db96d56Sopenharmony_ci x = 10; g = (i for i in range(x)); x = 5 9077db96d56Sopenharmony_ci self.assertEqual(len(list(g)), 10) 9087db96d56Sopenharmony_ci 9097db96d56Sopenharmony_ci # This should hold, since we're only precomputing outmost iterable. 9107db96d56Sopenharmony_ci x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x)) 9117db96d56Sopenharmony_ci x = 5; t = True; 9127db96d56Sopenharmony_ci self.assertEqual([(i,j) for i in range(10) for j in range(5)], list(g)) 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_ci # Grammar allows multiple adjacent 'if's in listcomps and genexps, 9157db96d56Sopenharmony_ci # even though it's silly. Make sure it works (ifelse broke this.) 9167db96d56Sopenharmony_ci self.assertEqual([ x for x in range(10) if x % 2 if x % 3 ], [1, 5, 7]) 9177db96d56Sopenharmony_ci self.assertEqual(list(x for x in range(10) if x % 2 if x % 3), [1, 5, 7]) 9187db96d56Sopenharmony_ci 9197db96d56Sopenharmony_ci # verify unpacking single element tuples in listcomp/genexp. 9207db96d56Sopenharmony_ci self.assertEqual([x for x, in [(4,), (5,), (6,)]], [4, 5, 6]) 9217db96d56Sopenharmony_ci self.assertEqual(list(x for x, in [(7,), (8,), (9,)]), [7, 8, 9]) 9227db96d56Sopenharmony_ci 9237db96d56Sopenharmony_ci def test_with_statement(self): 9247db96d56Sopenharmony_ci class manager(object): 9257db96d56Sopenharmony_ci def __enter__(self): 9267db96d56Sopenharmony_ci return (1, 2) 9277db96d56Sopenharmony_ci def __exit__(self, *args): 9287db96d56Sopenharmony_ci pass 9297db96d56Sopenharmony_ci 9307db96d56Sopenharmony_ci with manager(): 9317db96d56Sopenharmony_ci pass 9327db96d56Sopenharmony_ci with manager() as x: 9337db96d56Sopenharmony_ci pass 9347db96d56Sopenharmony_ci with manager() as (x, y): 9357db96d56Sopenharmony_ci pass 9367db96d56Sopenharmony_ci with manager(), manager(): 9377db96d56Sopenharmony_ci pass 9387db96d56Sopenharmony_ci with manager() as x, manager() as y: 9397db96d56Sopenharmony_ci pass 9407db96d56Sopenharmony_ci with manager() as x, manager(): 9417db96d56Sopenharmony_ci pass 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_ci def testIfElseExpr(self): 9447db96d56Sopenharmony_ci # Test ifelse expressions in various cases 9457db96d56Sopenharmony_ci def _checkeval(msg, ret): 9467db96d56Sopenharmony_ci "helper to check that evaluation of expressions is done correctly" 9477db96d56Sopenharmony_ci print x 9487db96d56Sopenharmony_ci return ret 9497db96d56Sopenharmony_ci 9507db96d56Sopenharmony_ci self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True]) 9517db96d56Sopenharmony_ci self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True]) 9527db96d56Sopenharmony_ci 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]) 9537db96d56Sopenharmony_ci self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5) 9547db96d56Sopenharmony_ci self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5) 9557db96d56Sopenharmony_ci self.assertEqual((5 and 6 if 0 else 1), 1) 9567db96d56Sopenharmony_ci self.assertEqual(((5 and 6) if 0 else 1), 1) 9577db96d56Sopenharmony_ci self.assertEqual((5 and (6 if 1 else 1)), 6) 9587db96d56Sopenharmony_ci self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3) 9597db96d56Sopenharmony_ci self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1) 9607db96d56Sopenharmony_ci self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5) 9617db96d56Sopenharmony_ci self.assertEqual((not 5 if 1 else 1), False) 9627db96d56Sopenharmony_ci self.assertEqual((not 5 if 0 else 1), 1) 9637db96d56Sopenharmony_ci self.assertEqual((6 + 1 if 1 else 2), 7) 9647db96d56Sopenharmony_ci self.assertEqual((6 - 1 if 1 else 2), 5) 9657db96d56Sopenharmony_ci self.assertEqual((6 * 2 if 1 else 4), 12) 9667db96d56Sopenharmony_ci self.assertEqual((6 / 2 if 1 else 3), 3) 9677db96d56Sopenharmony_ci self.assertEqual((6 < 4 if 0 else 2), 2) 9687db96d56Sopenharmony_ci 9697db96d56Sopenharmony_ci 9707db96d56Sopenharmony_ciif __name__ == '__main__': 9717db96d56Sopenharmony_ci unittest.main() 972