Example #1
0
        public void TestTransitionSuccessWithoutFollowon()
        {
            StateMachine sm = Initialize(false);

            sm.TransitionHandler(States.Idle, States.Validated).Prepare  += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess);
            sm.TransitionHandler(States.Idle, States.Validated).Commit   += new CommitTransitionEvent(CommitTransitiontoValid);
            sm.TransitionHandler(States.Idle, States.Validated).Rollback += new RollbackTransitionEvent(RollbackTransitiontoValid);

            sm.DoTransition(States.Validated, m_batch);

            _Debug.Assert(States.Validated.Equals(sm.State), "State machine did not transition to 'Validated' state");
        }
Example #2
0
        public void TestTransitionIllegal()
        {
            StateMachine sm = Initialize();

            sm.TransitionHandler(States.Idle, States.Validated).Prepare  += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess);
            sm.TransitionHandler(States.Idle, States.Validated).Commit   += new CommitTransitionEvent(CommitTransitiontoValid);
            sm.TransitionHandler(States.Idle, States.Validated).Rollback += new RollbackTransitionEvent(RollbackTransitiontoValid);

            try {
                sm.DoTransition(States.Paused, m_batch);
            } catch (TransitionFailureException tfe) {
                _Debug.WriteLine(tfe);
            }
            _Debug.Assert(States.Idle.Equals(sm.State), "State machine did not stay in 'Idle' state");
        }
Example #3
0
        public void TestTransitionIllegalToo()
        {
            StateMachine sm = Initialize();

            sm.TransitionHandler(States.Idle, States.Paused).Prepare += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess);
            sm.DoTransition(States.Paused, m_batch);
        }
Example #4
0
        public void TestStateMachine()
        {
            StateMachine sm = Initialize();

            sm.TransitionHandler(States.Idle, States.Validated).Prepare  += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess);
            sm.TransitionHandler(States.Idle, States.Validated).Commit   += new CommitTransitionEvent(CommitTransitiontoValid);
            sm.TransitionHandler(States.Idle, States.Validated).Rollback += new RollbackTransitionEvent(RollbackTransitiontoValid);
#if DEBUG
            _Debug.WriteLine("Idle state is " + sm._TestGetStateNumber(States.Idle));
            _Debug.WriteLine("Validated state is " + sm._TestGetStateNumber(States.Validated));
            _Debug.WriteLine("Paused state is " + sm._TestGetStateNumber(States.Paused));
            _Debug.WriteLine("Running state is " + sm._TestGetStateNumber(States.Running));
            _Debug.WriteLine("Finished state is " + sm._TestGetStateNumber(States.Finished));

            _Debug.WriteLine("Idle to Validated is valid? " + sm.TransitionHandler(States.Idle, States.Validated).IsValidTransition);
            _Debug.WriteLine("Idle to Paused is valid? " + sm.TransitionHandler(States.Idle, States.Paused).IsValidTransition);
#endif
            sm.DoTransition(States.Validated, m_batch);
        }
Example #5
0
        /// <summary>
        /// Creates the state machine to be used by this model. Called by the framework,
        /// and intended to be overridden by a derived class.
        /// </summary>
        /// <returns></returns>
        protected virtual StateMachine CreateStateMachine()
        {
            bool[,] transitionMatrix = { { false, true }, { true, false } };
            Enum[]       followOnStates = { DefaultModelStates.Idle, DefaultModelStates.Idle };
            StateMachine retval         = new StateMachine(this, transitionMatrix, followOnStates, DefaultModelStates.Idle);

            retval.SetStateMethod(RunModel, DefaultModelStates.Running);
            retval.TransitionHandler(DefaultModelStates.Running, DefaultModelStates.Idle).Commit += (model, data) => Completed?.Invoke(this);
            return(retval);
        }
