Skip to content

Commit d3e358d

Browse files
committed
Add tests for multiline editing
1 parent 0a8a1e3 commit d3e358d

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

Lib/test/test_pyrepl/test_reader.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,6 +1306,102 @@ def test_X_delete_char_before(self):
13061306
self.assertEqual(reader.get_unicode(), "helo")
13071307
self.assertEqual(reader.vi_mode, ViMode.NORMAL)
13081308

1309+
def test_dd_deletes_current_line(self):
1310+
events = itertools.chain(
1311+
code_to_events("first"),
1312+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1313+
code_to_events("second"),
1314+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1315+
code_to_events("third"),
1316+
[
1317+
Event(evt="key", data="\x1b", raw=bytearray(b"\x1b")), # ESC
1318+
Event(evt="key", data="k", raw=bytearray(b"k")), # up to second
1319+
Event(evt="key", data="d", raw=bytearray(b"d")), # dd
1320+
Event(evt="key", data="d", raw=bytearray(b"d")),
1321+
],
1322+
)
1323+
reader, _ = self._run_vi(events)
1324+
self.assertEqual(reader.get_unicode(), "first\n\nthird")
1325+
1326+
def test_j_k_navigation_between_lines(self):
1327+
events = itertools.chain(
1328+
code_to_events("short"),
1329+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1330+
code_to_events("longer line"),
1331+
[
1332+
Event(evt="key", data="\x1b", raw=bytearray(b"\x1b")), # ESC
1333+
Event(evt="key", data="k", raw=bytearray(b"k")), # up
1334+
Event(evt="key", data="$", raw=bytearray(b"$")), # end of line
1335+
Event(evt="key", data="j", raw=bytearray(b"j")), # down
1336+
],
1337+
)
1338+
reader, _ = self._run_vi(events)
1339+
self.assertEqual(reader.get_unicode(), "short\nlonger line")
1340+
# Cursor should be somewhere on second line
1341+
self.assertGreater(reader.pos, 6) # past the newline
1342+
1343+
def test_dollar_stops_at_line_end(self):
1344+
events = itertools.chain(
1345+
code_to_events("first"),
1346+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1347+
code_to_events("second"),
1348+
[
1349+
Event(evt="key", data="\x1b", raw=bytearray(b"\x1b")), # ESC
1350+
Event(evt="key", data="k", raw=bytearray(b"k")), # up to first
1351+
Event(evt="key", data="0", raw=bytearray(b"0")), # BOL
1352+
Event(evt="key", data="$", raw=bytearray(b"$")), # EOL
1353+
],
1354+
)
1355+
reader, _ = self._run_vi(events)
1356+
# $ should stop at end of "first", not go to newline or beyond
1357+
self.assertEqual(reader.pos, 4) # 'first'[4] = 't'
1358+
1359+
def test_zero_goes_to_line_start(self):
1360+
events = itertools.chain(
1361+
code_to_events("first"),
1362+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1363+
code_to_events("second"),
1364+
[
1365+
Event(evt="key", data="\x1b", raw=bytearray(b"\x1b")), # ESC
1366+
Event(evt="key", data="0", raw=bytearray(b"0")), # BOL of second
1367+
],
1368+
)
1369+
reader, _ = self._run_vi(events)
1370+
# 0 should go to start of "second" line (position 6)
1371+
self.assertEqual(reader.pos, 6)
1372+
1373+
def test_o_opens_line_below(self):
1374+
events = itertools.chain(
1375+
code_to_events("first"),
1376+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1377+
code_to_events("third"),
1378+
[
1379+
Event(evt="key", data="\x1b", raw=bytearray(b"\x1b")), # ESC
1380+
Event(evt="key", data="k", raw=bytearray(b"k")), # up to first
1381+
Event(evt="key", data="o", raw=bytearray(b"o")), # open below
1382+
],
1383+
code_to_events("second"),
1384+
)
1385+
reader, _ = self._run_vi(events)
1386+
self.assertEqual(reader.get_unicode(), "first\nsecond\nthird")
1387+
self.assertEqual(reader.vi_mode, ViMode.INSERT)
1388+
1389+
def test_w_motion_crosses_lines(self):
1390+
events = itertools.chain(
1391+
code_to_events("end"),
1392+
[Event(evt="key", data="\n", raw=bytearray(b"\n"))],
1393+
code_to_events("start"),
1394+
[
1395+
Event(evt="key", data="\x1b", raw=bytearray(b"\x1b")), # ESC
1396+
Event(evt="key", data="k", raw=bytearray(b"k")), # up
1397+
Event(evt="key", data="$", raw=bytearray(b"$")), # end of "end"
1398+
Event(evt="key", data="w", raw=bytearray(b"w")), # word forward
1399+
],
1400+
)
1401+
reader, _ = self._run_vi(events)
1402+
# w from end of first line should go to start of "start"
1403+
self.assertEqual(reader.pos, 4) # position of 's' in "start"
1404+
13091405

13101406
@force_not_colorized_test_class
13111407
class TestHistoricalReaderBindings(TestCase):

0 commit comments

Comments
 (0)