Ejemplo n.º 1
0
        public void TestMultiStateEnterExitTransitionEvents()
        {
            int abEnterCount = 0;
            int abExitCount  = 0;
            int bcEnterCount = 0;
            int bcExitCount  = 0;

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

            fsm.AddTransition(State.A, State.B, State.C);
            fsm.AddTransition(State.B, State.A, State.C);
            fsm.AddTransition(State.C, State.A, State.B);
            fsm.AddEventOnGroupEnter(new[] { State.A, State.B }, (from, to) => {
                Assert.IsTrue(from != State.A && from != State.B);
                Assert.IsTrue(to == State.A || to == State.B);
                abEnterCount++;
            });
            fsm.AddEventOnGroupExit(new[] { State.A, State.B }, (from, to) => {
                Assert.IsTrue(from == State.A || from == State.B);
                Assert.IsTrue(to != State.A && to != State.B);
                abExitCount++;
            });
            fsm.AddEventOnGroupEnter(new[] { State.B, State.C }, (from, to) => {
                Assert.IsTrue(from != State.B && from != State.C);
                Assert.IsTrue(to == State.B || to == State.C);
                bcEnterCount++;
            });
            fsm.AddEventOnGroupExit(new[] { State.B, State.C }, (from, to) => {
                Assert.IsTrue(from == State.B || from == State.C);
                Assert.IsTrue(to != State.B && to != State.C);
                bcExitCount++;
            });

            fsm.Start(State.A);
            Assert.AreEqual(0, abEnterCount);
            Assert.AreEqual(0, abExitCount);
            Assert.AreEqual(0, bcEnterCount);
            Assert.AreEqual(0, bcExitCount);

            fsm.TransitionTo(State.B);
            Assert.AreEqual(0, abEnterCount);
            Assert.AreEqual(0, abExitCount);
            Assert.AreEqual(1, bcEnterCount);
            Assert.AreEqual(0, bcExitCount);

            fsm.TransitionTo(State.C);
            Assert.AreEqual(0, abEnterCount);
            Assert.AreEqual(1, abExitCount);
            Assert.AreEqual(1, bcEnterCount);
            Assert.AreEqual(0, bcExitCount);

            fsm.TransitionTo(State.A);
            Assert.AreEqual(1, abEnterCount);
            Assert.AreEqual(1, abExitCount);
            Assert.AreEqual(1, bcEnterCount);
            Assert.AreEqual(1, bcExitCount);
        }