Example #1
0
        public void EpsilonTransitions()
        {
            TestSequentialTrigger trigger      = new TestSequentialTrigger(1);
            TestAction            action       = new TestAction();
            StateMachine          stateMachine = new StateMachine();

            for (int i = 0; i < 4; i++)
            {
                var state = new SimpleState();
                action.Monitor(state);
                stateMachine.AddState(state);
            }
            action.Monitor(stateMachine);
            stateMachine.AddEntryTransition(0, null);
            stateMachine.AddExitTransition(3, null);
            stateMachine.AddTransition(0, 1, null);
            stateMachine.AddTransition(1, 2, trigger[0]);
            stateMachine.AddTransition(2, 3, null);
            stateMachine.Run();
            Assert.AreEqual(1, stateMachine.ActiveStateId);
            trigger.Run(0);
            action.CompareResults(new List <string>()
            {
                "enter: 0",
                "enter: 0", "leave: 0",
                "enter: 1", "leave: 1",
                "enter: 2", "leave: 2",
                "enter: 3", "leave: 3",
            });
            Assert.AreEqual(State.ExitStateId, stateMachine.ActiveStateId);
        }
Example #2
0
        public void SimpleStatesOnly()
        {
            TestSequentialTrigger trigger      = new TestSequentialTrigger(8);
            TestAction            action       = new TestAction();
            StateMachine          stateMachine = new StateMachine();

            for (int i = 0; i < 4; i++)
            {
                var state = new SimpleState();
                action.Monitor(state);
                stateMachine.AddState(state);
            }
            action.Monitor(stateMachine);
            stateMachine.AddEntryTransition(0, trigger[7]);
            stateMachine.AddExitTransition(1, trigger[6]);
            stateMachine.AddTransition(0, 1, trigger[0]);
            stateMachine.AddTransition(0, 3, trigger[1]);
            stateMachine.AddTransition(1, 2, trigger[4]);
            stateMachine.AddTransition(2, 0, trigger[3]);
            stateMachine.AddTransition(3, 1, trigger[5]);
            stateMachine.AddTransition(3, 2, trigger[2]);
            Assert.AreEqual(State.InvalidStateId, stateMachine.ActiveStateId);
            Assert.AreEqual("-3", stateMachine.GenerateActiveStateDescriptor());
            stateMachine.Run();
            Assert.AreEqual(State.EntryStateId, stateMachine.ActiveStateId);
            Assert.AreEqual("-2", stateMachine.GenerateActiveStateDescriptor());
            trigger.Run(7, 1, 2, 3, 0, 4, 3, 1, 5); // loop around
            Assert.AreEqual("1.-1", stateMachine.GenerateActiveStateDescriptor());
            trigger.Run(0, 1, 2, 3, 5);             // invalid triggers
            Assert.AreEqual("1.-1", stateMachine.GenerateActiveStateDescriptor());
            trigger.Run(6);                         // to the end
            Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
            action.CompareResults(new List <string>()
            {
                "enter: 0",             // outer state machine
                "enter: 0", "leave: 0", // state 0
                "enter: 3", "leave: 3",
                "enter: 2", "leave: 2",
                "enter: 0", "leave: 0",
                "enter: 1", "leave: 1",
                "enter: 2", "leave: 2",
                "enter: 0", "leave: 0",
                "enter: 3", "leave: 3",
                "enter: 1", "leave: 1",
            });
            Assert.AreEqual(State.ExitStateId, stateMachine.ActiveStateId);
        }
Example #3
0
        public void TransitionEvents()
        {
            StateMachine stateMachine = new StateMachine();
            SimpleState  s0 = new SimpleState(), s1 = new SimpleState();

            stateMachine.AddState(s0);
            stateMachine.AddState(s1);
            stateMachine.AddEntryTransition(0, null);
            stateMachine.AddExitTransition(1, null);
            TransitionTrigger trigger = new TransitionTrigger();

            stateMachine.AddTransition(0, 1, trigger);
            List <string> result = new List <string>();

            s0.StateLeave            += () => result.Add("leave: 0");
            s1.StateEnter            += () => result.Add("enter: 1");
            trigger.BeforeTransition += () =>
            {
                result.Add("before transition");
                Assert.AreEqual("0.-1", stateMachine.GenerateActiveStateDescriptor());
            };
            trigger.AfterTransition += () =>
            {
                result.Add("after transition");
                Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
            };
            stateMachine.Run();
            trigger.Fire();
            Assert.AreEqual(4, result.Count);
            Assert.AreEqual("before transition", result[0]);
            Assert.AreEqual("leave: 0", result[1]);
            Assert.AreEqual("enter: 1", result[2]);
            Assert.AreEqual("after transition", result[3]);

            trigger.BeforeTransition += () => trigger.StopTransition();
            result.Clear();
            stateMachine.Reset();
            stateMachine.Run();
            trigger.Fire();
            Assert.AreEqual(1, result.Count);
            Assert.AreEqual("before transition", result[0]);
        }
