From 81551e4d1ac4788e6aa2fcfd974b47257d88cc3a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 8 Jul 2026 17:41:45 +0300 Subject: [PATCH] gh-151757: Skip curses variation-selector test on older macOS 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. Skip that assertion there. 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 5fe2850460717b8..f54c9a62d5033e6 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 @@ def wrapped(self, *args, **kwargs): 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 @@ def test_addch_emoji(self): 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.