That does it, I'm breaking out codex on this one. Take that tab completion!

This commit is contained in:
Storm Dragon
2026-05-08 23:38:59 -04:00
parent 42ba3fdad2
commit 0af7d94014
3 changed files with 245 additions and 1 deletions
+122
View File
@@ -1,4 +1,6 @@
import importlib.util
import time
from pathlib import Path
from unittest.mock import Mock
import pytest
@@ -14,6 +16,8 @@ def _build_env(old_text="", cursor=None, screen="pty"):
"event_name": "KEY_TAB",
"event_state": 1,
}
input_manager.get_last_deepest_input.return_value = [["KEY_TAB"]]
input_manager.get_last_input_time.return_value = time.time()
env = {
"runtime": {
"InputManager": input_manager,
@@ -32,6 +36,23 @@ def _build_env(old_text="", cursor=None, screen="pty"):
return manager, env, input_manager
def _load_large_insertion_module():
module_path = (
Path(__file__).resolve().parents[2]
/ "src"
/ "fenrirscreenreader"
/ "commands"
/ "onCursorChange"
/ "55000-large_insertion_echo.py"
)
spec = importlib.util.spec_from_file_location(
"fenrir_large_insertion_echo", module_path
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
def _set_screen_update(env, text, cursor, delta="", typing=False):
env["screen"]["new_content_text"] = text
env["screen"]["new_cursor"] = cursor.copy()
@@ -124,7 +145,108 @@ def test_non_tab_key_does_not_capture():
"event_name": "KEY_A",
"event_state": 1,
}
input_manager.get_last_deepest_input.return_value = [["KEY_A"]]
manager.capture_if_tab()
assert env["commandBuffer"]["tabCompletion"]["pending"] is None
@pytest.mark.unit
def test_recent_tab_screen_update_works_without_key_input_snapshot():
manager, env, input_manager = _build_env(
"cd Documents/".ljust(20), {"x": 13, "y": 0}
)
input_manager.get_last_event.return_value = {
"event_name": "KEY_TAB",
"event_state": 0,
}
env["screen"]["old_content_text"] = "cd Do".ljust(20)
env["screen"]["old_cursor"] = {"x": 5, "y": 0}
env["commandBuffer"]["tabCompletion"]["pending"] = None
_set_screen_update(
env,
"cd Documents/".ljust(20),
{"x": 13, "y": 0},
delta="cuments/",
typing=True,
)
assert manager.process_update() == "cuments/"
@pytest.mark.unit
def test_large_insertion_echo_speaks_pasted_cursor_text():
large_insertion_module = _load_large_insertion_module()
output_manager = Mock(present_text=Mock())
settings_manager = Mock()
settings_manager.get_setting_as_bool.return_value = False
input_manager = Mock()
input_manager.get_last_deepest_input.return_value = []
input_manager.get_last_event.return_value = None
screen_manager = Mock(
is_screen_change=Mock(return_value=False),
is_delta=Mock(return_value=True),
)
env = {
"runtime": {
"InputManager": input_manager,
"OutputManager": output_manager,
"ScreenManager": screen_manager,
"SettingsManager": settings_manager,
},
"screen": {
"old_cursor": {"x": 2, "y": 0},
"new_cursor": {"x": 13, "y": 0},
"new_delta": "hello world",
},
}
command = large_insertion_module.command()
command.initialize(env)
command.run()
output_manager.present_text.assert_called_once_with(
"hello world",
interrupt=True,
announce_capital=True,
flush=False,
)
@pytest.mark.unit
def test_large_insertion_echo_defers_recent_tab_to_tab_completion():
large_insertion_module = _load_large_insertion_module()
output_manager = Mock(present_text=Mock())
settings_manager = Mock()
settings_manager.get_setting_as_bool.return_value = False
input_manager = Mock()
input_manager.get_last_deepest_input.return_value = [["KEY_TAB"]]
input_manager.get_last_event.return_value = {
"event_name": "KEY_TAB",
"event_state": 1,
}
input_manager.get_last_input_time.return_value = time.time()
screen_manager = Mock(
is_screen_change=Mock(return_value=False),
is_delta=Mock(return_value=True),
)
env = {
"runtime": {
"InputManager": input_manager,
"OutputManager": output_manager,
"ScreenManager": screen_manager,
"SettingsManager": settings_manager,
},
"screen": {
"old_cursor": {"x": 5, "y": 0},
"new_cursor": {"x": 13, "y": 0},
"new_delta": "cuments/",
},
}
command = large_insertion_module.command()
command.initialize(env)
command.run()
output_manager.present_text.assert_not_called()