public void FluentStateMachineBuilder_GloballyTransitionsTo_NullState_ThrowsNullEx()
 {
     Assert.Throws <ArgumentNullException>(() =>
                                           FluentStateMachine <StubStateModel> .Describe()
                                           .State("s1")
                                           .GloballyTransitionsTo(null));
 }
예제 #2
0
        public void FluentStateMachine_StateNamed_ValidParms_ReturnsMatchingStateFromConstructor()
        {
            var machine = new StateMachine <StubStateModel>();
            var state1  = new State <StubStateModel>("s1");
            var state2  = new State <StubStateModel>("s2");
            var state3  = new State <StubStateModel>("s3");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machine,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Equal(state1, fluentMachine.StateNamed("s1"));
            Assert.Equal(state2, fluentMachine.StateNamed("s2"));
            Assert.Equal(state3, fluentMachine.StateNamed("s3"));
        }
예제 #3
0
        public void FluentStateMachine_InitialState_SameValueAsConstructor()
        {
            var machine     = new StateMachine <StubStateModel>();
            var machineMock = new Mock <IStateMachine <StubStateModel> >();
            var state1      = new State <StubStateModel>("s1");
            var state2      = new State <StubStateModel>("s2");
            var state3      = new State <StubStateModel>("s3");
            var trigger1    = new Trigger("t1");
            var trigger2    = new Trigger("t2");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);


            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Same(state2, fluentMachine.InitialState);
        }
예제 #4
0
        public void FluentStateMachine_AvailableStates_ValidParms_CallsReturnsMachineAvailable()
        {
            var machineMock = new Mock <IStateMachine <StubStateModel> >();
            var state1      = new State <StubStateModel>("s1");
            var state2      = new State <StubStateModel>("s2");
            var state3      = new State <StubStateModel>("s3");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var model = new StubStateModel();


            machineMock.Setup(m => m.AvailableStates(model)).Returns(allStates).Verifiable();

            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            var result = fluentMachine.AvailableStates(model);

            Assert.Same(allStates, result);
            machineMock.VerifyAll();
        }
예제 #5
0
        public void FluentStateMachine_AvailableStates_ValidParms_CallsReturnsMachineAvailable()
        {
            var machineMock = new Mock<IStateMachine<StubStateModel>>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var model = new StubStateModel();

            machineMock.Setup(m => m.AvailableStates(model)).Returns(allStates).Verifiable();

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            var result = fluentMachine.AvailableStates(model);

            Assert.Same(allStates, result);
            machineMock.VerifyAll();
        }
예제 #6
0
        public void FluentStateMachine_Trigger_NullName_ThrowsNullEx()
        {
            var machine = new StateMachine <StubStateModel>();
            var state1  = new State <StubStateModel>("s1");
            var state2  = new State <StubStateModel>("s2");
            var state3  = new State <StubStateModel>("s3");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);


            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machine,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Throws <ArgumentNullException>(() =>
                                                  fluentMachine.Trigger(null, new StubStateModel()));
        }
예제 #7
0
        public void FluentStateMachine_Trigger_ValidParms_CallsReturnsMachineTrigger()
        {
            var machineMock = new Mock <IStateMachine <StubStateModel> >();
            var state1      = new State <StubStateModel>("s1");
            var state2      = new State <StubStateModel>("s2");
            var state3      = new State <StubStateModel>("s3");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var model = new StubStateModel();


            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            machineMock.Setup(m => m.Trigger(It.Is <Trigger>(t => t.Name == "trigger1"), model)).Verifiable();

            fluentMachine.Trigger("trigger1", model);

            machineMock.VerifyAll();
        }
        public void FluentStateMachineBuilder_AfterExit_DefiningState_AddsEvent()
        {
            var loggedEvents = new List <string>();
            Action <string, TransitionEventArgs <StubStateModel> > logEvent = (message, e) =>
            {
                loggedEvents.Add(string.Format("{0} from {1} to {2} on {3}",
                                               message, e.From, e.To, e.Trigger));
            };

            var machine = FluentStateMachine <StubStateModel> .Describe()
                          .State("s1")
                          .AfterExit(e => logEvent("AfterExit", e))
                          .TransitionsTo("s2").On("t")
                          .Initiates()
                          .State("s2")
                          .AfterExit(e => logEvent("AfterExit", e))
                          .TransitionsTo("s1").On("t")
                          .Compile();

            var model = new StubStateModel();

            model.CurrentState = machine.InitialState;

            machine.Trigger("t", model);
            Assert.Equal("s2", model.CurrentState.ToString());
            Assert.Equal(1, loggedEvents.Count());
            Assert.Equal("AfterExit from s1 to s2 on t", loggedEvents[0]);
        }
