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); }