public void ForcefullyTransitioningFromChildStateMachineCallsExitHandlerOnCurrentState()
        {
            StateHandlerInfo <State>?nullableState22ExitInfo = null;

            var sm      = new StateMachine("State Machine");
            var evt1    = new Event("Event 1");
            var state1  = sm.CreateInitialState("State 1");
            var state2  = sm.CreateState("State 2");
            var subSm   = state2.CreateChildStateMachine();
            var state21 = subSm.CreateInitialState("State 2.1");
            var state22 = subSm.CreateState("State 2.2").WithExit(i => nullableState22ExitInfo = i);

            state1.TransitionOn(evt1).To(state2);
            state21.TransitionOn(evt1).To(state22);

            // Enter state2, and start child state machine
            evt1.Fire();
            // Enter State 2.2
            evt1.Fire();
            // Transition from state2 to state1, exiting the child state machine
            sm.ForceTransition(state1, evt1);

            Assert.NotNull(nullableState22ExitInfo);
            var state22ExitInfo = nullableState22ExitInfo.Value;

            Assert.AreEqual(state22, state22ExitInfo.From);
            Assert.AreEqual(state1, state22ExitInfo.To);
            Assert.AreEqual(evt1, state22ExitInfo.Event);
        }
        public void TransitioningFromTwoChildStateMachinesCallsExitHandlerOnCurrentState()
        {
            StateHandlerInfo <State>?nullableState212ExitInfo = null;

            var sm       = new StateMachine("State Machine");
            var evt1     = new Event("Event 1");
            var evt2     = new Event("Event 2");
            var state1   = sm.CreateInitialState("State 1");
            var state2   = sm.CreateState("State 2");
            var subSm    = state2.CreateChildStateMachine();
            var state21  = subSm.CreateInitialState("State 2.1");
            var subSubSm = state21.CreateChildStateMachine();
            var state211 = subSubSm.CreateInitialState("State 2.1.1");
            var state212 = subSubSm.CreateState("State 2.1.2").WithExit(i => nullableState212ExitInfo = i);

            state1.TransitionOn(evt1).To(state2);
            state2.TransitionOn(evt2).To(state1);
            state211.TransitionOn(evt1).To(state212);

            // Enter State 2 and State 2.1 and State 2.1.1, and start child state machine
            evt1.Fire();
            // Enter State 1.2.1
            evt1.Fire();
            // Transition from state2 to state1, exiting the child state machine
            evt2.Fire();

            Assert.NotNull(nullableState212ExitInfo);
            var state212ExitInfo = nullableState212ExitInfo.Value;

            Assert.AreEqual(state212, state212ExitInfo.From);
            Assert.AreEqual(state1, state212ExitInfo.To);
            Assert.AreEqual(evt2, state212ExitInfo.Event);
        }
Exemple #3
0
        public void ForcefullyTransitioningToChildStateMachineCallsEntryHandlerOnInitialState()
        {
            StateHandlerInfo <State> state21EntryInfo = null;

            var sm      = new StateMachine("State Machine");
            var evt     = sm.CreateEvent("Event");
            var state1  = sm.CreateInitialState("State 1");
            var state2  = sm.CreateState("State 2");
            var subSm   = state2.CreateChildStateMachine();
            var state21 = subSm.CreateInitialState("State 2.1").WithEntry(i => state21EntryInfo = i);

            sm.ForceTransition(state2, evt);

            Assert.NotNull(state21EntryInfo);
            Assert.AreEqual(state1, state21EntryInfo.From);
            Assert.AreEqual(state21, state21EntryInfo.To);
            Assert.AreEqual(evt, state21EntryInfo.Event);
        }
Exemple #4
0
        public void CorrectInfoIsGivenInEntryHandler()
        {
            StateHandlerInfo <State> handlerInfo = null;

            var sm     = new StateMachine("State Machine");
            var evt    = sm.CreateEvent("Event");
            var state1 = sm.CreateInitialState("State 1");
            var state2 = sm.CreateState("State 2").WithEntry(i => handlerInfo = i);

            state1.TransitionOn(evt).To(state2);

            evt.Fire();

            Assert.NotNull(handlerInfo);
            Assert.AreEqual(state1, handlerInfo.From);
            Assert.AreEqual(state2, handlerInfo.To);
            Assert.AreEqual(evt, handlerInfo.Event);
        }