예제 #9
0
        public void FluentStateMachine_Describe_ReturnsNewBuilderApi()
        {
            var result = FluentStateMachine <StubStateModel> .Describe();

            var result2 = FluentStateMachine <StubStateModel> .Describe();

            Assert.NotNull(result);
            Assert.NotNull(result);
            Assert.NotSame(result, result2);
        }
        public void FluentStateMachineBuilder_State_ValidParms_CreatesNewState()
        {
            var machine = FluentStateMachine <StubStateModel> .Describe()
                          .State("s1")
                          .Initiates()
                          .Compile();

            var model = new StubStateModel();

            model.CurrentState = machine.InitialState;

            Assert.Equal("s1", model.CurrentState.ToString());
        }
예제 #11
0
        public void FluentStateMachine_GlobalTransitionings_AddsEachOneToMachine()
        {
            var machine     = new StateMachine <StubStateModel>();
            var machineMock = new Mock <IStateMachine <StubStateModel> >();
            var state1      = new State <StubStateModel>("s1");
            var state2      = new State <StubStateModel>("s2");
            var state3      = new State <StubStateModel>("s3");
            var trigger1    = new Trigger("t1");
            var trigger2    = new Trigger("t2");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            // transition arg
            var arg = new TransitionEventArgs <StubStateModel>(new StubStateModel(),
                                                               state1, state2, trigger1);

            // create some global transitionings
            Action <TransitionEventArgs <StubStateModel> > callback1 = e => { };
            Action <TransitionEventArgs <StubStateModel> > callback2 = e => { };
            Action <TransitionEventArgs <StubStateModel> > callback3 = e => { };

            // put them in an ienum
            var callbacks = new List <Action <TransitionEventArgs <StubStateModel> > >();

            callbacks.Add(callback1);
            callbacks.Add(callback2);
            callbacks.Add(callback3);


            // create a fluent machine, and validate each was added to machine
            //machineMock.Raise(m => m.Transitioning += null, arg);
            machineMock.SetupAllProperties();

            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machineMock.Object,
                allStates,
                null,
                callbacks,
                null,
                null);

            //machineMock.VerifyAll();
        }
        public void FluentStateMachineBuilder_On_SetsTriggerForATransition()
        {
            var machine = FluentStateMachine <StubStateModel> .Describe()
                          .State("s1")
                          .TransitionsTo("s2").On("t")
                          .Initiates()
                          .State("s2")
                          .TransitionsTo("s1").On("t")
                          .Compile();

            var model = new StubStateModel();

            model.CurrentState = machine.InitialState;

            Assert.Equal("s1", model.CurrentState.ToString());
            machine.Trigger("t", model);
            Assert.Equal("s2", model.CurrentState.ToString());
        }
