Skip to content

Commit 8da314f

Browse files
committed
Adapt tests to theming when executed with -j
1 parent f449e7b commit 8da314f

File tree

5 files changed

+56
-33
lines changed

5 files changed

+56
-33
lines changed

Lib/test/support/__init__.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,36 +2855,59 @@ def is_slot_wrapper(name, value):
28552855

28562856

28572857
@contextlib.contextmanager
2858-
def no_color():
2858+
def force_color(color: bool):
28592859
import _colorize
28602860
from .os_helper import EnvironmentVarGuard
28612861

28622862
with (
2863-
swap_attr(_colorize, "can_colorize", lambda file=None: False),
2863+
swap_attr(_colorize, "can_colorize", lambda file=None: color),
28642864
EnvironmentVarGuard() as env,
28652865
):
28662866
env.unset("FORCE_COLOR", "NO_COLOR", "PYTHON_COLORS")
2867-
env.set("NO_COLOR", "1")
2867+
env.set("FORCE_COLOR" if color else "NO_COLOR", "1")
28682868
yield
28692869

28702870

2871+
def force_colorized(func):
2872+
"""Force the terminal to be colorized."""
2873+
@functools.wraps(func)
2874+
def wrapper(*args, **kwargs):
2875+
with force_color(True):
2876+
return func(*args, **kwargs)
2877+
return wrapper
2878+
2879+
28712880
def force_not_colorized(func):
2872-
"""Force the terminal not to be colorized."""
2881+
"""Force the terminal NOT to be colorized."""
28732882
@functools.wraps(func)
28742883
def wrapper(*args, **kwargs):
2875-
with no_color():
2884+
with force_color(False):
28762885
return func(*args, **kwargs)
28772886
return wrapper
28782887

28792888

2889+
def force_colorized_test_class(cls):
2890+
"""Force the terminal to be colorized for the entire test class."""
2891+
original_setUpClass = cls.setUpClass
2892+
2893+
@classmethod
2894+
@functools.wraps(cls.setUpClass)
2895+
def new_setUpClass(cls):
2896+
cls.enterClassContext(force_color(True))
2897+
original_setUpClass()
2898+
2899+
cls.setUpClass = new_setUpClass
2900+
return cls
2901+
2902+
28802903
def force_not_colorized_test_class(cls):
2881-
"""Force the terminal not to be colorized for the entire test class."""
2904+
"""Force the terminal NOT to be colorized for the entire test class."""
28822905
original_setUpClass = cls.setUpClass
28832906

28842907
@classmethod
28852908
@functools.wraps(cls.setUpClass)
28862909
def new_setUpClass(cls):
2887-
cls.enterClassContext(no_color())
2910+
cls.enterClassContext(force_color(False))
28882911
original_setUpClass()
28892912

28902913
cls.setUpClass = new_setUpClass

Lib/test/test_pyrepl/support.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,6 @@ def handle_all_events(
113113
prepare_console=partial(prepare_console, width=10),
114114
)
115115

116-
reader_no_colors = partial(prepare_reader, can_colorize=False)
117-
reader_force_colors = partial(prepare_reader, can_colorize=True)
118-
119116

120117
class FakeConsole(Console):
121118
def __init__(self, events, encoding="utf-8") -> None:

Lib/test/test_pyrepl/test_reader.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
from textwrap import dedent
55
from unittest import TestCase
66
from unittest.mock import MagicMock
7+
from test.support import force_colorized_test_class, force_not_colorized_test_class
78

89
from .support import handle_all_events, handle_events_narrow_console
910
from .support import ScreenEqualMixin, code_to_events
10-
from .support import prepare_console, reader_force_colors
11-
from .support import reader_no_colors as prepare_reader
11+
from .support import prepare_reader, prepare_console
1212
from _pyrepl.console import Event
1313
from _pyrepl.reader import Reader
1414
from _colorize import default_theme
@@ -18,6 +18,7 @@
1818
colors = {overrides.get(k, k[0].lower()): v for k, v in default_theme.repl.items()}
1919

2020

21+
@force_not_colorized_test_class
2122
class TestReader(ScreenEqualMixin, TestCase):
2223
def test_calc_screen_wrap_simple(self):
2324
events = code_to_events(10 * "a")
@@ -127,13 +128,6 @@ def test_setpos_for_xy_simple(self):
127128
reader.setpos_from_xy(0, 0)
128129
self.assertEqual(reader.pos, 0)
129130

