def test_onchangestate_should_fire_for_all_state_changes(self): def on_change_state(e): self.current_event = e fsm = Fysom({ 'initial': 'foo', 'events': [ {'name': 'footobar', 'src': 'foo', 'dst': 'bar'}, {'name': 'bartobaz', 'src': 'bar', 'dst': 'baz'}, ], 'callbacks': { 'onchangestate': on_change_state } }) fsm.footobar(id=123) self.assertEqual(self.current_event.event, 'footobar') self.assertEqual(self.current_event.src, 'foo') self.assertEqual(self.current_event.dst, 'bar') self.assertEqual(self.current_event.id, 123) self.assertTrue(self.current_event.fsm is fsm) fsm.bartobaz('positional', named_attribute='test') self.assertEqual(self.current_event.event, 'bartobaz') self.assertEqual(self.current_event.src, 'bar') self.assertEqual(self.current_event.dst, 'baz') self.assertEqual(self.current_event.named_attribute, 'test') self.assertEqual(self.current_event.args[0], 'positional') self.assertTrue(self.current_event.fsm is fsm)
def test_onchangestate_should_fire_for_all_state_changes(self): def on_change_state(e): self.current_event = e fsm = Fysom({ 'initial': 'foo', 'events': [ {'name': 'footobar', 'src': 'foo', 'dst': 'bar'}, {'name': 'bartobaz', 'src': 'bar', 'dst': 'baz'}, ], 'callbacks': { 'onchangestate': on_change_state } }) fsm.footobar(id=123) self.assertEqual(self.current_event.event, 'footobar') self.assertEqual(self.current_event.src, 'foo') self.assertEqual(self.current_event.dst, 'bar') self.assertEqual(self.current_event.id, 123) self.assertTrue(self.current_event.fsm is fsm) fsm.bartobaz('positional', named_attribute='test') self.assertEqual(self.current_event.event, 'bartobaz') self.assertEqual(self.current_event.src, 'bar') self.assertEqual(self.current_event.dst, 'baz') self.assertEqual(self.current_event.named_attribute, 'test') self.assertEqual(self.current_event.args[0], 'positional') self.assertTrue(self.current_event.fsm is fsm)
class FysomAsynchronousStateTransitionTests(unittest.TestCase): def on_leave_foo(self, e): self.leave_foo_event = e return False def on_enter_bar(self, e): self.on_enter_bar_fired = True self.on_enter_bar_event = e def setUp(self): self.on_enter_bar_fired = False self.fsm = Fysom({ 'initial': 'foo', 'events': [ { 'name': 'footobar', 'src': 'foo', 'dst': 'bar' }, { 'name': 'bartobar', 'src': 'bar', 'dst': 'bar' }, ], 'callbacks': { 'onleavefoo': self.on_leave_foo, 'onenterbar': self.on_enter_bar, } }) def test_fsm_should_be_put_on_hold_when_onleave_state_returns_false(self): self.fsm.footobar(id=123) self.assertEqual(self.fsm.current, 'foo') self.assertTrue(hasattr(self, 'leave_foo_event'), 'Callback onleavefoo did not fire.') self.assertTrue(self.leave_foo_event is not None) self.assertEqual(self.leave_foo_event.id, 123) self.fsm.transition() self.assertEqual(self.fsm.current, 'bar') def test_onenter_state_should_not_fire_when_fsm_is_put_on_hold(self): self.fsm.footobar(id=123) self.assertFalse(self.on_enter_bar_fired) self.fsm.transition() self.assertTrue(self.on_enter_bar_fired) def test_should_raise_exception_upon_further_transitions_when_fsm_is_on_hold( self): self.fsm.footobar(id=123) self.assertRaises(FysomError, self.fsm.bartobar)
class FysomAsynchronousStateTransitionTests(unittest.TestCase): def on_leave_foo(self, e): self.leave_foo_event = e return False def on_enter_bar(self, e): self.on_enter_bar_fired = True self.on_enter_bar_event = e def setUp(self): self.on_enter_bar_fired = False self.fsm = Fysom({ 'initial': 'foo', 'events': [ {'name': 'footobar', 'src': 'foo', 'dst': 'bar'}, {'name': 'bartobar', 'src': 'bar', 'dst': 'bar'}, ], 'callbacks': { 'onleavefoo': self.on_leave_foo, 'onenterbar': self.on_enter_bar, } }) def test_fsm_should_be_put_on_hold_when_onleave_state_returns_false(self): self.fsm.footobar(id=123) self.assertEqual(self.fsm.current, 'foo') self.assertTrue(hasattr(self, 'leave_foo_event'), 'Callback onleavefoo did not fire.') self.assertTrue(self.leave_foo_event is not None) self.assertEqual(self.leave_foo_event.id, 123) self.fsm.transition() self.assertEqual(self.fsm.current, 'bar') def test_onenter_state_should_not_fire_when_fsm_is_put_on_hold(self): self.fsm.footobar(id=123) self.assertFalse(self.on_enter_bar_fired) self.fsm.transition() self.assertTrue(self.on_enter_bar_fired) def test_should_raise_exception_upon_further_transitions_when_fsm_is_on_hold(self): self.fsm.footobar(id=123) self.assertRaises(FysomError, self.fsm.bartobar)