From 3c24e56cec819776e2bb7e07b40ae40c3d250e06 Mon Sep 17 00:00:00 2001 From: ptmcg Date: Tue, 14 May 2024 10:02:22 -0500 Subject: [PATCH] Added unit test for exception type to `trace_parse_action` exception output --- tests/test_unit.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 513eed8a..718f186d 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -6391,6 +6391,48 @@ def __call__(self, other): integer.addParseAction(pp.traceParseAction(Z())) integer.parseString("132", parseAll=True) + def testTraceParseActionDecorator_with_exception(self): + @pp.trace_parse_action + def convert_to_int_raising_type_error(t): + return int(t[0]) + ".000" + + @pp.trace_parse_action + def convert_to_int_raising_index_error(t): + return int(t[1]) + + @pp.trace_parse_action + def convert_to_int_raising_value_error(t): + a, b = t[0] + return int(t[1]) + + @pp.trace_parse_action + def convert_to_int_raising_parse_exception(t): + pp.Word(pp.alphas).parse_string("123") + + for pa, expected_message in ( + (convert_to_int_raising_type_error, "TypeError:"), + (convert_to_int_raising_index_error, "IndexError:"), + (convert_to_int_raising_value_error, "ValueError:"), + (convert_to_int_raising_parse_exception, "ParseException:"), + ): + print(f"Using parse action {pa.__name__!r}") + integer = pp.Word(pp.nums).set_parse_action(pa) + stderr_capture = StringIO() + try: + with contextlib.redirect_stderr(stderr_capture): + integer.parse_string("132", parse_all=True) + except Exception as exc: + print(f"Exception raised: {type(exc).__name__}: {exc}") + else: + print("No exception raised") + stderr_text = stderr_capture.getvalue() + print(stderr_text) + self.assertTrue( + expected_message in stderr_text, + f"Expected exception type {expected_message!r} not found in trace_parse_action output" + ) + + def testRunTests(self): integer = pp.Word(pp.nums).setParseAction(lambda t: int(t[0])) intrange = integer("start") + "-" + integer("end")