From: Serhiy Storchaka Date: Thu, 9 Jul 2026 06:28:32 +0000 (+0300) Subject: gh-151757: Skip curses variation-selector test on older macOS (GH-153344) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3fd9dc8d633a776439128fcc8de2b191fd94906;p=thirdparty%2FPython%2Fcpython.git 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 --- 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.