@@ -1641,6 +1641,40 @@ def test_suggestions_and_messages(self) -> None:
16411641 new_imports = sys .modules .keys () - _imported
16421642 self .assertSetEqual (new_imports , expected_imports )
16431643
1644+ def test_colorize_import_completions (self ) -> None :
1645+ from _colorize import get_theme
1646+ from _pyrepl .fancycompleter import colorize_matches
1647+ from _pyrepl .completing_reader import stripcolor
1648+
1649+ theme = get_theme ()
1650+ colorize = lambda names , values : colorize_matches (names , values , theme )
1651+ config = ReadlineConfig (colorize_completions = colorize )
1652+
1653+ reader = ReadlineAlikeReader (
1654+ console = FakeConsole (events = []),
1655+ config = config ,
1656+ )
1657+
1658+ # Multiple completions should be colorized (contain ANSI codes)
1659+ reader .buffer = list ("from collections import d" )
1660+ reader .pos = len (reader .buffer )
1661+ result = reader .get_module_completions ()
1662+ self .assertIsNotNone (result )
1663+ names , action = result
1664+ self .assertTrue (len (names ) > 1 )
1665+ # Colorized names contain ANSI escape sequences
1666+ self .assertTrue (any (name != stripcolor (name ) for name in names
1667+ if name .strip ()))
1668+
1669+ # Single completion should NOT be colorized
1670+ reader .buffer = list ("from collections import Order" )
1671+ reader .pos = len (reader .buffer )
1672+ result = reader .get_module_completions ()
1673+ self .assertIsNotNone (result )
1674+ names , action = result
1675+ self .assertEqual (len (names ), 1 )
1676+ self .assertEqual (names [0 ], stripcolor (names [0 ]))
1677+
16441678
16451679# Audit hook used to check for stdlib modules import side-effects
16461680# Defined globally to avoid adding one hook per test run (refleak)
0 commit comments