130-
def test_control_characters(self):
131-
code = 'flag = "🏳️‍🌈"'
132-
events = code_to_events(code)
133-
reader, _ = handle_all_events(events, prepare_reader=reader_force_colors)
134-
self.assert_screen_equal(reader, 'flag = "🏳️\\u200d🌈"', clean=True)
135-
self.assert_screen_equal(reader, 'flag {o}={z} {s}"🏳️\\u200d🌈"{z}'.format(**colors))
136-
137131
def test_setpos_from_xy_multiple_lines(self):
138132
# fmt: off
139133
code = (
@@ -364,6 +358,8 @@ def test_setpos_from_xy_for_non_printing_char(self):
364358
reader.setpos_from_xy(8, 0)
365359
self.assertEqual(reader.pos, 7)
366360

361+
@force_colorized_test_class
362+
class TestReaderInColor(ScreenEqualMixin, TestCase):
367363
def test_syntax_highlighting_basic(self):
368364
code = dedent(
369365
"""\
@@ -403,7 +399,7 @@ def funct(case: str = sys.platform) -> None:
403399
)
404400
expected_sync = expected.format(a="", **colors)
405401
events = code_to_events(code)
406-
reader, _ = handle_all_events(events, prepare_reader=reader_force_colors)
402+
reader, _ = handle_all_events(events)
407403
self.assert_screen_equal(reader, code, clean=True)
408404
self.assert_screen_equal(reader, expected_sync)
409405
self.assertEqual(reader.pos, 2**7 + 2**8)
@@ -416,7 +412,7 @@ def funct(case: str = sys.platform) -> None:
416412
[Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 13,
417413
code_to_events("async "),
418414
)
419-
reader, _ = handle_all_events(more_events, prepare_reader=reader_force_colors)
415+
reader, _ = handle_all_events(more_events)
420416
self.assert_screen_equal(reader, expected_async)
421417
self.assertEqual(reader.pos, 21)
422418
self.assertEqual(reader.cxy, (6, 1))
@@ -433,7 +429,7 @@ def unfinished_function(arg: str = "still typing
433429
"""
434430
).format(**colors)
435431
events = code_to_events(code)
436-
reader, _ = handle_all_events(events, prepare_reader=reader_force_colors)
432+
reader, _ = handle_all_events(events)
437433
self.assert_screen_equal(reader, code, clean=True)
438434
self.assert_screen_equal(reader, expected)
439435

@@ -451,7 +447,7 @@ def unfinished_function(
451447
"""
452448
).format(**colors)
453449
events = code_to_events(code)
454-
reader, _ = handle_all_events(events, prepare_reader=reader_force_colors)
450+
reader, _ = handle_all_events(events)
455451
self.assert_screen_equal(reader, code, clean=True)
456452
self.assert_screen_equal(reader, expected)
457453

@@ -471,7 +467,7 @@ def unfinished_function():
471467
"""
472468
).format(**colors)
473469
events = code_to_events(code)
474-
reader, _ = handle_all_events(events, prepare_reader=reader_force_colors)
470+
reader, _ = handle_all_events(events)
475471
self.assert_screen_equal(reader, code, clean=True)
476472
self.assert_screen_equal(reader, expected)
477473

@@ -497,6 +493,13 @@ def unfinished_function():
497493
"""
498494
).format(OB="{", CB="}", **colors)
499495
events = code_to_events(code)
500-
reader, _ = handle_all_events(events, prepare_reader=reader_force_colors)
496+
reader, _ = handle_all_events(events)
501497
self.assert_screen_equal(reader, code, clean=True)
502498
self.assert_screen_equal(reader, expected)
499+
500+
def test_control_characters(self):
501+
code = 'flag = "🏳️‍🌈"'
502+
events = code_to_events(code)
503+
reader, _ = handle_all_events(events)
504+
self.assert_screen_equal(reader, 'flag = "🏳️\\u200d🌈"', clean=True)
505+
self.assert_screen_equal(reader, 'flag {o}={z} {s}"🏳️\\u200d🌈"{z}'.format(**colors))

Lib/test/test_pyrepl/test_unix_console.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
import sys
44
import unittest
55
from functools import partial
6-
from test.support import os_helper
6+
from test.support import os_helper, force_not_colorized_test_class
7+
78
from unittest import TestCase
89
from unittest.mock import MagicMock, call, patch, ANY
910

10-
from .support import handle_all_events, code_to_events, reader_no_colors
11+
from .support import handle_all_events, code_to_events
1112

1213
try:
1314
from _pyrepl.console import Event
@@ -33,12 +34,10 @@ def unix_console(events, **kwargs):
3334

3435
handle_events_unix_console = partial(
3536
handle_all_events,
36-
prepare_reader=reader_no_colors,
3737
prepare_console=unix_console,
3838
)
3939
handle_events_narrow_unix_console = partial(
4040
handle_all_events,
41-
prepare_reader=reader_no_colors,
4241
prepare_console=partial(unix_console, width=5),
4342
)
4443
handle_events_short_unix_console = partial(
@@ -120,6 +119,7 @@ def unix_console(events, **kwargs):
120119
)
121120
@patch("termios.tcsetattr", lambda a, b, c: None)
122121
@patch("os.write")
122+
@force_not_colorized_test_class
123123
class TestConsole(TestCase):
124124
def test_simple_addition(self, _os_write):
125125
code = "12+34"
@@ -255,9 +255,7 @@ def test_resize_bigger_on_multiline_function(self, _os_write):
255255
# fmt: on
256256

257257
events = itertools.chain(code_to_events(code))
258-
reader, console = handle_events_short_unix_console(
259-
events, prepare_reader=reader_no_colors
260-
)
258+
reader, console = handle_events_short_unix_console(events)
261259

262260
console.height = 2
263261
console.getheightwidth = MagicMock(lambda _: (2, 80))

Lib/test/test_pyrepl/test_windows_console.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77

88
import itertools
99
from functools import partial
10+
from test.support import force_not_colorized_test_class
1011
from typing import Iterable
1112
from unittest import TestCase
1213
from unittest.mock import MagicMock, call
1314

1415
from .support import handle_all_events, code_to_events
15-
from .support import reader_no_colors as default_prepare_reader
16+
from .support import prepare_reader as default_prepare_reader
1617

1718
try:
1819
from _pyrepl.console import Event, Console
@@ -28,6 +29,7 @@
2829
pass
2930

3031

32+
@force_not_colorized_test_class
3133
class WindowsConsoleTests(TestCase):
3234
def console(self, events, **kwargs) -> Console:
3335
console = WindowsConsole()

0 commit comments

Comments
 (0)