From 132aa8e91807ebf9a7c917130615c0ed5a808cb6 Mon Sep 17 00:00:00 2001 From: Edern Deneuville Date: Sat, 12 Sep 2026 12:19:47 +0200 Subject: [PATCH] Test per-key LaTeX typing --- tests/test_key_stepper.py | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/tests/test_key_stepper.py b/tests/test_key_stepper.py index cf531d8..3b9579b 100644 --- a/tests/test_key_stepper.py +++ b/tests/test_key_stepper.py @@ -3,7 +3,7 @@ from types import SimpleNamespace from ai_typewriter.key_stepper import KeyStepper -def test_start_types_first_character_immediately_then_hooks_remaining(monkeypatch): +def test_start_installs_hook_without_typing_immediately(monkeypatch): typed = [] hooked = [] @@ -13,37 +13,57 @@ def test_start_types_first_character_immediately_then_hooks_remaining(monkeypatc stepper = KeyStepper("abc") stepper.start() - assert typed == ["a"] + assert typed == [] assert hooked and hooked[0][1] is True - assert stepper.remaining_characters == 2 + assert stepper.remaining_characters == 3 -def test_single_character_response_does_not_install_hook(monkeypatch): +def test_single_character_response_waits_for_key_then_unhooks(monkeypatch): typed = [] - hooks = [] + hook = {} + unhooked = [] monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.write", lambda char, delay=0, exact=True: typed.append(char)) - monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.hook", lambda callback, suppress=True: hooks.append(callback)) + monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.hook", lambda callback, suppress=True: hook.update({"callback": callback}) or "hook") + monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.unhook", lambda value: unhooked.append(value)) stepper = KeyStepper("x") stepper.start() + hook["callback"](SimpleNamespace(event_type="down")) assert typed == ["x"] - assert hooks == [] + assert unhooked == ["hook"] assert stepper.remaining_characters == 0 -def test_key_down_types_next_character_after_auto_first(monkeypatch): +def test_each_key_down_types_next_character(monkeypatch): typed = [] hook = {} monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.write", lambda char, delay=0, exact=True: typed.append(char)) - monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.hook", lambda callback, suppress=True: hook.setdefault("callback", callback) or "hook") + monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.hook", lambda callback, suppress=True: hook.update({"callback": callback}) or "hook") monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.unhook", lambda value: None) stepper = KeyStepper("ab") stepper.start() hook["callback"](SimpleNamespace(event_type="down")) + hook["callback"](SimpleNamespace(event_type="down")) assert typed == ["a", "b"] assert stepper.remaining_characters == 0 + + +def test_latex_markers_are_typed_literally_character_by_character(monkeypatch): + typed = [] + hook = {} + + monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.write", lambda char, delay=0, exact=True: typed.append(char)) + monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.hook", lambda callback, suppress=True: hook.update({"callback": callback}) or "hook") + monkeypatch.setattr("ai_typewriter.key_stepper.keyboard.unhook", lambda value: None) + + stepper = KeyStepper(r"[EQ]\frac{a}{b}[/EQ]") + stepper.start() + for _ in range(len(stepper.text)): + hook["callback"](SimpleNamespace(event_type="down")) + + assert "".join(typed) == r"[EQ]\frac{a}{b}[/EQ]"