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