147 lines
4.1 KiB
Python
147 lines
4.1 KiB
Python
import pytest
|
|
from unittest.mock import Mock
|
|
|
|
from fenrirscreenreader.core.eventData import FenrirEventType
|
|
from fenrirscreenreader.screenDriver.ptyDriver import PTYConstants
|
|
from fenrirscreenreader.screenDriver.ptyDriver import Terminal
|
|
from fenrirscreenreader.screenDriver.ptyDriver import driver as PtyDriver
|
|
|
|
|
|
class DummyProcessInput:
|
|
def __init__(self):
|
|
self.data = []
|
|
|
|
def write(self, data):
|
|
self.data.append(data)
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_csi_sequences_with_intermediate_characters_do_not_render_final_byte():
|
|
terminal = Terminal(10, 3, DummyProcessInput())
|
|
|
|
terminal.feed(b"\x1b[2026$p\x1b[2048$pX")
|
|
screen = terminal.get_screen_content()
|
|
|
|
assert screen["text"].splitlines()[0] == "X "
|
|
assert "p" not in screen["text"]
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_private_sgr_sequence_from_fullscreen_apps_does_not_crash():
|
|
terminal = Terminal(10, 3, DummyProcessInput())
|
|
|
|
terminal.feed(b"\x1b[?25;7mX")
|
|
screen = terminal.get_screen_content()
|
|
|
|
assert screen["text"].splitlines()[0] == "X "
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_optional_float_setting_uses_default_when_missing():
|
|
settings_manager = type(
|
|
"SettingsManager",
|
|
(),
|
|
{"get_setting": lambda self, section, setting: ""},
|
|
)()
|
|
pty_driver = PtyDriver()
|
|
|
|
assert (
|
|
pty_driver._get_optional_float_setting(
|
|
settings_manager,
|
|
"screen",
|
|
"ptyOutputTimeout",
|
|
PTYConstants.OUTPUT_READ_TIMEOUT,
|
|
)
|
|
== PTYConstants.OUTPUT_READ_TIMEOUT
|
|
)
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_pty_stdin_input_interrupts_output_when_all_keys_interrupt_enabled():
|
|
pty_driver = PtyDriver()
|
|
settings_manager = Mock()
|
|
settings_manager.get_setting_as_bool.return_value = True
|
|
settings_manager.get_setting.return_value = ""
|
|
output_manager = Mock()
|
|
pty_driver.env = {
|
|
"runtime": {
|
|
"SettingsManager": settings_manager,
|
|
"OutputManager": output_manager,
|
|
}
|
|
}
|
|
|
|
pty_driver.interrupt_output_on_stdin_input(b"a")
|
|
|
|
output_manager.interrupt_output.assert_called_once_with()
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_pty_stdin_input_honors_interrupt_disabled():
|
|
pty_driver = PtyDriver()
|
|
settings_manager = Mock()
|
|
settings_manager.get_setting_as_bool.return_value = False
|
|
output_manager = Mock()
|
|
pty_driver.env = {
|
|
"runtime": {
|
|
"SettingsManager": settings_manager,
|
|
"OutputManager": output_manager,
|
|
}
|
|
}
|
|
|
|
pty_driver.interrupt_output_on_stdin_input(b"a")
|
|
|
|
output_manager.interrupt_output.assert_not_called()
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_pty_stdin_input_leaves_filtered_interrupts_to_key_events():
|
|
pty_driver = PtyDriver()
|
|
settings_manager = Mock()
|
|
settings_manager.get_setting_as_bool.return_value = True
|
|
settings_manager.get_setting.return_value = "KEY_ENTER"
|
|
output_manager = Mock()
|
|
pty_driver.env = {
|
|
"runtime": {
|
|
"SettingsManager": settings_manager,
|
|
"OutputManager": output_manager,
|
|
}
|
|
}
|
|
|
|
pty_driver.interrupt_output_on_stdin_input(b"a")
|
|
|
|
output_manager.interrupt_output.assert_not_called()
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_pty_backspace_with_fenrir_key_synthesizes_shortcut_events():
|
|
pty_driver = PtyDriver()
|
|
event_queue = Mock()
|
|
pty_driver.env = {
|
|
"input": {"curr_input": ["KEY_FENRIR"]},
|
|
}
|
|
|
|
handled = pty_driver.synthesize_backspace_shortcut(b"\x7f", event_queue)
|
|
|
|
assert handled is True
|
|
assert event_queue.put.call_count == 2
|
|
first_event = event_queue.put.call_args_list[0].args[0]
|
|
second_event = event_queue.put.call_args_list[1].args[0]
|
|
assert first_event["Type"] == FenrirEventType.keyboard_input
|
|
assert first_event["data"]["event_name"] == "KEY_BACKSPACE"
|
|
assert first_event["data"]["event_state"] == 1
|
|
assert second_event["data"]["event_state"] == 0
|
|
|
|
|
|
@pytest.mark.unit
|
|
def test_pty_plain_backspace_is_not_synthesized():
|
|
pty_driver = PtyDriver()
|
|
event_queue = Mock()
|
|
pty_driver.env = {
|
|
"input": {"curr_input": []},
|
|
}
|
|
|
|
handled = pty_driver.synthesize_backspace_shortcut(b"\x7f", event_queue)
|
|
|
|
assert handled is False
|
|
event_queue.put.assert_not_called()
|