diff --git a/tests/test_history.py b/tests/test_history.py new file mode 100644 index 0000000..a4139fe --- /dev/null +++ b/tests/test_history.py @@ -0,0 +1,94 @@ +"""Tests for InputHistory.""" + +from tuimble.app import InputHistory + + +def test_empty_history_up_returns_none(): + h = InputHistory() + assert h.up("current") is None + + +def test_empty_history_down_returns_none(): + h = InputHistory() + assert h.down() is None + + +def test_push_then_up_returns_last(): + h = InputHistory() + h.push("hello") + assert h.up("draft") == "hello" + + +def test_up_twice_with_single_entry_stays(): + h = InputHistory() + h.push("one") + assert h.up("draft") == "one" + assert h.up("draft") == "one" # no older entry, stays put + + +def test_up_navigates_backwards(): + h = InputHistory() + h.push("first") + h.push("second") + h.push("third") + assert h.up("draft") == "third" + assert h.up("draft") == "second" + assert h.up("draft") == "first" + assert h.up("draft") == "first" # clamped at oldest + + +def test_down_navigates_forward(): + h = InputHistory() + h.push("first") + h.push("second") + h.push("third") + h.up("draft") # -> third + h.up("draft") # -> second + assert h.down() == "third" + + +def test_down_past_end_restores_draft(): + h = InputHistory() + h.push("one") + h.up("my draft") # -> one + result = h.down() # -> back to draft + assert result == "my draft" + + +def test_down_without_prior_up_returns_none(): + h = InputHistory() + h.push("one") + assert h.down() is None + + +def test_push_resets_navigation(): + h = InputHistory() + h.push("first") + h.up("draft") # -> first + h.push("second") + # After push, navigation resets -- up should go to newest + assert h.up("new draft") == "second" + + +def test_up_preserves_current_as_draft(): + """First up() saves current input; down past end restores it.""" + h = InputHistory() + h.push("old") + h.up("typing in progress") + assert h.down() == "typing in progress" + + +def test_full_cycle(): + """Push several, navigate to oldest, then back to draft.""" + h = InputHistory() + h.push("a") + h.push("b") + h.push("c") + + assert h.up("draft") == "c" + assert h.up("draft") == "b" + assert h.up("draft") == "a" + assert h.down() == "b" + assert h.down() == "c" + assert h.down() == "draft" + assert h.down() is None # already at draft