Skip to content

Commit a96eea4

Browse files
committed
Refactor tests
1 parent b83d282 commit a96eea4

4 files changed

Lines changed: 126 additions & 79 deletions

File tree

Lib/test/test_pyrepl/support.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,24 @@
66
from _pyrepl.console import Console, Event
77
from _pyrepl.readline import ReadlineAlikeReader, ReadlineConfig
88
from _pyrepl.simple_interact import _strip_final_indent
9+
from _pyrepl.utils import unbracket, ANSI_ESCAPE_SEQUENCE
10+
11+
12+
class ScreenEqualMixin:
13+
def assert_screen_equal(
14+
self, reader: ReadlineAlikeReader, expected: str, clean: bool = False
15+
):
16+
actual = clean_screen(reader) if clean else reader.screen
17+
expected = expected.split("\n")
18+
self.assertListEqual(actual, expected)
919

1020

1121
def multiline_input(reader: ReadlineAlikeReader, namespace: dict | None = None):
1222
saved = reader.more_lines
1323
try:
1424
reader.more_lines = partial(more_lines, namespace=namespace)
15-
reader.ps1 = reader.ps2 = ">>>"
16-
reader.ps3 = reader.ps4 = "..."
25+
reader.ps1 = reader.ps2 = ">>> "
26+
reader.ps3 = reader.ps4 = "... "
1727
return reader.readline()
1828
finally:
1929
reader.more_lines = saved
@@ -38,18 +48,22 @@ def code_to_events(code: str):
3848
yield Event(evt="key", data=c, raw=bytearray(c.encode("utf-8")))
3949

4050

41-
def clean_screen(screen: Iterable[str]):
51+
def clean_screen(reader: ReadlineAlikeReader) -> list[str]:
4252
"""Cleans color and console characters out of a screen output.
4353
4454
This is useful for screen testing, it increases the test readability since
4555
it strips out all the unreadable side of the screen.
4656
"""
4757
output = []
48-
for line in screen:
49-
if line.startswith(">>>") or line.startswith("..."):
50-
line = line[3:]
58+
for line in reader.screen:
59+
line = unbracket(line, including_content=True)
60+
line = ANSI_ESCAPE_SEQUENCE.sub("", line)
61+
for prefix in (reader.ps1, reader.ps2, reader.ps3, reader.ps4):
62+
if line.startswith(prefix):
63+
line = line[len(prefix):]
64+
break
5165
output.append(line)
52-
return "\n".join(output).strip()
66+
return output
5367

5468

5569
def prepare_reader(console: Console, **kwargs):
@@ -99,6 +113,9 @@ def handle_all_events(
99113
prepare_console=partial(prepare_console, width=10),
100114
)
101115

116+
reader_no_colors = partial(prepare_reader, can_colorize=False)
117+
reader_force_colors = partial(prepare_reader, can_colorize=True)
118+
102119

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

Lib/test/test_pyrepl/test_pyrepl.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717

