예제 #1
0
        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]);
        }
예제 #2
0
        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]);
        }