public void StateMachine_Trigger_ValidlyTransitions_RaisesAllEventsInCorrectOrder() { var calls = new List <string>(); var model = new TrackableStateModel(); var state1 = new State <TrackableStateModel>("s1"); var state2 = new State <TrackableStateModel>("s2"); var trigger = new Trigger("t1"); var transition = new Transition <TrackableStateModel>(trigger, state1, state2); state1.AddTransition(transition); model.CurrentState = state1; var stateMachine = new StateMachine <TrackableStateModel>(); Action <object, TransitionEventArgs <TrackableStateModel> > entering = (s, e) => calls.Add(string.Format("entering {0} from {1} on {2}", e.To, e.From, e.Trigger)); Action <object, TransitionEventArgs <TrackableStateModel> > entered = (s, e) => calls.Add(string.Format("entered {0} from {1} on {2}", e.To, e.From, e.Trigger)); Action <object, TransitionEventArgs <TrackableStateModel> > exiting = (s, e) => calls.Add(string.Format("exiting {0} to {1} on {2}", e.From, e.To, e.Trigger)); Action <object, TransitionEventArgs <TrackableStateModel> > exited = (s, e) => calls.Add(string.Format("exited {0} to {1} on {2}", e.From, e.To, e.Trigger)); model.Setting += (s, e) => calls.Add("setting new current state on model"); state1.Entering += (s, e) => entering(s, e); state1.Entered += (s, e) => entered(s, e); state1.Exiting += (s, e) => exiting(s, e); state1.Exited += (s, e) => exited(s, e); state2.Entering += (s, e) => entering(s, e); state2.Entered += (s, e) => entered(s, e); state2.Exiting += (s, e) => exiting(s, e); state2.Exited += (s, e) => exited(s, e); stateMachine.Transitioning += (s, e) => calls.Add(string.Format("transitioning from {0} to {1} on {2}", e.From, e.To, e.Trigger)); stateMachine.Transitioned += (s, e) => calls.Add(string.Format("transitioned from {0} to {1} on {2}", e.From, e.To, e.Trigger)); stateMachine.Trigger(trigger, model); Assert.Equal(7, calls.Count); Assert.Equal("transitioning from s1 to s2 on t1", calls[0]); Assert.Equal("exiting s1 to s2 on t1", calls[1]); Assert.Equal("entering s2 from s1 on t1", calls[2]); Assert.Equal("setting new current state on model", calls[3]); Assert.Equal("exited s1 to s2 on t1", calls[4]); Assert.Equal("entered s2 from s1 on t1", calls[5]); Assert.Equal("transitioned from s1 to s2 on t1", calls[6]); }
public void StateMachine_Trigger_ValidlyTransitions_RaisesAllEventsInCorrectOrder() { var calls = new List<string>(); var model = new TrackableStateModel(); var state1 = new State<TrackableStateModel>("s1"); var state2 = new State<TrackableStateModel>("s2"); var trigger = new Trigger("t1"); var transition = new Transition<TrackableStateModel>(trigger, state1, state2); state1.AddTransition(transition); model.CurrentState = state1; var stateMachine = new StateMachine<TrackableStateModel>(); Action<object, TransitionEventArgs<TrackableStateModel>> entering = (s, e) => calls.Add(String.Format("entering {0} from {1} on {2}", e.To, e.From, e.Trigger)); Action<object, TransitionEventArgs<TrackableStateModel>> entered = (s, e) => calls.Add(String.Format("entered {0} from {1} on {2}", e.To, e.From, e.Trigger)); Action<object, TransitionEventArgs<TrackableStateModel>> exiting = (s, e) => calls.Add(String.Format("exiting {0} to {1} on {2}", e.From, e.To, e.Trigger)); Action<object, TransitionEventArgs<TrackableStateModel>> exited = (s, e) => calls.Add(String.Format("exited {0} to {1} on {2}", e.From, e.To, e.Trigger)); model.Setting += (s, e) => calls.Add("setting new current state on model"); state1.Entering += (s, e) => entering(s, e); state1.Entered += (s, e) => entered(s, e); state1.Exiting += (s, e) => exiting(s, e); state1.Exited += (s, e) => exited(s, e); state2.Entering += (s, e) => entering(s, e); state2.Entered += (s, e) => entered(s, e); state2.Exiting += (s, e) => exiting(s, e); state2.Exited += (s, e) => exited(s, e); stateMachine.Transitioning += (s, e) => calls.Add(String.Format("transitioning from {0} to {1} on {2}", e.From, e.To, e.Trigger)); stateMachine.Transitioned += (s, e) => calls.Add(String.Format("transitioned from {0} to {1} on {2}", e.From, e.To, e.Trigger)); stateMachine.Trigger(trigger, model); Assert.Equal(7, calls.Count); Assert.Equal("transitioning from s1 to s2 on t1", calls[0]); Assert.Equal("exiting s1 to s2 on t1", calls[1]); Assert.Equal("entering s2 from s1 on t1", calls[2]); Assert.Equal("setting new current state on model", calls[3]); Assert.Equal("exited s1 to s2 on t1", calls[4]); Assert.Equal("entered s2 from s1 on t1", calls[5]); Assert.Equal("transitioned from s1 to s2 on t1", calls[6]); }