예제 #13
0
        public void FluentStateMachine_GlobalTransition_AddsEachOneToMachine()
        {
            var machineMock = new Mock <IStateMachine <StubStateModel> >();
            var state1      = new State <StubStateModel>("s1");
            var state2      = new State <StubStateModel>("s2");
            var state3      = new State <StubStateModel>("s3");
            var trigger1    = new Trigger("t1");
            var trigger2    = new Trigger("t2");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            // create some global trans
            var transition1 = new Transition <StubStateModel>(trigger1, null, state2);
            var transition2 = new Transition <StubStateModel>(trigger2, null, state3);
            // put them in an ienum
            var transitions = new List <Transition <StubStateModel> >();

            transitions.Add(transition1);
            transitions.Add(transition2);

            // set up verifications for items being added to machine mock
            var globalTransitionsAdded = new List <Transition <StubStateModel> >();

            machineMock.Setup(s => s.AddGlobalTransition(It.IsAny <Transition <StubStateModel> >()))
            .Callback <Transition <StubStateModel> >(t => globalTransitionsAdded.Add(t));

            // create a fluent machine, and validate each was added to machine

            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machineMock.Object,
                allStates,
                null,
                null,
                null,
                transitions);

            Assert.Equal(2, globalTransitionsAdded.Count);
            Assert.Equal(transition1, globalTransitionsAdded[0]);
            Assert.Equal(transition2, globalTransitionsAdded[1]);
        }
        public void FluentStateMachineBuilder_When_WhileDefTrans_AddsGuardToTransition()
        {
            var machine = FluentStateMachine <StubStateModel> .Describe()
                          .State("s1")
                          .Initiates()
                          .TransitionsTo("s2").On("t").When(m => false)
                          .TransitionsTo("s3").On("t").When(m => true)
                          .State("s2")
                          .State("s3")
                          .Compile();

            var model = new StubStateModel();

            model.CurrentState = machine.InitialState;

            Assert.Equal("s1", model.CurrentState.ToString());
            machine.Trigger("t", model);
            Assert.Equal("s3", model.CurrentState.ToString());
        }
        public void FluentStateMachineBuilder_DefiningCallbacksOnAll_AllCallbacksCalledInOrder()
        {
            var loggedEvents = new List <string>();
            Action <string, TransitionEventArgs <StubStateModel> > logEvent = (message, e) =>
            {
                loggedEvents.Add(string.Format("{0} from {1} to {2} on {3}",
                                               message, e.From, e.To, e.Trigger));
            };

            var machine = FluentStateMachine <StubStateModel> .Describe()
                          .State("s1")
                          .BeforeEntry(e => logEvent("beforeEntry", e))
                          .AfterEntry(e => logEvent("afterEntry", e))
                          .BeforeExit(e => logEvent("beforeExit", e))
                          .AfterExit(e => logEvent("afterExit", e))
                          .TransitionsTo("s2").On("t")
                          .Initiates()
                          .State("s2")
                          .BeforeEntry(e => logEvent("beforeEntry", e))
                          .AfterEntry(e => logEvent("afterEntry", e))
                          .BeforeExit(e => logEvent("beforeExit", e))
                          .AfterExit(e => logEvent("afterExit", e))
                          .TransitionsTo("s1").On("t")
                          .BeforeTransition(e => logEvent("beforeTransition", e))
                          .AfterTransition(e => logEvent("afterTransition", e))
                          .Compile();

            var model = new StubStateModel();

            model.CurrentState = machine.InitialState;

            machine.Trigger("t", model);
            Assert.Equal("s2", model.CurrentState.ToString());
            Assert.Equal(6, loggedEvents.Count());
            Assert.Equal("beforeTransition from s1 to s2 on t", loggedEvents[0]);
            Assert.Equal("beforeExit from s1 to s2 on t", loggedEvents[1]);
            Assert.Equal("beforeEntry from s1 to s2 on t", loggedEvents[2]);
            Assert.Equal("afterExit from s1 to s2 on t", loggedEvents[3]);
            Assert.Equal("afterEntry from s1 to s2 on t", loggedEvents[4]);
            Assert.Equal("afterTransition from s1 to s2 on t", loggedEvents[5]);
        }
예제 #16
0
        public void FluentStateMachine_AvailableStates_NullModel_ThrowsNullEx()
        {
            var machineMock = new Mock<IStateMachine<StubStateModel>>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Throws<ArgumentNullException>(() =>
                fluentMachine.AvailableStates(null));
        }
예제 #17
0
        public void FluentStateMachine_StateNamed_NullName_ThrowsNullEx()
        {
            var machineMock = new Mock <IStateMachine <StubStateModel> >();
            var state1      = new State <StubStateModel>("s1");
            var state2      = new State <StubStateModel>("s2");
            var state3      = new State <StubStateModel>("s3");

            var allStates = new List <State <StubStateModel> >();

            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var fluentMachine = new FluentStateMachine <StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Throws <ArgumentNullException>(() =>
                                                  fluentMachine.StateNamed(null));
        }
