Add various additional tests around XTermParser

This commit is contained in:
Darren Burns
2022-06-09 17:29:20 +01:00
parent bfb962bacf
commit 763c0d0a75

View File

@@ -3,7 +3,9 @@ from unittest import mock
import pytest import pytest
from textual._xterm_parser import XTermParser from textual._xterm_parser import XTermParser
from textual.events import Paste, Key, MouseDown, MouseUp, MouseMove from textual.events import Paste, Key, MouseDown, MouseUp, MouseMove, MouseScrollDown, \
MouseScrollUp
from textual.messages import TerminalSupportsSynchronizedOutput
@pytest.fixture @pytest.fixture
@@ -38,6 +40,15 @@ def test_bracketed_paste_content_contains_escape_codes(parser):
assert events[0].text == pasted_text assert events[0].text == pasted_text
def test_bracketed_paste_amongst_other_codes(parser):
pasted_text = "PASTED"
events = list(parser.feed(f"\x1b[8~\x1b[200~{pasted_text}\x1b[201~\x1b[8~"))
assert len(events) == 3 # Key.End -> Paste -> Key.End
assert events[0].key == "end"
assert events[1].text == pasted_text
assert events[2].key == "end"
def test_cant_match_escape_sequence_too_long(parser): def test_cant_match_escape_sequence_too_long(parser):
""" The sequence did not match, and we hit the maximum sequence search """ The sequence did not match, and we hit the maximum sequence search
length threshold, so each character should be issued as a key-press instead. length threshold, so each character should be issued as a key-press instead.
@@ -134,8 +145,8 @@ def test_mouse_click(parser, sequence, event_type, shift, meta):
@pytest.mark.parametrize("sequence, shift, meta, button", [ @pytest.mark.parametrize("sequence, shift, meta, button", [
("\x1b[<32;15;38M", False, False, 1), # Click and drag ("\x1b[<32;15;38M", False, False, 1), # Click and drag
("\x1b[<35;15;38M", False, False, 0), # Basic cursor movement ("\x1b[<35;15;38M", False, False, 0), # Basic cursor movement
("\x1b[<39;15;38M", True, False, 0), # Shift held down ("\x1b[<39;15;38M", True, False, 0), # Shift held down
("\x1b[<43;15;38M", False, True, 0), # Meta held down ("\x1b[<43;15;38M", False, True, 0), # Meta held down
]) ])
def test_mouse_move(parser, sequence, shift, meta, button): def test_mouse_move(parser, sequence, shift, meta, button):
events = list(parser.feed(sequence)) events = list(parser.feed(sequence))
@@ -152,9 +163,60 @@ def test_mouse_move(parser, sequence, shift, meta, button):
assert event.button == button assert event.button == button
@pytest.mark.parametrize("sequence", [
"\x1b[<64;18;25M",
"\x1b[<68;18;25M",
"\x1b[<72;18;25M",
])
def test_mouse_scroll_down(parser, sequence):
"""Scrolling the mouse with and without modifiers held down.
We don't currently capture modifier keys in scroll events.
"""
events = list(parser.feed(sequence))
assert len(events) == 1
event = events[0]
assert isinstance(event, MouseScrollDown)
assert event.x == 17
assert event.y == 24
@pytest.mark.parametrize("sequence, shift, meta", [
("\x1b[<65;18;25M", False, False),
("\x1b[<69;18;25M", True, False),
("\x1b[<73;18;25M", False, True),
])
def test_mouse_scroll_up(parser, sequence, shift, meta):
events = list(parser.feed(sequence))
assert len(events) == 1
event = events[0]
assert isinstance(event, MouseScrollUp)
assert event.x == 17
assert event.y == 24
def test_escape_sequence_resulting_in_multiple_keypresses(parser): def test_escape_sequence_resulting_in_multiple_keypresses(parser):
"""Some sequences are interpreted as more than 1 keypress""" """Some sequences are interpreted as more than 1 keypress"""
events = list(parser.feed("\x1b[2;4~")) events = list(parser.feed("\x1b[2;4~"))
assert len(events) == 2 assert len(events) == 2
assert events[0].key == "escape" assert events[0].key == "escape"
assert events[1].key == "shift+insert" assert events[1].key == "shift+insert"
def test_terminal_mode_reporting_synchronized_output_supported(parser):
sequence = "\x1b[?2026;1$y"
events = list(parser.feed(sequence))
assert len(events) == 1
assert isinstance(events[0], TerminalSupportsSynchronizedOutput)
assert events[0].sender == mock.sentinel
def test_terminal_mode_reporting_synchronized_output_not_supported(parser):
sequence = "\x1b[?2026;0$y"
events = list(parser.feed(sequence))
assert events == []