17db96d56Sopenharmony_cir"""Test correct treatment of various string literals by the parser.
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciThere are four types of string literals:
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci    'abc'             -- normal str
67db96d56Sopenharmony_ci    r'abc'            -- raw str
77db96d56Sopenharmony_ci    b'xyz'            -- normal bytes
87db96d56Sopenharmony_ci    br'xyz' | rb'xyz' -- raw bytes
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciThe difference between normal and raw strings is of course that in a
117db96d56Sopenharmony_ciraw string, \ escapes (while still used to determine the end of the
127db96d56Sopenharmony_ciliteral) are not interpreted, so that r'\x00' contains four
137db96d56Sopenharmony_cicharacters: a backslash, an x, and two zeros; while '\x00' contains a
147db96d56Sopenharmony_cisingle character (code point zero).
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciThe tricky thing is what should happen when non-ASCII bytes are used
177db96d56Sopenharmony_ciinside literals.  For bytes literals, this is considered illegal.  But
187db96d56Sopenharmony_cifor str literals, those bytes are supposed to be decoded using the
197db96d56Sopenharmony_ciencoding declared for the file (UTF-8 by default).
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ciWe have to test this with various file encodings.  We also test it with
227db96d56Sopenharmony_ciexec()/eval(), which uses a different code path.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ciThis file is really about correct treatment of encodings and
257db96d56Sopenharmony_cibackslashes.  It doesn't concern itself with issues like single
267db96d56Sopenharmony_civs. double quotes or singly- vs. triply-quoted strings: that's dealt
277db96d56Sopenharmony_ciwith elsewhere (I assume).
287db96d56Sopenharmony_ci"""
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ciimport os
317db96d56Sopenharmony_ciimport sys
327db96d56Sopenharmony_ciimport shutil
337db96d56Sopenharmony_ciimport tempfile
347db96d56Sopenharmony_ciimport unittest
357db96d56Sopenharmony_ciimport warnings
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciTEMPLATE = r"""# coding: %s
397db96d56Sopenharmony_cia = 'x'
407db96d56Sopenharmony_ciassert ord(a) == 120
417db96d56Sopenharmony_cib = '\x01'
427db96d56Sopenharmony_ciassert ord(b) == 1
437db96d56Sopenharmony_cic = r'\x01'
447db96d56Sopenharmony_ciassert list(map(ord, c)) == [92, 120, 48, 49]
457db96d56Sopenharmony_cid = '\x81'
467db96d56Sopenharmony_ciassert ord(d) == 0x81
477db96d56Sopenharmony_cie = r'\x81'
487db96d56Sopenharmony_ciassert list(map(ord, e)) == [92, 120, 56, 49]
497db96d56Sopenharmony_cif = '\u1881'
507db96d56Sopenharmony_ciassert ord(f) == 0x1881
517db96d56Sopenharmony_cig = r'\u1881'
527db96d56Sopenharmony_ciassert list(map(ord, g)) == [92, 117, 49, 56, 56, 49]
537db96d56Sopenharmony_cih = '\U0001d120'
547db96d56Sopenharmony_ciassert ord(h) == 0x1d120
557db96d56Sopenharmony_cii = r'\U0001d120'
567db96d56Sopenharmony_ciassert list(map(ord, i)) == [92, 85, 48, 48, 48, 49, 100, 49, 50, 48]
577db96d56Sopenharmony_ci"""
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_cidef byte(i):
617db96d56Sopenharmony_ci    return bytes([i])
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ciclass TestLiterals(unittest.TestCase):
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    def setUp(self):
677db96d56Sopenharmony_ci        self.save_path = sys.path[:]
687db96d56Sopenharmony_ci        self.tmpdir = tempfile.mkdtemp()
697db96d56Sopenharmony_ci        sys.path.insert(0, self.tmpdir)
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    def tearDown(self):
727db96d56Sopenharmony_ci        sys.path[:] = self.save_path
737db96d56Sopenharmony_ci        shutil.rmtree(self.tmpdir, ignore_errors=True)
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci    def test_template(self):
767db96d56Sopenharmony_ci        # Check that the template doesn't contain any non-printables
777db96d56Sopenharmony_ci        # except for \n.
787db96d56Sopenharmony_ci        for c in TEMPLATE:
797db96d56Sopenharmony_ci            assert c == '\n' or ' ' <= c <= '~', repr(c)
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci    def test_eval_str_normal(self):
827db96d56Sopenharmony_ci        self.assertEqual(eval(""" 'x' """), 'x')
837db96d56Sopenharmony_ci        self.assertEqual(eval(r""" '\x01' """), chr(1))
847db96d56Sopenharmony_ci        self.assertEqual(eval(""" '\x01' """), chr(1))
857db96d56Sopenharmony_ci        self.assertEqual(eval(r""" '\x81' """), chr(0x81))
867db96d56Sopenharmony_ci        self.assertEqual(eval(""" '\x81' """), chr(0x81))
877db96d56Sopenharmony_ci        self.assertEqual(eval(r""" '\u1881' """), chr(0x1881))
887db96d56Sopenharmony_ci        self.assertEqual(eval(""" '\u1881' """), chr(0x1881))
897db96d56Sopenharmony_ci        self.assertEqual(eval(r""" '\U0001d120' """), chr(0x1d120))
907db96d56Sopenharmony_ci        self.assertEqual(eval(""" '\U0001d120' """), chr(0x1d120))
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    def test_eval_str_incomplete(self):
937db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\x' """)
947db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\x0' """)
957db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\u' """)
967db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\u0' """)
977db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\u00' """)
987db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\u000' """)
997db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U' """)
1007db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U0' """)
1017db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U00' """)
1027db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U000' """)
1037db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U0000' """)
1047db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U00000' """)
1057db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U000000' """)
1067db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" '\U0000000' """)
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci    def test_eval_str_invalid_escape(self):
1097db96d56Sopenharmony_ci        for b in range(1, 128):
1107db96d56Sopenharmony_ci            if b in b"""\n\r"'01234567NU\\abfnrtuvx""":
1117db96d56Sopenharmony_ci                continue
1127db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
1137db96d56Sopenharmony_ci                self.assertEqual(eval(r"'\%c'" % b), '\\' + chr(b))
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
1167db96d56Sopenharmony_ci            warnings.simplefilter('always', category=DeprecationWarning)
1177db96d56Sopenharmony_ci            eval("'''\n\\z'''")
1187db96d56Sopenharmony_ci        self.assertEqual(len(w), 1)
1197db96d56Sopenharmony_ci        self.assertEqual(str(w[0].message), r"invalid escape sequence '\z'")
1207db96d56Sopenharmony_ci        self.assertEqual(w[0].filename, '<string>')
1217db96d56Sopenharmony_ci        self.assertEqual(w[0].lineno, 1)
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
1247db96d56Sopenharmony_ci            warnings.simplefilter('error', category=DeprecationWarning)
1257db96d56Sopenharmony_ci            with self.assertRaises(SyntaxError) as cm:
1267db96d56Sopenharmony_ci                eval("'''\n\\z'''")
1277db96d56Sopenharmony_ci            exc = cm.exception
1287db96d56Sopenharmony_ci        self.assertEqual(w, [])
1297db96d56Sopenharmony_ci        self.assertEqual(exc.msg, r"invalid escape sequence '\z'")
1307db96d56Sopenharmony_ci        self.assertEqual(exc.filename, '<string>')
1317db96d56Sopenharmony_ci        self.assertEqual(exc.lineno, 1)
1327db96d56Sopenharmony_ci        self.assertEqual(exc.offset, 1)
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci    def test_eval_str_invalid_octal_escape(self):
1357db96d56Sopenharmony_ci        for i in range(0o400, 0o1000):
1367db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
1377db96d56Sopenharmony_ci                self.assertEqual(eval(r"'\%o'" % i), chr(i))
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
1407db96d56Sopenharmony_ci            warnings.simplefilter('always', category=DeprecationWarning)
1417db96d56Sopenharmony_ci            eval("'''\n\\407'''")
1427db96d56Sopenharmony_ci        self.assertEqual(len(w), 1)
1437db96d56Sopenharmony_ci        self.assertEqual(str(w[0].message),
1447db96d56Sopenharmony_ci                         r"invalid octal escape sequence '\407'")
1457db96d56Sopenharmony_ci        self.assertEqual(w[0].filename, '<string>')
1467db96d56Sopenharmony_ci        self.assertEqual(w[0].lineno, 1)
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
1497db96d56Sopenharmony_ci            warnings.simplefilter('error', category=DeprecationWarning)
1507db96d56Sopenharmony_ci            with self.assertRaises(SyntaxError) as cm:
1517db96d56Sopenharmony_ci                eval("'''\n\\407'''")
1527db96d56Sopenharmony_ci            exc = cm.exception
1537db96d56Sopenharmony_ci        self.assertEqual(w, [])
1547db96d56Sopenharmony_ci        self.assertEqual(exc.msg, r"invalid octal escape sequence '\407'")
1557db96d56Sopenharmony_ci        self.assertEqual(exc.filename, '<string>')
1567db96d56Sopenharmony_ci        self.assertEqual(exc.lineno, 1)
1577db96d56Sopenharmony_ci        self.assertEqual(exc.offset, 1)
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci    def test_eval_str_raw(self):
1607db96d56Sopenharmony_ci        self.assertEqual(eval(""" r'x' """), 'x')
1617db96d56Sopenharmony_ci        self.assertEqual(eval(r""" r'\x01' """), '\\' + 'x01')
1627db96d56Sopenharmony_ci        self.assertEqual(eval(""" r'\x01' """), chr(1))
1637db96d56Sopenharmony_ci        self.assertEqual(eval(r""" r'\x81' """), '\\' + 'x81')
1647db96d56Sopenharmony_ci        self.assertEqual(eval(""" r'\x81' """), chr(0x81))
1657db96d56Sopenharmony_ci        self.assertEqual(eval(r""" r'\u1881' """), '\\' + 'u1881')
1667db96d56Sopenharmony_ci        self.assertEqual(eval(""" r'\u1881' """), chr(0x1881))
1677db96d56Sopenharmony_ci        self.assertEqual(eval(r""" r'\U0001d120' """), '\\' + 'U0001d120')
1687db96d56Sopenharmony_ci        self.assertEqual(eval(""" r'\U0001d120' """), chr(0x1d120))
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci    def test_eval_bytes_normal(self):
1717db96d56Sopenharmony_ci        self.assertEqual(eval(""" b'x' """), b'x')
1727db96d56Sopenharmony_ci        self.assertEqual(eval(r""" b'\x01' """), byte(1))
1737db96d56Sopenharmony_ci        self.assertEqual(eval(""" b'\x01' """), byte(1))
1747db96d56Sopenharmony_ci        self.assertEqual(eval(r""" b'\x81' """), byte(0x81))
1757db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ b'\x81' """)
1767db96d56Sopenharmony_ci        self.assertEqual(eval(r""" br'\u1881' """), b'\\' + b'u1881')
1777db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ b'\u1881' """)
1787db96d56Sopenharmony_ci        self.assertEqual(eval(r""" br'\U0001d120' """), b'\\' + b'U0001d120')
1797db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ b'\U0001d120' """)
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci    def test_eval_bytes_incomplete(self):
1827db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" b'\x' """)
1837db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, r""" b'\x0' """)
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    def test_eval_bytes_invalid_escape(self):
1867db96d56Sopenharmony_ci        for b in range(1, 128):
1877db96d56Sopenharmony_ci            if b in b"""\n\r"'01234567\\abfnrtvx""":
1887db96d56Sopenharmony_ci                continue
1897db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
1907db96d56Sopenharmony_ci                self.assertEqual(eval(r"b'\%c'" % b), b'\\' + bytes([b]))
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
1937db96d56Sopenharmony_ci            warnings.simplefilter('always', category=DeprecationWarning)
1947db96d56Sopenharmony_ci            eval("b'''\n\\z'''")
1957db96d56Sopenharmony_ci        self.assertEqual(len(w), 1)
1967db96d56Sopenharmony_ci        self.assertEqual(str(w[0].message), r"invalid escape sequence '\z'")
1977db96d56Sopenharmony_ci        self.assertEqual(w[0].filename, '<string>')
1987db96d56Sopenharmony_ci        self.assertEqual(w[0].lineno, 1)
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
2017db96d56Sopenharmony_ci            warnings.simplefilter('error', category=DeprecationWarning)
2027db96d56Sopenharmony_ci            with self.assertRaises(SyntaxError) as cm:
2037db96d56Sopenharmony_ci                eval("b'''\n\\z'''")
2047db96d56Sopenharmony_ci            exc = cm.exception
2057db96d56Sopenharmony_ci        self.assertEqual(w, [])
2067db96d56Sopenharmony_ci        self.assertEqual(exc.msg, r"invalid escape sequence '\z'")
2077db96d56Sopenharmony_ci        self.assertEqual(exc.filename, '<string>')
2087db96d56Sopenharmony_ci        self.assertEqual(exc.lineno, 1)
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci    def test_eval_bytes_invalid_octal_escape(self):
2117db96d56Sopenharmony_ci        for i in range(0o400, 0o1000):
2127db96d56Sopenharmony_ci            with self.assertWarns(DeprecationWarning):
2137db96d56Sopenharmony_ci                self.assertEqual(eval(r"b'\%o'" % i), bytes([i & 0o377]))
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
2167db96d56Sopenharmony_ci            warnings.simplefilter('always', category=DeprecationWarning)
2177db96d56Sopenharmony_ci            eval("b'''\n\\407'''")
2187db96d56Sopenharmony_ci        self.assertEqual(len(w), 1)
2197db96d56Sopenharmony_ci        self.assertEqual(str(w[0].message),
2207db96d56Sopenharmony_ci                         r"invalid octal escape sequence '\407'")
2217db96d56Sopenharmony_ci        self.assertEqual(w[0].filename, '<string>')
2227db96d56Sopenharmony_ci        self.assertEqual(w[0].lineno, 1)
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
2257db96d56Sopenharmony_ci            warnings.simplefilter('error', category=DeprecationWarning)
2267db96d56Sopenharmony_ci            with self.assertRaises(SyntaxError) as cm:
2277db96d56Sopenharmony_ci                eval("b'''\n\\407'''")
2287db96d56Sopenharmony_ci            exc = cm.exception
2297db96d56Sopenharmony_ci        self.assertEqual(w, [])
2307db96d56Sopenharmony_ci        self.assertEqual(exc.msg, r"invalid octal escape sequence '\407'")
2317db96d56Sopenharmony_ci        self.assertEqual(exc.filename, '<string>')
2327db96d56Sopenharmony_ci        self.assertEqual(exc.lineno, 1)
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci    def test_eval_bytes_raw(self):
2357db96d56Sopenharmony_ci        self.assertEqual(eval(""" br'x' """), b'x')
2367db96d56Sopenharmony_ci        self.assertEqual(eval(""" rb'x' """), b'x')
2377db96d56Sopenharmony_ci        self.assertEqual(eval(r""" br'\x01' """), b'\\' + b'x01')
2387db96d56Sopenharmony_ci        self.assertEqual(eval(r""" rb'\x01' """), b'\\' + b'x01')
2397db96d56Sopenharmony_ci        self.assertEqual(eval(""" br'\x01' """), byte(1))
2407db96d56Sopenharmony_ci        self.assertEqual(eval(""" rb'\x01' """), byte(1))
2417db96d56Sopenharmony_ci        self.assertEqual(eval(r""" br'\x81' """), b"\\" + b"x81")
2427db96d56Sopenharmony_ci        self.assertEqual(eval(r""" rb'\x81' """), b"\\" + b"x81")
2437db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ br'\x81' """)
2447db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ rb'\x81' """)
2457db96d56Sopenharmony_ci        self.assertEqual(eval(r""" br'\u1881' """), b"\\" + b"u1881")
2467db96d56Sopenharmony_ci        self.assertEqual(eval(r""" rb'\u1881' """), b"\\" + b"u1881")
2477db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ br'\u1881' """)
2487db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ rb'\u1881' """)
2497db96d56Sopenharmony_ci        self.assertEqual(eval(r""" br'\U0001d120' """), b"\\" + b"U0001d120")
2507db96d56Sopenharmony_ci        self.assertEqual(eval(r""" rb'\U0001d120' """), b"\\" + b"U0001d120")
2517db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ br'\U0001d120' """)
2527db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ rb'\U0001d120' """)
2537db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ bb'' """)
2547db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ rr'' """)
2557db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ brr'' """)
2567db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ bbr'' """)
2577db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ rrb'' """)
2587db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ rbb'' """)
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def test_eval_str_u(self):
2617db96d56Sopenharmony_ci        self.assertEqual(eval(""" u'x' """), 'x')
2627db96d56Sopenharmony_ci        self.assertEqual(eval(""" U'\u00e4' """), 'ä')
2637db96d56Sopenharmony_ci        self.assertEqual(eval(""" u'\N{LATIN SMALL LETTER A WITH DIAERESIS}' """), 'ä')
2647db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ ur'' """)
2657db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ ru'' """)
2667db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ bu'' """)
2677db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, eval, """ ub'' """)
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci    def test_uppercase_prefixes(self):
2707db96d56Sopenharmony_ci        self.assertEqual(eval(""" B'x' """), b'x')
2717db96d56Sopenharmony_ci        self.assertEqual(eval(r""" R'\x01' """), r'\x01')
2727db96d56Sopenharmony_ci        self.assertEqual(eval(r""" BR'\x01' """), br'\x01')
2737db96d56Sopenharmony_ci        self.assertEqual(eval(""" F'{1+1}' """), f'{1+1}')
2747db96d56Sopenharmony_ci        self.assertEqual(eval(r""" U'\U0001d120' """), u'\U0001d120')
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci    def check_encoding(self, encoding, extra=""):
2777db96d56Sopenharmony_ci        modname = "xx_" + encoding.replace("-", "_")
2787db96d56Sopenharmony_ci        fn = os.path.join(self.tmpdir, modname + ".py")
2797db96d56Sopenharmony_ci        f = open(fn, "w", encoding=encoding)
2807db96d56Sopenharmony_ci        try:
2817db96d56Sopenharmony_ci            f.write(TEMPLATE % encoding)
2827db96d56Sopenharmony_ci            f.write(extra)
2837db96d56Sopenharmony_ci        finally:
2847db96d56Sopenharmony_ci            f.close()
2857db96d56Sopenharmony_ci        __import__(modname)
2867db96d56Sopenharmony_ci        del sys.modules[modname]
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci    def test_file_utf_8(self):
2897db96d56Sopenharmony_ci        extra = "z = '\u1234'; assert ord(z) == 0x1234\n"
2907db96d56Sopenharmony_ci        self.check_encoding("utf-8", extra)
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci    def test_file_utf_8_error(self):
2937db96d56Sopenharmony_ci        extra = "b'\x80'\n"
2947db96d56Sopenharmony_ci        self.assertRaises(SyntaxError, self.check_encoding, "utf-8", extra)
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    def test_file_utf8(self):
2977db96d56Sopenharmony_ci        self.check_encoding("utf-8")
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    def test_file_iso_8859_1(self):
3007db96d56Sopenharmony_ci        self.check_encoding("iso-8859-1")
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci    def test_file_latin_1(self):
3037db96d56Sopenharmony_ci        self.check_encoding("latin-1")
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci    def test_file_latin9(self):
3067db96d56Sopenharmony_ci        self.check_encoding("latin9")
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ciif __name__ == "__main__":
3107db96d56Sopenharmony_ci    unittest.main()
311