153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia# -*- coding: koi8-r -*- 22409c87361b78ec733e2481c52198bea245fe1daWei Jia 353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaimport unittest 453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiafrom test.support import TESTFN, unlink, unload, rmtree, script_helper, captured_stdout 553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaimport importlib 653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaimport os 753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaimport sys 853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaimport subprocess 953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaimport tempfile 1053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass MiscSourceEncodingTest(unittest.TestCase): 1253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 1353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_pep263(self): 1453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual( 1553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia "�����".encode("utf-8"), 1653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd' 1753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia ) 182409c87361b78ec733e2481c52198bea245fe1daWei Jia self.assertEqual( 1953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia "\�".encode("utf-8"), 2053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'\\\xd0\x9f' 212409c87361b78ec733e2481c52198bea245fe1daWei Jia ) 2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_compilestring(self): 2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # see #1882 2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia c = compile(b"\n# coding: utf-8\nu = '\xc3\xb3'\n", "dummy", "exec") 2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia d = {} 2753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia exec(c, d) 2853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(d['u'], '\xf3') 2953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_issue2301(self): 3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia try: 3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b"# coding: cp932\nprint '\x94\x4e'", "dummy", "exec") 3353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia except SyntaxError as v: 3453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(v.text, "print '\u5e74'\n") 3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia else: 3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.fail() 3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_issue4626(self): 3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia c = compile("# coding=latin-1\n\u00c6 = '\u00c6'", "dummy", "exec") 4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia d = {} 412409c87361b78ec733e2481c52198bea245fe1daWei Jia exec(c, d) 4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(d['\xc6'], '\xc6') 4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 4453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_issue3297(self): 4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia c = compile("a, b = '\U0001010F', '\\U0001010F'", "dummy", "exec") 4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia d = {} 4753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia exec(c, d) 4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(d['a'], d['b']) 4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(len(d['a']), len(d['b'])) 5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(ascii(d['a']), ascii(d['b'])) 5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_issue7820(self): 5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # Ensure that check_bom() restores all bytes in the right order if 5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # check_bom() fails in pydebug mode: a buffer starts with the first 5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # byte of a valid BOM, but next bytes are different 5653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # one byte in common with the UTF-16-LE BOM 5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertRaises(SyntaxError, eval, b'\xff\x20') 5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # two bytes in common with the UTF-8 BOM 6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertRaises(SyntaxError, eval, b'\xef\xbb\x20') 6253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_20731(self): 6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sub = subprocess.Popen([sys.executable, 6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia os.path.join(os.path.dirname(__file__), 6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 'coding20731.py')], 6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia stderr=subprocess.PIPE) 6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia err = sub.communicate()[1] 6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(sub.returncode, 0) 7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertNotIn(b'SyntaxError', err) 7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_error_message(self): 7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'# -*- coding: iso-8859-15 -*-\n', 'dummy', 'exec') 7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'\xef\xbb\xbf\n', 'dummy', 'exec') 7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'\xef\xbb\xbf# -*- coding: utf-8 -*-\n', 'dummy', 'exec') 7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with self.assertRaisesRegex(SyntaxError, 'fake'): 7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'# -*- coding: fake -*-\n', 'dummy', 'exec') 7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with self.assertRaisesRegex(SyntaxError, 'iso-8859-15'): 792409c87361b78ec733e2481c52198bea245fe1daWei Jia compile(b'\xef\xbb\xbf# -*- coding: iso-8859-15 -*-\n', 8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 'dummy', 'exec') 8153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with self.assertRaisesRegex(SyntaxError, 'BOM'): 8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'\xef\xbb\xbf# -*- coding: iso-8859-15 -*-\n', 8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 'dummy', 'exec') 8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with self.assertRaisesRegex(SyntaxError, 'fake'): 8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'\xef\xbb\xbf# -*- coding: fake -*-\n', 'dummy', 'exec') 862409c87361b78ec733e2481c52198bea245fe1daWei Jia with self.assertRaisesRegex(SyntaxError, 'BOM'): 8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(b'\xef\xbb\xbf# -*- coding: fake -*-\n', 'dummy', 'exec') 8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 8953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_bad_coding(self): 9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia module_name = 'bad_coding' 9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.verify_bad_module(module_name) 9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 932409c87361b78ec733e2481c52198bea245fe1daWei Jia def test_bad_coding2(self): 9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia module_name = 'bad_coding2' 9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.verify_bad_module(module_name) 9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def verify_bad_module(self, module_name): 9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertRaises(SyntaxError, __import__, 'test.' + module_name) 992409c87361b78ec733e2481c52198bea245fe1daWei Jia 10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia path = os.path.dirname(__file__) 10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia filename = os.path.join(path, module_name + '.py') 10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with open(filename, "rb") as fp: 10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia bytes = fp.read() 10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertRaises(SyntaxError, compile, bytes, filename, 'exec') 10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_exec_valid_coding(self): 10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia d = {} 10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia exec(b'# coding: cp949\na = "\xaa\xa7"\n', d) 10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(d['a'], '\u3047') 11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 11153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_file_parse(self): 11253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # issue1134: all encodings outside latin-1 and utf-8 fail on 11353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # multiline strings and long lines (>512 columns) 11453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia unload(TESTFN) 11553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia filename = TESTFN + ".py" 11653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia f = open(filename, "w", encoding="cp1252") 11753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia sys.path.insert(0, os.curdir) 11853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia try: 11953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with f: 12053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia f.write("# -*- coding: cp1252 -*-\n") 12153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia f.write("'''A short string\n") 12253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia f.write("'''\n") 12353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia f.write("'A very long string %s'\n" % ("X" * 1000)) 12453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 12553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia importlib.invalidate_caches() 12653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia __import__(TESTFN) 12753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia finally: 12853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia del sys.path[0] 129003fdb5b76ccc537d4ab7ef19c8a2e3be19b594cWei Jia unlink(filename) 13053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia unlink(filename + "c") 13153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia unlink(filename + "o") 13253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia unload(TESTFN) 13353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia rmtree('__pycache__') 13453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 13553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_error_from_string(self): 13653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # See http://bugs.python.org/issue6289 13753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia input = "# coding: ascii\n\N{SNOWMAN}".encode('utf-8') 1382409c87361b78ec733e2481c52198bea245fe1daWei Jia with self.assertRaises(SyntaxError) as c: 13953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia compile(input, "<string>", "exec") 14053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia expected = "'ascii' codec can't decode byte 0xe2 in position 16: " \ 1412409c87361b78ec733e2481c52198bea245fe1daWei Jia "ordinal not in range(128)" 14253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertTrue(c.exception.args[0].startswith(expected), 14353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia msg=c.exception.args[0]) 14453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass AbstractSourceEncodingTest: 14753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 14853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_default_coding(self): 14953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'print(ascii("\xc3\xa4"))\n') 15053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xe4'") 1512409c87361b78ec733e2481c52198bea245fe1daWei Jia 15253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_first_coding_line(self): 15353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'#coding:iso8859-15\n' 15453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 15553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xc3\u20ac'") 1562409c87361b78ec733e2481c52198bea245fe1daWei Jia 15753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_second_coding_line(self): 15853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'#\n' 15953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'#coding:iso8859-15\n' 16053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 16153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xc3\u20ac'") 16253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 16353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_third_coding_line(self): 16453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # Only first two lines are tested for a magic comment. 16553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'#\n' 1662409c87361b78ec733e2481c52198bea245fe1daWei Jia b'#\n' 16753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'#coding:iso8859-15\n' 16853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 16953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xe4'") 17053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 17153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_double_coding_line(self): 17253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia # If the first line matches the second line is ignored. 17353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'#coding:iso8859-15\n' 17453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'#coding:latin1\n' 17553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 17653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xc3\u20ac'") 17753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 17853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_double_coding_same_line(self): 17953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'#coding:iso8859-15 coding:latin1\n' 18053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 18153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xc3\u20ac'") 18253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 18353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_first_non_utf8_coding_line(self): 18453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'#coding:iso-8859-15 \xa4\n' 18553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 18653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xc3\u20ac'") 18753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 18853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_second_non_utf8_coding_line(self): 18953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'\n' 19053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'#coding:iso-8859-15 \xa4\n' 19153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 19253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xc3\u20ac'") 19353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 19453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_utf8_bom(self): 19553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'\xef\xbb\xbfprint(ascii("\xc3\xa4"))\n') 19653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xe4'") 19753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 19853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def test_utf8_bom_and_utf8_coding_line(self): 19953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia src = (b'\xef\xbb\xbf#coding:utf-8\n' 20053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia b'print(ascii("\xc3\xa4"))\n') 20153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.check_script_output(src, br"'\xe4'") 2022409c87361b78ec733e2481c52198bea245fe1daWei Jia 20353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 20453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass BytesSourceEncodingTest(AbstractSourceEncodingTest, unittest.TestCase): 20553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 20653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def check_script_output(self, src, expected): 20753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with captured_stdout() as stdout: 20853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia exec(src) 20953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia out = stdout.getvalue().encode('latin1') 21053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(out.rstrip(), expected) 21153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 21253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 21353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaclass FileSourceEncodingTest(AbstractSourceEncodingTest, unittest.TestCase): 21453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 21553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia def check_script_output(self, src, expected): 21653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with tempfile.TemporaryDirectory() as tmpd: 21753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia fn = os.path.join(tmpd, 'test.py') 21853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia with open(fn, 'wb') as fp: 21953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia fp.write(src) 22053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia res = script_helper.assert_python_ok(fn) 22153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia self.assertEqual(res.out.rstrip(), expected) 22253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 22353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia 22453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiaif __name__ == "__main__": 22553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia unittest.main() 22653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia