# SPDX-License-Identifier: MIT # SPDX-FileCopyrightText: 2021 Taneli Hukkinen # Licensed to PSF under a Contributor Agreement. import unittest from . import tomllib class TestError(unittest.TestCase): def test_line_and_col(self): with self.assertRaises(tomllib.TOMLDecodeError) as exc_info: tomllib.loads("val=.") self.assertEqual(str(exc_info.exception), "Invalid value (at line 1, column 5)") with self.assertRaises(tomllib.TOMLDecodeError) as exc_info: tomllib.loads(".") self.assertEqual( str(exc_info.exception), "Invalid statement (at line 1, column 1)" ) with self.assertRaises(tomllib.TOMLDecodeError) as exc_info: tomllib.loads("\n\nval=.") self.assertEqual(str(exc_info.exception), "Invalid value (at line 3, column 5)") with self.assertRaises(tomllib.TOMLDecodeError) as exc_info: tomllib.loads("\n\n.") self.assertEqual( str(exc_info.exception), "Invalid statement (at line 3, column 1)" ) def test_missing_value(self): with self.assertRaises(tomllib.TOMLDecodeError) as exc_info: tomllib.loads("\n\nfwfw=") self.assertEqual(str(exc_info.exception), "Invalid value (at end of document)") def test_invalid_char_quotes(self): with self.assertRaises(tomllib.TOMLDecodeError) as exc_info: tomllib.loads("v = '\n'") self.assertTrue(" '\\n' " in str(exc_info.exception)) def test_type_error(self): with self.assertRaises(TypeError) as exc_info: tomllib.loads(b"v = 1") # type: ignore[arg-type] self.assertEqual(str(exc_info.exception), "Expected str object, not 'bytes'") with self.assertRaises(TypeError) as exc_info: tomllib.loads(False) # type: ignore[arg-type] self.assertEqual(str(exc_info.exception), "Expected str object, not 'bool'") def test_module_name(self): self.assertEqual( tomllib.TOMLDecodeError("", "", 0).__module__, tomllib.__name__ ) def test_invalid_parse_float(self): def dict_returner(s: str) -> dict: return {} def list_returner(s: str) -> list: return [] for invalid_parse_float in (dict_returner, list_returner): with self.assertRaises(ValueError) as exc_info: tomllib.loads("f=0.1", parse_float=invalid_parse_float) self.assertEqual( str(exc_info.exception), "parse_float must not return dicts or lists" ) def test_deprecated_tomldecodeerror(self): for args in [ (), ("err msg",), (None,), (None, "doc"), ("err msg", None), (None, "doc", None), ("err msg", "doc", None), ("one", "two", "three", "four"), ("one", "two", 3, "four", "five"), ]: with self.assertWarns(DeprecationWarning): e = tomllib.TOMLDecodeError(*args) # type: ignore[arg-type] self.assertEqual(e.args, args) def test_tomldecodeerror(self): msg = "error parsing" doc = "v=1\n[table]\nv='val'" pos = 13 formatted_msg = "error parsing (at line 3, column 2)" e = tomllib.TOMLDecodeError(msg, doc, pos) self.assertEqual(e.args, (formatted_msg,)) self.assertEqual(str(e), formatted_msg) self.assertEqual(e.msg, msg) self.assertEqual(e.doc, doc) self.assertEqual(e.pos, pos) self.assertEqual(e.lineno, 3) self.assertEqual(e.colno, 2)