public void FluentStateMachineBuilder_GloballyTransitionsTo_NullState_ThrowsNullEx() { Assert.Throws <ArgumentNullException>(() => FluentStateMachine <StubStateModel> .Describe() .State("s1") .GloballyTransitionsTo(null)); }
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")); }
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); }
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(); }
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(); }
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())); }
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]); }
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()); }
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()); }
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]); }
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)); }
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)); }
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 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); }
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")); }
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())); }
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 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(); }