예제 #18
0
        public void FluentStateMachine_GlobalTransition_AddsEachOneToMachine()
        {
            var machineMock = new Mock<IStateMachine<StubStateModel>>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");
            var trigger1 = new Trigger("t1");
            var trigger2 = new Trigger("t2");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            // create some global trans
            var transition1 = new Transition<StubStateModel>(trigger1, null, state2);
            var transition2 = new Transition<StubStateModel>(trigger2, null, state3);
            // put them in an ienum
            var transitions = new List<Transition<StubStateModel>>();
            transitions.Add(transition1);
            transitions.Add(transition2);

            // set up verifications for items being added to machine mock
            var globalTransitionsAdded = new List<Transition<StubStateModel>>();
            machineMock.Setup(s => s.AddGlobalTransition(It.IsAny<Transition<StubStateModel>>()))
                .Callback<Transition<StubStateModel>>(t => globalTransitionsAdded.Add(t));

            // create a fluent machine, and validate each was added to machine

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machineMock.Object,
                allStates,
                null,
                null,
                null,
                transitions);

            Assert.Equal(2, globalTransitionsAdded.Count);
            Assert.Equal(transition1, globalTransitionsAdded[0]);
            Assert.Equal(transition2, globalTransitionsAdded[1]);
        }
예제 #19
0
        public void FluentStateMachine_InitialState_SameValueAsConstructor()
        {
            var machine = new StateMachine<StubStateModel>();
            var machineMock = new Mock<IStateMachine<StubStateModel>>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");
            var trigger1 = new Trigger("t1");
            var trigger2 = new Trigger("t2");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Same(state2, fluentMachine.InitialState);
        }
예제 #20
0
        public void FluentStateMachine_StateNamed_ValidParms_ReturnsMatchingStateFromConstructor()
        {
            var machine = new StateMachine<StubStateModel>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machine,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Equal(state1, fluentMachine.StateNamed("s1"));
            Assert.Equal(state2, fluentMachine.StateNamed("s2"));
            Assert.Equal(state3, fluentMachine.StateNamed("s3"));
        }
예제 #21
0
        public void FluentStateMachine_Trigger_NullName_ThrowsNullEx()
        {
            var machine = new StateMachine<StubStateModel>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machine,
                allStates,
                state2,
                null,
                null,
                null);

            Assert.Throws<ArgumentNullException>(() =>
                fluentMachine.Trigger(null, new StubStateModel()));
        }
예제 #22
0
        public void FluentStateMachine_Trigger_ValidParms_CallsReturnsMachineTrigger()
        {
            var machineMock = new Mock<IStateMachine<StubStateModel>>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            var model = new StubStateModel();

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machineMock.Object,
                allStates,
                state2,
                null,
                null,
                null);

            machineMock.Setup(m => m.Trigger(It.Is<Trigger>(t => t.Name == "trigger1"), model)).Verifiable();

            fluentMachine.Trigger("trigger1", model);

            machineMock.VerifyAll();
        }
예제 #23
0
        public void FluentStateMachine_GlobalTransitioneds_AddsEachOneToMachine()
        {
            var machine = new StateMachine<StubStateModel>();
            var machineMock = new Mock<IStateMachine<StubStateModel>>();
            var state1 = new State<StubStateModel>("s1");
            var state2 = new State<StubStateModel>("s2");
            var state3 = new State<StubStateModel>("s3");
            var trigger1 = new Trigger("t1");
            var trigger2 = new Trigger("t2");

            var allStates = new List<State<StubStateModel>>();
            allStates.Add(state1);
            allStates.Add(state2);
            allStates.Add(state3);

            // transition arg
            var arg = new TransitionEventArgs<StubStateModel>(new StubStateModel(),
                state1, state2, trigger1);

            // create some global transitionings
            Action<TransitionEventArgs<StubStateModel>> callback1 = e => { };
            Action<TransitionEventArgs<StubStateModel>> callback2 = e => { };
            Action<TransitionEventArgs<StubStateModel>> callback3 = e => { };

            // put them in an ienum
            var callbacks = new List<Action<TransitionEventArgs<StubStateModel>>>();
            callbacks.Add(callback1);
            callbacks.Add(callback2);
            callbacks.Add(callback3);

            // create a fluent machine, and validate each was added to machine
            //machineMock.Raise(m => m.Transitioning += null, arg);
            //machineMock.SetupAllProperties();

            var fluentMachine = new FluentStateMachine<StubStateModel>(
                machineMock.Object,
                allStates,
                null,
                null,
                callbacks,
                null);

            //machineMock.VerifyAll();
        }