17db96d56Sopenharmony_ci""" 27db96d56Sopenharmony_ci Test cases for codeop.py 37db96d56Sopenharmony_ci Nick Mathewson 47db96d56Sopenharmony_ci""" 57db96d56Sopenharmony_ciimport sys 67db96d56Sopenharmony_ciimport unittest 77db96d56Sopenharmony_ciimport warnings 87db96d56Sopenharmony_cifrom test import support 97db96d56Sopenharmony_cifrom test.support import warnings_helper 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cifrom codeop import compile_command, PyCF_DONT_IMPLY_DEDENT 127db96d56Sopenharmony_ciimport io 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciif support.is_jython: 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci def unify_callables(d): 177db96d56Sopenharmony_ci for n,v in d.items(): 187db96d56Sopenharmony_ci if hasattr(v, '__call__'): 197db96d56Sopenharmony_ci d[n] = True 207db96d56Sopenharmony_ci return d 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciclass CodeopTests(unittest.TestCase): 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci def assertValid(self, str, symbol='single'): 257db96d56Sopenharmony_ci '''succeed iff str is a valid piece of code''' 267db96d56Sopenharmony_ci if support.is_jython: 277db96d56Sopenharmony_ci code = compile_command(str, "<input>", symbol) 287db96d56Sopenharmony_ci self.assertTrue(code) 297db96d56Sopenharmony_ci if symbol == "single": 307db96d56Sopenharmony_ci d,r = {},{} 317db96d56Sopenharmony_ci saved_stdout = sys.stdout 327db96d56Sopenharmony_ci sys.stdout = io.StringIO() 337db96d56Sopenharmony_ci try: 347db96d56Sopenharmony_ci exec(code, d) 357db96d56Sopenharmony_ci exec(compile(str,"<input>","single"), r) 367db96d56Sopenharmony_ci finally: 377db96d56Sopenharmony_ci sys.stdout = saved_stdout 387db96d56Sopenharmony_ci elif symbol == 'eval': 397db96d56Sopenharmony_ci ctx = {'a': 2} 407db96d56Sopenharmony_ci d = { 'value': eval(code,ctx) } 417db96d56Sopenharmony_ci r = { 'value': eval(str,ctx) } 427db96d56Sopenharmony_ci self.assertEqual(unify_callables(r),unify_callables(d)) 437db96d56Sopenharmony_ci else: 447db96d56Sopenharmony_ci expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT) 457db96d56Sopenharmony_ci self.assertEqual(compile_command(str, "<input>", symbol), expected) 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci def assertIncomplete(self, str, symbol='single'): 487db96d56Sopenharmony_ci '''succeed iff str is the start of a valid piece of code''' 497db96d56Sopenharmony_ci self.assertEqual(compile_command(str, symbol=symbol), None) 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci def assertInvalid(self, str, symbol='single', is_syntax=1): 527db96d56Sopenharmony_ci '''succeed iff str is the start of an invalid piece of code''' 537db96d56Sopenharmony_ci try: 547db96d56Sopenharmony_ci compile_command(str,symbol=symbol) 557db96d56Sopenharmony_ci self.fail("No exception raised for invalid code") 567db96d56Sopenharmony_ci except SyntaxError: 577db96d56Sopenharmony_ci self.assertTrue(is_syntax) 587db96d56Sopenharmony_ci except OverflowError: 597db96d56Sopenharmony_ci self.assertTrue(not is_syntax) 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci def test_valid(self): 627db96d56Sopenharmony_ci av = self.assertValid 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci # special case 657db96d56Sopenharmony_ci if not support.is_jython: 667db96d56Sopenharmony_ci self.assertEqual(compile_command(""), 677db96d56Sopenharmony_ci compile("pass", "<input>", 'single', 687db96d56Sopenharmony_ci PyCF_DONT_IMPLY_DEDENT)) 697db96d56Sopenharmony_ci self.assertEqual(compile_command("\n"), 707db96d56Sopenharmony_ci compile("pass", "<input>", 'single', 717db96d56Sopenharmony_ci PyCF_DONT_IMPLY_DEDENT)) 727db96d56Sopenharmony_ci else: 737db96d56Sopenharmony_ci av("") 747db96d56Sopenharmony_ci av("\n") 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci av("a = 1") 777db96d56Sopenharmony_ci av("\na = 1") 787db96d56Sopenharmony_ci av("a = 1\n") 797db96d56Sopenharmony_ci av("a = 1\n\n") 807db96d56Sopenharmony_ci av("\n\na = 1\n\n") 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci av("def x():\n pass\n") 837db96d56Sopenharmony_ci av("if 1:\n pass\n") 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci av("\n\nif 1: pass\n") 867db96d56Sopenharmony_ci av("\n\nif 1: pass\n\n") 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci av("def x():\n\n pass\n") 897db96d56Sopenharmony_ci av("def x():\n pass\n \n") 907db96d56Sopenharmony_ci av("def x():\n pass\n \n") 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci av("pass\n") 937db96d56Sopenharmony_ci av("3**3\n") 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci av("if 9==3:\n pass\nelse:\n pass\n") 967db96d56Sopenharmony_ci av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n") 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci av("#a\n#b\na = 3\n") 997db96d56Sopenharmony_ci av("#a\n\n \na=3\n") 1007db96d56Sopenharmony_ci av("a=3\n\n") 1017db96d56Sopenharmony_ci av("a = 9+ \\\n3") 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci av("3**3","eval") 1047db96d56Sopenharmony_ci av("(lambda z: \n z**3)","eval") 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci av("9+ \\\n3","eval") 1077db96d56Sopenharmony_ci av("9+ \\\n3\n","eval") 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci av("\n\na**3","eval") 1107db96d56Sopenharmony_ci av("\n \na**3","eval") 1117db96d56Sopenharmony_ci av("#a\n#b\na**3","eval") 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci av("\n\na = 1\n\n") 1147db96d56Sopenharmony_ci av("\n\nif 1: a=1\n\n") 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n") 1177db96d56Sopenharmony_ci av("#a\n\n \na=3\n\n") 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci av("\n\na**3","eval") 1207db96d56Sopenharmony_ci av("\n \na**3","eval") 1217db96d56Sopenharmony_ci av("#a\n#b\na**3","eval") 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci av("def f():\n try: pass\n finally: [x for x in (1,2)]\n") 1247db96d56Sopenharmony_ci av("def f():\n pass\n#foo\n") 1257db96d56Sopenharmony_ci av("@a.b.c\ndef f():\n pass\n") 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci def test_incomplete(self): 1287db96d56Sopenharmony_ci ai = self.assertIncomplete 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci ai("(a **") 1317db96d56Sopenharmony_ci ai("(a,b,") 1327db96d56Sopenharmony_ci ai("(a,b,(") 1337db96d56Sopenharmony_ci ai("(a,b,(") 1347db96d56Sopenharmony_ci ai("a = (") 1357db96d56Sopenharmony_ci ai("a = {") 1367db96d56Sopenharmony_ci ai("b + {") 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci ai("print([1,\n2,") 1397db96d56Sopenharmony_ci ai("print({1:1,\n2:3,") 1407db96d56Sopenharmony_ci ai("print((1,\n2,") 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci ai("if 9==3:\n pass\nelse:") 1437db96d56Sopenharmony_ci ai("if 9==3:\n pass\nelse:\n") 1447db96d56Sopenharmony_ci ai("if 9==3:\n pass\nelse:\n pass") 1457db96d56Sopenharmony_ci ai("if 1:") 1467db96d56Sopenharmony_ci ai("if 1:\n") 1477db96d56Sopenharmony_ci ai("if 1:\n pass\n if 1:\n pass\n else:") 1487db96d56Sopenharmony_ci ai("if 1:\n pass\n if 1:\n pass\n else:\n") 1497db96d56Sopenharmony_ci ai("if 1:\n pass\n if 1:\n pass\n else:\n pass") 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci ai("def x():") 1527db96d56Sopenharmony_ci ai("def x():\n") 1537db96d56Sopenharmony_ci ai("def x():\n\n") 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci ai("def x():\n pass") 1567db96d56Sopenharmony_ci ai("def x():\n pass\n ") 1577db96d56Sopenharmony_ci ai("def x():\n pass\n ") 1587db96d56Sopenharmony_ci ai("\n\ndef x():\n pass") 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci ai("a = 9+ \\") 1617db96d56Sopenharmony_ci ai("a = 'a\\") 1627db96d56Sopenharmony_ci ai("a = '''xy") 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci ai("","eval") 1657db96d56Sopenharmony_ci ai("\n","eval") 1667db96d56Sopenharmony_ci ai("(","eval") 1677db96d56Sopenharmony_ci ai("(9+","eval") 1687db96d56Sopenharmony_ci ai("9+ \\","eval") 1697db96d56Sopenharmony_ci ai("lambda z: \\","eval") 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci ai("if True:\n if True:\n if True: \n") 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci ai("@a(") 1747db96d56Sopenharmony_ci ai("@a(b") 1757db96d56Sopenharmony_ci ai("@a(b,") 1767db96d56Sopenharmony_ci ai("@a(b,c") 1777db96d56Sopenharmony_ci ai("@a(b,c,") 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci ai("from a import (") 1807db96d56Sopenharmony_ci ai("from a import (b") 1817db96d56Sopenharmony_ci ai("from a import (b,") 1827db96d56Sopenharmony_ci ai("from a import (b,c") 1837db96d56Sopenharmony_ci ai("from a import (b,c,") 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci ai("[") 1867db96d56Sopenharmony_ci ai("[a") 1877db96d56Sopenharmony_ci ai("[a,") 1887db96d56Sopenharmony_ci ai("[a,b") 1897db96d56Sopenharmony_ci ai("[a,b,") 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci ai("{") 1927db96d56Sopenharmony_ci ai("{a") 1937db96d56Sopenharmony_ci ai("{a:") 1947db96d56Sopenharmony_ci ai("{a:b") 1957db96d56Sopenharmony_ci ai("{a:b,") 1967db96d56Sopenharmony_ci ai("{a:b,c") 1977db96d56Sopenharmony_ci ai("{a:b,c:") 1987db96d56Sopenharmony_ci ai("{a:b,c:d") 1997db96d56Sopenharmony_ci ai("{a:b,c:d,") 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ci ai("a(") 2027db96d56Sopenharmony_ci ai("a(b") 2037db96d56Sopenharmony_ci ai("a(b,") 2047db96d56Sopenharmony_ci ai("a(b,c") 2057db96d56Sopenharmony_ci ai("a(b,c,") 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci ai("a[") 2087db96d56Sopenharmony_ci ai("a[b") 2097db96d56Sopenharmony_ci ai("a[b,") 2107db96d56Sopenharmony_ci ai("a[b:") 2117db96d56Sopenharmony_ci ai("a[b:c") 2127db96d56Sopenharmony_ci ai("a[b:c:") 2137db96d56Sopenharmony_ci ai("a[b:c:d") 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci ai("def a(") 2167db96d56Sopenharmony_ci ai("def a(b") 2177db96d56Sopenharmony_ci ai("def a(b,") 2187db96d56Sopenharmony_ci ai("def a(b,c") 2197db96d56Sopenharmony_ci ai("def a(b,c,") 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ci ai("(") 2227db96d56Sopenharmony_ci ai("(a") 2237db96d56Sopenharmony_ci ai("(a,") 2247db96d56Sopenharmony_ci ai("(a,b") 2257db96d56Sopenharmony_ci ai("(a,b,") 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci ai("if a:\n pass\nelif b:") 2287db96d56Sopenharmony_ci ai("if a:\n pass\nelif b:\n pass\nelse:") 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci ai("while a:") 2317db96d56Sopenharmony_ci ai("while a:\n pass\nelse:") 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci ai("for a in b:") 2347db96d56Sopenharmony_ci ai("for a in b:\n pass\nelse:") 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci ai("try:") 2377db96d56Sopenharmony_ci ai("try:\n pass\nexcept:") 2387db96d56Sopenharmony_ci ai("try:\n pass\nfinally:") 2397db96d56Sopenharmony_ci ai("try:\n pass\nexcept:\n pass\nfinally:") 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci ai("with a:") 2427db96d56Sopenharmony_ci ai("with a as b:") 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci ai("class a:") 2457db96d56Sopenharmony_ci ai("class a(") 2467db96d56Sopenharmony_ci ai("class a(b") 2477db96d56Sopenharmony_ci ai("class a(b,") 2487db96d56Sopenharmony_ci ai("class a():") 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci ai("[x for") 2517db96d56Sopenharmony_ci ai("[x for x in") 2527db96d56Sopenharmony_ci ai("[x for x in (") 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci ai("(x for") 2557db96d56Sopenharmony_ci ai("(x for x in") 2567db96d56Sopenharmony_ci ai("(x for x in (") 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci def test_invalid(self): 2597db96d56Sopenharmony_ci ai = self.assertInvalid 2607db96d56Sopenharmony_ci ai("a b") 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci ai("a @") 2637db96d56Sopenharmony_ci ai("a b @") 2647db96d56Sopenharmony_ci ai("a ** @") 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci ai("a = ") 2677db96d56Sopenharmony_ci ai("a = 9 +") 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci ai("def x():\n\npass\n") 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci ai("\n\n if 1: pass\n\npass") 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci ai("a = 9+ \\\n") 2747db96d56Sopenharmony_ci ai("a = 'a\\ ") 2757db96d56Sopenharmony_ci ai("a = 'a\\\n") 2767db96d56Sopenharmony_ci 2777db96d56Sopenharmony_ci ai("a = 1","eval") 2787db96d56Sopenharmony_ci ai("]","eval") 2797db96d56Sopenharmony_ci ai("())","eval") 2807db96d56Sopenharmony_ci ai("[}","eval") 2817db96d56Sopenharmony_ci ai("9+","eval") 2827db96d56Sopenharmony_ci ai("lambda z:","eval") 2837db96d56Sopenharmony_ci ai("a b","eval") 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci ai("return 2.3") 2867db96d56Sopenharmony_ci ai("if (a == 1 and b = 2): pass") 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci ai("del 1") 2897db96d56Sopenharmony_ci ai("del (1,)") 2907db96d56Sopenharmony_ci ai("del [1]") 2917db96d56Sopenharmony_ci ai("del '1'") 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci ai("[i for i in range(10)] = (1, 2, 3)") 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci def test_invalid_exec(self): 2967db96d56Sopenharmony_ci ai = self.assertInvalid 2977db96d56Sopenharmony_ci ai("raise = 4", symbol="exec") 2987db96d56Sopenharmony_ci ai('def a-b', symbol='exec') 2997db96d56Sopenharmony_ci ai('await?', symbol='exec') 3007db96d56Sopenharmony_ci ai('=!=', symbol='exec') 3017db96d56Sopenharmony_ci ai('a await raise b', symbol='exec') 3027db96d56Sopenharmony_ci ai('a await raise b?+1', symbol='exec') 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci def test_filename(self): 3057db96d56Sopenharmony_ci self.assertEqual(compile_command("a = 1\n", "abc").co_filename, 3067db96d56Sopenharmony_ci compile("a = 1\n", "abc", 'single').co_filename) 3077db96d56Sopenharmony_ci self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename, 3087db96d56Sopenharmony_ci compile("a = 1\n", "def", 'single').co_filename) 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci def test_warning(self): 3117db96d56Sopenharmony_ci # Test that the warning is only returned once. 3127db96d56Sopenharmony_ci with warnings_helper.check_warnings( 3137db96d56Sopenharmony_ci (".*literal", SyntaxWarning), 3147db96d56Sopenharmony_ci (".*invalid", DeprecationWarning), 3157db96d56Sopenharmony_ci ) as w: 3167db96d56Sopenharmony_ci compile_command(r"'\e' is 0") 3177db96d56Sopenharmony_ci self.assertEqual(len(w.warnings), 2) 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci # bpo-41520: check SyntaxWarning treated as an SyntaxError 3207db96d56Sopenharmony_ci with warnings.catch_warnings(), self.assertRaises(SyntaxError): 3217db96d56Sopenharmony_ci warnings.simplefilter('error', SyntaxWarning) 3227db96d56Sopenharmony_ci compile_command('1 is 1', symbol='exec') 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci # Check DeprecationWarning treated as an SyntaxError 3257db96d56Sopenharmony_ci with warnings.catch_warnings(), self.assertRaises(SyntaxError): 3267db96d56Sopenharmony_ci warnings.simplefilter('error', DeprecationWarning) 3277db96d56Sopenharmony_ci compile_command(r"'\e'", symbol='exec') 3287db96d56Sopenharmony_ci 3297db96d56Sopenharmony_ci def test_incomplete_warning(self): 3307db96d56Sopenharmony_ci with warnings.catch_warnings(record=True) as w: 3317db96d56Sopenharmony_ci warnings.simplefilter('always') 3327db96d56Sopenharmony_ci self.assertIncomplete("'\\e' + (") 3337db96d56Sopenharmony_ci self.assertEqual(w, []) 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ci def test_invalid_warning(self): 3367db96d56Sopenharmony_ci with warnings.catch_warnings(record=True) as w: 3377db96d56Sopenharmony_ci warnings.simplefilter('always') 3387db96d56Sopenharmony_ci self.assertInvalid("'\\e' 1") 3397db96d56Sopenharmony_ci self.assertEqual(len(w), 1) 3407db96d56Sopenharmony_ci self.assertEqual(w[0].category, DeprecationWarning) 3417db96d56Sopenharmony_ci self.assertRegex(str(w[0].message), 'invalid escape sequence') 3427db96d56Sopenharmony_ci self.assertEqual(w[0].filename, '<input>') 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ciif __name__ == "__main__": 3467db96d56Sopenharmony_ci unittest.main() 347