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