public void TestTransitionFromEnterState()
        {
            var machine = new StateMachine();

            var state = new VisitedState();

            machine.AddTransition(DefaultState.Enter, state);
            machine.Update(0);

            Assert.True(state.Entered, $"State machine is not in expected state ({machine}).");
        }
        public void TestMultipleTransitions()
        {
            var machine = new StateMachine();

            var rightState  = new VisitedState();
            var wrongState1 = new VisitedState();
            var wrongState2 = new VisitedState();

            machine.AddTransition(DefaultState.Enter, wrongState1)
            .When(s => false);

            machine.AddTransition(DefaultState.Enter, rightState);

            machine.AddTransition(DefaultState.Enter, wrongState2)
            .When(s => false);
        }
        public void TestNestedMachineWithEmptyState()
        {
            var parent = new StateMachine();
            var child  = new StateMachine();

            var state = new VisitedState();

            child.AddTransition(DefaultState.Enter, state);
            parent.AddTransition(DefaultState.Enter, child);

            parent.Update(0);

            Assert.IsTrue(state.Entered, "Nested state machine was not entered.");
            Assert.IsTrue(state.Updated, "Nested state machine was not updated.");
            Assert.IsTrue(state.Exited, "Nested state machine was not exited.");
        }
        public void TestNestedMachineExit()
        {
            var parent = new StateMachine();
            var child  = new StateMachine();

            var childState  = new VisitedState();
            var parentState = new VisitedState();

            parent.AddTransition(DefaultState.Enter, child);
            parent.AddTransition(child, parentState);

            child.AddTransition(DefaultState.Enter, childState);

            parent.Update(0);
            Assert.IsTrue(childState.Exited);
            Assert.IsTrue(parentState.Entered);
        }
        public void TestExceptionTransition()
        {
            var machine = new StateMachine();
            var state1  = new VisitedState();
            var state2  = new VisitedState();
            var state3  = new VisitedState();

            machine.AddTransition(DefaultState.Enter, state1);

            machine.AddTransition(state1, state2)
            .ButWhen(s => s.Exited, state3);

            machine.Update(0);

            Assert.IsTrue(state2.Entered);
            Assert.IsFalse(state3.Entered);

            machine.Update(0);
            Assert.IsTrue(state3.Entered);
        }