Skip to content

Commit 9e3ebb3

Browse files
committed
Restore deleted Lib/test/test_pyrepl/test_render.py
1 parent 164c692 commit 9e3ebb3

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
from unittest import TestCase
2+
from _pyrepl.render import (
3+
RenderLine,
4+
RenderedScreen,
5+
StyleRef,
6+
diff_render_lines,
7+
render_cells,
8+
)
9+
10+
11+
class TestRenderLine(TestCase):
12+
def test_from_rendered_text_parses_style_state(self):
13+
line = RenderLine.from_rendered_text("\x1b[31ma\x1b[0mb")
14+
15+
self.assertEqual(line.width, 2)
16+
self.assertEqual([cell.text for cell in line.cells], ["a", "b"])
17+
self.assertEqual([cell.style.sgr for cell in line.cells], ["\x1b[31m", ""])
18+
self.assertEqual([cell.controls for cell in line.cells], [(), ()])
19+
20+
def test_from_rendered_text_round_trips_trailing_reset(self):
21+
line = RenderLine.from_rendered_text("\x1b[31ma\x1b[0m")
22+
23+
self.assertEqual([cell.text for cell in line.cells], ["a"])
24+
self.assertEqual([cell.style.sgr for cell in line.cells], ["\x1b[31m"])
25+
self.assertEqual(line.text, "\x1b[31ma\x1b[0m")
26+
27+
def test_from_parts_accepts_style_refs(self):
28+
line = RenderLine.from_parts(
29+
["d", "e", "f", " "],
30+
[1, 1, 1, 1],
31+
[StyleRef.from_sgr("\x1b[1;34m")] * 3 + [None],
32+
)
33+
34+
self.assertEqual([cell.text for cell in line.cells], ["d", "e", "f", " "])
35+
self.assertEqual(
36+
[cell.style.sgr for cell in line.cells],
37+
["\x1b[1;34m", "\x1b[1;34m", "\x1b[1;34m", ""],
38+
)
39+
self.assertEqual(line.text, "\x1b[1;34mdef\x1b[0m ")
40+
41+
42+
class TestLineDiff(TestCase):
43+
def test_diff_render_lines_ignores_unchanged_ansi_prefix(self):
44+
old = RenderLine.from_rendered_text("\x1b[31ma\x1b[0mb")
45+
new = RenderLine.from_rendered_text("\x1b[31ma\x1b[0mc")
46+
47+
diff = diff_render_lines(old, new)
48+
49+
self.assertIsNotNone(diff)
50+
assert diff is not None
51+
self.assertEqual(diff.start_x, 1)
52+
self.assertEqual(diff.old_text, "b")
53+
self.assertEqual(diff.new_text, "c")
54+
55+
def test_diff_render_lines_detects_single_cell_insertion(self):
56+
old = RenderLine.from_rendered_text("ab")
57+
new = RenderLine.from_rendered_text("acb")
58+
59+
diff = diff_render_lines(old, new)
60+
61+
self.assertIsNotNone(diff)
62+
assert diff is not None
63+
self.assertEqual(diff.start_x, 1)
64+
self.assertEqual(diff.old_text, "")
65+
self.assertEqual(diff.new_text, "c")
66+
67+
def test_colored_append_only_emits_new_character_and_reset(self):
68+
old = RenderLine.from_rendered_text("\x1b[1mabc\x1b[0m")
69+
new = RenderLine.from_rendered_text("\x1b[1mabcd\x1b[0m")
70+
71+
diff = diff_render_lines(old, new)
72+
73+
self.assertIsNotNone(diff)
74+
assert diff is not None
75+
self.assertEqual(diff.start_x, 3)
76+
self.assertEqual(render_cells(diff.new_cells), "\x1b[1md\x1b[0m")
77+
78+
def test_keyword_space_inserts_only_space_after_reset(self):
79+
old = RenderLine.from_parts(
80+
["d", "e", "f"],
81+
[1, 1, 1],
82+
["keyword", "keyword", "keyword"],
83+
)
84+
new = RenderLine.from_parts(
85+
["d", "e", "f", " "],
86+
[1, 1, 1, 1],
87+
["keyword", "keyword", "keyword", None],
88+
)
89+
90+
diff = diff_render_lines(old, new)
91+
92+
self.assertIsNotNone(diff)
93+
assert diff is not None
94+
self.assertEqual(diff.start_x, 3)
95+
self.assertEqual(render_cells(diff.new_cells), " ")
96+
97+
def test_rendered_screen_round_trips_screen_lines(self):
98+
screen = RenderedScreen.from_screen_lines(
99+
["a", "\x1b[31mb\x1b[0m"],
100+
(0, 1),
101+
)
102+
103+
self.assertEqual(screen.screen_lines, ("a", "\x1b[31mb\x1b[0m"))

0 commit comments

Comments
 (0)