Example #4
0
        /*
         *  | state id |    state name    |
         *  |    0     |    unconnected   |
         *  |    1     |    connected     |
         *  |    2     |    recovery      |
         */
        private void BuildStateMachine(ITransportationStateProvider transportationStateProvider)
        {
            stateMachine.AddState(unconnectedState);
            stateMachine.AddState(connectedState);
            stateMachine.AddState(recoveryState);

            transportationStateProvider.ConnectionEstablished += () => transportationReadyTrigger.Fire();
            transportationStateProvider.ConnectionLost        += () => transportationLostTrigger.Fire();

            unconnectedState.StateEnter += () =>
            {
                if (!started)
                {
                    started = true;
                    return;
                }
                Logger.Log($"unconnectedState.StateEnter, stop timers, state={StateDescr()}", "FT");
                silenceTimer.Stop();
                heartBeatTimer.Stop();
                Logger.Log($"invoking connection lost event, state={StateDescr()}", "FT");
                ConnectionLost?.Invoke();
            };
            unconnectedState.StateLeave += () =>
            {
                Logger.Log($"unconnectedState.StateLeave, start silence timer, state={StateDescr()}", "FT");
                silenceTimer.Start();
            };
            connectedState.StateEnter += () =>
            {
                Logger.Log($"connectedState.StateEnter, start heart beat, state={StateDescr()}", "FT");
                heartBeatTimer.Start();
            };

            stateMachine.AddEntryTransition(0, null);
            stateMachine.AddTransition(1, 0, silenceTimeoutTrigger);
            stateMachine.AddTransition(1, 0, transportationLostTrigger);

            AddCustomTransitionsAndActions();
            stateMachine.Run();
        }
Example #5
0
        public RecursiveMachineTestBase()
        {
            trigger0   = new TestSequentialTrigger(2);
            trigger00  = new TestSequentialTrigger(3);
            trigger01  = new TestSequentialTrigger(4);
            trigger010 = new TestSequentialTrigger(2);

            stateMachine00 = new StateMachine();
            CreateSimpleStatesAndMonitor(action, stateMachine00, 3);
            stateMachine00.AddEntryTransition(0, null);
            stateMachine00.AddExitTransition(2, null);
            stateMachine00.AddTransition(0, 1, trigger00[0]);
            stateMachine00.AddTransition(2, 0, trigger00[2]);
            stateMachine00.AddTransition(1, 2, trigger00[1]);

            stateMachine010 = new StateMachine();
            CreateSimpleStatesAndMonitor(action, stateMachine010, 1);
            stateMachine010.AddEntryTransition(0, trigger010[0]);
            stateMachine010.AddExitTransition(0, trigger010[1]);

            stateMachine01 = new StateMachine();
            stateMachine01.AddState(stateMachine010);
            CreateSimpleStatesAndMonitor(action, stateMachine01, 1);
            stateMachine01.AddEntryTransition(0, trigger01[1]);
            stateMachine01.AddExitTransition(0, trigger01[2]);
            stateMachine01.AddTransition(0, 1, trigger01[3]);
            stateMachine01.AddTransition(1, 0, trigger01[0]);

            stateMachine0 = new StateMachine();
            stateMachine0.AddState(stateMachine00);
            stateMachine0.AddState(stateMachine01);
            CreateSimpleStatesAndMonitor(action, stateMachine0, 1);
            stateMachine0.AddEntryTransition(0, null); // No exit transition
            stateMachine0.AddTransition(0, 1, null);
            stateMachine0.AddTransition(1, 0, trigger0[1]);
            stateMachine0.AddTransition(1, 2, null);
            stateMachine0.AddTransition(2, 0, trigger0[0]);
        }
Example #6
0
        public void MultiEdges()
        {
            StateMachine stateMachine = new StateMachine();
            SimpleState  s0 = new SimpleState(), s1 = new SimpleState();

            stateMachine.AddState(s0);
            stateMachine.AddState(s1);
            stateMachine.AddEntryTransition(0, null);
            stateMachine.AddExitTransition(1, null);
            TransitionTrigger trigger0 = new TransitionTrigger();
            TransitionTrigger trigger1 = new TransitionTrigger();

            stateMachine.AddTransition(0, 1, trigger0);
            stateMachine.AddTransition(0, 1, trigger1);

            stateMachine.Run();
            trigger0.Fire();
            Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
            stateMachine.Reset();
            stateMachine.Run();
            trigger1.Fire();
            Assert.AreEqual("-1", stateMachine.GenerateActiveStateDescriptor());
        }