public IActionResult Edit(ExpectedReport expectedReport) { if (ModelState.IsValid) { _context.Update(expectedReport); _context.SaveChanges(); return RedirectToAction("Index"); } return View(expectedReport); }
public void YEdGraphML() { 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); var stream = new MemoryStream(); var textWriter = new StreamWriter(stream); var testee = new YEdStateMachineReportGenerator <States, Events>(textWriter); elevator.Report(testee); stream.Position = 0; var reader = new StreamReader(stream); var report = reader.ReadToEnd(); const string ExpectedReport = "<?xml version=\"1.0\" encoding=\"utf-8\"?><graphml xmlns:y=\"http://www.yworks.com/xml/graphml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:yed=\"http://www.yworks.com/xml/yed/3\" xmlns:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd\" xmlns=\"http://graphml.graphdrawing.org/xmlns\"> <!--Created by Appccelerate.StateMachine.YEdStateMachineReportGenerator--> <key for=\"graphml\" id=\"d0\" yfiles.type=\"resources\" /> <key for=\"port\" id=\"d1\" yfiles.type=\"portgraphics\" /> <key for=\"port\" id=\"d2\" yfiles.type=\"portgeometry\" /> <key for=\"port\" id=\"d3\" yfiles.type=\"portuserdata\" /> <key attr.name=\"url\" attr.type=\"string\" for=\"node\" id=\"d4\" /> <key attr.name=\"description\" attr.type=\"string\" for=\"node\" id=\"d5\" /> <key for=\"node\" id=\"d6\" yfiles.type=\"nodegraphics\" /> <key attr.name=\"Beschreibung\" attr.type=\"string\" for=\"graph\" id=\"d7\"> <default /> </key> <key attr.name=\"url\" attr.type=\"string\" for=\"edge\" id=\"d8\" /> <key attr.name=\"description\" attr.type=\"string\" for=\"edge\" id=\"d9\" /> <key for=\"edge\" id=\"d10\" yfiles.type=\"edgegraphics\" /> <graph edgedefault=\"directed\" id=\"G\"> <node id=\"Healthy\"> <data key=\"d6\"> <y:ProxyAutoBoundsNode> <y:Realizers active=\"0\"> <y:GroupNode> <y:NodeLabel alignment=\"right\" autoSizePolicy=\"node_width\" backgroundColor=\"#EBEBEB\" modelName=\"internal\" modelPosition=\"t\">Healthy</y:NodeLabel> <y:State closed=\"false\" innerGraphDisplayEnabled=\"true\" /> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault=\"directed\" id=\"Healthy:\"> <node id=\"OnFloor\"> <data key=\"d6\"> <y:ProxyAutoBoundsNode> <y:Realizers active=\"0\"> <y:GroupNode> <y:NodeLabel alignment=\"right\" autoSizePolicy=\"node_width\" backgroundColor=\"#EBEBEB\" modelName=\"internal\" modelPosition=\"t\">(AnnounceFloor)OnFloor(Beep, Beep)</y:NodeLabel> <y:State closed=\"false\" innerGraphDisplayEnabled=\"true\" /> <y:BorderStyle width=\"2.0\" /> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault=\"directed\" id=\"OnFloor:\"> <node id=\"DoorClosed\"> <data key=\"d6\"> <y:ShapeNode> <y:NodeLabel>DoorClosed</y:NodeLabel> <y:Shape type=\"ellipse\" /> <y:BorderStyle width=\"2.0\" /> </y:ShapeNode> </data> </node> <node id=\"DoorOpen\"> <data key=\"d6\"> <y:ShapeNode> <y:NodeLabel>DoorOpen</y:NodeLabel> <y:Shape type=\"ellipse\" /> </y:ShapeNode> </data> </node> </graph> </node> <node id=\"Moving\"> <data key=\"d6\"> <y:ProxyAutoBoundsNode> <y:Realizers active=\"0\"> <y:GroupNode> <y:NodeLabel alignment=\"right\" autoSizePolicy=\"node_width\" backgroundColor=\"#EBEBEB\" modelName=\"internal\" modelPosition=\"t\">Moving</y:NodeLabel> <y:State closed=\"false\" innerGraphDisplayEnabled=\"true\" /> </y:GroupNode> </y:Realizers> </y:ProxyAutoBoundsNode> </data> <graph edgedefault=\"directed\" id=\"Moving:\"> <node id=\"MovingUp\"> <data key=\"d6\"> <y:ShapeNode> <y:NodeLabel>MovingUp</y:NodeLabel> <y:Shape type=\"ellipse\" /> <y:BorderStyle width=\"2.0\" /> </y:ShapeNode> </data> </node> <node id=\"MovingDown\"> <data key=\"d6\"> <y:ShapeNode> <y:NodeLabel>MovingDown</y:NodeLabel> <y:Shape type=\"ellipse\" /> </y:ShapeNode> </data> </node> </graph> </node> </graph> </node> <node id=\"Error\"> <data key=\"d6\"> <y:ShapeNode> <y:NodeLabel>Error</y:NodeLabel> <y:Shape type=\"ellipse\" /> </y:ShapeNode> </data> </node> <edge id=\"CloseDoor0\" source=\"OnFloor\" target=\"DoorClosed\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>CloseDoor</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"OpenDoor1\" source=\"OnFloor\" target=\"DoorOpen\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>OpenDoor</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"GoUp2\" source=\"OnFloor\" target=\"MovingUp\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>[CheckOverload]GoUp</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"GoUp3\" source=\"OnFloor\" target=\"OnFloor\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"dashed\" /> <y:Arrows source=\"none\" target=\"plain\" /> <y:EdgeLabel>GoUp(AnnounceOverload, Beep)</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"GoDown4\" source=\"OnFloor\" target=\"MovingDown\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>[CheckOverload]GoDown</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"GoDown5\" source=\"OnFloor\" target=\"OnFloor\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"dashed\" /> <y:Arrows source=\"none\" target=\"plain\" /> <y:EdgeLabel>GoDown(AnnounceOverload)</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"Stop6\" source=\"Moving\" target=\"OnFloor\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>Stop</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"ErrorOccured7\" source=\"Healthy\" target=\"Error\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>ErrorOccured</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"Reset8\" source=\"Error\" target=\"Healthy\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"line\" /> <y:Arrows source=\"none\" target=\"standard\" /> <y:EdgeLabel>Reset</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> <edge id=\"ErrorOccured9\" source=\"Error\" target=\"Error\"> <data key=\"d10\"> <y:PolyLineEdge> <y:LineStyle type=\"dashed\" /> <y:Arrows source=\"none\" target=\"plain\" /> <y:EdgeLabel>ErrorOccured</y:EdgeLabel> </y:PolyLineEdge> </data> </edge> </graph> <data key=\"d0\"> <y:Resources /> </data></graphml>"; var cleanedReport = report.Replace("\n", string.Empty).Replace("\r", string.Empty); cleanedReport.Should().Be(ExpectedReport.Replace("\n", string.Empty).Replace("\r", string.Empty)); }
public void Report() { this.machine.DefineHierarchyOn(States.B) .WithHistoryType(HistoryType.None) .WithInitialSubState(States.B1) .WithSubState(States.B2); this.machine.DefineHierarchyOn(States.C) .WithHistoryType(HistoryType.Shallow) .WithInitialSubState(States.C1) .WithSubState(States.C2); this.machine.DefineHierarchyOn(States.C1) .WithHistoryType(HistoryType.Shallow) .WithInitialSubState(States.C1A) .WithSubState(States.C1B); this.machine.DefineHierarchyOn(States.D) .WithHistoryType(HistoryType.Deep) .WithInitialSubState(States.D1) .WithSubState(States.D2); this.machine.DefineHierarchyOn(States.D1) .WithHistoryType(HistoryType.Deep) .WithInitialSubState(States.D1A) .WithSubState(States.D1B); this.machine.In(States.A) .ExecuteOnEntry(EnterA) .ExecuteOnExit(ExitA) .On(Events.A) .On(Events.B).Goto(States.B) .On(Events.C).If(() => true).Goto(States.C1) .On(Events.C).If(() => false).Goto(States.C2); this.machine.In(States.B) .On(Events.A).Goto(States.A).Execute(Action); this.machine.In(States.B1) .On(Events.B2).Goto(States.B1); this.machine.In(States.B2) .On(Events.B1).Goto(States.B2); this.machine.Initialize(States.A); var testee = new StateMachineReportGenerator <States, Events>(); this.machine.Report(testee); string report = testee.Result; const string ExpectedReport = @"Test Machine: initial state = A B: initial state = B1 history type = None entry action: exit action: A -> A actions: Action guard: B1: initial state = None history type = None entry action: exit action: B2 -> B1 actions: guard: B2: initial state = None history type = None entry action: exit action: B1 -> B2 actions: guard: C: initial state = C1 history type = Shallow entry action: exit action: C1: initial state = C1A history type = Shallow entry action: exit action: C1A: initial state = None history type = None entry action: exit action: C1B: initial state = None history type = None entry action: exit action: C2: initial state = None history type = None entry action: exit action: D: initial state = D1 history type = Deep entry action: exit action: D1: initial state = D1A history type = Deep entry action: exit action: D1A: initial state = None history type = None entry action: exit action: D1B: initial state = None history type = None entry action: exit action: D2: initial state = None history type = None entry action: exit action: A: initial state = None history type = None entry action: EnterA exit action: ExitA A -> internal actions: guard: B -> B actions: guard: C -> C1 actions: guard: <Report>b__2_0 C -> C2 actions: guard: <Report>b__2_1 "; report.Replace("\n", string.Empty).Replace("\r", string.Empty) .Should().Be(ExpectedReport.Replace("\n", string.Empty).Replace("\r", string.Empty)); }
public void Report(string dummyName, Func <string, StateMachineDefinition <States, Events>, IStateMachine <States, Events> > createStateMachine) { var stateMachineDefinitionBuilder = new StateMachineDefinitionBuilder <States, Events>(); stateMachineDefinitionBuilder .DefineHierarchyOn(States.B) .WithHistoryType(HistoryType.None) .WithInitialSubState(States.B1) .WithSubState(States.B2); stateMachineDefinitionBuilder .DefineHierarchyOn(States.C) .WithHistoryType(HistoryType.Shallow) .WithInitialSubState(States.C1) .WithSubState(States.C2); stateMachineDefinitionBuilder .DefineHierarchyOn(States.C1) .WithHistoryType(HistoryType.Shallow) .WithInitialSubState(States.C1A) .WithSubState(States.C1B); stateMachineDefinitionBuilder .DefineHierarchyOn(States.D) .WithHistoryType(HistoryType.Deep) .WithInitialSubState(States.D1) .WithSubState(States.D2); stateMachineDefinitionBuilder .DefineHierarchyOn(States.D1) .WithHistoryType(HistoryType.Deep) .WithInitialSubState(States.D1A) .WithSubState(States.D1B); stateMachineDefinitionBuilder .In(States.A) .ExecuteOnEntry(EnterA) .ExecuteOnExit(ExitA) .On(Events.A) .On(Events.B).Goto(States.B) .On(Events.C).If(AlwaysTrue).Goto(States.C1) .On(Events.C).If(AlwaysFalse).Goto(States.C2); stateMachineDefinitionBuilder .In(States.B) .On(Events.A).Goto(States.A).Execute(Action); stateMachineDefinitionBuilder .In(States.B1) .On(Events.B2).Goto(States.B1); stateMachineDefinitionBuilder .In(States.B2) .On(Events.B1).Goto(States.B2); var stateMachineDefinition = stateMachineDefinitionBuilder .WithInitialState(States.A) .Build(); var stateMachine = createStateMachine("Test Machine", stateMachineDefinition); var testee = new StateMachineReportGenerator <States, Events>(); stateMachine.Report(testee); var actualReport = testee.Result; const string ExpectedReport = @"Test Machine: initial state = A B: initial state = B1 history type = None entry action: exit action: A -> A actions: Action guard: B1: initial state = None history type = None entry action: exit action: B2 -> B1 actions: guard: B2: initial state = None history type = None entry action: exit action: B1 -> B2 actions: guard: C: initial state = C1 history type = Shallow entry action: exit action: C1: initial state = C1A history type = Shallow entry action: exit action: C1A: initial state = None history type = None entry action: exit action: C1B: initial state = None history type = None entry action: exit action: C2: initial state = None history type = None entry action: exit action: D: initial state = D1 history type = Deep entry action: exit action: D1: initial state = D1A history type = Deep entry action: exit action: D1A: initial state = None history type = None entry action: exit action: D1B: initial state = None history type = None entry action: exit action: D2: initial state = None history type = None entry action: exit action: A: initial state = None history type = None entry action: EnterA exit action: ExitA A -> internal actions: guard: B -> B actions: guard: C -> C1 actions: guard: AlwaysTrue C -> C2 actions: guard: AlwaysFalse "; actualReport .IgnoringNewlines() .Should() .Be( ExpectedReport .IgnoringNewlines()); }
public void Report() { this.machine.DefineHierarchyOn(States.B, States.B1, HistoryType.None, States.B1, States.B2); this.machine.DefineHierarchyOn(States.C, States.C1, HistoryType.Shallow, States.C1, States.C2); this.machine.DefineHierarchyOn(States.C1, States.C1a, HistoryType.Shallow, States.C1a, States.C1b); this.machine.DefineHierarchyOn(States.D, States.D1, HistoryType.Deep, States.D1, States.D2); this.machine.DefineHierarchyOn(States.D1, States.D1a, HistoryType.Deep, States.D1a, States.D1b); this.machine.In(States.A) .ExecuteOnEntry(EnterA) .ExecuteOnExit(ExitA) .On(Events.A) .On(Events.B).Goto(States.B) .On(Events.C).If(eventArguments => true).Goto(States.C1) .On(Events.C).If(eventArguments => false).Goto(States.C2); this.machine.In(States.B) .On(Events.A).Goto(States.A).Execute(Action); this.machine.In(States.B1) .On(Events.B2).Goto(States.B1); this.machine.In(States.B2) .On(Events.B1).Goto(States.B2); this.machine.Initialize(States.A); var testee = new StateMachineReportGenerator <States, Events>(); this.machine.Report(testee); string report = testee.Result; const string ExpectedReport = @"Test Machine: initial state = A B: initial state = B1 history type = None entry action: exit action: A -> A actions: Action guard: B1: initial state = None history type = None entry action: exit action: B2 -> B1 actions: guard: B2: initial state = None history type = None entry action: exit action: B1 -> B2 actions: guard: C: initial state = C1 history type = Shallow entry action: exit action: C1: initial state = C1a history type = Shallow entry action: exit action: C1a: initial state = None history type = None entry action: exit action: C1b: initial state = None history type = None entry action: exit action: C2: initial state = None history type = None entry action: exit action: D: initial state = D1 history type = Deep entry action: exit action: D1: initial state = D1a history type = Deep entry action: exit action: D1a: initial state = None history type = None entry action: exit action: D1b: initial state = None history type = None entry action: exit action: D2: initial state = None history type = None entry action: exit action: A: initial state = None history type = None entry action: EnterA exit action: ExitA A -> internal actions: guard: B -> B actions: guard: C -> C1 actions: guard: anonymous C -> C2 actions: guard: anonymous "; report.Replace("\n", string.Empty).Replace("\r", string.Empty) .Should().Be(ExpectedReport.Replace("\n", string.Empty).Replace("\r", string.Empty)); }