def test_execute_transition_not_found(self):
     fsm = FSM("off")
     fsm.add_transition("play", "off", "music", "on")
     self.assertRaises(Exception, fsm.execute, "stop")
     self.assertIsNone(fsm.action)
     self.assertIsNone(fsm.prev_state)
     self.assertEqual("off", fsm.current_state)
 def test_execute_transition_found(self):
     fsm = FSM("off")
     fsm.add_transition("play", "off", "music", "on")
     fsm.execute("play")
     self.assertEqual("music", fsm.action)
     self.assertEqual("off", fsm.prev_state)
     self.assertEqual("on", fsm.current_state)
 def test_add_transition_4args(self):
     fsm = FSM("off")
     fsm.add_transition("play", "off", "music", "on")
     self.assertEqual(("music", "on"), fsm.transitions[("play", "off")])
 def test_add_transition_3args(self):
     fsm = FSM("on")
     fsm.add_transition("change", "on", "radio")
     self.assertEqual(("radio", "on"), fsm.transitions[("change", "on")])
class Lion:
    def __init__(self, initial_state):
        self.FSM = FSM(initial_state)

        self.FSM.add_transition("Antelope", "Hungry", "Eat", "Fed")
        self.FSM.add_transition("Antelope", "Fed", "Sleep", "Hungry")
        self.FSM.add_transition("Hunter", "Hungry", "Run away")
        self.FSM.add_transition("Hunter", "Fed", "Run away", "Hungry")
        self.FSM.add_transition("Tree", "Hungry", "Sleep")
        self.FSM.add_transition("Tree", "Fed", "Look", "Hungry")

    def meet(self, who):
        self.FSM.execute(who)