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