1818
from .support import (
1919
FakeConsole,
20+
ScreenEqualMixin,
2021
handle_all_events,
2122
handle_events_narrow_console,
2223
more_lines,
2324
multiline_input,
2425
code_to_events,
25-
clean_screen,
2626
)
2727
from _pyrepl.console import Event
2828
from _pyrepl.readline import (ReadlineAlikeReader, ReadlineConfig,
@@ -587,7 +587,7 @@ def test_auto_indent_ignore_comments(self):
587587
self.assertEqual(output, output_code)
588588

589589

590-
class TestPyReplOutput(TestCase):
590+
class TestPyReplOutput(ScreenEqualMixin, TestCase):
591591
def prepare_reader(self, events):
592592
console = FakeConsole(events)
593593
config = ReadlineConfig(readline_completer=None)
@@ -620,7 +620,7 @@ def test_basic(self):
620620

621621
output = multiline_input(reader)
622622
self.assertEqual(output, "1+1")
623-
self.assertEqual(clean_screen(reader.screen), "1+1")
623+
self.assert_screen_equal(reader, "1+1", clean=True)
624624

625625
def test_get_line_buffer_returns_str(self):
626626
reader = self.prepare_reader(code_to_events("\n"))
@@ -654,11 +654,13 @@ def test_multiline_edit(self):
654654
reader = self.prepare_reader(events)
655655

656656
output = multiline_input(reader)
657-
self.assertEqual(output, "def f():\n ...\n ")
658-
self.assertEqual(clean_screen(reader.screen), "def f():\n ...")
657+
expected = "def f():\n ...\n "
658+
self.assertEqual(output, expected)
659+
self.assert_screen_equal(reader, expected, clean=True)
659660
output = multiline_input(reader)
660-
self.assertEqual(output, "def g():\n pass\n ")
661-
self.assertEqual(clean_screen(reader.screen), "def g():\n pass")
661+
expected = "def g():\n pass\n "
662+
self.assertEqual(output, expected)
663+
self.assert_screen_equal(reader, expected, clean=True)
662664

663665
def test_history_navigation_with_up_arrow(self):
664666
events = itertools.chain(
@@ -677,16 +679,16 @@ def test_history_navigation_with_up_arrow(self):
677679

678680
output = multiline_input(reader)
679681
self.assertEqual(output, "1+1")
680-
self.assertEqual(clean_screen(reader.screen), "1+1")
682+
self.assert_screen_equal(reader, "1+1", clean=True)
681683
output = multiline_input(reader)
682684
self.assertEqual(output, "2+2")
683-
self.assertEqual(clean_screen(reader.screen), "2+2")
685+
self.assert_screen_equal(reader, "2+2", clean=True)
684686
output = multiline_input(reader)
685687
self.assertEqual(output, "2+2")
686-
self.assertEqual(clean_screen(reader.screen), "2+2")
688+
self.assert_screen_equal(reader, "2+2", clean=True)
687689
output = multiline_input(reader)
688690
self.assertEqual(output, "1+1")
689-
self.assertEqual(clean_screen(reader.screen), "1+1")
691+
self.assert_screen_equal(reader, "1+1", clean=True)
690692

691693
def test_history_with_multiline_entries(self):
692694
code = "def foo():\nx = 1\ny = 2\nz = 3\n\ndef bar():\nreturn 42\n\n"
@@ -705,11 +707,9 @@ def test_history_with_multiline_entries(self):
705707
output = multiline_input(reader)
706708
output = multiline_input(reader)
707709
output = multiline_input(reader)
708-
self.assertEqual(
709-
clean_screen(reader.screen),
710-
'def foo():\n x = 1\n y = 2\n z = 3'
711-
)
712-
self.assertEqual(output, "def foo():\n x = 1\n y = 2\n z = 3\n ")
710+
expected = "def foo():\n x = 1\n y = 2\n z = 3\n "
711+
self.assert_screen_equal(reader, expected, clean=True)
712+
self.assertEqual(output, expected)
713713

714714

715715
def test_history_navigation_with_down_arrow(self):
@@ -728,7 +728,7 @@ def test_history_navigation_with_down_arrow(self):
728728

729729
output = multiline_input(reader)
730730
self.assertEqual(output, "1+1")
731-
self.assertEqual(clean_screen(reader.screen), "1+1")
731+
self.assert_screen_equal(reader, "1+1", clean=True)
732732

733733
def test_history_search(self):
734734
events = itertools.chain(
@@ -745,23 +745,23 @@ def test_history_search(self):
745745

746746
output = multiline_input(reader)
747747
self.assertEqual(output, "1+1")
748-
self.assertEqual(clean_screen(reader.screen), "1+1")
748+
self.assert_screen_equal(reader, "1+1", clean=True)
749749
output = multiline_input(reader)
750750
self.assertEqual(output, "2+2")
751-
self.assertEqual(clean_screen(reader.screen), "2+2")
751+
self.assert_screen_equal(reader, "2+2", clean=True)
752752
output = multiline_input(reader)
753753
self.assertEqual(output, "3+3")
754-
self.assertEqual(clean_screen(reader.screen), "3+3")
754+
self.assert_screen_equal(reader, "3+3", clean=True)
755755
output = multiline_input(reader)
756756
self.assertEqual(output, "1+1")
757-
self.assertEqual(clean_screen(reader.screen), "1+1")
757+
self.assert_screen_equal(reader, "1+1", clean=True)
758758

759759
def test_control_character(self):
760760
events = code_to_events("c\x1d\n")
761761
reader = self.prepare_reader(events)
762762
output = multiline_input(reader)
763763
self.assertEqual(output, "c\x1d")
764-
self.assertEqual(clean_screen(reader.screen), "c")
764+
self.assert_screen_equal(reader, "c\x1d", clean=True)
765765

766766
def test_history_search_backward(self):
767767
# Test <page up> history search backward with "imp" input
@@ -781,7 +781,7 @@ def test_history_search_backward(self):
781781
# search for "imp" in history
782782
output = multiline_input(reader)
783783
self.assertEqual(output, "import os")
784-
self.assertEqual(clean_screen(reader.screen), "import os")
784+
self.assert_screen_equal(reader, "import os", clean=True)
785785

786786
def test_history_search_backward_empty(self):
787787
# Test <page up> history search backward with an empty input
@@ -800,7 +800,7 @@ def test_history_search_backward_empty(self):
800800
# search backward in history
801801
output = multiline_input(reader)
802802
self.assertEqual(output, "import os")
803-
self.assertEqual(clean_screen(reader.screen), "import os")
803+
self.assert_screen_equal(reader, "import os", clean=True)
804804

805805

806806
class TestPyReplCompleter(TestCase):

0 commit comments

Comments
 (0)