8000 [3.8] [3.9] bpo-42681: Fix test_curses failures related to color pair… · python/cpython@e2c847e · GitHub
[go: up one dir, main page]

Skip to content

Commit e2c847e

Browse files
[3.8] [3.9] bpo-42681: Fix test_curses failures related to color pairs (GH-24089) (GH-24113) (GH-24116)
On ncurses 6.1 pair numbers are limited by SHORT_MAX-1. Improve error reporting and tests for color functions. (cherry picked from commit 59f9b4e) (cherry picked from commit 9b3a53a)
1 parent a087a97 commit e2c847e

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

Lib/test/test_curses.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,20 @@ def bad_colors(self):
319319
def bad_pairs(self):
320320
return (-2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64)
321321

322+
def test_start_color(self):
323+
if not curses.has_colors():
324+
self.skipTest('requires colors support')
325+
curses.start_color()
326+
if verbose:
327+
print(f'COLORS = {curses.COLORS}', file=sys.stderr)
328+
print(f'COLOR_PAIRS = {curses.COLOR_PAIRS}', file=sys.stderr)
329+
322330
@requires_colors
323331
def test_color_content(self):
324332
self.assertEqual(curses.color_content(curses.COLOR_BLACK), (0, 0, 0))
325333
curses.color_content(0)
326-
curses.color_content(min(curses.COLORS - 1, SHORT_MAX))
334+
maxcolor = min(curses.COLORS - 1, SHORT_MAX)
335+
curses.color_content(maxcolor)
327336

328337
for color in self.bad_colors():
329338
self.assertRaises(OverflowError, curses.color_content, color)
@@ -364,13 +373,18 @@ def test_init_color(self):
364373
self.assertRaises(curses.error, curses.init_color, 0, 0, comp, 0)
365374
self.assertRaises(curses.error, curses.init_color, 0, 0, 0, comp)
366375

376+
def get_pair_limit(self):
377+
return min(curses.COLOR_PAIRS, SHORT_MAX)
378+
367379
@requires_colors
368380
def test_pair_content(self):
369381
if not hasattr(curses, 'use_default_colors'):
370382
self.assertEqual(curses.pair_content(0),
371383
(curses.COLOR_WHITE, curses.COLOR_BLACK))
372384
curses.pair_content(0)
373-
curses.pair_content(min(curses.COLOR_PAIRS - 1, SHORT_MAX))
385+
maxpair = self.get_pair_limit() - 1
386+
if maxpair > 0:
387+
curses.pair_content(maxpair)
374388

375389
for pair in self.bad_pairs():
376390
self.assertRaises(OverflowError, curses.pair_content, pair)
@@ -385,11 +399,14 @@ def test_init_pair(self):
385399
curses.init_pair(1, 0, 0)
386400
self.assertEqual(curses.pair_content(1), (0, 0))
387401
maxcolor = min(curses.COLORS - 1, SHORT_MAX)
388-
curses.init_pair(1, maxcolor, maxcolor)
389-
self.assertEqual(curses.pair_content(1), (maxcolor, maxcolor))
390-
maxpair = min(curses.COLOR_PAIRS - 1, SHORT_MAX)
391-
curses.init_pair(maxpair, 2, 3)
392-
self.assertEqual(curses.pair_content(maxpair), (2, 3))
402+
curses.init_pair(1, maxcolor, 0)
403+
self.assertEqual(curses.pair_content(1), (maxcolor, 0))
404+
curses.init_pair(1, 0, maxcolor)
405+
self.assertEqual(curses.pair_content(1), (0, maxcolor))
406+
maxpair = self.get_pair_limit() - 1
407+
if maxpair > 1:
408+
curses.init_pair(maxpair, 0, 0)
409+
self.assertEqual(curses.pair_content(maxpair), (0, 0))
393410

394411
for pair in self.bad_pairs():
395412
self.assertRaises(OverflowError, curses.init_pair, pair, 0, 0)
@@ -587,6 +604,8 @@ def test_update_lines_cols(self):
587604
@requires_curses_func('ncurses_version')
588605
def test_ncurses_version(self):
589606
v = curses.ncurses_version
607+
if verbose:
608+
print(f'ncurses_version = {curses.ncurses_version}', flush=True)
590609
self.assertIsInstance(v[:], tuple)
591610
self.assertEqual(len(v), 3)
592611
self.assertIsInstance(v[0], int)

Modules/_cursesmodule.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2592,13 +2592,18 @@ _curses_color_content_impl(PyObject *module, short color_number)
25922592
PyCursesInitialised;
25932593
PyCursesInitialisedColor;
25942594

2595-
if (color_content(color_number, &r, &g, &b) != ERR)
2596-
return Py_BuildValue("(iii)", r, g, b);
2597-
else {
2598-
PyErr_SetString(PyCursesError,
2599-
"Argument 1 was out of range. Check value of COLORS.");
2595+
if (color_content(color_number, &r, &g, &b) == ERR) {
2596+
if (color_number >= COLORS) {
2597+
PyErr_SetString(PyCursesError,
2598+
"Argument 1 was out of range. Check value of COLORS.");
2599+
}
2600+
else {
2601+
PyErr_SetString(PyCursesError, "color_content() returned ERR");
2602+
}
26002603
return NULL;
26012604
}
2605+
2606+
return Py_BuildValue("(iii)", r, g, b);
26022607
}
26032608

26042609
/*[clinic input]
@@ -3617,9 +3622,14 @@ _curses_pair_content_impl(PyObject *module, short pair_number)
36173622
PyCursesInitialised;
36183623
PyCursesInitialisedColor;
36193624

3620-
if (pair_content(pair_number, &f, &b)==ERR) {
3621-
PyErr_SetString(PyCursesError,
3622-
"Argument 1 was out of range. (0..COLOR_PAIRS-1)");
3625+
if (pair_content(pair_number, &f, &b) == ERR) {
3626+
if (pair_number >= COLOR_PAIRS) {
3627+
PyErr_SetString(PyCursesError,
3628+
"Argument 1 was out of range. (0..COLOR_PAIRS-1)");
3629+
}
3630+
else {
3631+
PyErr_SetString(PyCursesError, "pair_content() returned ERR");
3632+
}
36233633
return NULL;
36243634
}
36253635

0 commit comments

Comments
 (0)
0