Exemple #5
0
        public void FiresEntryHandlerWithCorrectArgumentsWhenEntered()
        {
            var sm     = new StateMachine("State Machine");
            var state1 = sm.CreateInitialState("State 1");
            var state2 = sm.CreateState("State 2");
            var evt    = sm.CreateEvent("Event");
            StateHandlerInfo <State> info = null;
            var group = new StateGroup("Group")
                        .WithEntry(i => info = i);

            state2.AddToGroup(group);
            state1.TransitionOn(evt).To(state2);

            evt.Fire();

            Assert.NotNull(info);
            Assert.AreEqual(state1, info.From);
            Assert.AreEqual(state2, info.To);
            Assert.AreEqual(evt, info.Event);
        }
        public void CorrectInfoIsGivenInExitHandlerT()
        {
            StateHandlerInfo <State>?nullableHandlerInfo = null;

            var sm     = new StateMachine("State Machine");
            var evt    = new Event <string>("Event");
            var state1 = sm.CreateInitialState("State 1").WithExit(i => nullableHandlerInfo = i);
            var state2 = sm.CreateState("State 2");

            state1.TransitionOn(evt).To(state2);

            evt.Fire("foo");

            Assert.NotNull(nullableHandlerInfo);
            var handlerInfo = nullableHandlerInfo.Value;

            Assert.AreEqual(state1, handlerInfo.From);
            Assert.AreEqual(state2, handlerInfo.To);
            Assert.AreEqual(evt, handlerInfo.Event);
            Assert.AreEqual("foo", handlerInfo.EventData);
        }
        public void FiresExitHandlerWithCorrectArgumentsWhenExited()
        {
            var sm     = new StateMachine("State Machine");
            var state1 = sm.CreateInitialState("State 1");
            var state2 = sm.CreateState("State 2");
            var evt    = new Event("Event");
            StateHandlerInfo <State>?nullableInfo = null;
            var group = new StateGroup <State>("Group")
                        .WithExit(i => nullableInfo = i);

            state1.AddToGroup(group);
            state1.TransitionOn(evt).To(state2);

            evt.Fire();

            Assert.NotNull(nullableInfo);
            var info = nullableInfo.Value;

            Assert.AreEqual(state1, info.From);
            Assert.AreEqual(state2, info.To);
            Assert.AreEqual(evt, info.Event);
        }
        public void TransitioningToChildStateMachineCallsEntryHandlerOnInitialState()
        {
            StateHandlerInfo <State>?nullableState21EntryInfo = null;

            var sm      = new StateMachine("State Machine");
            var evt     = new Event("Event");
            var state1  = sm.CreateInitialState("State 1");
            var state2  = sm.CreateState("State 2");
            var subSm   = state2.CreateChildStateMachine();
            var state21 = subSm.CreateInitialState("State 2.1").WithEntry(i => nullableState21EntryInfo = i);

            state1.TransitionOn(evt).To(state2);

            evt.Fire();

            Assert.NotNull(nullableState21EntryInfo);
            var state21EntryInfo = nullableState21EntryInfo.Value;

            Assert.AreEqual(state1, state21EntryInfo.From);
            Assert.AreEqual(state21, state21EntryInfo.To);
            Assert.AreEqual(evt, state21EntryInfo.Event);
        }
        protected override void OnExit(StateHandlerInfo <State> info)
        {
            // Custom code which isn't in the exit handler

            base.OnExit(info);
        }
 protected override void OnExit(StateHandlerInfo <State> info)
 {
     this.OnExitInfo = info;
 }
 protected override void OnEntry(StateHandlerInfo <State> info)
 {
     this.OnEntryInfo = info;
 }
Exemple #12
0
        protected override void OnEntry(StateHandlerInfo <CustomBaseState> info)
        {
            // Custom code which isn't in the entry handler

            base.OnEntry(info);
        }