Example #6
0
        public void TestTransitionMultipleHandlersSorted()
        {
            StateMachine sm = Initialize(false);

            // Set up Prepare handlers.
            sm.UniversalTransitionHandler().AddPrepareEvent(new PrepareTransitionEvent(UniversalPrepareToTransition), -2);

            sm.OutboundTransitionHandler(States.Idle).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_1), 4);
            sm.OutboundTransitionHandler(States.Idle).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_2), 3);
            sm.OutboundTransitionHandler(States.Idle).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_3), 2);
            sm.OutboundTransitionHandler(States.Idle).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_4), 1);

            sm.InboundTransitionHandler(States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_1), 4);
            sm.InboundTransitionHandler(States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_2), 3);
            sm.InboundTransitionHandler(States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_3), 2);
            sm.InboundTransitionHandler(States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_4), 1);

            sm.TransitionHandler(States.Idle, States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_1), 4);
            sm.TransitionHandler(States.Idle, States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_2), 3);
            sm.TransitionHandler(States.Idle, States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_3), 2);
            sm.TransitionHandler(States.Idle, States.Validated).AddPrepareEvent(new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_4), 1);

            // Set up Commit handlers.
            sm.UniversalTransitionHandler().AddCommitEvent(new CommitTransitionEvent(UniversalCommitTransition), -2);

            sm.OutboundTransitionHandler(States.Idle).AddCommitEvent(new CommitTransitionEvent(CommitTransitionOutOfIdle_1), 4);
            sm.OutboundTransitionHandler(States.Idle).AddCommitEvent(new CommitTransitionEvent(CommitTransitionOutOfIdle_2), 3);
            sm.OutboundTransitionHandler(States.Idle).AddCommitEvent(new CommitTransitionEvent(CommitTransitionOutOfIdle_3), 2);
            sm.OutboundTransitionHandler(States.Idle).AddCommitEvent(new CommitTransitionEvent(CommitTransitionOutOfIdle_4), 1);

            sm.InboundTransitionHandler(States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionToValid_1), 4);
            sm.InboundTransitionHandler(States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionToValid_2), 3);
            sm.InboundTransitionHandler(States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionToValid_3), 2);
            sm.InboundTransitionHandler(States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionToValid_4), 1);

            sm.TransitionHandler(States.Idle, States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionIdleToValid_1), 4);
            sm.TransitionHandler(States.Idle, States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionIdleToValid_2), 3);
            sm.TransitionHandler(States.Idle, States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionIdleToValid_3), 2);
            sm.TransitionHandler(States.Idle, States.Validated).AddCommitEvent(new CommitTransitionEvent(CommitTransitionIdleToValid_4), 1);

            sm.DoTransition(States.Validated, m_batch);

            _Debug.Assert(States.Validated.Equals(sm.State), "");
        }
Example #7
0
        public void TestTransitionMultipleHandlers()
        {
            StateMachine sm = Initialize(false);

            // Set up Prepare handlers.
            sm.UniversalTransitionHandler().Prepare += new PrepareTransitionEvent(UniversalPrepareToTransition);

            sm.OutboundTransitionHandler(States.Idle).Prepare += new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_1);
            sm.OutboundTransitionHandler(States.Idle).Prepare += new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_2);
            sm.OutboundTransitionHandler(States.Idle).Prepare += new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_3);
            sm.OutboundTransitionHandler(States.Idle).Prepare += new PrepareTransitionEvent(PrepareToTransitionOutOfIdleWithSuccess_4);

            sm.InboundTransitionHandler(States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_1);
            sm.InboundTransitionHandler(States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_2);
            sm.InboundTransitionHandler(States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_3);
            sm.InboundTransitionHandler(States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess_4);

            sm.TransitionHandler(States.Idle, States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_1);
            sm.TransitionHandler(States.Idle, States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_2);
            sm.TransitionHandler(States.Idle, States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_3);
            sm.TransitionHandler(States.Idle, States.Validated).Prepare += new PrepareTransitionEvent(PrepareToTransitionIdletoValidWithSuccess_4);

            // Set up Commit handlers.
            sm.UniversalTransitionHandler().Commit += new CommitTransitionEvent(UniversalCommitTransition);

            sm.OutboundTransitionHandler(States.Idle).Commit += new CommitTransitionEvent(CommitTransitionOutOfIdle_1);
            sm.OutboundTransitionHandler(States.Idle).Commit += new CommitTransitionEvent(CommitTransitionOutOfIdle_2);
            sm.OutboundTransitionHandler(States.Idle).Commit += new CommitTransitionEvent(CommitTransitionOutOfIdle_3);
            sm.OutboundTransitionHandler(States.Idle).Commit += new CommitTransitionEvent(CommitTransitionOutOfIdle_4);

            sm.InboundTransitionHandler(States.Validated).Commit += new CommitTransitionEvent(CommitTransitionToValid_1);
            sm.InboundTransitionHandler(States.Validated).Commit += new CommitTransitionEvent(CommitTransitionToValid_2);
            sm.InboundTransitionHandler(States.Validated).Commit += new CommitTransitionEvent(CommitTransitionToValid_3);
            sm.InboundTransitionHandler(States.Validated).Commit += new CommitTransitionEvent(CommitTransitionToValid_4);

            sm.TransitionHandler(States.Idle, States.Validated).Commit += new CommitTransitionEvent(CommitTransitionIdleToValid_1);
            sm.TransitionHandler(States.Idle, States.Validated).Commit += new CommitTransitionEvent(CommitTransitionIdleToValid_2);
            sm.TransitionHandler(States.Idle, States.Validated).Commit += new CommitTransitionEvent(CommitTransitionIdleToValid_3);
            sm.TransitionHandler(States.Idle, States.Validated).Commit += new CommitTransitionEvent(CommitTransitionIdleToValid_4);

            sm.DoTransition(States.Validated, m_batch);

            Assert.IsTrue(States.Validated.Equals(sm.State), "");
        }
