From b588847f0314085db9ff314e44cc6a5ca49a716a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Jan 2021 12:31:35 +0200 Subject: [PATCH 1/7] bpo-42681: Fix test_curses failures related to COLOR_PAIRS --- Lib/test/test_curses.py | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 7b40d714742101..cf006f7e871a14 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -327,11 +327,20 @@ def bad_colors2(self): def bad_pairs(self): return (-1, -2**31 - 1, 2**31, -2**63 - 1, 2**63, 2**64) + def test_start_color(self): + if not curses.has_colors(): + self.skipTest('requires colors support') + curses.start_color() + if verbose: + print(f'COLORS = {curses.COLORS}', file=sys.stderr) + print(f'COLOR_PAIRS = {curses.COLOR_PAIRS}', file=sys.stderr) + @requires_colors def test_color_content(self): self.assertEqual(curses.color_content(curses.COLOR_BLACK), (0, 0, 0)) curses.color_content(0) - curses.color_content(curses.COLORS - 1) + maxcolor = curses.COLORS - 1 + curses.color_content(maxcolor) for color in self.bad_colors(): self.assertRaises(ValueError, curses.color_content, color) @@ -352,11 +361,12 @@ def test_init_color(self): curses.init_color(0, 1000, 1000, 1000) self.assertEqual(curses.color_content(0), (1000, 1000, 1000)) - old = curses.color_content(curses.COLORS - 1) - curses.init_color(curses.COLORS - 1, *old) - self.addCleanup(curses.init_color, curses.COLORS - 1, *old) - curses.init_color(curses.COLORS - 1, 0, 500, 1000) - self.assertEqual(curses.color_content(curses.COLORS - 1), (0, 500, 1000)) + maxcolor = curses.COLORS - 1 + old = curses.color_content(maxcolor) + curses.init_color(maxcolor, *old) + self.addCleanup(curses.init_color, maxcolor, *old) + curses.init_color(maxcolor, 0, 500, 1000) + self.assertEqual(curses.color_content(maxcolor), (0, 500, 1000)) for color in self.bad_colors(): self.assertRaises(ValueError, curses.init_color, color, 0, 0, 0) @@ -371,7 +381,9 @@ def test_pair_content(self): self.assertEqual(curses.pair_content(0), (curses.COLOR_WHITE, curses.COLOR_BLACK)) curses.pair_content(0) - curses.pair_content(curses.COLOR_PAIRS - 1) + maxpair = curses.COLOR_PAIRS - 1 + if maxpair > 0: + curses.pair_content(maxpair) for pair in self.bad_pairs(): self.assertRaises(ValueError, curses.pair_content, pair) @@ -384,11 +396,15 @@ def test_init_pair(self): curses.init_pair(1, 0, 0) self.assertEqual(curses.pair_content(1), (0, 0)) - curses.init_pair(1, curses.COLORS - 1, curses.COLORS - 1) - self.assertEqual(curses.pair_content(1), - (curses.COLORS - 1, curses.COLORS - 1)) - curses.init_pair(curses.COLOR_PAIRS - 1, 2, 3) - self.assertEqual(curses.pair_content(curses.COLOR_PAIRS - 1), (2, 3)) + maxcolor = curses.COLORS - 1 + curses.init_pair(1, maxcolor, 0) + self.assertEqual(curses.pair_content(1), (maxcolor, 0)) + curses.init_pair(1, 0, maxcolor) + self.assertEqual(curses.pair_content(1), (0, maxcolor)) + maxpair = curses.COLOR_PAIRS - 1 + if maxpair > 1: + curses.init_pair(maxpair, 0, 0) + self.assertEqual(curses.pair_content(maxpair), (0, 0)) for pair in self.bad_pairs(): self.assertRaises(ValueError, curses.init_pair, pair, 0, 0) From d89dbb11976eb581352415a1b9af8dd93eed5f19 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Jan 2021 13:35:40 +0200 Subject: [PATCH 2/7] Improve diagnostic. --- Modules/_cursesmodule.c | 59 ++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 23f6d96f5144e2..0687bb2d966a0f 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -142,22 +142,21 @@ typedef chtype attr_t; /* No attr_t type is available */ #endif /* defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS) */ #if _NCURSES_EXTENDED_COLOR_FUNCS -#define _NCURSES_COLOR_VAL_TYPE int +#define _CURSES_COLOR_VAL_TYPE int +#define _CURSES_COLOR_NUM_TYPE int #define _CURSES_INIT_COLOR_FUNC init_extended_color #define _CURSES_INIT_PAIR_FUNC init_extended_pair #define _COLOR_CONTENT_FUNC extended_color_content -#define _CURSES_PAIR_NUMBER_FUNC extended_pair_content +#define _CURSES_PAIR_CONTENT_FUNC extended_pair_content #else -#define _NCURSES_COLOR_VAL_TYPE short +#define _CURSES_COLOR_VAL_TYPE short +#define _CURSES_COLOR_NUM_TYPE short #define _CURSES_INIT_COLOR_FUNC init_color #define _CURSES_INIT_PAIR_FUNC init_pair #define _COLOR_CONTENT_FUNC color_content -#define _CURSES_PAIR_NUMBER_FUNC pair_content +#define _CURSES_PAIR_CONTENT_FUNC pair_content #endif /* _NCURSES_EXTENDED_COLOR_FUNCS */ -#define _CURSES_INIT_COLOR_FUNC_NAME Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC) -#define _CURSES_INIT_PAIR_FUNC_NAME Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC) - /*[clinic input] module _curses class _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type" @@ -2737,18 +2736,18 @@ static PyObject * _curses_color_content_impl(PyObject *module, int color_number) /*[clinic end generated code: output=17b466df7054e0de input=03b5ed0472662aea]*/ { - _NCURSES_COLOR_VAL_TYPE r,g,b; + _CURSES_COLOR_VAL_TYPE r,g,b; PyCursesInitialised; PyCursesInitialisedColor; - if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) != ERR) - return Py_BuildValue("(iii)", r, g, b); - else { - PyErr_SetString(PyCursesError, - "Argument 1 was out of range. Check value of COLORS."); + if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) == ERR) { + PyErr_Format(PyCursesError, "%s() returned ERR", + Py_STRINGIFY(_COLOR_CONTENT_FUNC)); return NULL; } + + return Py_BuildValue("(iii)", r, g, b); } /*[clinic input] @@ -3190,7 +3189,8 @@ _curses_init_color_impl(PyObject *module, int color_number, short r, short g, PyCursesInitialised; PyCursesInitialisedColor; - return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b), _CURSES_INIT_COLOR_FUNC_NAME); + return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b), + Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC)); } /*[clinic input] @@ -3217,7 +3217,20 @@ _curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg) PyCursesInitialised; PyCursesInitialisedColor; - return PyCursesCheckERR(_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg), _CURSES_INIT_PAIR_FUNC_NAME); + if (_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg) == ERR) { + if (pair_number >= COLOR_PAIRS) { + PyErr_Format(PyExc_ValueError, + "Color pair is greater than COLOR_PAIRS-1 (%d).", + COLOR_PAIRS - 1); + } + else { + PyErr_Format(PyCursesError, "%s() returned ERR", + Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC)); + } + return NULL; + } + + Py_RETURN_NONE; } static PyObject *ModDict; @@ -3845,14 +3858,22 @@ static PyObject * _curses_pair_content_impl(PyObject *module, int pair_number) /*[clinic end generated code: output=4a726dd0e6885f3f input=03970f840fc7b739]*/ { - _NCURSES_COLOR_VAL_TYPE f, b; + _CURSES_COLOR_NUM_TYPE f, b; PyCursesInitialised; PyCursesInitialisedColor; - if (_CURSES_PAIR_NUMBER_FUNC(pair_number, &f, &b)==ERR) { - PyErr_SetString(PyCursesError, - "Argument 1 was out of range. (0..COLOR_PAIRS-1)"); + if (_CURSES_PAIR_CONTENT_FUNC(pair_number, &f, &b) == ERR) { + if (pair_number >= COLOR_PAIRS) { + PyErr_Format(PyExc_ValueError, + "Color pair is greater than COLOR_PAIRS-1 (%d).", + COLOR_PAIRS - 1); + } + else { + PyErr_Format(PyCursesError, "%s() returned ERR for color pair %d", + Py_STRINGIFY(_CURSES_PAIR_CONTENT_FUNC), + pair_number); + } return NULL; } From 80a9ce2f1c89fd02e3eceed630e0634609e457fc Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Jan 2021 14:13:24 +0200 Subject: [PATCH 3/7] Debug. --- Lib/test/test_curses.py | 12 ++++++++++-- Modules/_cursesmodule.c | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index cf006f7e871a14..415c764ec48c2c 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -382,8 +382,16 @@ def test_pair_content(self): (curses.COLOR_WHITE, curses.COLOR_BLACK)) curses.pair_content(0) maxpair = curses.COLOR_PAIRS - 1 - if maxpair > 0: - curses.pair_content(maxpair) + err = None + while maxpair > 0: + try: + curses.pair_content(maxpair) + break + except curses.error as e: + err = e + maxpair -= 1 + if err is not None: + raise err for pair in self.bad_pairs(): self.assertRaises(ValueError, curses.pair_content, pair) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 0687bb2d966a0f..27fabad0c718ca 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -3866,7 +3866,8 @@ _curses_pair_content_impl(PyObject *module, int pair_number) if (_CURSES_PAIR_CONTENT_FUNC(pair_number, &f, &b) == ERR) { if (pair_number >= COLOR_PAIRS) { PyErr_Format(PyExc_ValueError, - "Color pair is greater than COLOR_PAIRS-1 (%d).", + "Color pair %d is greater than COLOR_PAIRS-1 (%d).", + pair_number, COLOR_PAIRS - 1); } else { From c0ccb2f356cd3d21d4ac6357a1ae1d5aee09dc12 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Jan 2021 18:11:34 +0200 Subject: [PATCH 4/7] Output more info. --- Lib/test/pythoninfo.py | 47 +++++++++++++++++++++++++++++++++++++++++ Lib/test/test_curses.py | 2 ++ 2 files changed, 49 insertions(+) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index cc228fb3b54c94..4762ad98dbd254 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -7,6 +7,7 @@ import sys import traceback import warnings +from contextlib import suppress def normalize_text(text): @@ -238,8 +239,10 @@ def format_groups(groups): "ARCHFLAGS", "ARFLAGS", "AUDIODEV", + "BAUDRATE", "CC", "CFLAGS", + "COLORFGBG", "COLUMNS", "COMPUTERNAME", "COMSPEC", @@ -256,6 +259,8 @@ def format_groups(groups): "HOMEPATH", "IDLESTARTUP", "LANG", + "LC_ALL", + "LC_CTYPE", "LDFLAGS", "LDSHARED", "LD_LIBRARY_PATH", @@ -264,7 +269,14 @@ def format_groups(groups): "MAILCAPS", "MAKEFLAGS", "MIXERDEV", + "MOUSE_BUTTONS_123", "MSSDK", + "NCURSES_ASSUMED_COLORS", + "NCURSES_CONSOLE2", + "NCURSES_GPM_TERMS", + "NCURSES_NO_HARD_TABS", + "NCURSES_NO_MAGIC_COOKIE", + "NCURSES_NO_PADDING", "PATH", "PATHEXT", "PIP_CONFIG_FILE", @@ -281,6 +293,9 @@ def format_groups(groups): "SYSTEMROOT", "TEMP", "TERM", + "TERMCAP", + "TERMINFO", + "TERMPATH", "TILE_LIBRARY", "TIX_LIBRARY", "TMP", @@ -291,6 +306,7 @@ def format_groups(groups): "VIRTUAL_ENV", "WAYLAND_DISPLAY", "WINDIR", + "XTERM_PROG", "_PYTHON_HOST_PLATFORM", "_PYTHON_PROJECT_BASE", "_PYTHON_SYSCONFIGDATA_NAME", @@ -739,6 +755,36 @@ def collect_fips(info_add): pass +def collect_curses(info_add): + try: + import curses + except ImportError: + return + copy_attr(info_add, 'curses.ncurses_version', curses, 'ncurses_version') + call_func(info_add, 'curses.has_extended_color_support', curses, 'has_extended_color_support') + + try: + stdscr = curses.initscr() + except curses.error: + return + try: + copy_attr(info_add, 'curses.COLS', curses, 'COLS') + copy_attr(info_add, 'curses.LINES', curses, 'LINES') + call_func(info_add, 'curses.has_colors', curses, 'has_colors') + call_func(info_add, 'curses.can_change_color', curses, 'can_change_color') + call_func(info_add, 'curses.termname', curses, 'termname', formatter=repr) + call_func(info_add, 'curses.longname', curses, 'longname', formatter=repr) + call_func(info_add, 'curses.termattrs', curses, 'termattrs', formatter=hex) + if curses.has_colors(): + with suppress(curses.error): + curses.start_color() + copy_attr(info_add, 'curses.COLORS', curses, 'COLORS') + copy_attr(info_add, 'curses.COLOR_PAIRS', curses, 'COLOR_PAIRS') + finally: + with suppress(curses.error): + curses.endwin() + + def collect_info(info): error = False info_add = info.add @@ -751,6 +797,7 @@ def collect_info(info): collect_builtins, collect_cc, + collect_curses, collect_datetime, collect_decimal, collect_expat, diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 415c764ec48c2c..b24398c72a4a6e 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -606,6 +606,8 @@ def test_update_lines_cols(self): @requires_curses_func('ncurses_version') def test_ncurses_version(self): v = curses.ncurses_version + if verbose: + print(f'ncurses_version = {curses.ncurses_version}', flush=True) self.assertIsInstance(v[:], tuple) self.assertEqual(len(v), 3) self.assertIsInstance(v[0], int) From 6e4596ac45be7b3dce06eb92228a6a0ce7faf919 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Jan 2021 20:39:00 +0200 Subject: [PATCH 5/7] Workaround a ncurses 6.1 bug. --- Lib/test/test_curses.py | 18 ++++++++---------- Modules/_cursesmodule.c | 10 ++++------ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index b24398c72a4a6e..0a1ce070448e0a 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -47,6 +47,7 @@ def wrapped(self, *args, **kwargs): return wrapped term = os.environ.get('TERM') +SHORT_MAX = 0x7fff # If newterm was supported we could use it instead of initscr and not exit @unittest.skipIf(not term or term == 'unknown', @@ -382,16 +383,10 @@ def test_pair_content(self): (curses.COLOR_WHITE, curses.COLOR_BLACK)) curses.pair_content(0) maxpair = curses.COLOR_PAIRS - 1 - err = None - while maxpair > 0: - try: - curses.pair_content(maxpair) - break - except curses.error as e: - err = e - maxpair -= 1 - if err is not None: - raise err + if (not curses.has_extended_color_support() + or (6,) <= getattr(curses, 'ncurses_version', ()) < (6, 2)): + maxpair = min(maxpair, SHORT_MAX - 1) + curses.pair_content(maxpair) for pair in self.bad_pairs(): self.assertRaises(ValueError, curses.pair_content, pair) @@ -410,6 +405,9 @@ def test_init_pair(self): curses.init_pair(1, 0, maxcolor) self.assertEqual(curses.pair_content(1), (0, maxcolor)) maxpair = curses.COLOR_PAIRS - 1 + if (not curses.has_extended_color_support() + or (6,) <= getattr(curses, 'ncurses_version', ()) < (6, 2)): + maxpair = min(maxpair, SHORT_MAX - 1) if maxpair > 1: curses.init_pair(maxpair, 0, 0) self.assertEqual(curses.pair_content(maxpair), (0, 0)) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 27fabad0c718ca..7175c722965794 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -135,7 +135,7 @@ typedef chtype attr_t; /* No attr_t type is available */ #define STRICT_SYSV_CURSES #endif -#if defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS) +#if NCURSES_EXT_COLORS+0 && NCURSES_EXT_FUNCS+0 #define _NCURSES_EXTENDED_COLOR_FUNCS 1 #else #define _NCURSES_EXTENDED_COLOR_FUNCS 0 @@ -3866,14 +3866,12 @@ _curses_pair_content_impl(PyObject *module, int pair_number) if (_CURSES_PAIR_CONTENT_FUNC(pair_number, &f, &b) == ERR) { if (pair_number >= COLOR_PAIRS) { PyErr_Format(PyExc_ValueError, - "Color pair %d is greater than COLOR_PAIRS-1 (%d).", - pair_number, + "Color pair is greater than COLOR_PAIRS-1 (%d).", COLOR_PAIRS - 1); } else { - PyErr_Format(PyCursesError, "%s() returned ERR for color pair %d", - Py_STRINGIFY(_CURSES_PAIR_CONTENT_FUNC), - pair_number); + PyErr_Format(PyCursesError, "%s() returned ERR", + Py_STRINGIFY(_CURSES_PAIR_CONTENT_FUNC)); } return NULL; } From 517fe010bd979851305ae781bab427b1d42a4a34 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 4 Jan 2021 23:41:00 +0200 Subject: [PATCH 6/7] Revert changes in pythoninfo. --- Lib/test/pythoninfo.py | 47 ------------------------------------------ 1 file changed, 47 deletions(-) diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index 4762ad98dbd254..cc228fb3b54c94 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -7,7 +7,6 @@ import sys import traceback import warnings -from contextlib import suppress def normalize_text(text): @@ -239,10 +238,8 @@ def format_groups(groups): "ARCHFLAGS", "ARFLAGS", "AUDIODEV", - "BAUDRATE", "CC", "CFLAGS", - "COLORFGBG", "COLUMNS", "COMPUTERNAME", "COMSPEC", @@ -259,8 +256,6 @@ def format_groups(groups): "HOMEPATH", "IDLESTARTUP", "LANG", - "LC_ALL", - "LC_CTYPE", "LDFLAGS", "LDSHARED", "LD_LIBRARY_PATH", @@ -269,14 +264,7 @@ def format_groups(groups): "MAILCAPS", "MAKEFLAGS", "MIXERDEV", - "MOUSE_BUTTONS_123", "MSSDK", - "NCURSES_ASSUMED_COLORS", - "NCURSES_CONSOLE2", - "NCURSES_GPM_TERMS", - "NCURSES_NO_HARD_TABS", - "NCURSES_NO_MAGIC_COOKIE", - "NCURSES_NO_PADDING", "PATH", "PATHEXT", "PIP_CONFIG_FILE", @@ -293,9 +281,6 @@ def format_groups(groups): "SYSTEMROOT", "TEMP", "TERM", - "TERMCAP", - "TERMINFO", - "TERMPATH", "TILE_LIBRARY", "TIX_LIBRARY", "TMP", @@ -306,7 +291,6 @@ def format_groups(groups): "VIRTUAL_ENV", "WAYLAND_DISPLAY", "WINDIR", - "XTERM_PROG", "_PYTHON_HOST_PLATFORM", "_PYTHON_PROJECT_BASE", "_PYTHON_SYSCONFIGDATA_NAME", @@ -755,36 +739,6 @@ def collect_fips(info_add): pass -def collect_curses(info_add): - try: - import curses - except ImportError: - return - copy_attr(info_add, 'curses.ncurses_version', curses, 'ncurses_version') - call_func(info_add, 'curses.has_extended_color_support', curses, 'has_extended_color_support') - - try: - stdscr = curses.initscr() - except curses.error: - return - try: - copy_attr(info_add, 'curses.COLS', curses, 'COLS') - copy_attr(info_add, 'curses.LINES', curses, 'LINES') - call_func(info_add, 'curses.has_colors', curses, 'has_colors') - call_func(info_add, 'curses.can_change_color', curses, 'can_change_color') - call_func(info_add, 'curses.termname', curses, 'termname', formatter=repr) - call_func(info_add, 'curses.longname', curses, 'longname', formatter=repr) - call_func(info_add, 'curses.termattrs', curses, 'termattrs', formatter=hex) - if curses.has_colors(): - with suppress(curses.error): - curses.start_color() - copy_attr(info_add, 'curses.COLORS', curses, 'COLORS') - copy_attr(info_add, 'curses.COLOR_PAIRS', curses, 'COLOR_PAIRS') - finally: - with suppress(curses.error): - curses.endwin() - - def collect_info(info): error = False info_add = info.add @@ -797,7 +751,6 @@ def collect_info(info): collect_builtins, collect_cc, - collect_curses, collect_datetime, collect_decimal, collect_expat, From 8610b63f92188d95206e71c633b3857674c6ebe0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 5 Jan 2021 00:18:14 +0200 Subject: [PATCH 7/7] More accurate calculation of pair limit. --- Lib/test/test_curses.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 0a1ce070448e0a..f2cad05b2c92e6 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -376,17 +376,25 @@ def test_init_color(self): self.assertRaises(ValueError, curses.init_color, 0, 0, comp, 0) self.assertRaises(ValueError, curses.init_color, 0, 0, 0, comp) + def get_pair_limit(self): + pair_limit = curses.COLOR_PAIRS + if hasattr(curses, 'ncurses_version'): + if curses.has_extended_color_support(): + pair_limit += 2*curses.COLORS + 1 + if (not curses.has_extended_color_support() + or (6, 1) <= curses.ncurses_version < (6, 2)): + pair_limit = min(pair_limit, SHORT_MAX) + return pair_limit + @requires_colors def test_pair_content(self): if not hasattr(curses, 'use_default_colors'): self.assertEqual(curses.pair_content(0), (curses.COLOR_WHITE, curses.COLOR_BLACK)) curses.pair_content(0) - maxpair = curses.COLOR_PAIRS - 1 - if (not curses.has_extended_color_support() - or (6,) <= getattr(curses, 'ncurses_version', ()) < (6, 2)): - maxpair = min(maxpair, SHORT_MAX - 1) - curses.pair_content(maxpair) + maxpair = self.get_pair_limit() - 1 + if maxpair > 0: + curses.pair_content(maxpair) for pair in self.bad_pairs(): self.assertRaises(ValueError, curses.pair_content, pair) @@ -404,10 +412,7 @@ def test_init_pair(self): self.assertEqual(curses.pair_content(1), (maxcolor, 0)) curses.init_pair(1, 0, maxcolor) self.assertEqual(curses.pair_content(1), (0, maxcolor)) - maxpair = curses.COLOR_PAIRS - 1 - if (not curses.has_extended_color_support() - or (6,) <= getattr(curses, 'ncurses_version', ()) < (6, 2)): - maxpair = min(maxpair, SHORT_MAX - 1) + maxpair = self.get_pair_limit() - 1 if maxpair > 1: curses.init_pair(maxpair, 0, 0) self.assertEqual(curses.pair_content(maxpair), (0, 0))