public void Report() { var elevator = new PassiveStateMachine <States, Events>("Elevator"); elevator.DefineHierarchyOn(States.Healthy, States.OnFloor, HistoryType.Deep, States.OnFloor, States.Moving); elevator.DefineHierarchyOn(States.Moving, States.MovingUp, HistoryType.Shallow, States.MovingUp, States.MovingDown); elevator.DefineHierarchyOn(States.OnFloor, States.DoorClosed, HistoryType.None, States.DoorClosed, States.DoorOpen); elevator.In(States.Healthy) .On(Events.ErrorOccured).Goto(States.Error); elevator.In(States.Error) .On(Events.Reset).Goto(States.Healthy) .On(Events.ErrorOccured); elevator.In(States.OnFloor) .ExecuteOnEntry(AnnounceFloor) .ExecuteOnExit(Beep, Beep) .On(Events.CloseDoor).Goto(States.DoorClosed) .On(Events.OpenDoor).Goto(States.DoorOpen) .On(Events.GoUp) .If(CheckOverload).Goto(States.MovingUp) .Otherwise().Execute(AnnounceOverload, Beep) .On(Events.GoDown) .If(CheckOverload).Goto(States.MovingDown) .Otherwise().Execute(AnnounceOverload); elevator.In(States.Moving) .On(Events.Stop).Goto(States.OnFloor); elevator.Initialize(States.OnFloor); elevator.Report(this.testee); string statesReport; string transitionsReport; this.stateStream.Position = 0; using (var reader = new StreamReader(this.stateStream)) { statesReport = reader.ReadToEnd(); } this.transitionsStream.Position = 0; using (var reader = new StreamReader(this.transitionsStream)) { transitionsReport = reader.ReadToEnd(); } const string ExpectedStatesReport = "Source;Entry;Exit;ChildrenOnFloor;AnnounceFloor;Beep, Beep;DoorClosed, DoorOpenMoving;;;MovingUp, MovingDownHealthy;;;OnFloor, MovingMovingUp;;;MovingDown;;;DoorClosed;;;DoorOpen;;;Error;;;"; const string ExpectedTransitionsReport = "Source;Event;Guard;Target;ActionsOnFloor;CloseDoor;;DoorClosed;OnFloor;OpenDoor;;DoorOpen;OnFloor;GoUp;CheckOverload;MovingUp;OnFloor;GoUp;;internal transition;AnnounceOverload, BeepOnFloor;GoDown;CheckOverload;MovingDown;OnFloor;GoDown;;internal transition;AnnounceOverloadMoving;Stop;;OnFloor;Healthy;ErrorOccured;;Error;Error;Reset;;Healthy;Error;ErrorOccured;;internal transition;"; statesReport.Replace("\n", string.Empty).Replace("\r", string.Empty) .Should().Be(ExpectedStatesReport.Replace("\n", string.Empty).Replace("\r", string.Empty)); transitionsReport.Replace("\n", string.Empty).Replace("\r", string.Empty) .Should().Be(ExpectedTransitionsReport.Replace("\n", string.Empty).Replace("\r", string.Empty)); }
public void Report(string dummyName, Func <string, StateMachineDefinition <States, Events>, IStateMachine <States, Events> > createStateMachine) { var stateStream = new MemoryStream(); var transitionsStream = new MemoryStream(); var testee = new CsvStateMachineReportGenerator <States, Events>(stateStream, transitionsStream); var stateMachineDefinitionBuilder = new StateMachineDefinitionBuilder <States, Events>(); stateMachineDefinitionBuilder .DefineHierarchyOn(States.Healthy) .WithHistoryType(HistoryType.Deep) .WithInitialSubState(States.OnFloor) .WithSubState(States.Moving); stateMachineDefinitionBuilder .DefineHierarchyOn(States.Moving) .WithHistoryType(HistoryType.Shallow) .WithInitialSubState(States.MovingUp) .WithSubState(States.MovingDown); stateMachineDefinitionBuilder .DefineHierarchyOn(States.OnFloor) .WithHistoryType(HistoryType.None) .WithInitialSubState(States.DoorClosed) .WithSubState(States.DoorOpen); stateMachineDefinitionBuilder .In(States.Healthy) .On(Events.ErrorOccurred).Goto(States.Error); stateMachineDefinitionBuilder .In(States.Error) .On(Events.Reset).Goto(States.Healthy) .On(Events.ErrorOccurred); stateMachineDefinitionBuilder .In(States.OnFloor) .ExecuteOnEntry(AnnounceFloor) .ExecuteOnExit(Beep) .ExecuteOnExit(Beep) .On(Events.CloseDoor).Goto(States.DoorClosed) .On(Events.OpenDoor).Goto(States.DoorOpen) .On(Events.GoUp) .If(CheckOverload) .Goto(States.MovingUp) .Otherwise() .Execute(AnnounceOverload) .Execute(Beep) .On(Events.GoDown) .If(CheckOverload) .Goto(States.MovingDown) .Otherwise() .Execute(AnnounceOverload); stateMachineDefinitionBuilder .In(States.Moving) .On(Events.Stop).Goto(States.OnFloor); var stateMachineDefinition = stateMachineDefinitionBuilder .WithInitialState(States.OnFloor) .Build(); var elevator = createStateMachine("Elevator", stateMachineDefinition); elevator.Report(testee); string statesReport; string transitionsReport; stateStream.Position = 0; using (var reader = new StreamReader(stateStream)) { statesReport = reader.ReadToEnd(); } transitionsStream.Position = 0; using (var reader = new StreamReader(transitionsStream)) { transitionsReport = reader.ReadToEnd(); } const string ExpectedTransitionsReport = "Source;Event;Guard;Target;ActionsHealthy;ErrorOccurred;;Error;OnFloor;CloseDoor;;DoorClosed;OnFloor;OpenDoor;;DoorOpen;OnFloor;GoUp;CheckOverload;MovingUp;OnFloor;GoUp;;internal transition;AnnounceOverload, BeepOnFloor;GoDown;CheckOverload;MovingDown;OnFloor;GoDown;;internal transition;AnnounceOverloadMoving;Stop;;OnFloor;Error;Reset;;Healthy;Error;ErrorOccurred;;internal transition;"; const string ExpectedStatesReport = "Source;Entry;Exit;ChildrenHealthy;;;OnFloor, MovingOnFloor;AnnounceFloor;Beep, Beep;DoorClosed, DoorOpenMoving;;;MovingUp, MovingDownMovingUp;;;MovingDown;;;DoorClosed;;;DoorOpen;;;Error;;;"; statesReport .IgnoringNewlines() .Should() .Be( ExpectedStatesReport .IgnoringNewlines()); transitionsReport .IgnoringNewlines() .Should() .Be( ExpectedTransitionsReport .IgnoringNewlines()); stateStream.Dispose(); }