Example #8
0
        public void TestTransitionChainSuccess()
        {
            StateMachine sm = Initialize(false);

            sm.TransitionHandler(States.Finished, States.Idle).Prepare  += new PrepareTransitionEvent(PrepareToTransitionToIdleWithSuccess);
            sm.TransitionHandler(States.Finished, States.Idle).Commit   += new CommitTransitionEvent(CommitTransitionToIdle);
            sm.TransitionHandler(States.Finished, States.Idle).Rollback += new RollbackTransitionEvent(RollbackTransitionToIdle);

            sm.TransitionHandler(States.Idle, States.Validated).Prepare  += new PrepareTransitionEvent(PrepareToTransitiontoValidWithSuccess);
            sm.TransitionHandler(States.Idle, States.Validated).Commit   += new CommitTransitionEvent(CommitTransitiontoValid);
            sm.TransitionHandler(States.Idle, States.Validated).Rollback += new RollbackTransitionEvent(RollbackTransitiontoValid);

            sm.TransitionHandler(States.Validated, States.Running).Prepare  += new PrepareTransitionEvent(PrepareToTransitionToRunningWithSuccess);
            sm.TransitionHandler(States.Validated, States.Running).Commit   += new CommitTransitionEvent(CommitTransitionToRunning);
            sm.TransitionHandler(States.Validated, States.Running).Rollback += new RollbackTransitionEvent(RollbackTransitionToRunning);

            sm.TransitionHandler(States.Paused, States.Running).Prepare  += new PrepareTransitionEvent(PrepareToTransitionToRunningWithSuccess);
            sm.TransitionHandler(States.Paused, States.Running).Commit   += new CommitTransitionEvent(CommitTransitionToRunning);
            sm.TransitionHandler(States.Paused, States.Running).Rollback += new RollbackTransitionEvent(RollbackTransitionToRunning);

            sm.TransitionHandler(States.Running, States.Paused).Prepare  += new PrepareTransitionEvent(PrepareToTransitionToPausedWithSuccess);
            sm.TransitionHandler(States.Running, States.Paused).Commit   += new CommitTransitionEvent(CommitTransitionToPaused);
            sm.TransitionHandler(States.Running, States.Paused).Rollback += new RollbackTransitionEvent(RollbackTransitionToPaused);

            sm.TransitionHandler(States.Running, States.Finished).Prepare  += new PrepareTransitionEvent(PrepareToTransitionToFinishedWithSuccess);
            sm.TransitionHandler(States.Running, States.Finished).Commit   += new CommitTransitionEvent(CommitTransitionToFinished);
            sm.TransitionHandler(States.Running, States.Finished).Rollback += new RollbackTransitionEvent(RollbackTransitionToFinished);

            sm.DoTransition(States.Validated, m_batch);
            _Debug.Assert(States.Validated.Equals(sm.State), "Transition chain did not move to the 'Validated' state.");
            sm.DoTransition(States.Running, m_batch);
            _Debug.Assert(States.Running.Equals(sm.State), "Transition chain did not move to the 'Running' state.");
            sm.DoTransition(States.Paused, m_batch);
            _Debug.Assert(States.Paused.Equals(sm.State), "Transition chain did not move to the 'Paused' state.");
            sm.DoTransition(States.Running, m_batch);
            _Debug.Assert(States.Running.Equals(sm.State), "Transition chain did not move to the 'Running' state.");
            sm.DoTransition(States.Finished, m_batch);
            _Debug.Assert(States.Finished.Equals(sm.State), "Transition chain did not move to the 'Finished' state.");
        }