示例#1
0
        public void Loading(
            StateMachineSaver <State> saver,
            StateMachineLoader <State> loader,
            State sourceState,
            State targetState)
        {
            "establish a saved state machine with history"._(() =>
            {
                var machine = new PassiveStateMachine <State, Event>();
                DefineMachine(machine);
                machine.Initialize(State.A);
                machine.Start();
                machine.Fire(Event.S2);     // set history of super state S
                machine.Fire(Event.B);      // set current state to B

                saver  = new StateMachineSaver <State>();
                loader = new StateMachineLoader <State>();

                machine.Save(saver);
            });

            "when state machine is loaded"._(() =>
            {
                loader.SetCurrentState(saver.CurrentStateId);
                loader.SetHistoryStates(saver.HistoryStates);

                var loadedMachine = new PassiveStateMachine <State, Event>();
                DefineMachine(loadedMachine);
                loadedMachine.Load(loader);

                loadedMachine.TransitionCompleted += (sender, args) =>
                {
                    sourceState = args.StateId;
                    targetState = args.NewStateId;
                };

                loadedMachine.Start();
                loadedMachine.Fire(Event.S);
            });

            "it should reset current state"._(() =>
                                              sourceState.Should().Be(State.B));

            "it should reset all history states of super states"._(() =>
                                                                   targetState.Should().Be(State.S2));
        }
示例#2
0
        public void InitializeALoadedStateMachine(
            PassiveStateMachine <int, int> machine,
            Exception receivedException)
        {
            "establish a loaded state machine"._(() =>
            {
                machine = new PassiveStateMachine <int, int>();

                machine.Load(A.Fake <IStateMachineLoader <int> >());
            });

            "when initializing the state machine"._(() =>
                                                    receivedException = Catch.Exception(() =>
                                                                                        machine.Initialize(0)));

            "should throw an invalid operation exception"._(() =>
            {
                receivedException
                .Should().BeAssignableTo <InvalidOperationException>();
                receivedException.Message
                .Should().Be(ExceptionMessages.StateMachineIsAlreadyInitialized);
            });
        }