import unittest

from edge.state_machine import Event, InvalidTransition, PatrolStateMachine, State


class PatrolStateMachineTest(unittest.TestCase):
    def test_nominal_patrol_returns_to_idle(self) -> None:
        machine = PatrolStateMachine()
        for event in (
            Event.START_PATROL,
            Event.ENTERED_ROUTE,
            Event.PATROL_COMPLETED,
            Event.RETURNED_HOME,
        ):
            machine = machine.dispatch(event)
        self.assertEqual(machine.state, State.IDLE)

    def test_abort_during_enter_returns_home(self) -> None:
        machine = PatrolStateMachine().dispatch(Event.START_PATROL)
        self.assertEqual(machine.dispatch(Event.ABORT).state, State.RETURN)

    def test_safety_timeout_enters_fault(self) -> None:
        machine = PatrolStateMachine().dispatch(Event.START_PATROL).dispatch(Event.ENTERED_ROUTE)
        self.assertEqual(machine.dispatch(Event.SAFETY_TIMEOUT).state, State.FAULT)

    def test_invalid_transition_is_rejected(self) -> None:
        with self.assertRaises(InvalidTransition):
            PatrolStateMachine().dispatch(Event.RETURNED_HOME)


if __name__ == "__main__":
    unittest.main()
