From f3fd9dc8d633a776439128fcc8de2b191fd94906 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Jul 2026 09:28:32 +0300 Subject: [PATCH] gh-151757: Skip curses variation-selector test on older macOS (GH-153344) Older macOS reports a variation selector as a spacing character (wcwidth() returns 1) instead of a zero-width combining mark, so curses cannot put it in the same cell as its base. Co-authored-by: Claude Opus 4.8 --- Lib/test/test_curses.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index 5fe285046071..f54c9a62d503 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -1,6 +1,7 @@ import functools import inspect import os +import platform import select import string import sys @@ -86,6 +87,18 @@ _ncurses_version = getattr(curses, 'ncurses_version', None) BROKEN_NEWTERM = _ncurses_version is not None and _ncurses_version < (6, 5) USE_NEWTERM = hasattr(curses, 'newterm') and not BROKEN_NEWTERM +# Older macOS reports a variation selector as a spacing character (wcwidth() +# == 1) rather than a combining mark, so it cannot share a cell with its base. +# The failure is confirmed on 14.2 and gone by 26, so skip below 26. +def _broken_variation_selector_width(): + if sys.platform == 'darwin': + mac_ver = platform.mac_ver()[0] + if mac_ver: + return tuple(map(int, mac_ver.split('.'))) < (26,) + return False + +BROKEN_VARIATION_SELECTOR_WIDTH = _broken_variation_selector_width() + # newterm() is used when available (it reports errors instead of exiting), but # initscr() is still the fallback, and an unusable $TERM has no terminal to # drive either way. @@ -411,7 +424,8 @@ class TestCurses(unittest.TestCase): stdscr = self.stdscr if self._encodable('\U0001f600'): stdscr.addch(0, 0, '\U0001f600') # single emoji - if self._encodable('\u263a\ufe0f'): + # Skip the variation selector where the platform reports it as spacing. + if not BROKEN_VARIATION_SELECTOR_WIDTH and self._encodable('\u263a\ufe0f'): stdscr.addch(1, 0, '\u263a\ufe0f') # WHITE SMILING FACE + VS-16 # An emoji ZWJ sequence or an emoji with a modifier is more than one # spacing character and cannot share a single cell. -- 2.47.3