"""Tests for the assistant mode state machine.""" from stt_daemon.assistant.modes import Mode, ModeMachine def test_initial_mode_is_idle(): assert ModeMachine().mode is Mode.IDLE def test_arm_execute_finish_cycle(): machine = ModeMachine() assert machine.arm() is True assert machine.mode is Mode.COMMAND_ARMED assert machine.execute() is True assert machine.mode is Mode.EXECUTING assert machine.finish() is True assert machine.mode is Mode.IDLE def test_cancel_from_armed_returns_to_idle(): machine = ModeMachine() machine.arm() assert machine.cancel() is True assert machine.mode is Mode.IDLE def test_chat_enter_exit_cycle(): machine = ModeMachine() assert machine.enter_chat() is True assert machine.mode is Mode.CHAT assert machine.exit_chat() is True assert machine.mode is Mode.IDLE def test_cannot_enter_chat_while_command_active(): machine = ModeMachine() machine.arm() assert machine.enter_chat() is False assert machine.mode is Mode.COMMAND_ARMED machine.execute() assert machine.enter_chat() is False assert machine.mode is Mode.EXECUTING def test_cannot_arm_while_in_chat(): machine = ModeMachine() machine.enter_chat() assert machine.arm() is False assert machine.mode is Mode.CHAT def test_refusals_leave_mode_unchanged(): machine = ModeMachine() assert machine.execute() is False assert machine.cancel() is False assert machine.finish() is False assert machine.exit_chat() is False assert machine.mode is Mode.IDLE def test_command_active_property(): machine = ModeMachine() assert machine.command_active is False machine.arm() assert machine.command_active is True machine.execute() assert machine.command_active is True machine.finish() assert machine.command_active is False machine.enter_chat() assert machine.command_active is False