| # 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) |