def test_notify_child(self): m = StateMachine() composite_state = m.create_state('composite', CompositeState) target_state = m.create_state('target') composite_state.add_transition_to(target_state, 'tick') substate_source = composite_state.create_state('substate1') substate_target = composite_state.create_state('substate2') substate_source.add_transition_to(substate_target, 'tick') substate_source.on_end = MagicMock() substate_target.on_start = MagicMock() composite_state.initial_state = substate_source composite_state.initialise() m.initial_state = composite_state m.initialise() # Test, expecting the composite state's machine to transition e = Event('tick') m.notify(e) # Verify self.assertEqual(composite_state, m.current_state) self.assertEqual(substate_target, composite_state.current_state) self.assertEqual(1, substate_source.on_end.call_count) self.assertEqual(1, substate_target.on_start.call_count)
def test_notify_observers(self): """ Test that a substate still notifies observers """ # SETUP m = StateMachine('Observed') composite_state = m.create_state('composite', CompositeState) sub_state = composite_state.create_state('substate') listener = StateMachine('Listener') listener.notify = MagicMock() m.register_observer('tick', listener) # TEST e = Event('tick') sub_state.notify_observers(e) m.flush() self.assertEqual(1, listener.notify.call_count) listener.notify.assert_called_with(e)