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