Beispiel #1
0
        public void TestEnterExitTransitionEvents()
        {
            int   aEnterCount     = 0;
            int   aExitCount      = 0;
            State?aExitToState    = null;
            int   bEnterCount     = 0;
            State?bEnterFromState = null;

            FiniteStateMachine <State> fsm = new FiniteStateMachine <State>();

            fsm.AddTransition(State.A, State.B);
            fsm.AddTransition(State.B, State.C);
            fsm.AddEventOnEnter(State.A, (from, to) => {
                Assert.IsTrue(to == State.A);
                aEnterCount++;
            });
            fsm.AddEventOnExit(State.A, (from, to) => {
                Assert.IsTrue(from == State.A);
                aExitToState = to;
                aExitCount++;
            });
            fsm.AddEventOnEnter(State.B, (from, to) => {
                bEnterFromState = from;
                Assert.IsTrue(to == State.B);
                bEnterCount++;
            });

            // Start does not trigger enter event
            fsm.Start(State.A);
            Assert.IsTrue(aEnterCount == 0);
            Assert.IsTrue(aExitCount == 0);
            Assert.IsTrue(bEnterCount == 0);

            fsm.TransitionTo(State.B);
            Assert.IsTrue(aEnterCount == 0);
            Assert.IsTrue(aExitCount == 1);
            Assert.IsTrue(aExitToState == State.B);
            Assert.IsTrue(bEnterCount == 1);
            Assert.IsTrue(bEnterFromState == State.A);
        }