From b789143b96e514f559a2f30ab4d349495d7575a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Furga=C5=82a?= <83299832+00200200@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:01:34 +0200 Subject: [PATCH] test: allow variable frame width in recursion error test (#386) In test_render_debug_better_error_message_recursion_error, line numbers and repeated frame counts are right-aligned to max_frame_length = len(str(remaining_frames_length)). On platforms like PyPy or when recursion depth exceeds 999 frames, max_frame_length is 4 or more digits, leading to additional indentation before the code lines and repeated frame marker '...'. Use \s+ and \s*\.\.\. in the regex pattern to accommodate variable frame count widths while continuing to strictly validate the formatted stack trace. Fixes #386. --- news/386.bugfix.md | 1 + tests/ui/test_exception_trace.py | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 news/386.bugfix.md diff --git a/news/386.bugfix.md b/news/386.bugfix.md new file mode 100644 index 00000000..f31d6bee --- /dev/null +++ b/news/386.bugfix.md @@ -0,0 +1 @@ +Fix `test_render_debug_better_error_message_recursion_error` failure under PyPy and deep recursion limits. diff --git a/tests/ui/test_exception_trace.py b/tests/ui/test_exception_trace.py index df57a2e7..d22e1382 100644 --- a/tests/ui/test_exception_trace.py +++ b/tests/ui/test_exception_trace.py @@ -92,18 +92,18 @@ def test_render_debug_better_error_message_recursion_error() -> None: Stack trace: \d+ {re.escape(str(trace._get_relative_file_path(__file__)))}:{lineno} in test_render_debug_better_error_message_recursion_error - {lineno - 2}\│ - {lineno - 1}\│ try: - → {lineno + 0}\│ recursion.recursion_error\(\) - {lineno + 1}\│ except RecursionError as e: - {lineno + 2}\│ trace = ExceptionTrace\(e\) - - ... Previous frame repeated \d+ times - - \s*\d+ {re.escape(str(trace._get_relative_file_path(recursion.__file__)))}:2 in recursion_error - 1\│ def recursion_error\(\) -> None: - → 2\│ recursion_error\(\) - 3\│ +\s+{lineno - 2}\│ +\s+{lineno - 1}\│ try: +\s*→\s+{lineno + 0}\│ recursion.recursion_error\(\) +\s+{lineno + 1}\│ except RecursionError as e: +\s+{lineno + 2}\│ trace = ExceptionTrace\(e\) + +\s*\.\.\. Previous frame repeated \d+ times + +\s*\d+ {re.escape(str(trace._get_relative_file_path(recursion.__file__)))}:2 in recursion_error +\s+1\│ def recursion_error\(\) -> None: +\s*→\s+2\│ recursion_error\(\) +\s+3\│ RecursionError