17db96d56Sopenharmony_ci# Python test set -- part 1, grammar. 27db96d56Sopenharmony_ci# This just tests whether the parser accepts them all. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_cifrom test.support import check_syntax_error 57db96d56Sopenharmony_cifrom test.support import import_helper 67db96d56Sopenharmony_cifrom test.support.warnings_helper import check_syntax_warning 77db96d56Sopenharmony_ciimport inspect 87db96d56Sopenharmony_ciimport unittest 97db96d56Sopenharmony_ciimport sys 107db96d56Sopenharmony_ciimport warnings 117db96d56Sopenharmony_ci# testing import * 127db96d56Sopenharmony_cifrom sys import * 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci# different import patterns to check that __annotations__ does not interfere 157db96d56Sopenharmony_ci# with import machinery 167db96d56Sopenharmony_ciimport test.ann_module as ann_module 177db96d56Sopenharmony_ciimport typing 187db96d56Sopenharmony_cifrom collections import ChainMap 197db96d56Sopenharmony_cifrom test import ann_module2 207db96d56Sopenharmony_ciimport test 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci# These are shared with test_tokenize and other test modules. 237db96d56Sopenharmony_ci# 247db96d56Sopenharmony_ci# Note: since several test cases filter out floats by looking for "e" and ".", 257db96d56Sopenharmony_ci# don't add hexadecimal literals that contain "e" or "E". 267db96d56Sopenharmony_ciVALID_UNDERSCORE_LITERALS = [ 277db96d56Sopenharmony_ci '0_0_0', 287db96d56Sopenharmony_ci '4_2', 297db96d56Sopenharmony_ci '1_0000_0000', 307db96d56Sopenharmony_ci '0b1001_0100', 317db96d56Sopenharmony_ci '0xffff_ffff', 327db96d56Sopenharmony_ci '0o5_7_7', 337db96d56Sopenharmony_ci '1_00_00.5', 347db96d56Sopenharmony_ci '1_00_00.5e5', 357db96d56Sopenharmony_ci '1_00_00e5_1', 367db96d56Sopenharmony_ci '1e1_0', 377db96d56Sopenharmony_ci '.1_4', 387db96d56Sopenharmony_ci '.1_4e1', 397db96d56Sopenharmony_ci '0b_0', 407db96d56Sopenharmony_ci '0x_f', 417db96d56Sopenharmony_ci '0o_5', 427db96d56Sopenharmony_ci '1_00_00j', 437db96d56Sopenharmony_ci '1_00_00.5j', 447db96d56Sopenharmony_ci '1_00_00e5_1j', 457db96d56Sopenharmony_ci '.1_4j', 467db96d56Sopenharmony_ci '(1_2.5+3_3j)', 477db96d56Sopenharmony_ci '(.5_6j)', 487db96d56Sopenharmony_ci] 497db96d56Sopenharmony_ciINVALID_UNDERSCORE_LITERALS = [ 507db96d56Sopenharmony_ci # Trailing underscores: 517db96d56Sopenharmony_ci '0_', 527db96d56Sopenharmony_ci '42_', 537db96d56Sopenharmony_ci '1.4j_', 547db96d56Sopenharmony_ci '0x_', 557db96d56Sopenharmony_ci '0b1_', 567db96d56Sopenharmony_ci '0xf_', 577db96d56Sopenharmony_ci '0o5_', 587db96d56Sopenharmony_ci '0 if 1_Else 1', 597db96d56Sopenharmony_ci # Underscores in the base selector: 607db96d56Sopenharmony_ci '0_b0', 617db96d56Sopenharmony_ci '0_xf', 627db96d56Sopenharmony_ci '0_o5', 637db96d56Sopenharmony_ci # Old-style octal, still disallowed: 647db96d56Sopenharmony_ci '0_7', 657db96d56Sopenharmony_ci '09_99', 667db96d56Sopenharmony_ci # Multiple consecutive underscores: 677db96d56Sopenharmony_ci '4_______2', 687db96d56Sopenharmony_ci '0.1__4', 697db96d56Sopenharmony_ci '0.1__4j', 707db96d56Sopenharmony_ci '0b1001__0100', 717db96d56Sopenharmony_ci '0xffff__ffff', 727db96d56Sopenharmony_ci '0x___', 737db96d56Sopenharmony_ci '0o5__77', 747db96d56Sopenharmony_ci '1e1__0', 757db96d56Sopenharmony_ci '1e1__0j', 767db96d56Sopenharmony_ci # Underscore right before a dot: 777db96d56Sopenharmony_ci '1_.4', 787db96d56Sopenharmony_ci '1_.4j', 797db96d56Sopenharmony_ci # Underscore right after a dot: 807db96d56Sopenharmony_ci '1._4', 817db96d56Sopenharmony_ci '1._4j', 827db96d56Sopenharmony_ci '._5', 837db96d56Sopenharmony_ci '._5j', 847db96d56Sopenharmony_ci # Underscore right after a sign: 857db96d56Sopenharmony_ci '1.0e+_1', 867db96d56Sopenharmony_ci '1.0e+_1j', 877db96d56Sopenharmony_ci # Underscore right before j: 887db96d56Sopenharmony_ci '1.4_j', 897db96d56Sopenharmony_ci '1.4e5_j', 907db96d56Sopenharmony_ci # Underscore right before e: 917db96d56Sopenharmony_ci '1_e1', 927db96d56Sopenharmony_ci '1.4_e1', 937db96d56Sopenharmony_ci '1.4_e1j', 947db96d56Sopenharmony_ci # Underscore right after e: 957db96d56Sopenharmony_ci '1e_1', 967db96d56Sopenharmony_ci '1.4e_1', 977db96d56Sopenharmony_ci '1.4e_1j', 987db96d56Sopenharmony_ci # Complex cases with parens: 997db96d56Sopenharmony_ci '(1+1.5_j_)', 1007db96d56Sopenharmony_ci '(1+1.5_j)', 1017db96d56Sopenharmony_ci] 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ciclass TokenTests(unittest.TestCase): 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci from test.support import check_syntax_error 1077db96d56Sopenharmony_ci from test.support.warnings_helper import check_syntax_warning 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci def test_backslash(self): 1107db96d56Sopenharmony_ci # Backslash means line continuation: 1117db96d56Sopenharmony_ci x = 1 \ 1127db96d56Sopenharmony_ci + 1 1137db96d56Sopenharmony_ci self.assertEqual(x, 2, 'backslash for line continuation') 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci # Backslash does not means continuation in comments :\ 1167db96d56Sopenharmony_ci x = 0 1177db96d56Sopenharmony_ci self.assertEqual(x, 0, 'backslash ending comment') 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci def test_plain_integers(self): 1207db96d56Sopenharmony_ci self.assertEqual(type(000), type(0)) 1217db96d56Sopenharmony_ci self.assertEqual(0xff, 255) 1227db96d56Sopenharmony_ci self.assertEqual(0o377, 255) 1237db96d56Sopenharmony_ci self.assertEqual(2147483647, 0o17777777777) 1247db96d56Sopenharmony_ci self.assertEqual(0b1001, 9) 1257db96d56Sopenharmony_ci # "0x" is not a valid literal 1267db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "0x") 1277db96d56Sopenharmony_ci from sys import maxsize 1287db96d56Sopenharmony_ci if maxsize == 2147483647: 1297db96d56Sopenharmony_ci self.assertEqual(-2147483647-1, -0o20000000000) 1307db96d56Sopenharmony_ci # XXX -2147483648 1317db96d56Sopenharmony_ci self.assertTrue(0o37777777777 > 0) 1327db96d56Sopenharmony_ci self.assertTrue(0xffffffff > 0) 1337db96d56Sopenharmony_ci self.assertTrue(0b1111111111111111111111111111111 > 0) 1347db96d56Sopenharmony_ci for s in ('2147483648', '0o40000000000', '0x100000000', 1357db96d56Sopenharmony_ci '0b10000000000000000000000000000000'): 1367db96d56Sopenharmony_ci try: 1377db96d56Sopenharmony_ci x = eval(s) 1387db96d56Sopenharmony_ci except OverflowError: 1397db96d56Sopenharmony_ci self.fail("OverflowError on huge integer literal %r" % s) 1407db96d56Sopenharmony_ci elif maxsize == 9223372036854775807: 1417db96d56Sopenharmony_ci self.assertEqual(-9223372036854775807-1, -0o1000000000000000000000) 1427db96d56Sopenharmony_ci self.assertTrue(0o1777777777777777777777 > 0) 1437db96d56Sopenharmony_ci self.assertTrue(0xffffffffffffffff > 0) 1447db96d56Sopenharmony_ci self.assertTrue(0b11111111111111111111111111111111111111111111111111111111111111 > 0) 1457db96d56Sopenharmony_ci for s in '9223372036854775808', '0o2000000000000000000000', \ 1467db96d56Sopenharmony_ci '0x10000000000000000', \ 1477db96d56Sopenharmony_ci '0b100000000000000000000000000000000000000000000000000000000000000': 1487db96d56Sopenharmony_ci try: 1497db96d56Sopenharmony_ci x = eval(s) 1507db96d56Sopenharmony_ci except OverflowError: 1517db96d56Sopenharmony_ci self.fail("OverflowError on huge integer literal %r" % s) 1527db96d56Sopenharmony_ci else: 1537db96d56Sopenharmony_ci self.fail('Weird maxsize value %r' % maxsize) 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci def test_long_integers(self): 1567db96d56Sopenharmony_ci x = 0 1577db96d56Sopenharmony_ci x = 0xffffffffffffffff 1587db96d56Sopenharmony_ci x = 0Xffffffffffffffff 1597db96d56Sopenharmony_ci x = 0o77777777777777777 1607db96d56Sopenharmony_ci x = 0O77777777777777777 1617db96d56Sopenharmony_ci x = 123456789012345678901234567890 1627db96d56Sopenharmony_ci x = 0b100000000000000000000000000000000000000000000000000000000000000000000 1637db96d56Sopenharmony_ci x = 0B111111111111111111111111111111111111111111111111111111111111111111111 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci def test_floats(self): 1667db96d56Sopenharmony_ci x = 3.14 1677db96d56Sopenharmony_ci x = 314. 1687db96d56Sopenharmony_ci x = 0.314 1697db96d56Sopenharmony_ci # XXX x = 000.314 1707db96d56Sopenharmony_ci x = .314 1717db96d56Sopenharmony_ci x = 3e14 1727db96d56Sopenharmony_ci x = 3E14 1737db96d56Sopenharmony_ci x = 3e-14 1747db96d56Sopenharmony_ci x = 3e+14 1757db96d56Sopenharmony_ci x = 3.e14 1767db96d56Sopenharmony_ci x = .3e14 1777db96d56Sopenharmony_ci x = 3.1e4 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci def test_float_exponent_tokenization(self): 1807db96d56Sopenharmony_ci # See issue 21642. 1817db96d56Sopenharmony_ci with warnings.catch_warnings(): 1827db96d56Sopenharmony_ci warnings.simplefilter('ignore', SyntaxWarning) 1837db96d56Sopenharmony_ci self.assertEqual(eval("1 if 1else 0"), 1) 1847db96d56Sopenharmony_ci self.assertEqual(eval("1 if 0else 0"), 0) 1857db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "0 if 1Else 0") 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci def test_underscore_literals(self): 1887db96d56Sopenharmony_ci for lit in VALID_UNDERSCORE_LITERALS: 1897db96d56Sopenharmony_ci self.assertEqual(eval(lit), eval(lit.replace('_', ''))) 1907db96d56Sopenharmony_ci for lit in INVALID_UNDERSCORE_LITERALS: 1917db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, lit) 1927db96d56Sopenharmony_ci # Sanity check: no literal begins with an underscore 1937db96d56Sopenharmony_ci self.assertRaises(NameError, eval, "_0") 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci def test_bad_numerical_literals(self): 1967db96d56Sopenharmony_ci check = self.check_syntax_error 1977db96d56Sopenharmony_ci check("0b12", "invalid digit '2' in binary literal") 1987db96d56Sopenharmony_ci check("0b1_2", "invalid digit '2' in binary literal") 1997db96d56Sopenharmony_ci check("0b2", "invalid digit '2' in binary literal") 2007db96d56Sopenharmony_ci check("0b1_", "invalid binary literal") 2017db96d56Sopenharmony_ci check("0b", "invalid binary literal") 2027db96d56Sopenharmony_ci check("0o18", "invalid digit '8' in octal literal") 2037db96d56Sopenharmony_ci check("0o1_8", "invalid digit '8' in octal literal") 2047db96d56Sopenharmony_ci check("0o8", "invalid digit '8' in octal literal") 2057db96d56Sopenharmony_ci check("0o1_", "invalid octal literal") 2067db96d56Sopenharmony_ci check("0o", "invalid octal literal") 2077db96d56Sopenharmony_ci check("0x1_", "invalid hexadecimal literal") 2087db96d56Sopenharmony_ci check("0x", "invalid hexadecimal literal") 2097db96d56Sopenharmony_ci check("1_", "invalid decimal literal") 2107db96d56Sopenharmony_ci check("012", 2117db96d56Sopenharmony_ci "leading zeros in decimal integer literals are not permitted; " 2127db96d56Sopenharmony_ci "use an 0o prefix for octal integers") 2137db96d56Sopenharmony_ci check("1.2_", "invalid decimal literal") 2147db96d56Sopenharmony_ci check("1e2_", "invalid decimal literal") 2157db96d56Sopenharmony_ci check("1e+", "invalid decimal literal") 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci def test_end_of_numerical_literals(self): 2187db96d56Sopenharmony_ci def check(test, error=False): 2197db96d56Sopenharmony_ci with self.subTest(expr=test): 2207db96d56Sopenharmony_ci if error: 2217db96d56Sopenharmony_ci with warnings.catch_warnings(record=True) as w: 2227db96d56Sopenharmony_ci with self.assertRaisesRegex(SyntaxError, 2237db96d56Sopenharmony_ci r'invalid \w+ literal'): 2247db96d56Sopenharmony_ci compile(test, "<testcase>", "eval") 2257db96d56Sopenharmony_ci self.assertEqual(w, []) 2267db96d56Sopenharmony_ci else: 2277db96d56Sopenharmony_ci self.check_syntax_warning(test, 2287db96d56Sopenharmony_ci errtext=r'invalid \w+ literal') 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci for num in "0xf", "0o7", "0b1", "9", "0", "1.", "1e3", "1j": 2317db96d56Sopenharmony_ci compile(num, "<testcase>", "eval") 2327db96d56Sopenharmony_ci check(f"{num}and x", error=(num == "0xf")) 2337db96d56Sopenharmony_ci check(f"{num}or x", error=(num == "0")) 2347db96d56Sopenharmony_ci check(f"{num}in x") 2357db96d56Sopenharmony_ci check(f"{num}not in x") 2367db96d56Sopenharmony_ci check(f"{num}if x else y") 2377db96d56Sopenharmony_ci check(f"x if {num}else y", error=(num == "0xf")) 2387db96d56Sopenharmony_ci check(f"[{num}for x in ()]") 2397db96d56Sopenharmony_ci check(f"{num}spam", error=True) 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci with warnings.catch_warnings(): 2427db96d56Sopenharmony_ci warnings.filterwarnings('ignore', '"is" with a literal', 2437db96d56Sopenharmony_ci SyntaxWarning) 2447db96d56Sopenharmony_ci with self.assertWarnsRegex(SyntaxWarning, 2457db96d56Sopenharmony_ci r'invalid \w+ literal'): 2467db96d56Sopenharmony_ci compile(f"{num}is x", "<testcase>", "eval") 2477db96d56Sopenharmony_ci warnings.simplefilter('error', SyntaxWarning) 2487db96d56Sopenharmony_ci with self.assertRaisesRegex(SyntaxError, 2497db96d56Sopenharmony_ci r'invalid \w+ literal'): 2507db96d56Sopenharmony_ci compile(f"{num}is x", "<testcase>", "eval") 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci check("[0x1ffor x in ()]") 2537db96d56Sopenharmony_ci check("[0x1for x in ()]") 2547db96d56Sopenharmony_ci check("[0xfor x in ()]") 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci def test_string_literals(self): 2577db96d56Sopenharmony_ci x = ''; y = ""; self.assertTrue(len(x) == 0 and x == y) 2587db96d56Sopenharmony_ci x = '\''; y = "'"; self.assertTrue(len(x) == 1 and x == y and ord(x) == 39) 2597db96d56Sopenharmony_ci x = '"'; y = "\""; self.assertTrue(len(x) == 1 and x == y and ord(x) == 34) 2607db96d56Sopenharmony_ci x = "doesn't \"shrink\" does it" 2617db96d56Sopenharmony_ci y = 'doesn\'t "shrink" does it' 2627db96d56Sopenharmony_ci self.assertTrue(len(x) == 24 and x == y) 2637db96d56Sopenharmony_ci x = "does \"shrink\" doesn't it" 2647db96d56Sopenharmony_ci y = 'does "shrink" doesn\'t it' 2657db96d56Sopenharmony_ci self.assertTrue(len(x) == 24 and x == y) 2667db96d56Sopenharmony_ci x = """ 2677db96d56Sopenharmony_ciThe "quick" 2687db96d56Sopenharmony_cibrown fox 2697db96d56Sopenharmony_cijumps over 2707db96d56Sopenharmony_cithe 'lazy' dog. 2717db96d56Sopenharmony_ci""" 2727db96d56Sopenharmony_ci y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n' 2737db96d56Sopenharmony_ci self.assertEqual(x, y) 2747db96d56Sopenharmony_ci y = ''' 2757db96d56Sopenharmony_ciThe "quick" 2767db96d56Sopenharmony_cibrown fox 2777db96d56Sopenharmony_cijumps over 2787db96d56Sopenharmony_cithe 'lazy' dog. 2797db96d56Sopenharmony_ci''' 2807db96d56Sopenharmony_ci self.assertEqual(x, y) 2817db96d56Sopenharmony_ci y = "\n\ 2827db96d56Sopenharmony_ciThe \"quick\"\n\ 2837db96d56Sopenharmony_cibrown fox\n\ 2847db96d56Sopenharmony_cijumps over\n\ 2857db96d56Sopenharmony_cithe 'lazy' dog.\n\ 2867db96d56Sopenharmony_ci" 2877db96d56Sopenharmony_ci self.assertEqual(x, y) 2887db96d56Sopenharmony_ci y = '\n\ 2897db96d56Sopenharmony_ciThe \"quick\"\n\ 2907db96d56Sopenharmony_cibrown fox\n\ 2917db96d56Sopenharmony_cijumps over\n\ 2927db96d56Sopenharmony_cithe \'lazy\' dog.\n\ 2937db96d56Sopenharmony_ci' 2947db96d56Sopenharmony_ci self.assertEqual(x, y) 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci def test_ellipsis(self): 2977db96d56Sopenharmony_ci x = ... 2987db96d56Sopenharmony_ci self.assertTrue(x is Ellipsis) 2997db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, ".. .") 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci def test_eof_error(self): 3027db96d56Sopenharmony_ci samples = ("def foo(", "\ndef foo(", "def foo(\n") 3037db96d56Sopenharmony_ci for s in samples: 3047db96d56Sopenharmony_ci with self.assertRaises(SyntaxError) as cm: 3057db96d56Sopenharmony_ci compile(s, "<test>", "exec") 3067db96d56Sopenharmony_ci self.assertIn("was never closed", str(cm.exception)) 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_civar_annot_global: int # a global annotated is necessary for test_var_annot 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci# custom namespace for testing __annotations__ 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ciclass CNS: 3137db96d56Sopenharmony_ci def __init__(self): 3147db96d56Sopenharmony_ci self._dct = {} 3157db96d56Sopenharmony_ci def __setitem__(self, item, value): 3167db96d56Sopenharmony_ci self._dct[item.lower()] = value 3177db96d56Sopenharmony_ci def __getitem__(self, item): 3187db96d56Sopenharmony_ci return self._dct[item] 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ciclass GrammarTests(unittest.TestCase): 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci from test.support import check_syntax_error 3247db96d56Sopenharmony_ci from test.support.warnings_helper import check_syntax_warning 3257db96d56Sopenharmony_ci from test.support.warnings_helper import check_no_warnings 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE 3287db96d56Sopenharmony_ci # XXX can't test in a script -- this rule is only used when interactive 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci # file_input: (NEWLINE | stmt)* ENDMARKER 3317db96d56Sopenharmony_ci # Being tested as this very moment this very module 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci # expr_input: testlist NEWLINE 3347db96d56Sopenharmony_ci # XXX Hard to test -- used only in calls to input() 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci def test_eval_input(self): 3377db96d56Sopenharmony_ci # testlist ENDMARKER 3387db96d56Sopenharmony_ci x = eval('1, 0 or 1') 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci def test_var_annot_basics(self): 3417db96d56Sopenharmony_ci # all these should be allowed 3427db96d56Sopenharmony_ci var1: int = 5 3437db96d56Sopenharmony_ci var2: [int, str] 3447db96d56Sopenharmony_ci my_lst = [42] 3457db96d56Sopenharmony_ci def one(): 3467db96d56Sopenharmony_ci return 1 3477db96d56Sopenharmony_ci int.new_attr: int 3487db96d56Sopenharmony_ci [list][0]: type 3497db96d56Sopenharmony_ci my_lst[one()-1]: int = 5 3507db96d56Sopenharmony_ci self.assertEqual(my_lst, [5]) 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci def test_var_annot_syntax_errors(self): 3537db96d56Sopenharmony_ci # parser pass 3547db96d56Sopenharmony_ci check_syntax_error(self, "def f: int") 3557db96d56Sopenharmony_ci check_syntax_error(self, "x: int: str") 3567db96d56Sopenharmony_ci check_syntax_error(self, "def f():\n" 3577db96d56Sopenharmony_ci " nonlocal x: int\n") 3587db96d56Sopenharmony_ci # AST pass 3597db96d56Sopenharmony_ci check_syntax_error(self, "[x, 0]: int\n") 3607db96d56Sopenharmony_ci check_syntax_error(self, "f(): int\n") 3617db96d56Sopenharmony_ci check_syntax_error(self, "(x,): int") 3627db96d56Sopenharmony_ci check_syntax_error(self, "def f():\n" 3637db96d56Sopenharmony_ci " (x, y): int = (1, 2)\n") 3647db96d56Sopenharmony_ci # symtable pass 3657db96d56Sopenharmony_ci check_syntax_error(self, "def f():\n" 3667db96d56Sopenharmony_ci " x: int\n" 3677db96d56Sopenharmony_ci " global x\n") 3687db96d56Sopenharmony_ci check_syntax_error(self, "def f():\n" 3697db96d56Sopenharmony_ci " global x\n" 3707db96d56Sopenharmony_ci " x: int\n") 3717db96d56Sopenharmony_ci 3727db96d56Sopenharmony_ci def test_var_annot_basic_semantics(self): 3737db96d56Sopenharmony_ci # execution order 3747db96d56Sopenharmony_ci with self.assertRaises(ZeroDivisionError): 3757db96d56Sopenharmony_ci no_name[does_not_exist]: no_name_again = 1/0 3767db96d56Sopenharmony_ci with self.assertRaises(NameError): 3777db96d56Sopenharmony_ci no_name[does_not_exist]: 1/0 = 0 3787db96d56Sopenharmony_ci global var_annot_global 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci # function semantics 3817db96d56Sopenharmony_ci def f(): 3827db96d56Sopenharmony_ci st: str = "Hello" 3837db96d56Sopenharmony_ci a.b: int = (1, 2) 3847db96d56Sopenharmony_ci return st 3857db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {}) 3867db96d56Sopenharmony_ci def f_OK(): 3877db96d56Sopenharmony_ci x: 1/0 3887db96d56Sopenharmony_ci f_OK() 3897db96d56Sopenharmony_ci def fbad(): 3907db96d56Sopenharmony_ci x: int 3917db96d56Sopenharmony_ci print(x) 3927db96d56Sopenharmony_ci with self.assertRaises(UnboundLocalError): 3937db96d56Sopenharmony_ci fbad() 3947db96d56Sopenharmony_ci def f2bad(): 3957db96d56Sopenharmony_ci (no_such_global): int 3967db96d56Sopenharmony_ci print(no_such_global) 3977db96d56Sopenharmony_ci try: 3987db96d56Sopenharmony_ci f2bad() 3997db96d56Sopenharmony_ci except Exception as e: 4007db96d56Sopenharmony_ci self.assertIs(type(e), NameError) 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci # class semantics 4037db96d56Sopenharmony_ci class C: 4047db96d56Sopenharmony_ci __foo: int 4057db96d56Sopenharmony_ci s: str = "attr" 4067db96d56Sopenharmony_ci z = 2 4077db96d56Sopenharmony_ci def __init__(self, x): 4087db96d56Sopenharmony_ci self.x: int = x 4097db96d56Sopenharmony_ci self.assertEqual(C.__annotations__, {'_C__foo': int, 's': str}) 4107db96d56Sopenharmony_ci with self.assertRaises(NameError): 4117db96d56Sopenharmony_ci class CBad: 4127db96d56Sopenharmony_ci no_such_name_defined.attr: int = 0 4137db96d56Sopenharmony_ci with self.assertRaises(NameError): 4147db96d56Sopenharmony_ci class Cbad2(C): 4157db96d56Sopenharmony_ci x: int 4167db96d56Sopenharmony_ci x.y: list = [] 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci def test_annotations_inheritance(self): 4197db96d56Sopenharmony_ci # Check that annotations are not inherited by derived classes 4207db96d56Sopenharmony_ci class A: 4217db96d56Sopenharmony_ci attr: int 4227db96d56Sopenharmony_ci class B(A): 4237db96d56Sopenharmony_ci pass 4247db96d56Sopenharmony_ci class C(A): 4257db96d56Sopenharmony_ci attr: str 4267db96d56Sopenharmony_ci class D: 4277db96d56Sopenharmony_ci attr2: int 4287db96d56Sopenharmony_ci class E(A, D): 4297db96d56Sopenharmony_ci pass 4307db96d56Sopenharmony_ci class F(C, A): 4317db96d56Sopenharmony_ci pass 4327db96d56Sopenharmony_ci self.assertEqual(A.__annotations__, {"attr": int}) 4337db96d56Sopenharmony_ci self.assertEqual(B.__annotations__, {}) 4347db96d56Sopenharmony_ci self.assertEqual(C.__annotations__, {"attr" : str}) 4357db96d56Sopenharmony_ci self.assertEqual(D.__annotations__, {"attr2" : int}) 4367db96d56Sopenharmony_ci self.assertEqual(E.__annotations__, {}) 4377db96d56Sopenharmony_ci self.assertEqual(F.__annotations__, {}) 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci 4407db96d56Sopenharmony_ci def test_var_annot_metaclass_semantics(self): 4417db96d56Sopenharmony_ci class CMeta(type): 4427db96d56Sopenharmony_ci @classmethod 4437db96d56Sopenharmony_ci def __prepare__(metacls, name, bases, **kwds): 4447db96d56Sopenharmony_ci return {'__annotations__': CNS()} 4457db96d56Sopenharmony_ci class CC(metaclass=CMeta): 4467db96d56Sopenharmony_ci XX: 'ANNOT' 4477db96d56Sopenharmony_ci self.assertEqual(CC.__annotations__['xx'], 'ANNOT') 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci def test_var_annot_module_semantics(self): 4507db96d56Sopenharmony_ci self.assertEqual(test.__annotations__, {}) 4517db96d56Sopenharmony_ci self.assertEqual(ann_module.__annotations__, 4527db96d56Sopenharmony_ci {1: 2, 'x': int, 'y': str, 'f': typing.Tuple[int, int], 'u': int | float}) 4537db96d56Sopenharmony_ci self.assertEqual(ann_module.M.__annotations__, 4547db96d56Sopenharmony_ci {'123': 123, 'o': type}) 4557db96d56Sopenharmony_ci self.assertEqual(ann_module2.__annotations__, {}) 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci def test_var_annot_in_module(self): 4587db96d56Sopenharmony_ci # check that functions fail the same way when executed 4597db96d56Sopenharmony_ci # outside of module where they were defined 4607db96d56Sopenharmony_ci ann_module3 = import_helper.import_fresh_module("test.ann_module3") 4617db96d56Sopenharmony_ci with self.assertRaises(NameError): 4627db96d56Sopenharmony_ci ann_module3.f_bad_ann() 4637db96d56Sopenharmony_ci with self.assertRaises(NameError): 4647db96d56Sopenharmony_ci ann_module3.g_bad_ann() 4657db96d56Sopenharmony_ci with self.assertRaises(NameError): 4667db96d56Sopenharmony_ci ann_module3.D_bad_ann(5) 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci def test_var_annot_simple_exec(self): 4697db96d56Sopenharmony_ci gns = {}; lns= {} 4707db96d56Sopenharmony_ci exec("'docstring'\n" 4717db96d56Sopenharmony_ci "__annotations__[1] = 2\n" 4727db96d56Sopenharmony_ci "x: int = 5\n", gns, lns) 4737db96d56Sopenharmony_ci self.assertEqual(lns["__annotations__"], {1: 2, 'x': int}) 4747db96d56Sopenharmony_ci with self.assertRaises(KeyError): 4757db96d56Sopenharmony_ci gns['__annotations__'] 4767db96d56Sopenharmony_ci 4777db96d56Sopenharmony_ci def test_var_annot_custom_maps(self): 4787db96d56Sopenharmony_ci # tests with custom locals() and __annotations__ 4797db96d56Sopenharmony_ci ns = {'__annotations__': CNS()} 4807db96d56Sopenharmony_ci exec('X: int; Z: str = "Z"; (w): complex = 1j', ns) 4817db96d56Sopenharmony_ci self.assertEqual(ns['__annotations__']['x'], int) 4827db96d56Sopenharmony_ci self.assertEqual(ns['__annotations__']['z'], str) 4837db96d56Sopenharmony_ci with self.assertRaises(KeyError): 4847db96d56Sopenharmony_ci ns['__annotations__']['w'] 4857db96d56Sopenharmony_ci nonloc_ns = {} 4867db96d56Sopenharmony_ci class CNS2: 4877db96d56Sopenharmony_ci def __init__(self): 4887db96d56Sopenharmony_ci self._dct = {} 4897db96d56Sopenharmony_ci def __setitem__(self, item, value): 4907db96d56Sopenharmony_ci nonlocal nonloc_ns 4917db96d56Sopenharmony_ci self._dct[item] = value 4927db96d56Sopenharmony_ci nonloc_ns[item] = value 4937db96d56Sopenharmony_ci def __getitem__(self, item): 4947db96d56Sopenharmony_ci return self._dct[item] 4957db96d56Sopenharmony_ci exec('x: int = 1', {}, CNS2()) 4967db96d56Sopenharmony_ci self.assertEqual(nonloc_ns['__annotations__']['x'], int) 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci def test_var_annot_refleak(self): 4997db96d56Sopenharmony_ci # complex case: custom locals plus custom __annotations__ 5007db96d56Sopenharmony_ci # this was causing refleak 5017db96d56Sopenharmony_ci cns = CNS() 5027db96d56Sopenharmony_ci nonloc_ns = {'__annotations__': cns} 5037db96d56Sopenharmony_ci class CNS2: 5047db96d56Sopenharmony_ci def __init__(self): 5057db96d56Sopenharmony_ci self._dct = {'__annotations__': cns} 5067db96d56Sopenharmony_ci def __setitem__(self, item, value): 5077db96d56Sopenharmony_ci nonlocal nonloc_ns 5087db96d56Sopenharmony_ci self._dct[item] = value 5097db96d56Sopenharmony_ci nonloc_ns[item] = value 5107db96d56Sopenharmony_ci def __getitem__(self, item): 5117db96d56Sopenharmony_ci return self._dct[item] 5127db96d56Sopenharmony_ci exec('X: str', {}, CNS2()) 5137db96d56Sopenharmony_ci self.assertEqual(nonloc_ns['__annotations__']['x'], str) 5147db96d56Sopenharmony_ci 5157db96d56Sopenharmony_ci def test_var_annot_rhs(self): 5167db96d56Sopenharmony_ci ns = {} 5177db96d56Sopenharmony_ci exec('x: tuple = 1, 2', ns) 5187db96d56Sopenharmony_ci self.assertEqual(ns['x'], (1, 2)) 5197db96d56Sopenharmony_ci stmt = ('def f():\n' 5207db96d56Sopenharmony_ci ' x: int = yield') 5217db96d56Sopenharmony_ci exec(stmt, ns) 5227db96d56Sopenharmony_ci self.assertEqual(list(ns['f']()), [None]) 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci ns = {"a": 1, 'b': (2, 3, 4), "c":5, "Tuple": typing.Tuple} 5257db96d56Sopenharmony_ci exec('x: Tuple[int, ...] = a,*b,c', ns) 5267db96d56Sopenharmony_ci self.assertEqual(ns['x'], (1, 2, 3, 4, 5)) 5277db96d56Sopenharmony_ci 5287db96d56Sopenharmony_ci def test_funcdef(self): 5297db96d56Sopenharmony_ci ### [decorators] 'def' NAME parameters ['->' test] ':' suite 5307db96d56Sopenharmony_ci ### decorator: '@' namedexpr_test NEWLINE 5317db96d56Sopenharmony_ci ### decorators: decorator+ 5327db96d56Sopenharmony_ci ### parameters: '(' [typedargslist] ')' 5337db96d56Sopenharmony_ci ### typedargslist: ((tfpdef ['=' test] ',')* 5347db96d56Sopenharmony_ci ### ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef) 5357db96d56Sopenharmony_ci ### | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) 5367db96d56Sopenharmony_ci ### tfpdef: NAME [':' test] 5377db96d56Sopenharmony_ci ### varargslist: ((vfpdef ['=' test] ',')* 5387db96d56Sopenharmony_ci ### ('*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef) 5397db96d56Sopenharmony_ci ### | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) 5407db96d56Sopenharmony_ci ### vfpdef: NAME 5417db96d56Sopenharmony_ci def f1(): pass 5427db96d56Sopenharmony_ci f1() 5437db96d56Sopenharmony_ci f1(*()) 5447db96d56Sopenharmony_ci f1(*(), **{}) 5457db96d56Sopenharmony_ci def f2(one_argument): pass 5467db96d56Sopenharmony_ci def f3(two, arguments): pass 5477db96d56Sopenharmony_ci self.assertEqual(f2.__code__.co_varnames, ('one_argument',)) 5487db96d56Sopenharmony_ci self.assertEqual(f3.__code__.co_varnames, ('two', 'arguments')) 5497db96d56Sopenharmony_ci def a1(one_arg,): pass 5507db96d56Sopenharmony_ci def a2(two, args,): pass 5517db96d56Sopenharmony_ci def v0(*rest): pass 5527db96d56Sopenharmony_ci def v1(a, *rest): pass 5537db96d56Sopenharmony_ci def v2(a, b, *rest): pass 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ci f1() 5567db96d56Sopenharmony_ci f2(1) 5577db96d56Sopenharmony_ci f2(1,) 5587db96d56Sopenharmony_ci f3(1, 2) 5597db96d56Sopenharmony_ci f3(1, 2,) 5607db96d56Sopenharmony_ci v0() 5617db96d56Sopenharmony_ci v0(1) 5627db96d56Sopenharmony_ci v0(1,) 5637db96d56Sopenharmony_ci v0(1,2) 5647db96d56Sopenharmony_ci v0(1,2,3,4,5,6,7,8,9,0) 5657db96d56Sopenharmony_ci v1(1) 5667db96d56Sopenharmony_ci v1(1,) 5677db96d56Sopenharmony_ci v1(1,2) 5687db96d56Sopenharmony_ci v1(1,2,3) 5697db96d56Sopenharmony_ci v1(1,2,3,4,5,6,7,8,9,0) 5707db96d56Sopenharmony_ci v2(1,2) 5717db96d56Sopenharmony_ci v2(1,2,3) 5727db96d56Sopenharmony_ci v2(1,2,3,4) 5737db96d56Sopenharmony_ci v2(1,2,3,4,5,6,7,8,9,0) 5747db96d56Sopenharmony_ci 5757db96d56Sopenharmony_ci def d01(a=1): pass 5767db96d56Sopenharmony_ci d01() 5777db96d56Sopenharmony_ci d01(1) 5787db96d56Sopenharmony_ci d01(*(1,)) 5797db96d56Sopenharmony_ci d01(*[] or [2]) 5807db96d56Sopenharmony_ci d01(*() or (), *{} and (), **() or {}) 5817db96d56Sopenharmony_ci d01(**{'a':2}) 5827db96d56Sopenharmony_ci d01(**{'a':2} or {}) 5837db96d56Sopenharmony_ci def d11(a, b=1): pass 5847db96d56Sopenharmony_ci d11(1) 5857db96d56Sopenharmony_ci d11(1, 2) 5867db96d56Sopenharmony_ci d11(1, **{'b':2}) 5877db96d56Sopenharmony_ci def d21(a, b, c=1): pass 5887db96d56Sopenharmony_ci d21(1, 2) 5897db96d56Sopenharmony_ci d21(1, 2, 3) 5907db96d56Sopenharmony_ci d21(*(1, 2, 3)) 5917db96d56Sopenharmony_ci d21(1, *(2, 3)) 5927db96d56Sopenharmony_ci d21(1, 2, *(3,)) 5937db96d56Sopenharmony_ci d21(1, 2, **{'c':3}) 5947db96d56Sopenharmony_ci def d02(a=1, b=2): pass 5957db96d56Sopenharmony_ci d02() 5967db96d56Sopenharmony_ci d02(1) 5977db96d56Sopenharmony_ci d02(1, 2) 5987db96d56Sopenharmony_ci d02(*(1, 2)) 5997db96d56Sopenharmony_ci d02(1, *(2,)) 6007db96d56Sopenharmony_ci d02(1, **{'b':2}) 6017db96d56Sopenharmony_ci d02(**{'a': 1, 'b': 2}) 6027db96d56Sopenharmony_ci def d12(a, b=1, c=2): pass 6037db96d56Sopenharmony_ci d12(1) 6047db96d56Sopenharmony_ci d12(1, 2) 6057db96d56Sopenharmony_ci d12(1, 2, 3) 6067db96d56Sopenharmony_ci def d22(a, b, c=1, d=2): pass 6077db96d56Sopenharmony_ci d22(1, 2) 6087db96d56Sopenharmony_ci d22(1, 2, 3) 6097db96d56Sopenharmony_ci d22(1, 2, 3, 4) 6107db96d56Sopenharmony_ci def d01v(a=1, *rest): pass 6117db96d56Sopenharmony_ci d01v() 6127db96d56Sopenharmony_ci d01v(1) 6137db96d56Sopenharmony_ci d01v(1, 2) 6147db96d56Sopenharmony_ci d01v(*(1, 2, 3, 4)) 6157db96d56Sopenharmony_ci d01v(*(1,)) 6167db96d56Sopenharmony_ci d01v(**{'a':2}) 6177db96d56Sopenharmony_ci def d11v(a, b=1, *rest): pass 6187db96d56Sopenharmony_ci d11v(1) 6197db96d56Sopenharmony_ci d11v(1, 2) 6207db96d56Sopenharmony_ci d11v(1, 2, 3) 6217db96d56Sopenharmony_ci def d21v(a, b, c=1, *rest): pass 6227db96d56Sopenharmony_ci d21v(1, 2) 6237db96d56Sopenharmony_ci d21v(1, 2, 3) 6247db96d56Sopenharmony_ci d21v(1, 2, 3, 4) 6257db96d56Sopenharmony_ci d21v(*(1, 2, 3, 4)) 6267db96d56Sopenharmony_ci d21v(1, 2, **{'c': 3}) 6277db96d56Sopenharmony_ci def d02v(a=1, b=2, *rest): pass 6287db96d56Sopenharmony_ci d02v() 6297db96d56Sopenharmony_ci d02v(1) 6307db96d56Sopenharmony_ci d02v(1, 2) 6317db96d56Sopenharmony_ci d02v(1, 2, 3) 6327db96d56Sopenharmony_ci d02v(1, *(2, 3, 4)) 6337db96d56Sopenharmony_ci d02v(**{'a': 1, 'b': 2}) 6347db96d56Sopenharmony_ci def d12v(a, b=1, c=2, *rest): pass 6357db96d56Sopenharmony_ci d12v(1) 6367db96d56Sopenharmony_ci d12v(1, 2) 6377db96d56Sopenharmony_ci d12v(1, 2, 3) 6387db96d56Sopenharmony_ci d12v(1, 2, 3, 4) 6397db96d56Sopenharmony_ci d12v(*(1, 2, 3, 4)) 6407db96d56Sopenharmony_ci d12v(1, 2, *(3, 4, 5)) 6417db96d56Sopenharmony_ci d12v(1, *(2,), **{'c': 3}) 6427db96d56Sopenharmony_ci def d22v(a, b, c=1, d=2, *rest): pass 6437db96d56Sopenharmony_ci d22v(1, 2) 6447db96d56Sopenharmony_ci d22v(1, 2, 3) 6457db96d56Sopenharmony_ci d22v(1, 2, 3, 4) 6467db96d56Sopenharmony_ci d22v(1, 2, 3, 4, 5) 6477db96d56Sopenharmony_ci d22v(*(1, 2, 3, 4)) 6487db96d56Sopenharmony_ci d22v(1, 2, *(3, 4, 5)) 6497db96d56Sopenharmony_ci d22v(1, *(2, 3), **{'d': 4}) 6507db96d56Sopenharmony_ci 6517db96d56Sopenharmony_ci # keyword argument type tests 6527db96d56Sopenharmony_ci with warnings.catch_warnings(): 6537db96d56Sopenharmony_ci warnings.simplefilter('ignore', BytesWarning) 6547db96d56Sopenharmony_ci try: 6557db96d56Sopenharmony_ci str('x', **{b'foo':1 }) 6567db96d56Sopenharmony_ci except TypeError: 6577db96d56Sopenharmony_ci pass 6587db96d56Sopenharmony_ci else: 6597db96d56Sopenharmony_ci self.fail('Bytes should not work as keyword argument names') 6607db96d56Sopenharmony_ci # keyword only argument tests 6617db96d56Sopenharmony_ci def pos0key1(*, key): return key 6627db96d56Sopenharmony_ci pos0key1(key=100) 6637db96d56Sopenharmony_ci def pos2key2(p1, p2, *, k1, k2=100): return p1,p2,k1,k2 6647db96d56Sopenharmony_ci pos2key2(1, 2, k1=100) 6657db96d56Sopenharmony_ci pos2key2(1, 2, k1=100, k2=200) 6667db96d56Sopenharmony_ci pos2key2(1, 2, k2=100, k1=200) 6677db96d56Sopenharmony_ci def pos2key2dict(p1, p2, *, k1=100, k2, **kwarg): return p1,p2,k1,k2,kwarg 6687db96d56Sopenharmony_ci pos2key2dict(1,2,k2=100,tokwarg1=100,tokwarg2=200) 6697db96d56Sopenharmony_ci pos2key2dict(1,2,tokwarg1=100,tokwarg2=200, k2=100) 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "def f(*): pass") 6727db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "def f(*,): pass") 6737db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "def f(*, **kwds): pass") 6747db96d56Sopenharmony_ci 6757db96d56Sopenharmony_ci # keyword arguments after *arglist 6767db96d56Sopenharmony_ci def f(*args, **kwargs): 6777db96d56Sopenharmony_ci return args, kwargs 6787db96d56Sopenharmony_ci self.assertEqual(f(1, x=2, *[3, 4], y=5), ((1, 3, 4), 6797db96d56Sopenharmony_ci {'x':2, 'y':5})) 6807db96d56Sopenharmony_ci self.assertEqual(f(1, *(2,3), 4), ((1, 2, 3, 4), {})) 6817db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, "f(1, x=2, *(3,4), x=5)") 6827db96d56Sopenharmony_ci self.assertEqual(f(**{'eggs':'scrambled', 'spam':'fried'}), 6837db96d56Sopenharmony_ci ((), {'eggs':'scrambled', 'spam':'fried'})) 6847db96d56Sopenharmony_ci self.assertEqual(f(spam='fried', **{'eggs':'scrambled'}), 6857db96d56Sopenharmony_ci ((), {'eggs':'scrambled', 'spam':'fried'})) 6867db96d56Sopenharmony_ci 6877db96d56Sopenharmony_ci # Check ast errors in *args and *kwargs 6887db96d56Sopenharmony_ci check_syntax_error(self, "f(*g(1=2))") 6897db96d56Sopenharmony_ci check_syntax_error(self, "f(**g(1=2))") 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_ci # argument annotation tests 6927db96d56Sopenharmony_ci def f(x) -> list: pass 6937db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'return': list}) 6947db96d56Sopenharmony_ci def f(x: int): pass 6957db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'x': int}) 6967db96d56Sopenharmony_ci def f(x: int, /): pass 6977db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'x': int}) 6987db96d56Sopenharmony_ci def f(x: int = 34, /): pass 6997db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'x': int}) 7007db96d56Sopenharmony_ci def f(*x: str): pass 7017db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'x': str}) 7027db96d56Sopenharmony_ci def f(**x: float): pass 7037db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'x': float}) 7047db96d56Sopenharmony_ci def f(x, y: 1+2): pass 7057db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'y': 3}) 7067db96d56Sopenharmony_ci def f(x, y: 1+2, /): pass 7077db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'y': 3}) 7087db96d56Sopenharmony_ci def f(a, b: 1, c: 2, d): pass 7097db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'b': 1, 'c': 2}) 7107db96d56Sopenharmony_ci def f(a, b: 1, /, c: 2, d): pass 7117db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'b': 1, 'c': 2}) 7127db96d56Sopenharmony_ci def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6): pass 7137db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, 7147db96d56Sopenharmony_ci {'b': 1, 'c': 2, 'e': 3, 'g': 6}) 7157db96d56Sopenharmony_ci def f(a, b: 1, c: 2, d, e: 3 = 4, f=5, *g: 6, h: 7, i=8, j: 9 = 10, 7167db96d56Sopenharmony_ci **k: 11) -> 12: pass 7177db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, 7187db96d56Sopenharmony_ci {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9, 7197db96d56Sopenharmony_ci 'k': 11, 'return': 12}) 7207db96d56Sopenharmony_ci def f(a, b: 1, c: 2, d, e: 3 = 4, f: int = 5, /, *g: 6, h: 7, i=8, j: 9 = 10, 7217db96d56Sopenharmony_ci **k: 11) -> 12: pass 7227db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, 7237db96d56Sopenharmony_ci {'b': 1, 'c': 2, 'e': 3, 'f': int, 'g': 6, 'h': 7, 'j': 9, 7247db96d56Sopenharmony_ci 'k': 11, 'return': 12}) 7257db96d56Sopenharmony_ci # Check for issue #20625 -- annotations mangling 7267db96d56Sopenharmony_ci class Spam: 7277db96d56Sopenharmony_ci def f(self, *, __kw: 1): 7287db96d56Sopenharmony_ci pass 7297db96d56Sopenharmony_ci class Ham(Spam): pass 7307db96d56Sopenharmony_ci self.assertEqual(Spam.f.__annotations__, {'_Spam__kw': 1}) 7317db96d56Sopenharmony_ci self.assertEqual(Ham.f.__annotations__, {'_Spam__kw': 1}) 7327db96d56Sopenharmony_ci # Check for SF Bug #1697248 - mixing decorators and a return annotation 7337db96d56Sopenharmony_ci def null(x): return x 7347db96d56Sopenharmony_ci @null 7357db96d56Sopenharmony_ci def f(x) -> list: pass 7367db96d56Sopenharmony_ci self.assertEqual(f.__annotations__, {'return': list}) 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci # Test expressions as decorators (PEP 614): 7397db96d56Sopenharmony_ci @False or null 7407db96d56Sopenharmony_ci def f(x): pass 7417db96d56Sopenharmony_ci @d := null 7427db96d56Sopenharmony_ci def f(x): pass 7437db96d56Sopenharmony_ci @lambda f: null(f) 7447db96d56Sopenharmony_ci def f(x): pass 7457db96d56Sopenharmony_ci @[..., null, ...][1] 7467db96d56Sopenharmony_ci def f(x): pass 7477db96d56Sopenharmony_ci @null(null)(null) 7487db96d56Sopenharmony_ci def f(x): pass 7497db96d56Sopenharmony_ci @[null][0].__call__.__call__ 7507db96d56Sopenharmony_ci def f(x): pass 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci # test closures with a variety of opargs 7537db96d56Sopenharmony_ci closure = 1 7547db96d56Sopenharmony_ci def f(): return closure 7557db96d56Sopenharmony_ci def f(x=1): return closure 7567db96d56Sopenharmony_ci def f(*, k=1): return closure 7577db96d56Sopenharmony_ci def f() -> int: return closure 7587db96d56Sopenharmony_ci 7597db96d56Sopenharmony_ci # Check trailing commas are permitted in funcdef argument list 7607db96d56Sopenharmony_ci def f(a,): pass 7617db96d56Sopenharmony_ci def f(*args,): pass 7627db96d56Sopenharmony_ci def f(**kwds,): pass 7637db96d56Sopenharmony_ci def f(a, *args,): pass 7647db96d56Sopenharmony_ci def f(a, **kwds,): pass 7657db96d56Sopenharmony_ci def f(*args, b,): pass 7667db96d56Sopenharmony_ci def f(*, b,): pass 7677db96d56Sopenharmony_ci def f(*args, **kwds,): pass 7687db96d56Sopenharmony_ci def f(a, *args, b,): pass 7697db96d56Sopenharmony_ci def f(a, *, b,): pass 7707db96d56Sopenharmony_ci def f(a, *args, **kwds,): pass 7717db96d56Sopenharmony_ci def f(*args, b, **kwds,): pass 7727db96d56Sopenharmony_ci def f(*, b, **kwds,): pass 7737db96d56Sopenharmony_ci def f(a, *args, b, **kwds,): pass 7747db96d56Sopenharmony_ci def f(a, *, b, **kwds,): pass 7757db96d56Sopenharmony_ci 7767db96d56Sopenharmony_ci def test_lambdef(self): 7777db96d56Sopenharmony_ci ### lambdef: 'lambda' [varargslist] ':' test 7787db96d56Sopenharmony_ci l1 = lambda : 0 7797db96d56Sopenharmony_ci self.assertEqual(l1(), 0) 7807db96d56Sopenharmony_ci l2 = lambda : a[d] # XXX just testing the expression 7817db96d56Sopenharmony_ci l3 = lambda : [2 < x for x in [-1, 3, 0]] 7827db96d56Sopenharmony_ci self.assertEqual(l3(), [0, 1, 0]) 7837db96d56Sopenharmony_ci l4 = lambda x = lambda y = lambda z=1 : z : y() : x() 7847db96d56Sopenharmony_ci self.assertEqual(l4(), 1) 7857db96d56Sopenharmony_ci l5 = lambda x, y, z=2: x + y + z 7867db96d56Sopenharmony_ci self.assertEqual(l5(1, 2), 5) 7877db96d56Sopenharmony_ci self.assertEqual(l5(1, 2, 3), 6) 7887db96d56Sopenharmony_ci check_syntax_error(self, "lambda x: x = 2") 7897db96d56Sopenharmony_ci check_syntax_error(self, "lambda (None,): None") 7907db96d56Sopenharmony_ci l6 = lambda x, y, *, k=20: x+y+k 7917db96d56Sopenharmony_ci self.assertEqual(l6(1,2), 1+2+20) 7927db96d56Sopenharmony_ci self.assertEqual(l6(1,2,k=10), 1+2+10) 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_ci # check that trailing commas are permitted 7957db96d56Sopenharmony_ci l10 = lambda a,: 0 7967db96d56Sopenharmony_ci l11 = lambda *args,: 0 7977db96d56Sopenharmony_ci l12 = lambda **kwds,: 0 7987db96d56Sopenharmony_ci l13 = lambda a, *args,: 0 7997db96d56Sopenharmony_ci l14 = lambda a, **kwds,: 0 8007db96d56Sopenharmony_ci l15 = lambda *args, b,: 0 8017db96d56Sopenharmony_ci l16 = lambda *, b,: 0 8027db96d56Sopenharmony_ci l17 = lambda *args, **kwds,: 0 8037db96d56Sopenharmony_ci l18 = lambda a, *args, b,: 0 8047db96d56Sopenharmony_ci l19 = lambda a, *, b,: 0 8057db96d56Sopenharmony_ci l20 = lambda a, *args, **kwds,: 0 8067db96d56Sopenharmony_ci l21 = lambda *args, b, **kwds,: 0 8077db96d56Sopenharmony_ci l22 = lambda *, b, **kwds,: 0 8087db96d56Sopenharmony_ci l23 = lambda a, *args, b, **kwds,: 0 8097db96d56Sopenharmony_ci l24 = lambda a, *, b, **kwds,: 0 8107db96d56Sopenharmony_ci 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci ### stmt: simple_stmt | compound_stmt 8137db96d56Sopenharmony_ci # Tested below 8147db96d56Sopenharmony_ci 8157db96d56Sopenharmony_ci def test_simple_stmt(self): 8167db96d56Sopenharmony_ci ### simple_stmt: small_stmt (';' small_stmt)* [';'] 8177db96d56Sopenharmony_ci x = 1; pass; del x 8187db96d56Sopenharmony_ci def foo(): 8197db96d56Sopenharmony_ci # verify statements that end with semi-colons 8207db96d56Sopenharmony_ci x = 1; pass; del x; 8217db96d56Sopenharmony_ci foo() 8227db96d56Sopenharmony_ci 8237db96d56Sopenharmony_ci ### small_stmt: expr_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt 8247db96d56Sopenharmony_ci # Tested below 8257db96d56Sopenharmony_ci 8267db96d56Sopenharmony_ci def test_expr_stmt(self): 8277db96d56Sopenharmony_ci # (exprlist '=')* exprlist 8287db96d56Sopenharmony_ci 1 8297db96d56Sopenharmony_ci 1, 2, 3 8307db96d56Sopenharmony_ci x = 1 8317db96d56Sopenharmony_ci x = 1, 2, 3 8327db96d56Sopenharmony_ci x = y = z = 1, 2, 3 8337db96d56Sopenharmony_ci x, y, z = 1, 2, 3 8347db96d56Sopenharmony_ci abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4) 8357db96d56Sopenharmony_ci 8367db96d56Sopenharmony_ci check_syntax_error(self, "x + 1 = 1") 8377db96d56Sopenharmony_ci check_syntax_error(self, "a + 1 = b + 2") 8387db96d56Sopenharmony_ci 8397db96d56Sopenharmony_ci # Check the heuristic for print & exec covers significant cases 8407db96d56Sopenharmony_ci # As well as placing some limits on false positives 8417db96d56Sopenharmony_ci def test_former_statements_refer_to_builtins(self): 8427db96d56Sopenharmony_ci keywords = "print", "exec" 8437db96d56Sopenharmony_ci # Cases where we want the custom error 8447db96d56Sopenharmony_ci cases = [ 8457db96d56Sopenharmony_ci "{} foo", 8467db96d56Sopenharmony_ci "{} {{1:foo}}", 8477db96d56Sopenharmony_ci "if 1: {} foo", 8487db96d56Sopenharmony_ci "if 1: {} {{1:foo}}", 8497db96d56Sopenharmony_ci "if 1:\n {} foo", 8507db96d56Sopenharmony_ci "if 1:\n {} {{1:foo}}", 8517db96d56Sopenharmony_ci ] 8527db96d56Sopenharmony_ci for keyword in keywords: 8537db96d56Sopenharmony_ci custom_msg = "call to '{}'".format(keyword) 8547db96d56Sopenharmony_ci for case in cases: 8557db96d56Sopenharmony_ci source = case.format(keyword) 8567db96d56Sopenharmony_ci with self.subTest(source=source): 8577db96d56Sopenharmony_ci with self.assertRaisesRegex(SyntaxError, custom_msg): 8587db96d56Sopenharmony_ci exec(source) 8597db96d56Sopenharmony_ci source = source.replace("foo", "(foo.)") 8607db96d56Sopenharmony_ci with self.subTest(source=source): 8617db96d56Sopenharmony_ci with self.assertRaisesRegex(SyntaxError, "invalid syntax"): 8627db96d56Sopenharmony_ci exec(source) 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_ci def test_del_stmt(self): 8657db96d56Sopenharmony_ci # 'del' exprlist 8667db96d56Sopenharmony_ci abc = [1,2,3] 8677db96d56Sopenharmony_ci x, y, z = abc 8687db96d56Sopenharmony_ci xyz = x, y, z 8697db96d56Sopenharmony_ci 8707db96d56Sopenharmony_ci del abc 8717db96d56Sopenharmony_ci del x, y, (z, xyz) 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ci x, y, z = "xyz" 8747db96d56Sopenharmony_ci del x 8757db96d56Sopenharmony_ci del y, 8767db96d56Sopenharmony_ci del (z) 8777db96d56Sopenharmony_ci del () 8787db96d56Sopenharmony_ci 8797db96d56Sopenharmony_ci a, b, c, d, e, f, g = "abcdefg" 8807db96d56Sopenharmony_ci del a, (b, c), (d, (e, f)) 8817db96d56Sopenharmony_ci 8827db96d56Sopenharmony_ci a, b, c, d, e, f, g = "abcdefg" 8837db96d56Sopenharmony_ci del a, [b, c], (d, [e, f]) 8847db96d56Sopenharmony_ci 8857db96d56Sopenharmony_ci abcd = list("abcd") 8867db96d56Sopenharmony_ci del abcd[1:2] 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci compile("del a, (b[0].c, (d.e, f.g[1:2])), [h.i.j], ()", "<testcase>", "exec") 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ci def test_pass_stmt(self): 8917db96d56Sopenharmony_ci # 'pass' 8927db96d56Sopenharmony_ci pass 8937db96d56Sopenharmony_ci 8947db96d56Sopenharmony_ci # flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt 8957db96d56Sopenharmony_ci # Tested below 8967db96d56Sopenharmony_ci 8977db96d56Sopenharmony_ci def test_break_stmt(self): 8987db96d56Sopenharmony_ci # 'break' 8997db96d56Sopenharmony_ci while 1: break 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ci def test_continue_stmt(self): 9027db96d56Sopenharmony_ci # 'continue' 9037db96d56Sopenharmony_ci i = 1 9047db96d56Sopenharmony_ci while i: i = 0; continue 9057db96d56Sopenharmony_ci 9067db96d56Sopenharmony_ci msg = "" 9077db96d56Sopenharmony_ci while not msg: 9087db96d56Sopenharmony_ci msg = "ok" 9097db96d56Sopenharmony_ci try: 9107db96d56Sopenharmony_ci continue 9117db96d56Sopenharmony_ci msg = "continue failed to continue inside try" 9127db96d56Sopenharmony_ci except: 9137db96d56Sopenharmony_ci msg = "continue inside try called except block" 9147db96d56Sopenharmony_ci if msg != "ok": 9157db96d56Sopenharmony_ci self.fail(msg) 9167db96d56Sopenharmony_ci 9177db96d56Sopenharmony_ci msg = "" 9187db96d56Sopenharmony_ci while not msg: 9197db96d56Sopenharmony_ci msg = "finally block not called" 9207db96d56Sopenharmony_ci try: 9217db96d56Sopenharmony_ci continue 9227db96d56Sopenharmony_ci finally: 9237db96d56Sopenharmony_ci msg = "ok" 9247db96d56Sopenharmony_ci if msg != "ok": 9257db96d56Sopenharmony_ci self.fail(msg) 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci def test_break_continue_loop(self): 9287db96d56Sopenharmony_ci # This test warrants an explanation. It is a test specifically for SF bugs 9297db96d56Sopenharmony_ci # #463359 and #462937. The bug is that a 'break' statement executed or 9307db96d56Sopenharmony_ci # exception raised inside a try/except inside a loop, *after* a continue 9317db96d56Sopenharmony_ci # statement has been executed in that loop, will cause the wrong number of 9327db96d56Sopenharmony_ci # arguments to be popped off the stack and the instruction pointer reset to 9337db96d56Sopenharmony_ci # a very small number (usually 0.) Because of this, the following test 9347db96d56Sopenharmony_ci # *must* written as a function, and the tracking vars *must* be function 9357db96d56Sopenharmony_ci # arguments with default values. Otherwise, the test will loop and loop. 9367db96d56Sopenharmony_ci 9377db96d56Sopenharmony_ci def test_inner(extra_burning_oil = 1, count=0): 9387db96d56Sopenharmony_ci big_hippo = 2 9397db96d56Sopenharmony_ci while big_hippo: 9407db96d56Sopenharmony_ci count += 1 9417db96d56Sopenharmony_ci try: 9427db96d56Sopenharmony_ci if extra_burning_oil and big_hippo == 1: 9437db96d56Sopenharmony_ci extra_burning_oil -= 1 9447db96d56Sopenharmony_ci break 9457db96d56Sopenharmony_ci big_hippo -= 1 9467db96d56Sopenharmony_ci continue 9477db96d56Sopenharmony_ci except: 9487db96d56Sopenharmony_ci raise 9497db96d56Sopenharmony_ci if count > 2 or big_hippo != 1: 9507db96d56Sopenharmony_ci self.fail("continue then break in try/except in loop broken!") 9517db96d56Sopenharmony_ci test_inner() 9527db96d56Sopenharmony_ci 9537db96d56Sopenharmony_ci def test_return(self): 9547db96d56Sopenharmony_ci # 'return' [testlist_star_expr] 9557db96d56Sopenharmony_ci def g1(): return 9567db96d56Sopenharmony_ci def g2(): return 1 9577db96d56Sopenharmony_ci def g3(): 9587db96d56Sopenharmony_ci z = [2, 3] 9597db96d56Sopenharmony_ci return 1, *z 9607db96d56Sopenharmony_ci 9617db96d56Sopenharmony_ci g1() 9627db96d56Sopenharmony_ci x = g2() 9637db96d56Sopenharmony_ci y = g3() 9647db96d56Sopenharmony_ci self.assertEqual(y, (1, 2, 3), "unparenthesized star expr return") 9657db96d56Sopenharmony_ci check_syntax_error(self, "class foo:return 1") 9667db96d56Sopenharmony_ci 9677db96d56Sopenharmony_ci def test_break_in_finally(self): 9687db96d56Sopenharmony_ci count = 0 9697db96d56Sopenharmony_ci while count < 2: 9707db96d56Sopenharmony_ci count += 1 9717db96d56Sopenharmony_ci try: 9727db96d56Sopenharmony_ci pass 9737db96d56Sopenharmony_ci finally: 9747db96d56Sopenharmony_ci break 9757db96d56Sopenharmony_ci self.assertEqual(count, 1) 9767db96d56Sopenharmony_ci 9777db96d56Sopenharmony_ci count = 0 9787db96d56Sopenharmony_ci while count < 2: 9797db96d56Sopenharmony_ci count += 1 9807db96d56Sopenharmony_ci try: 9817db96d56Sopenharmony_ci continue 9827db96d56Sopenharmony_ci finally: 9837db96d56Sopenharmony_ci break 9847db96d56Sopenharmony_ci self.assertEqual(count, 1) 9857db96d56Sopenharmony_ci 9867db96d56Sopenharmony_ci count = 0 9877db96d56Sopenharmony_ci while count < 2: 9887db96d56Sopenharmony_ci count += 1 9897db96d56Sopenharmony_ci try: 9907db96d56Sopenharmony_ci 1/0 9917db96d56Sopenharmony_ci finally: 9927db96d56Sopenharmony_ci break 9937db96d56Sopenharmony_ci self.assertEqual(count, 1) 9947db96d56Sopenharmony_ci 9957db96d56Sopenharmony_ci for count in [0, 1]: 9967db96d56Sopenharmony_ci self.assertEqual(count, 0) 9977db96d56Sopenharmony_ci try: 9987db96d56Sopenharmony_ci pass 9997db96d56Sopenharmony_ci finally: 10007db96d56Sopenharmony_ci break 10017db96d56Sopenharmony_ci self.assertEqual(count, 0) 10027db96d56Sopenharmony_ci 10037db96d56Sopenharmony_ci for count in [0, 1]: 10047db96d56Sopenharmony_ci self.assertEqual(count, 0) 10057db96d56Sopenharmony_ci try: 10067db96d56Sopenharmony_ci continue 10077db96d56Sopenharmony_ci finally: 10087db96d56Sopenharmony_ci break 10097db96d56Sopenharmony_ci self.assertEqual(count, 0) 10107db96d56Sopenharmony_ci 10117db96d56Sopenharmony_ci for count in [0, 1]: 10127db96d56Sopenharmony_ci self.assertEqual(count, 0) 10137db96d56Sopenharmony_ci try: 10147db96d56Sopenharmony_ci 1/0 10157db96d56Sopenharmony_ci finally: 10167db96d56Sopenharmony_ci break 10177db96d56Sopenharmony_ci self.assertEqual(count, 0) 10187db96d56Sopenharmony_ci 10197db96d56Sopenharmony_ci def test_continue_in_finally(self): 10207db96d56Sopenharmony_ci count = 0 10217db96d56Sopenharmony_ci while count < 2: 10227db96d56Sopenharmony_ci count += 1 10237db96d56Sopenharmony_ci try: 10247db96d56Sopenharmony_ci pass 10257db96d56Sopenharmony_ci finally: 10267db96d56Sopenharmony_ci continue 10277db96d56Sopenharmony_ci break 10287db96d56Sopenharmony_ci self.assertEqual(count, 2) 10297db96d56Sopenharmony_ci 10307db96d56Sopenharmony_ci count = 0 10317db96d56Sopenharmony_ci while count < 2: 10327db96d56Sopenharmony_ci count += 1 10337db96d56Sopenharmony_ci try: 10347db96d56Sopenharmony_ci break 10357db96d56Sopenharmony_ci finally: 10367db96d56Sopenharmony_ci continue 10377db96d56Sopenharmony_ci self.assertEqual(count, 2) 10387db96d56Sopenharmony_ci 10397db96d56Sopenharmony_ci count = 0 10407db96d56Sopenharmony_ci while count < 2: 10417db96d56Sopenharmony_ci count += 1 10427db96d56Sopenharmony_ci try: 10437db96d56Sopenharmony_ci 1/0 10447db96d56Sopenharmony_ci finally: 10457db96d56Sopenharmony_ci continue 10467db96d56Sopenharmony_ci break 10477db96d56Sopenharmony_ci self.assertEqual(count, 2) 10487db96d56Sopenharmony_ci 10497db96d56Sopenharmony_ci for count in [0, 1]: 10507db96d56Sopenharmony_ci try: 10517db96d56Sopenharmony_ci pass 10527db96d56Sopenharmony_ci finally: 10537db96d56Sopenharmony_ci continue 10547db96d56Sopenharmony_ci break 10557db96d56Sopenharmony_ci self.assertEqual(count, 1) 10567db96d56Sopenharmony_ci 10577db96d56Sopenharmony_ci for count in [0, 1]: 10587db96d56Sopenharmony_ci try: 10597db96d56Sopenharmony_ci break 10607db96d56Sopenharmony_ci finally: 10617db96d56Sopenharmony_ci continue 10627db96d56Sopenharmony_ci self.assertEqual(count, 1) 10637db96d56Sopenharmony_ci 10647db96d56Sopenharmony_ci for count in [0, 1]: 10657db96d56Sopenharmony_ci try: 10667db96d56Sopenharmony_ci 1/0 10677db96d56Sopenharmony_ci finally: 10687db96d56Sopenharmony_ci continue 10697db96d56Sopenharmony_ci break 10707db96d56Sopenharmony_ci self.assertEqual(count, 1) 10717db96d56Sopenharmony_ci 10727db96d56Sopenharmony_ci def test_return_in_finally(self): 10737db96d56Sopenharmony_ci def g1(): 10747db96d56Sopenharmony_ci try: 10757db96d56Sopenharmony_ci pass 10767db96d56Sopenharmony_ci finally: 10777db96d56Sopenharmony_ci return 1 10787db96d56Sopenharmony_ci self.assertEqual(g1(), 1) 10797db96d56Sopenharmony_ci 10807db96d56Sopenharmony_ci def g2(): 10817db96d56Sopenharmony_ci try: 10827db96d56Sopenharmony_ci return 2 10837db96d56Sopenharmony_ci finally: 10847db96d56Sopenharmony_ci return 3 10857db96d56Sopenharmony_ci self.assertEqual(g2(), 3) 10867db96d56Sopenharmony_ci 10877db96d56Sopenharmony_ci def g3(): 10887db96d56Sopenharmony_ci try: 10897db96d56Sopenharmony_ci 1/0 10907db96d56Sopenharmony_ci finally: 10917db96d56Sopenharmony_ci return 4 10927db96d56Sopenharmony_ci self.assertEqual(g3(), 4) 10937db96d56Sopenharmony_ci 10947db96d56Sopenharmony_ci def test_break_in_finally_after_return(self): 10957db96d56Sopenharmony_ci # See issue #37830 10967db96d56Sopenharmony_ci def g1(x): 10977db96d56Sopenharmony_ci for count in [0, 1]: 10987db96d56Sopenharmony_ci count2 = 0 10997db96d56Sopenharmony_ci while count2 < 20: 11007db96d56Sopenharmony_ci count2 += 10 11017db96d56Sopenharmony_ci try: 11027db96d56Sopenharmony_ci return count + count2 11037db96d56Sopenharmony_ci finally: 11047db96d56Sopenharmony_ci if x: 11057db96d56Sopenharmony_ci break 11067db96d56Sopenharmony_ci return 'end', count, count2 11077db96d56Sopenharmony_ci self.assertEqual(g1(False), 10) 11087db96d56Sopenharmony_ci self.assertEqual(g1(True), ('end', 1, 10)) 11097db96d56Sopenharmony_ci 11107db96d56Sopenharmony_ci def g2(x): 11117db96d56Sopenharmony_ci for count in [0, 1]: 11127db96d56Sopenharmony_ci for count2 in [10, 20]: 11137db96d56Sopenharmony_ci try: 11147db96d56Sopenharmony_ci return count + count2 11157db96d56Sopenharmony_ci finally: 11167db96d56Sopenharmony_ci if x: 11177db96d56Sopenharmony_ci break 11187db96d56Sopenharmony_ci return 'end', count, count2 11197db96d56Sopenharmony_ci self.assertEqual(g2(False), 10) 11207db96d56Sopenharmony_ci self.assertEqual(g2(True), ('end', 1, 10)) 11217db96d56Sopenharmony_ci 11227db96d56Sopenharmony_ci def test_continue_in_finally_after_return(self): 11237db96d56Sopenharmony_ci # See issue #37830 11247db96d56Sopenharmony_ci def g1(x): 11257db96d56Sopenharmony_ci count = 0 11267db96d56Sopenharmony_ci while count < 100: 11277db96d56Sopenharmony_ci count += 1 11287db96d56Sopenharmony_ci try: 11297db96d56Sopenharmony_ci return count 11307db96d56Sopenharmony_ci finally: 11317db96d56Sopenharmony_ci if x: 11327db96d56Sopenharmony_ci continue 11337db96d56Sopenharmony_ci return 'end', count 11347db96d56Sopenharmony_ci self.assertEqual(g1(False), 1) 11357db96d56Sopenharmony_ci self.assertEqual(g1(True), ('end', 100)) 11367db96d56Sopenharmony_ci 11377db96d56Sopenharmony_ci def g2(x): 11387db96d56Sopenharmony_ci for count in [0, 1]: 11397db96d56Sopenharmony_ci try: 11407db96d56Sopenharmony_ci return count 11417db96d56Sopenharmony_ci finally: 11427db96d56Sopenharmony_ci if x: 11437db96d56Sopenharmony_ci continue 11447db96d56Sopenharmony_ci return 'end', count 11457db96d56Sopenharmony_ci self.assertEqual(g2(False), 0) 11467db96d56Sopenharmony_ci self.assertEqual(g2(True), ('end', 1)) 11477db96d56Sopenharmony_ci 11487db96d56Sopenharmony_ci def test_yield(self): 11497db96d56Sopenharmony_ci # Allowed as standalone statement 11507db96d56Sopenharmony_ci def g(): yield 1 11517db96d56Sopenharmony_ci def g(): yield from () 11527db96d56Sopenharmony_ci # Allowed as RHS of assignment 11537db96d56Sopenharmony_ci def g(): x = yield 1 11547db96d56Sopenharmony_ci def g(): x = yield from () 11557db96d56Sopenharmony_ci # Ordinary yield accepts implicit tuples 11567db96d56Sopenharmony_ci def g(): yield 1, 1 11577db96d56Sopenharmony_ci def g(): x = yield 1, 1 11587db96d56Sopenharmony_ci # 'yield from' does not 11597db96d56Sopenharmony_ci check_syntax_error(self, "def g(): yield from (), 1") 11607db96d56Sopenharmony_ci check_syntax_error(self, "def g(): x = yield from (), 1") 11617db96d56Sopenharmony_ci # Requires parentheses as subexpression 11627db96d56Sopenharmony_ci def g(): 1, (yield 1) 11637db96d56Sopenharmony_ci def g(): 1, (yield from ()) 11647db96d56Sopenharmony_ci check_syntax_error(self, "def g(): 1, yield 1") 11657db96d56Sopenharmony_ci check_syntax_error(self, "def g(): 1, yield from ()") 11667db96d56Sopenharmony_ci # Requires parentheses as call argument 11677db96d56Sopenharmony_ci def g(): f((yield 1)) 11687db96d56Sopenharmony_ci def g(): f((yield 1), 1) 11697db96d56Sopenharmony_ci def g(): f((yield from ())) 11707db96d56Sopenharmony_ci def g(): f((yield from ()), 1) 11717db96d56Sopenharmony_ci # Do not require parenthesis for tuple unpacking 11727db96d56Sopenharmony_ci def g(): rest = 4, 5, 6; yield 1, 2, 3, *rest 11737db96d56Sopenharmony_ci self.assertEqual(list(g()), [(1, 2, 3, 4, 5, 6)]) 11747db96d56Sopenharmony_ci check_syntax_error(self, "def g(): f(yield 1)") 11757db96d56Sopenharmony_ci check_syntax_error(self, "def g(): f(yield 1, 1)") 11767db96d56Sopenharmony_ci check_syntax_error(self, "def g(): f(yield from ())") 11777db96d56Sopenharmony_ci check_syntax_error(self, "def g(): f(yield from (), 1)") 11787db96d56Sopenharmony_ci # Not allowed at top level 11797db96d56Sopenharmony_ci check_syntax_error(self, "yield") 11807db96d56Sopenharmony_ci check_syntax_error(self, "yield from") 11817db96d56Sopenharmony_ci # Not allowed at class scope 11827db96d56Sopenharmony_ci check_syntax_error(self, "class foo:yield 1") 11837db96d56Sopenharmony_ci check_syntax_error(self, "class foo:yield from ()") 11847db96d56Sopenharmony_ci # Check annotation refleak on SyntaxError 11857db96d56Sopenharmony_ci check_syntax_error(self, "def g(a:(yield)): pass") 11867db96d56Sopenharmony_ci 11877db96d56Sopenharmony_ci def test_yield_in_comprehensions(self): 11887db96d56Sopenharmony_ci # Check yield in comprehensions 11897db96d56Sopenharmony_ci def g(): [x for x in [(yield 1)]] 11907db96d56Sopenharmony_ci def g(): [x for x in [(yield from ())]] 11917db96d56Sopenharmony_ci 11927db96d56Sopenharmony_ci check = self.check_syntax_error 11937db96d56Sopenharmony_ci check("def g(): [(yield x) for x in ()]", 11947db96d56Sopenharmony_ci "'yield' inside list comprehension") 11957db96d56Sopenharmony_ci check("def g(): [x for x in () if not (yield x)]", 11967db96d56Sopenharmony_ci "'yield' inside list comprehension") 11977db96d56Sopenharmony_ci check("def g(): [y for x in () for y in [(yield x)]]", 11987db96d56Sopenharmony_ci "'yield' inside list comprehension") 11997db96d56Sopenharmony_ci check("def g(): {(yield x) for x in ()}", 12007db96d56Sopenharmony_ci "'yield' inside set comprehension") 12017db96d56Sopenharmony_ci check("def g(): {(yield x): x for x in ()}", 12027db96d56Sopenharmony_ci "'yield' inside dict comprehension") 12037db96d56Sopenharmony_ci check("def g(): {x: (yield x) for x in ()}", 12047db96d56Sopenharmony_ci "'yield' inside dict comprehension") 12057db96d56Sopenharmony_ci check("def g(): ((yield x) for x in ())", 12067db96d56Sopenharmony_ci "'yield' inside generator expression") 12077db96d56Sopenharmony_ci check("def g(): [(yield from x) for x in ()]", 12087db96d56Sopenharmony_ci "'yield' inside list comprehension") 12097db96d56Sopenharmony_ci check("class C: [(yield x) for x in ()]", 12107db96d56Sopenharmony_ci "'yield' inside list comprehension") 12117db96d56Sopenharmony_ci check("[(yield x) for x in ()]", 12127db96d56Sopenharmony_ci "'yield' inside list comprehension") 12137db96d56Sopenharmony_ci 12147db96d56Sopenharmony_ci def test_raise(self): 12157db96d56Sopenharmony_ci # 'raise' test [',' test] 12167db96d56Sopenharmony_ci try: raise RuntimeError('just testing') 12177db96d56Sopenharmony_ci except RuntimeError: pass 12187db96d56Sopenharmony_ci try: raise KeyboardInterrupt 12197db96d56Sopenharmony_ci except KeyboardInterrupt: pass 12207db96d56Sopenharmony_ci 12217db96d56Sopenharmony_ci def test_import(self): 12227db96d56Sopenharmony_ci # 'import' dotted_as_names 12237db96d56Sopenharmony_ci import sys 12247db96d56Sopenharmony_ci import time, sys 12257db96d56Sopenharmony_ci # 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names) 12267db96d56Sopenharmony_ci from time import time 12277db96d56Sopenharmony_ci from time import (time) 12287db96d56Sopenharmony_ci # not testable inside a function, but already done at top of the module 12297db96d56Sopenharmony_ci # from sys import * 12307db96d56Sopenharmony_ci from sys import path, argv 12317db96d56Sopenharmony_ci from sys import (path, argv) 12327db96d56Sopenharmony_ci from sys import (path, argv,) 12337db96d56Sopenharmony_ci 12347db96d56Sopenharmony_ci def test_global(self): 12357db96d56Sopenharmony_ci # 'global' NAME (',' NAME)* 12367db96d56Sopenharmony_ci global a 12377db96d56Sopenharmony_ci global a, b 12387db96d56Sopenharmony_ci global one, two, three, four, five, six, seven, eight, nine, ten 12397db96d56Sopenharmony_ci 12407db96d56Sopenharmony_ci def test_nonlocal(self): 12417db96d56Sopenharmony_ci # 'nonlocal' NAME (',' NAME)* 12427db96d56Sopenharmony_ci x = 0 12437db96d56Sopenharmony_ci y = 0 12447db96d56Sopenharmony_ci def f(): 12457db96d56Sopenharmony_ci nonlocal x 12467db96d56Sopenharmony_ci nonlocal x, y 12477db96d56Sopenharmony_ci 12487db96d56Sopenharmony_ci def test_assert(self): 12497db96d56Sopenharmony_ci # assertTruestmt: 'assert' test [',' test] 12507db96d56Sopenharmony_ci assert 1 12517db96d56Sopenharmony_ci assert 1, 1 12527db96d56Sopenharmony_ci assert lambda x:x 12537db96d56Sopenharmony_ci assert 1, lambda x:x+1 12547db96d56Sopenharmony_ci 12557db96d56Sopenharmony_ci try: 12567db96d56Sopenharmony_ci assert True 12577db96d56Sopenharmony_ci except AssertionError as e: 12587db96d56Sopenharmony_ci self.fail("'assert True' should not have raised an AssertionError") 12597db96d56Sopenharmony_ci 12607db96d56Sopenharmony_ci try: 12617db96d56Sopenharmony_ci assert True, 'this should always pass' 12627db96d56Sopenharmony_ci except AssertionError as e: 12637db96d56Sopenharmony_ci self.fail("'assert True, msg' should not have " 12647db96d56Sopenharmony_ci "raised an AssertionError") 12657db96d56Sopenharmony_ci 12667db96d56Sopenharmony_ci # these tests fail if python is run with -O, so check __debug__ 12677db96d56Sopenharmony_ci @unittest.skipUnless(__debug__, "Won't work if __debug__ is False") 12687db96d56Sopenharmony_ci def test_assert_failures(self): 12697db96d56Sopenharmony_ci try: 12707db96d56Sopenharmony_ci assert 0, "msg" 12717db96d56Sopenharmony_ci except AssertionError as e: 12727db96d56Sopenharmony_ci self.assertEqual(e.args[0], "msg") 12737db96d56Sopenharmony_ci else: 12747db96d56Sopenharmony_ci self.fail("AssertionError not raised by assert 0") 12757db96d56Sopenharmony_ci 12767db96d56Sopenharmony_ci try: 12777db96d56Sopenharmony_ci assert False 12787db96d56Sopenharmony_ci except AssertionError as e: 12797db96d56Sopenharmony_ci self.assertEqual(len(e.args), 0) 12807db96d56Sopenharmony_ci else: 12817db96d56Sopenharmony_ci self.fail("AssertionError not raised by 'assert False'") 12827db96d56Sopenharmony_ci 12837db96d56Sopenharmony_ci def test_assert_syntax_warnings(self): 12847db96d56Sopenharmony_ci # Ensure that we warn users if they provide a non-zero length tuple as 12857db96d56Sopenharmony_ci # the assertion test. 12867db96d56Sopenharmony_ci self.check_syntax_warning('assert(x, "msg")', 12877db96d56Sopenharmony_ci 'assertion is always true') 12887db96d56Sopenharmony_ci self.check_syntax_warning('assert(False, "msg")', 12897db96d56Sopenharmony_ci 'assertion is always true') 12907db96d56Sopenharmony_ci self.check_syntax_warning('assert(False,)', 12917db96d56Sopenharmony_ci 'assertion is always true') 12927db96d56Sopenharmony_ci 12937db96d56Sopenharmony_ci with self.check_no_warnings(category=SyntaxWarning): 12947db96d56Sopenharmony_ci compile('assert x, "msg"', '<testcase>', 'exec') 12957db96d56Sopenharmony_ci compile('assert False, "msg"', '<testcase>', 'exec') 12967db96d56Sopenharmony_ci 12977db96d56Sopenharmony_ci def test_assert_warning_promotes_to_syntax_error(self): 12987db96d56Sopenharmony_ci # If SyntaxWarning is configured to be an error, it actually raises a 12997db96d56Sopenharmony_ci # SyntaxError. 13007db96d56Sopenharmony_ci # https://bugs.python.org/issue35029 13017db96d56Sopenharmony_ci with warnings.catch_warnings(): 13027db96d56Sopenharmony_ci warnings.simplefilter('error', SyntaxWarning) 13037db96d56Sopenharmony_ci try: 13047db96d56Sopenharmony_ci compile('assert x, "msg" ', '<testcase>', 'exec') 13057db96d56Sopenharmony_ci except SyntaxError: 13067db96d56Sopenharmony_ci self.fail('SyntaxError incorrectly raised for \'assert x, "msg"\'') 13077db96d56Sopenharmony_ci with self.assertRaises(SyntaxError): 13087db96d56Sopenharmony_ci compile('assert(x, "msg")', '<testcase>', 'exec') 13097db96d56Sopenharmony_ci with self.assertRaises(SyntaxError): 13107db96d56Sopenharmony_ci compile('assert(False, "msg")', '<testcase>', 'exec') 13117db96d56Sopenharmony_ci with self.assertRaises(SyntaxError): 13127db96d56Sopenharmony_ci compile('assert(False,)', '<testcase>', 'exec') 13137db96d56Sopenharmony_ci 13147db96d56Sopenharmony_ci 13157db96d56Sopenharmony_ci ### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef 13167db96d56Sopenharmony_ci # Tested below 13177db96d56Sopenharmony_ci 13187db96d56Sopenharmony_ci def test_if(self): 13197db96d56Sopenharmony_ci # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] 13207db96d56Sopenharmony_ci if 1: pass 13217db96d56Sopenharmony_ci if 1: pass 13227db96d56Sopenharmony_ci else: pass 13237db96d56Sopenharmony_ci if 0: pass 13247db96d56Sopenharmony_ci elif 0: pass 13257db96d56Sopenharmony_ci if 0: pass 13267db96d56Sopenharmony_ci elif 0: pass 13277db96d56Sopenharmony_ci elif 0: pass 13287db96d56Sopenharmony_ci elif 0: pass 13297db96d56Sopenharmony_ci else: pass 13307db96d56Sopenharmony_ci 13317db96d56Sopenharmony_ci def test_while(self): 13327db96d56Sopenharmony_ci # 'while' test ':' suite ['else' ':' suite] 13337db96d56Sopenharmony_ci while 0: pass 13347db96d56Sopenharmony_ci while 0: pass 13357db96d56Sopenharmony_ci else: pass 13367db96d56Sopenharmony_ci 13377db96d56Sopenharmony_ci # Issue1920: "while 0" is optimized away, 13387db96d56Sopenharmony_ci # ensure that the "else" clause is still present. 13397db96d56Sopenharmony_ci x = 0 13407db96d56Sopenharmony_ci while 0: 13417db96d56Sopenharmony_ci x = 1 13427db96d56Sopenharmony_ci else: 13437db96d56Sopenharmony_ci x = 2 13447db96d56Sopenharmony_ci self.assertEqual(x, 2) 13457db96d56Sopenharmony_ci 13467db96d56Sopenharmony_ci def test_for(self): 13477db96d56Sopenharmony_ci # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] 13487db96d56Sopenharmony_ci for i in 1, 2, 3: pass 13497db96d56Sopenharmony_ci for i, j, k in (): pass 13507db96d56Sopenharmony_ci else: pass 13517db96d56Sopenharmony_ci class Squares: 13527db96d56Sopenharmony_ci def __init__(self, max): 13537db96d56Sopenharmony_ci self.max = max 13547db96d56Sopenharmony_ci self.sofar = [] 13557db96d56Sopenharmony_ci def __len__(self): return len(self.sofar) 13567db96d56Sopenharmony_ci def __getitem__(self, i): 13577db96d56Sopenharmony_ci if not 0 <= i < self.max: raise IndexError 13587db96d56Sopenharmony_ci n = len(self.sofar) 13597db96d56Sopenharmony_ci while n <= i: 13607db96d56Sopenharmony_ci self.sofar.append(n*n) 13617db96d56Sopenharmony_ci n = n+1 13627db96d56Sopenharmony_ci return self.sofar[i] 13637db96d56Sopenharmony_ci n = 0 13647db96d56Sopenharmony_ci for x in Squares(10): n = n+x 13657db96d56Sopenharmony_ci if n != 285: 13667db96d56Sopenharmony_ci self.fail('for over growing sequence') 13677db96d56Sopenharmony_ci 13687db96d56Sopenharmony_ci result = [] 13697db96d56Sopenharmony_ci for x, in [(1,), (2,), (3,)]: 13707db96d56Sopenharmony_ci result.append(x) 13717db96d56Sopenharmony_ci self.assertEqual(result, [1, 2, 3]) 13727db96d56Sopenharmony_ci 13737db96d56Sopenharmony_ci result = [] 13747db96d56Sopenharmony_ci a = b = c = [1, 2, 3] 13757db96d56Sopenharmony_ci for x in *a, *b, *c: 13767db96d56Sopenharmony_ci result.append(x) 13777db96d56Sopenharmony_ci self.assertEqual(result, 3 * a) 13787db96d56Sopenharmony_ci 13797db96d56Sopenharmony_ci def test_try(self): 13807db96d56Sopenharmony_ci ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] 13817db96d56Sopenharmony_ci ### | 'try' ':' suite 'finally' ':' suite 13827db96d56Sopenharmony_ci ### except_clause: 'except' [expr ['as' NAME]] 13837db96d56Sopenharmony_ci try: 13847db96d56Sopenharmony_ci 1/0 13857db96d56Sopenharmony_ci except ZeroDivisionError: 13867db96d56Sopenharmony_ci pass 13877db96d56Sopenharmony_ci else: 13887db96d56Sopenharmony_ci pass 13897db96d56Sopenharmony_ci try: 1/0 13907db96d56Sopenharmony_ci except EOFError: pass 13917db96d56Sopenharmony_ci except TypeError as msg: pass 13927db96d56Sopenharmony_ci except: pass 13937db96d56Sopenharmony_ci else: pass 13947db96d56Sopenharmony_ci try: 1/0 13957db96d56Sopenharmony_ci except (EOFError, TypeError, ZeroDivisionError): pass 13967db96d56Sopenharmony_ci try: 1/0 13977db96d56Sopenharmony_ci except (EOFError, TypeError, ZeroDivisionError) as msg: pass 13987db96d56Sopenharmony_ci try: pass 13997db96d56Sopenharmony_ci finally: pass 14007db96d56Sopenharmony_ci with self.assertRaises(SyntaxError): 14017db96d56Sopenharmony_ci compile("try:\n pass\nexcept Exception as a.b:\n pass", "?", "exec") 14027db96d56Sopenharmony_ci compile("try:\n pass\nexcept Exception as a[b]:\n pass", "?", "exec") 14037db96d56Sopenharmony_ci 14047db96d56Sopenharmony_ci def test_try_star(self): 14057db96d56Sopenharmony_ci ### try_stmt: 'try': suite (except_star_clause : suite) + ['else' ':' suite] 14067db96d56Sopenharmony_ci ### except_star_clause: 'except*' expr ['as' NAME] 14077db96d56Sopenharmony_ci try: 14087db96d56Sopenharmony_ci 1/0 14097db96d56Sopenharmony_ci except* ZeroDivisionError: 14107db96d56Sopenharmony_ci pass 14117db96d56Sopenharmony_ci else: 14127db96d56Sopenharmony_ci pass 14137db96d56Sopenharmony_ci try: 1/0 14147db96d56Sopenharmony_ci except* EOFError: pass 14157db96d56Sopenharmony_ci except* ZeroDivisionError as msg: pass 14167db96d56Sopenharmony_ci else: pass 14177db96d56Sopenharmony_ci try: 1/0 14187db96d56Sopenharmony_ci except* (EOFError, TypeError, ZeroDivisionError): pass 14197db96d56Sopenharmony_ci try: 1/0 14207db96d56Sopenharmony_ci except* (EOFError, TypeError, ZeroDivisionError) as msg: pass 14217db96d56Sopenharmony_ci try: pass 14227db96d56Sopenharmony_ci finally: pass 14237db96d56Sopenharmony_ci with self.assertRaises(SyntaxError): 14247db96d56Sopenharmony_ci compile("try:\n pass\nexcept* Exception as a.b:\n pass", "?", "exec") 14257db96d56Sopenharmony_ci compile("try:\n pass\nexcept* Exception as a[b]:\n pass", "?", "exec") 14267db96d56Sopenharmony_ci compile("try:\n pass\nexcept*:\n pass", "?", "exec") 14277db96d56Sopenharmony_ci 14287db96d56Sopenharmony_ci def test_suite(self): 14297db96d56Sopenharmony_ci # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT 14307db96d56Sopenharmony_ci if 1: pass 14317db96d56Sopenharmony_ci if 1: 14327db96d56Sopenharmony_ci pass 14337db96d56Sopenharmony_ci if 1: 14347db96d56Sopenharmony_ci # 14357db96d56Sopenharmony_ci # 14367db96d56Sopenharmony_ci # 14377db96d56Sopenharmony_ci pass 14387db96d56Sopenharmony_ci pass 14397db96d56Sopenharmony_ci # 14407db96d56Sopenharmony_ci pass 14417db96d56Sopenharmony_ci # 14427db96d56Sopenharmony_ci 14437db96d56Sopenharmony_ci def test_test(self): 14447db96d56Sopenharmony_ci ### and_test ('or' and_test)* 14457db96d56Sopenharmony_ci ### and_test: not_test ('and' not_test)* 14467db96d56Sopenharmony_ci ### not_test: 'not' not_test | comparison 14477db96d56Sopenharmony_ci if not 1: pass 14487db96d56Sopenharmony_ci if 1 and 1: pass 14497db96d56Sopenharmony_ci if 1 or 1: pass 14507db96d56Sopenharmony_ci if not not not 1: pass 14517db96d56Sopenharmony_ci if not 1 and 1 and 1: pass 14527db96d56Sopenharmony_ci if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass 14537db96d56Sopenharmony_ci 14547db96d56Sopenharmony_ci def test_comparison(self): 14557db96d56Sopenharmony_ci ### comparison: expr (comp_op expr)* 14567db96d56Sopenharmony_ci ### comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not' 14577db96d56Sopenharmony_ci if 1: pass 14587db96d56Sopenharmony_ci x = (1 == 1) 14597db96d56Sopenharmony_ci if 1 == 1: pass 14607db96d56Sopenharmony_ci if 1 != 1: pass 14617db96d56Sopenharmony_ci if 1 < 1: pass 14627db96d56Sopenharmony_ci if 1 > 1: pass 14637db96d56Sopenharmony_ci if 1 <= 1: pass 14647db96d56Sopenharmony_ci if 1 >= 1: pass 14657db96d56Sopenharmony_ci if x is x: pass 14667db96d56Sopenharmony_ci if x is not x: pass 14677db96d56Sopenharmony_ci if 1 in (): pass 14687db96d56Sopenharmony_ci if 1 not in (): pass 14697db96d56Sopenharmony_ci if 1 < 1 > 1 == 1 >= 1 <= 1 != 1 in 1 not in x is x is not x: pass 14707db96d56Sopenharmony_ci 14717db96d56Sopenharmony_ci def test_comparison_is_literal(self): 14727db96d56Sopenharmony_ci def check(test, msg='"is" with a literal'): 14737db96d56Sopenharmony_ci self.check_syntax_warning(test, msg) 14747db96d56Sopenharmony_ci 14757db96d56Sopenharmony_ci check('x is 1') 14767db96d56Sopenharmony_ci check('x is "thing"') 14777db96d56Sopenharmony_ci check('1 is x') 14787db96d56Sopenharmony_ci check('x is y is 1') 14797db96d56Sopenharmony_ci check('x is not 1', '"is not" with a literal') 14807db96d56Sopenharmony_ci 14817db96d56Sopenharmony_ci with warnings.catch_warnings(): 14827db96d56Sopenharmony_ci warnings.simplefilter('error', SyntaxWarning) 14837db96d56Sopenharmony_ci compile('x is None', '<testcase>', 'exec') 14847db96d56Sopenharmony_ci compile('x is False', '<testcase>', 'exec') 14857db96d56Sopenharmony_ci compile('x is True', '<testcase>', 'exec') 14867db96d56Sopenharmony_ci compile('x is ...', '<testcase>', 'exec') 14877db96d56Sopenharmony_ci 14887db96d56Sopenharmony_ci def test_warn_missed_comma(self): 14897db96d56Sopenharmony_ci def check(test): 14907db96d56Sopenharmony_ci self.check_syntax_warning(test, msg) 14917db96d56Sopenharmony_ci 14927db96d56Sopenharmony_ci msg=r'is not callable; perhaps you missed a comma\?' 14937db96d56Sopenharmony_ci check('[(1, 2) (3, 4)]') 14947db96d56Sopenharmony_ci check('[(x, y) (3, 4)]') 14957db96d56Sopenharmony_ci check('[[1, 2] (3, 4)]') 14967db96d56Sopenharmony_ci check('[{1, 2} (3, 4)]') 14977db96d56Sopenharmony_ci check('[{1: 2} (3, 4)]') 14987db96d56Sopenharmony_ci check('[[i for i in range(5)] (3, 4)]') 14997db96d56Sopenharmony_ci check('[{i for i in range(5)} (3, 4)]') 15007db96d56Sopenharmony_ci check('[(i for i in range(5)) (3, 4)]') 15017db96d56Sopenharmony_ci check('[{i: i for i in range(5)} (3, 4)]') 15027db96d56Sopenharmony_ci check('[f"{x}" (3, 4)]') 15037db96d56Sopenharmony_ci check('[f"x={x}" (3, 4)]') 15047db96d56Sopenharmony_ci check('["abc" (3, 4)]') 15057db96d56Sopenharmony_ci check('[b"abc" (3, 4)]') 15067db96d56Sopenharmony_ci check('[123 (3, 4)]') 15077db96d56Sopenharmony_ci check('[12.3 (3, 4)]') 15087db96d56Sopenharmony_ci check('[12.3j (3, 4)]') 15097db96d56Sopenharmony_ci check('[None (3, 4)]') 15107db96d56Sopenharmony_ci check('[True (3, 4)]') 15117db96d56Sopenharmony_ci check('[... (3, 4)]') 15127db96d56Sopenharmony_ci 15137db96d56Sopenharmony_ci msg=r'is not subscriptable; perhaps you missed a comma\?' 15147db96d56Sopenharmony_ci check('[{1, 2} [i, j]]') 15157db96d56Sopenharmony_ci check('[{i for i in range(5)} [i, j]]') 15167db96d56Sopenharmony_ci check('[(i for i in range(5)) [i, j]]') 15177db96d56Sopenharmony_ci check('[(lambda x, y: x) [i, j]]') 15187db96d56Sopenharmony_ci check('[123 [i, j]]') 15197db96d56Sopenharmony_ci check('[12.3 [i, j]]') 15207db96d56Sopenharmony_ci check('[12.3j [i, j]]') 15217db96d56Sopenharmony_ci check('[None [i, j]]') 15227db96d56Sopenharmony_ci check('[True [i, j]]') 15237db96d56Sopenharmony_ci check('[... [i, j]]') 15247db96d56Sopenharmony_ci 15257db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not tuple; perhaps you missed a comma\?' 15267db96d56Sopenharmony_ci check('[(1, 2) [i, j]]') 15277db96d56Sopenharmony_ci check('[(x, y) [i, j]]') 15287db96d56Sopenharmony_ci check('[[1, 2] [i, j]]') 15297db96d56Sopenharmony_ci check('[[i for i in range(5)] [i, j]]') 15307db96d56Sopenharmony_ci check('[f"{x}" [i, j]]') 15317db96d56Sopenharmony_ci check('[f"x={x}" [i, j]]') 15327db96d56Sopenharmony_ci check('["abc" [i, j]]') 15337db96d56Sopenharmony_ci check('[b"abc" [i, j]]') 15347db96d56Sopenharmony_ci 15357db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not tuple;' 15367db96d56Sopenharmony_ci check('[[1, 2] [3, 4]]') 15377db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not list;' 15387db96d56Sopenharmony_ci check('[[1, 2] [[3, 4]]]') 15397db96d56Sopenharmony_ci check('[[1, 2] [[i for i in range(5)]]]') 15407db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not set;' 15417db96d56Sopenharmony_ci check('[[1, 2] [{3, 4}]]') 15427db96d56Sopenharmony_ci check('[[1, 2] [{i for i in range(5)}]]') 15437db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not dict;' 15447db96d56Sopenharmony_ci check('[[1, 2] [{3: 4}]]') 15457db96d56Sopenharmony_ci check('[[1, 2] [{i: i for i in range(5)}]]') 15467db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not generator;' 15477db96d56Sopenharmony_ci check('[[1, 2] [(i for i in range(5))]]') 15487db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not function;' 15497db96d56Sopenharmony_ci check('[[1, 2] [(lambda x, y: x)]]') 15507db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not str;' 15517db96d56Sopenharmony_ci check('[[1, 2] [f"{x}"]]') 15527db96d56Sopenharmony_ci check('[[1, 2] [f"x={x}"]]') 15537db96d56Sopenharmony_ci check('[[1, 2] ["abc"]]') 15547db96d56Sopenharmony_ci msg=r'indices must be integers or slices, not' 15557db96d56Sopenharmony_ci check('[[1, 2] [b"abc"]]') 15567db96d56Sopenharmony_ci check('[[1, 2] [12.3]]') 15577db96d56Sopenharmony_ci check('[[1, 2] [12.3j]]') 15587db96d56Sopenharmony_ci check('[[1, 2] [None]]') 15597db96d56Sopenharmony_ci check('[[1, 2] [...]]') 15607db96d56Sopenharmony_ci 15617db96d56Sopenharmony_ci with warnings.catch_warnings(): 15627db96d56Sopenharmony_ci warnings.simplefilter('error', SyntaxWarning) 15637db96d56Sopenharmony_ci compile('[(lambda x, y: x) (3, 4)]', '<testcase>', 'exec') 15647db96d56Sopenharmony_ci compile('[[1, 2] [i]]', '<testcase>', 'exec') 15657db96d56Sopenharmony_ci compile('[[1, 2] [0]]', '<testcase>', 'exec') 15667db96d56Sopenharmony_ci compile('[[1, 2] [True]]', '<testcase>', 'exec') 15677db96d56Sopenharmony_ci compile('[[1, 2] [1:2]]', '<testcase>', 'exec') 15687db96d56Sopenharmony_ci compile('[{(1, 2): 3} [i, j]]', '<testcase>', 'exec') 15697db96d56Sopenharmony_ci 15707db96d56Sopenharmony_ci def test_binary_mask_ops(self): 15717db96d56Sopenharmony_ci x = 1 & 1 15727db96d56Sopenharmony_ci x = 1 ^ 1 15737db96d56Sopenharmony_ci x = 1 | 1 15747db96d56Sopenharmony_ci 15757db96d56Sopenharmony_ci def test_shift_ops(self): 15767db96d56Sopenharmony_ci x = 1 << 1 15777db96d56Sopenharmony_ci x = 1 >> 1 15787db96d56Sopenharmony_ci x = 1 << 1 >> 1 15797db96d56Sopenharmony_ci 15807db96d56Sopenharmony_ci def test_additive_ops(self): 15817db96d56Sopenharmony_ci x = 1 15827db96d56Sopenharmony_ci x = 1 + 1 15837db96d56Sopenharmony_ci x = 1 - 1 - 1 15847db96d56Sopenharmony_ci x = 1 - 1 + 1 - 1 + 1 15857db96d56Sopenharmony_ci 15867db96d56Sopenharmony_ci def test_multiplicative_ops(self): 15877db96d56Sopenharmony_ci x = 1 * 1 15887db96d56Sopenharmony_ci x = 1 / 1 15897db96d56Sopenharmony_ci x = 1 % 1 15907db96d56Sopenharmony_ci x = 1 / 1 * 1 % 1 15917db96d56Sopenharmony_ci 15927db96d56Sopenharmony_ci def test_unary_ops(self): 15937db96d56Sopenharmony_ci x = +1 15947db96d56Sopenharmony_ci x = -1 15957db96d56Sopenharmony_ci x = ~1 15967db96d56Sopenharmony_ci x = ~1 ^ 1 & 1 | 1 & 1 ^ -1 15977db96d56Sopenharmony_ci x = -1*1/1 + 1*1 - ---1*1 15987db96d56Sopenharmony_ci 15997db96d56Sopenharmony_ci def test_selectors(self): 16007db96d56Sopenharmony_ci ### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME 16017db96d56Sopenharmony_ci ### subscript: expr | [expr] ':' [expr] 16027db96d56Sopenharmony_ci 16037db96d56Sopenharmony_ci import sys, time 16047db96d56Sopenharmony_ci c = sys.path[0] 16057db96d56Sopenharmony_ci x = time.time() 16067db96d56Sopenharmony_ci x = sys.modules['time'].time() 16077db96d56Sopenharmony_ci a = '01234' 16087db96d56Sopenharmony_ci c = a[0] 16097db96d56Sopenharmony_ci c = a[-1] 16107db96d56Sopenharmony_ci s = a[0:5] 16117db96d56Sopenharmony_ci s = a[:5] 16127db96d56Sopenharmony_ci s = a[0:] 16137db96d56Sopenharmony_ci s = a[:] 16147db96d56Sopenharmony_ci s = a[-5:] 16157db96d56Sopenharmony_ci s = a[:-1] 16167db96d56Sopenharmony_ci s = a[-4:-3] 16177db96d56Sopenharmony_ci # A rough test of SF bug 1333982. http://python.org/sf/1333982 16187db96d56Sopenharmony_ci # The testing here is fairly incomplete. 16197db96d56Sopenharmony_ci # Test cases should include: commas with 1 and 2 colons 16207db96d56Sopenharmony_ci d = {} 16217db96d56Sopenharmony_ci d[1] = 1 16227db96d56Sopenharmony_ci d[1,] = 2 16237db96d56Sopenharmony_ci d[1,2] = 3 16247db96d56Sopenharmony_ci d[1,2,3] = 4 16257db96d56Sopenharmony_ci L = list(d) 16267db96d56Sopenharmony_ci L.sort(key=lambda x: (type(x).__name__, x)) 16277db96d56Sopenharmony_ci self.assertEqual(str(L), '[1, (1,), (1, 2), (1, 2, 3)]') 16287db96d56Sopenharmony_ci 16297db96d56Sopenharmony_ci def test_atoms(self): 16307db96d56Sopenharmony_ci ### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING 16317db96d56Sopenharmony_ci ### dictsetmaker: (test ':' test (',' test ':' test)* [',']) | (test (',' test)* [',']) 16327db96d56Sopenharmony_ci 16337db96d56Sopenharmony_ci x = (1) 16347db96d56Sopenharmony_ci x = (1 or 2 or 3) 16357db96d56Sopenharmony_ci x = (1 or 2 or 3, 2, 3) 16367db96d56Sopenharmony_ci 16377db96d56Sopenharmony_ci x = [] 16387db96d56Sopenharmony_ci x = [1] 16397db96d56Sopenharmony_ci x = [1 or 2 or 3] 16407db96d56Sopenharmony_ci x = [1 or 2 or 3, 2, 3] 16417db96d56Sopenharmony_ci x = [] 16427db96d56Sopenharmony_ci 16437db96d56Sopenharmony_ci x = {} 16447db96d56Sopenharmony_ci x = {'one': 1} 16457db96d56Sopenharmony_ci x = {'one': 1,} 16467db96d56Sopenharmony_ci x = {'one' or 'two': 1 or 2} 16477db96d56Sopenharmony_ci x = {'one': 1, 'two': 2} 16487db96d56Sopenharmony_ci x = {'one': 1, 'two': 2,} 16497db96d56Sopenharmony_ci x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6} 16507db96d56Sopenharmony_ci 16517db96d56Sopenharmony_ci x = {'one'} 16527db96d56Sopenharmony_ci x = {'one', 1,} 16537db96d56Sopenharmony_ci x = {'one', 'two', 'three'} 16547db96d56Sopenharmony_ci x = {2, 3, 4,} 16557db96d56Sopenharmony_ci 16567db96d56Sopenharmony_ci x = x 16577db96d56Sopenharmony_ci x = 'x' 16587db96d56Sopenharmony_ci x = 123 16597db96d56Sopenharmony_ci 16607db96d56Sopenharmony_ci ### exprlist: expr (',' expr)* [','] 16617db96d56Sopenharmony_ci ### testlist: test (',' test)* [','] 16627db96d56Sopenharmony_ci # These have been exercised enough above 16637db96d56Sopenharmony_ci 16647db96d56Sopenharmony_ci def test_classdef(self): 16657db96d56Sopenharmony_ci # 'class' NAME ['(' [testlist] ')'] ':' suite 16667db96d56Sopenharmony_ci class B: pass 16677db96d56Sopenharmony_ci class B2(): pass 16687db96d56Sopenharmony_ci class C1(B): pass 16697db96d56Sopenharmony_ci class C2(B): pass 16707db96d56Sopenharmony_ci class D(C1, C2, B): pass 16717db96d56Sopenharmony_ci class C: 16727db96d56Sopenharmony_ci def meth1(self): pass 16737db96d56Sopenharmony_ci def meth2(self, arg): pass 16747db96d56Sopenharmony_ci def meth3(self, a1, a2): pass 16757db96d56Sopenharmony_ci 16767db96d56Sopenharmony_ci # decorator: '@' namedexpr_test NEWLINE 16777db96d56Sopenharmony_ci # decorators: decorator+ 16787db96d56Sopenharmony_ci # decorated: decorators (classdef | funcdef) 16797db96d56Sopenharmony_ci def class_decorator(x): return x 16807db96d56Sopenharmony_ci @class_decorator 16817db96d56Sopenharmony_ci class G: pass 16827db96d56Sopenharmony_ci 16837db96d56Sopenharmony_ci # Test expressions as decorators (PEP 614): 16847db96d56Sopenharmony_ci @False or class_decorator 16857db96d56Sopenharmony_ci class H: pass 16867db96d56Sopenharmony_ci @d := class_decorator 16877db96d56Sopenharmony_ci class I: pass 16887db96d56Sopenharmony_ci @lambda c: class_decorator(c) 16897db96d56Sopenharmony_ci class J: pass 16907db96d56Sopenharmony_ci @[..., class_decorator, ...][1] 16917db96d56Sopenharmony_ci class K: pass 16927db96d56Sopenharmony_ci @class_decorator(class_decorator)(class_decorator) 16937db96d56Sopenharmony_ci class L: pass 16947db96d56Sopenharmony_ci @[class_decorator][0].__call__.__call__ 16957db96d56Sopenharmony_ci class M: pass 16967db96d56Sopenharmony_ci 16977db96d56Sopenharmony_ci def test_dictcomps(self): 16987db96d56Sopenharmony_ci # dictorsetmaker: ( (test ':' test (comp_for | 16997db96d56Sopenharmony_ci # (',' test ':' test)* [','])) | 17007db96d56Sopenharmony_ci # (test (comp_for | (',' test)* [','])) ) 17017db96d56Sopenharmony_ci nums = [1, 2, 3] 17027db96d56Sopenharmony_ci self.assertEqual({i:i+1 for i in nums}, {1: 2, 2: 3, 3: 4}) 17037db96d56Sopenharmony_ci 17047db96d56Sopenharmony_ci def test_listcomps(self): 17057db96d56Sopenharmony_ci # list comprehension tests 17067db96d56Sopenharmony_ci nums = [1, 2, 3, 4, 5] 17077db96d56Sopenharmony_ci strs = ["Apple", "Banana", "Coconut"] 17087db96d56Sopenharmony_ci spcs = [" Apple", " Banana ", "Coco nut "] 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci self.assertEqual([s.strip() for s in spcs], ['Apple', 'Banana', 'Coco nut']) 17117db96d56Sopenharmony_ci self.assertEqual([3 * x for x in nums], [3, 6, 9, 12, 15]) 17127db96d56Sopenharmony_ci self.assertEqual([x for x in nums if x > 2], [3, 4, 5]) 17137db96d56Sopenharmony_ci self.assertEqual([(i, s) for i in nums for s in strs], 17147db96d56Sopenharmony_ci [(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'), 17157db96d56Sopenharmony_ci (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'), 17167db96d56Sopenharmony_ci (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'), 17177db96d56Sopenharmony_ci (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'), 17187db96d56Sopenharmony_ci (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')]) 17197db96d56Sopenharmony_ci self.assertEqual([(i, s) for i in nums for s in [f for f in strs if "n" in f]], 17207db96d56Sopenharmony_ci [(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'), 17217db96d56Sopenharmony_ci (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'), 17227db96d56Sopenharmony_ci (5, 'Banana'), (5, 'Coconut')]) 17237db96d56Sopenharmony_ci self.assertEqual([(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)], 17247db96d56Sopenharmony_ci [[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]]) 17257db96d56Sopenharmony_ci 17267db96d56Sopenharmony_ci def test_in_func(l): 17277db96d56Sopenharmony_ci return [0 < x < 3 for x in l if x > 2] 17287db96d56Sopenharmony_ci 17297db96d56Sopenharmony_ci self.assertEqual(test_in_func(nums), [False, False, False]) 17307db96d56Sopenharmony_ci 17317db96d56Sopenharmony_ci def test_nested_front(): 17327db96d56Sopenharmony_ci self.assertEqual([[y for y in [x, x + 1]] for x in [1,3,5]], 17337db96d56Sopenharmony_ci [[1, 2], [3, 4], [5, 6]]) 17347db96d56Sopenharmony_ci 17357db96d56Sopenharmony_ci test_nested_front() 17367db96d56Sopenharmony_ci 17377db96d56Sopenharmony_ci check_syntax_error(self, "[i, s for i in nums for s in strs]") 17387db96d56Sopenharmony_ci check_syntax_error(self, "[x if y]") 17397db96d56Sopenharmony_ci 17407db96d56Sopenharmony_ci suppliers = [ 17417db96d56Sopenharmony_ci (1, "Boeing"), 17427db96d56Sopenharmony_ci (2, "Ford"), 17437db96d56Sopenharmony_ci (3, "Macdonalds") 17447db96d56Sopenharmony_ci ] 17457db96d56Sopenharmony_ci 17467db96d56Sopenharmony_ci parts = [ 17477db96d56Sopenharmony_ci (10, "Airliner"), 17487db96d56Sopenharmony_ci (20, "Engine"), 17497db96d56Sopenharmony_ci (30, "Cheeseburger") 17507db96d56Sopenharmony_ci ] 17517db96d56Sopenharmony_ci 17527db96d56Sopenharmony_ci suppart = [ 17537db96d56Sopenharmony_ci (1, 10), (1, 20), (2, 20), (3, 30) 17547db96d56Sopenharmony_ci ] 17557db96d56Sopenharmony_ci 17567db96d56Sopenharmony_ci x = [ 17577db96d56Sopenharmony_ci (sname, pname) 17587db96d56Sopenharmony_ci for (sno, sname) in suppliers 17597db96d56Sopenharmony_ci for (pno, pname) in parts 17607db96d56Sopenharmony_ci for (sp_sno, sp_pno) in suppart 17617db96d56Sopenharmony_ci if sno == sp_sno and pno == sp_pno 17627db96d56Sopenharmony_ci ] 17637db96d56Sopenharmony_ci 17647db96d56Sopenharmony_ci self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'), 17657db96d56Sopenharmony_ci ('Macdonalds', 'Cheeseburger')]) 17667db96d56Sopenharmony_ci 17677db96d56Sopenharmony_ci def test_genexps(self): 17687db96d56Sopenharmony_ci # generator expression tests 17697db96d56Sopenharmony_ci g = ([x for x in range(10)] for x in range(1)) 17707db96d56Sopenharmony_ci self.assertEqual(next(g), [x for x in range(10)]) 17717db96d56Sopenharmony_ci try: 17727db96d56Sopenharmony_ci next(g) 17737db96d56Sopenharmony_ci self.fail('should produce StopIteration exception') 17747db96d56Sopenharmony_ci except StopIteration: 17757db96d56Sopenharmony_ci pass 17767db96d56Sopenharmony_ci 17777db96d56Sopenharmony_ci a = 1 17787db96d56Sopenharmony_ci try: 17797db96d56Sopenharmony_ci g = (a for d in a) 17807db96d56Sopenharmony_ci next(g) 17817db96d56Sopenharmony_ci self.fail('should produce TypeError') 17827db96d56Sopenharmony_ci except TypeError: 17837db96d56Sopenharmony_ci pass 17847db96d56Sopenharmony_ci 17857db96d56Sopenharmony_ci self.assertEqual(list((x, y) for x in 'abcd' for y in 'abcd'), [(x, y) for x in 'abcd' for y in 'abcd']) 17867db96d56Sopenharmony_ci self.assertEqual(list((x, y) for x in 'ab' for y in 'xy'), [(x, y) for x in 'ab' for y in 'xy']) 17877db96d56Sopenharmony_ci 17887db96d56Sopenharmony_ci a = [x for x in range(10)] 17897db96d56Sopenharmony_ci b = (x for x in (y for y in a)) 17907db96d56Sopenharmony_ci self.assertEqual(sum(b), sum([x for x in range(10)])) 17917db96d56Sopenharmony_ci 17927db96d56Sopenharmony_ci self.assertEqual(sum(x**2 for x in range(10)), sum([x**2 for x in range(10)])) 17937db96d56Sopenharmony_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])) 17947db96d56Sopenharmony_ci self.assertEqual(sum(x for x in (y for y in range(10))), sum([x for x in range(10)])) 17957db96d56Sopenharmony_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)])) 17967db96d56Sopenharmony_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)])) 17977db96d56Sopenharmony_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)])) 17987db96d56Sopenharmony_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) 17997db96d56Sopenharmony_ci check_syntax_error(self, "foo(x for x in range(10), 100)") 18007db96d56Sopenharmony_ci check_syntax_error(self, "foo(100, x for x in range(10))") 18017db96d56Sopenharmony_ci 18027db96d56Sopenharmony_ci def test_comprehension_specials(self): 18037db96d56Sopenharmony_ci # test for outmost iterable precomputation 18047db96d56Sopenharmony_ci x = 10; g = (i for i in range(x)); x = 5 18057db96d56Sopenharmony_ci self.assertEqual(len(list(g)), 10) 18067db96d56Sopenharmony_ci 18077db96d56Sopenharmony_ci # This should hold, since we're only precomputing outmost iterable. 18087db96d56Sopenharmony_ci x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x)) 18097db96d56Sopenharmony_ci x = 5; t = True; 18107db96d56Sopenharmony_ci self.assertEqual([(i,j) for i in range(10) for j in range(5)], list(g)) 18117db96d56Sopenharmony_ci 18127db96d56Sopenharmony_ci # Grammar allows multiple adjacent 'if's in listcomps and genexps, 18137db96d56Sopenharmony_ci # even though it's silly. Make sure it works (ifelse broke this.) 18147db96d56Sopenharmony_ci self.assertEqual([ x for x in range(10) if x % 2 if x % 3 ], [1, 5, 7]) 18157db96d56Sopenharmony_ci self.assertEqual(list(x for x in range(10) if x % 2 if x % 3), [1, 5, 7]) 18167db96d56Sopenharmony_ci 18177db96d56Sopenharmony_ci # verify unpacking single element tuples in listcomp/genexp. 18187db96d56Sopenharmony_ci self.assertEqual([x for x, in [(4,), (5,), (6,)]], [4, 5, 6]) 18197db96d56Sopenharmony_ci self.assertEqual(list(x for x, in [(7,), (8,), (9,)]), [7, 8, 9]) 18207db96d56Sopenharmony_ci 18217db96d56Sopenharmony_ci def test_with_statement(self): 18227db96d56Sopenharmony_ci class manager(object): 18237db96d56Sopenharmony_ci def __enter__(self): 18247db96d56Sopenharmony_ci return (1, 2) 18257db96d56Sopenharmony_ci def __exit__(self, *args): 18267db96d56Sopenharmony_ci pass 18277db96d56Sopenharmony_ci 18287db96d56Sopenharmony_ci with manager(): 18297db96d56Sopenharmony_ci pass 18307db96d56Sopenharmony_ci with manager() as x: 18317db96d56Sopenharmony_ci pass 18327db96d56Sopenharmony_ci with manager() as (x, y): 18337db96d56Sopenharmony_ci pass 18347db96d56Sopenharmony_ci with manager(), manager(): 18357db96d56Sopenharmony_ci pass 18367db96d56Sopenharmony_ci with manager() as x, manager() as y: 18377db96d56Sopenharmony_ci pass 18387db96d56Sopenharmony_ci with manager() as x, manager(): 18397db96d56Sopenharmony_ci pass 18407db96d56Sopenharmony_ci 18417db96d56Sopenharmony_ci with ( 18427db96d56Sopenharmony_ci manager() 18437db96d56Sopenharmony_ci ): 18447db96d56Sopenharmony_ci pass 18457db96d56Sopenharmony_ci 18467db96d56Sopenharmony_ci with ( 18477db96d56Sopenharmony_ci manager() as x 18487db96d56Sopenharmony_ci ): 18497db96d56Sopenharmony_ci pass 18507db96d56Sopenharmony_ci 18517db96d56Sopenharmony_ci with ( 18527db96d56Sopenharmony_ci manager() as (x, y), 18537db96d56Sopenharmony_ci manager() as z, 18547db96d56Sopenharmony_ci ): 18557db96d56Sopenharmony_ci pass 18567db96d56Sopenharmony_ci 18577db96d56Sopenharmony_ci with ( 18587db96d56Sopenharmony_ci manager(), 18597db96d56Sopenharmony_ci manager() 18607db96d56Sopenharmony_ci ): 18617db96d56Sopenharmony_ci pass 18627db96d56Sopenharmony_ci 18637db96d56Sopenharmony_ci with ( 18647db96d56Sopenharmony_ci manager() as x, 18657db96d56Sopenharmony_ci manager() as y 18667db96d56Sopenharmony_ci ): 18677db96d56Sopenharmony_ci pass 18687db96d56Sopenharmony_ci 18697db96d56Sopenharmony_ci with ( 18707db96d56Sopenharmony_ci manager() as x, 18717db96d56Sopenharmony_ci manager() 18727db96d56Sopenharmony_ci ): 18737db96d56Sopenharmony_ci pass 18747db96d56Sopenharmony_ci 18757db96d56Sopenharmony_ci with ( 18767db96d56Sopenharmony_ci manager() as x, 18777db96d56Sopenharmony_ci manager() as y, 18787db96d56Sopenharmony_ci manager() as z, 18797db96d56Sopenharmony_ci ): 18807db96d56Sopenharmony_ci pass 18817db96d56Sopenharmony_ci 18827db96d56Sopenharmony_ci with ( 18837db96d56Sopenharmony_ci manager() as x, 18847db96d56Sopenharmony_ci manager() as y, 18857db96d56Sopenharmony_ci manager(), 18867db96d56Sopenharmony_ci ): 18877db96d56Sopenharmony_ci pass 18887db96d56Sopenharmony_ci 18897db96d56Sopenharmony_ci def test_if_else_expr(self): 18907db96d56Sopenharmony_ci # Test ifelse expressions in various cases 18917db96d56Sopenharmony_ci def _checkeval(msg, ret): 18927db96d56Sopenharmony_ci "helper to check that evaluation of expressions is done correctly" 18937db96d56Sopenharmony_ci print(msg) 18947db96d56Sopenharmony_ci return ret 18957db96d56Sopenharmony_ci 18967db96d56Sopenharmony_ci # the next line is not allowed anymore 18977db96d56Sopenharmony_ci #self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True]) 18987db96d56Sopenharmony_ci self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True]) 18997db96d56Sopenharmony_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]) 19007db96d56Sopenharmony_ci self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5) 19017db96d56Sopenharmony_ci self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5) 19027db96d56Sopenharmony_ci self.assertEqual((5 and 6 if 0 else 1), 1) 19037db96d56Sopenharmony_ci self.assertEqual(((5 and 6) if 0 else 1), 1) 19047db96d56Sopenharmony_ci self.assertEqual((5 and (6 if 1 else 1)), 6) 19057db96d56Sopenharmony_ci self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3) 19067db96d56Sopenharmony_ci self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1) 19077db96d56Sopenharmony_ci self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5) 19087db96d56Sopenharmony_ci self.assertEqual((not 5 if 1 else 1), False) 19097db96d56Sopenharmony_ci self.assertEqual((not 5 if 0 else 1), 1) 19107db96d56Sopenharmony_ci self.assertEqual((6 + 1 if 1 else 2), 7) 19117db96d56Sopenharmony_ci self.assertEqual((6 - 1 if 1 else 2), 5) 19127db96d56Sopenharmony_ci self.assertEqual((6 * 2 if 1 else 4), 12) 19137db96d56Sopenharmony_ci self.assertEqual((6 / 2 if 1 else 3), 3) 19147db96d56Sopenharmony_ci self.assertEqual((6 < 4 if 0 else 2), 2) 19157db96d56Sopenharmony_ci 19167db96d56Sopenharmony_ci def test_paren_evaluation(self): 19177db96d56Sopenharmony_ci self.assertEqual(16 // (4 // 2), 8) 19187db96d56Sopenharmony_ci self.assertEqual((16 // 4) // 2, 2) 19197db96d56Sopenharmony_ci self.assertEqual(16 // 4 // 2, 2) 19207db96d56Sopenharmony_ci x = 2 19217db96d56Sopenharmony_ci y = 3 19227db96d56Sopenharmony_ci self.assertTrue(False is (x is y)) 19237db96d56Sopenharmony_ci self.assertFalse((False is x) is y) 19247db96d56Sopenharmony_ci self.assertFalse(False is x is y) 19257db96d56Sopenharmony_ci 19267db96d56Sopenharmony_ci def test_matrix_mul(self): 19277db96d56Sopenharmony_ci # This is not intended to be a comprehensive test, rather just to be few 19287db96d56Sopenharmony_ci # samples of the @ operator in test_grammar.py. 19297db96d56Sopenharmony_ci class M: 19307db96d56Sopenharmony_ci def __matmul__(self, o): 19317db96d56Sopenharmony_ci return 4 19327db96d56Sopenharmony_ci def __imatmul__(self, o): 19337db96d56Sopenharmony_ci self.other = o 19347db96d56Sopenharmony_ci return self 19357db96d56Sopenharmony_ci m = M() 19367db96d56Sopenharmony_ci self.assertEqual(m @ m, 4) 19377db96d56Sopenharmony_ci m @= 42 19387db96d56Sopenharmony_ci self.assertEqual(m.other, 42) 19397db96d56Sopenharmony_ci 19407db96d56Sopenharmony_ci def test_async_await(self): 19417db96d56Sopenharmony_ci async def test(): 19427db96d56Sopenharmony_ci def sum(): 19437db96d56Sopenharmony_ci pass 19447db96d56Sopenharmony_ci if 1: 19457db96d56Sopenharmony_ci await someobj() 19467db96d56Sopenharmony_ci 19477db96d56Sopenharmony_ci self.assertEqual(test.__name__, 'test') 19487db96d56Sopenharmony_ci self.assertTrue(bool(test.__code__.co_flags & inspect.CO_COROUTINE)) 19497db96d56Sopenharmony_ci 19507db96d56Sopenharmony_ci def decorator(func): 19517db96d56Sopenharmony_ci setattr(func, '_marked', True) 19527db96d56Sopenharmony_ci return func 19537db96d56Sopenharmony_ci 19547db96d56Sopenharmony_ci @decorator 19557db96d56Sopenharmony_ci async def test2(): 19567db96d56Sopenharmony_ci return 22 19577db96d56Sopenharmony_ci self.assertTrue(test2._marked) 19587db96d56Sopenharmony_ci self.assertEqual(test2.__name__, 'test2') 19597db96d56Sopenharmony_ci self.assertTrue(bool(test2.__code__.co_flags & inspect.CO_COROUTINE)) 19607db96d56Sopenharmony_ci 19617db96d56Sopenharmony_ci def test_async_for(self): 19627db96d56Sopenharmony_ci class Done(Exception): pass 19637db96d56Sopenharmony_ci 19647db96d56Sopenharmony_ci class AIter: 19657db96d56Sopenharmony_ci def __aiter__(self): 19667db96d56Sopenharmony_ci return self 19677db96d56Sopenharmony_ci async def __anext__(self): 19687db96d56Sopenharmony_ci raise StopAsyncIteration 19697db96d56Sopenharmony_ci 19707db96d56Sopenharmony_ci async def foo(): 19717db96d56Sopenharmony_ci async for i in AIter(): 19727db96d56Sopenharmony_ci pass 19737db96d56Sopenharmony_ci async for i, j in AIter(): 19747db96d56Sopenharmony_ci pass 19757db96d56Sopenharmony_ci async for i in AIter(): 19767db96d56Sopenharmony_ci pass 19777db96d56Sopenharmony_ci else: 19787db96d56Sopenharmony_ci pass 19797db96d56Sopenharmony_ci raise Done 19807db96d56Sopenharmony_ci 19817db96d56Sopenharmony_ci with self.assertRaises(Done): 19827db96d56Sopenharmony_ci foo().send(None) 19837db96d56Sopenharmony_ci 19847db96d56Sopenharmony_ci def test_async_with(self): 19857db96d56Sopenharmony_ci class Done(Exception): pass 19867db96d56Sopenharmony_ci 19877db96d56Sopenharmony_ci class manager: 19887db96d56Sopenharmony_ci async def __aenter__(self): 19897db96d56Sopenharmony_ci return (1, 2) 19907db96d56Sopenharmony_ci async def __aexit__(self, *exc): 19917db96d56Sopenharmony_ci return False 19927db96d56Sopenharmony_ci 19937db96d56Sopenharmony_ci async def foo(): 19947db96d56Sopenharmony_ci async with manager(): 19957db96d56Sopenharmony_ci pass 19967db96d56Sopenharmony_ci async with manager() as x: 19977db96d56Sopenharmony_ci pass 19987db96d56Sopenharmony_ci async with manager() as (x, y): 19997db96d56Sopenharmony_ci pass 20007db96d56Sopenharmony_ci async with manager(), manager(): 20017db96d56Sopenharmony_ci pass 20027db96d56Sopenharmony_ci async with manager() as x, manager() as y: 20037db96d56Sopenharmony_ci pass 20047db96d56Sopenharmony_ci async with manager() as x, manager(): 20057db96d56Sopenharmony_ci pass 20067db96d56Sopenharmony_ci raise Done 20077db96d56Sopenharmony_ci 20087db96d56Sopenharmony_ci with self.assertRaises(Done): 20097db96d56Sopenharmony_ci foo().send(None) 20107db96d56Sopenharmony_ci 20117db96d56Sopenharmony_ci 20127db96d56Sopenharmony_ciif __name__ == '__main__': 20137db96d56Sopenharmony_ci unittest.main() 2014