From 6c0d271ce8d3a7be164b676e10dcb20b20769e9d Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 29 Aug 2026 13:47:58 +0300 Subject: [PATCH] gh-155974: Add a test for the window attributes after a failed write The bug was introduced and fixed in 3.15, but the behaviour is worth guarding here too. --- Lib/test/test_curses.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index cf9ba5123253529..fdd98df721c2e38 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -434,6 +434,26 @@ def test_output_string_embedded_null_chars(self): self.assertRaises(ValueError, stdscr.insstr, arg) self.assertRaises(ValueError, stdscr.insnstr, arg, 1) + def test_output_string_attr_restored(self): + # A write with an attr restores the window rendition afterwards, + # whether it succeeded or failed. + win = curses.newwin(2, 10, 0, 0) + def current_attrs(): + # Write a cell with the window's current rendition and read it + # back, so that the rendition itself is checked. + win.addstr(1, 0, ' ') + return win.inch(1, 0) & curses.A_ATTRIBUTES + for func, args in [(win.addstr, ('x',)), (win.addnstr, ('x', 1)), + (win.insstr, ('x',)), (win.insnstr, ('x', 1))]: + with self.subTest(func.__qualname__): + win.attrset(curses.A_UNDERLINE) + # y=100 is outside the window, so the write fails. + self.assertRaises(curses.error, func, 100, 0, *args, + curses.A_BOLD) + self.assertEqual(current_attrs(), curses.A_UNDERLINE) + func(0, 0, *args, curses.A_BOLD) + self.assertEqual(current_attrs(), curses.A_UNDERLINE) + def test_add_string_behavior(self): # addstr() advances the cursor past the written text; addnstr() # writes at most n characters.