from pocketbook.app import ToggleStateMachine, EscapeStateMachine, navigate class TestToggleStateMachine: def test_initial_state_visible(self): sm = ToggleStateMachine(start_hidden=False) assert sm.visible is True def test_initial_state_hidden(self): sm = ToggleStateMachine(start_hidden=True) assert sm.visible is False def test_toggle_alternates(self): sm = ToggleStateMachine(start_hidden=False) assert sm.visible is True sm.toggle() assert sm.visible is False sm.toggle() assert sm.visible is True def test_toggle_from_hidden(self): sm = ToggleStateMachine(start_hidden=True) assert sm.visible is False sm.toggle() assert sm.visible is True sm.toggle() assert sm.visible is False class TestEscapeStateMachine: def test_escape_while_editing_returns_exit_edit(self): esc = EscapeStateMachine() toggle = ToggleStateMachine(start_hidden=False) action = esc.escape(is_editing=True, toggle=toggle) assert action == "exit_edit" # Toggle state should not change assert toggle.visible is True def test_escape_while_browsing_returns_hide(self): esc = EscapeStateMachine() toggle = ToggleStateMachine(start_hidden=False) action = esc.escape(is_editing=False, toggle=toggle) assert action == "hide" assert toggle.visible is False def test_escape_edit_then_browse_hides(self): """Simulates: editing → Escape (exit edit) → Escape (hide).""" esc = EscapeStateMachine() toggle = ToggleStateMachine(start_hidden=False) # First escape: exit edit mode action1 = esc.escape(is_editing=True, toggle=toggle) assert action1 == "exit_edit" assert toggle.visible is True # Second escape: now in browse mode, hide panel action2 = esc.escape(is_editing=False, toggle=toggle) assert action2 == "hide" assert toggle.visible is False def test_escape_hide_does_not_change_when_already_hidden(self): esc = EscapeStateMachine() toggle = ToggleStateMachine(start_hidden=True) assert toggle.visible is False action = esc.escape(is_editing=False, toggle=toggle) assert action == "hide" # Toggled again — now visible (edge case if called when hidden) assert toggle.visible is True class TestNavigate: def test_no_notes(self): assert navigate(None, 0, 1) is None assert navigate(None, 0, -1) is None def test_no_focus_next_goes_to_first(self): assert navigate(None, 3, 1) == 0 def test_no_focus_prev_goes_to_last(self): assert navigate(None, 3, -1) == 2 def test_next_from_middle(self): assert navigate(1, 3, 1) == 2 def test_prev_from_middle(self): assert navigate(1, 3, -1) == 0 def test_next_clamps_at_end(self): assert navigate(2, 3, 1) == 2 def test_prev_clamps_at_start(self): assert navigate(0, 3, -1) == 0 def test_single_note(self): assert navigate(0, 1, 1) == 0 assert navigate(0, 1, -1) == 0