public void BuildOrder_Should_Check_Example() { //arrange var graph = new MyGraph <char>(6); graph.AddVertex(0, 'a'); graph.AddVertex(1, 'b'); graph.AddVertex(2, 'c'); graph.AddVertex(3, 'd'); graph.AddVertex(4, 'e'); graph.AddVertex(5, 'f'); graph.AddEdge(5, 1); graph.AddEdge(5, 0); graph.AddEdge(0, 3); graph.AddEdge(1, 3); graph.AddEdge(3, 2); var order = new[] { 'e', 'f', 'a', 'b', 'd', 'c' }; //act var result = _treesGraphs.BuildOrder(graph).ToArray(); //assert result.Length.ShouldBeEquivalentTo(order.Length); for (int i = 0; i < result.Length; i++) { result[i].ShouldBeEquivalentTo(order[i]); } }
public void RouteBetweenNodes_Should_Check_False() { //arrange var graph = new MyGraph <int>(7); graph.AddVertex(0, 0); graph.AddVertex(1, 1); graph.AddVertex(2, 2); graph.AddVertex(3, 3); graph.AddVertex(4, 4); graph.AddVertex(5, 5); graph.AddVertex(6, 6); graph.AddEdge(0, 4); graph.AddEdge(1, 4); graph.AddEdge(2, 5); graph.AddEdge(3, 5); graph.AddEdge(4, 0); graph.AddEdge(4, 1); graph.AddEdge(5, 2); graph.AddEdge(5, 3); //act var result = _treesGraphs.RouteBetweenNodes(graph, 0, 3); //assert result.ShouldBeEquivalentTo(false); }
public void Deserialize(string fileName, out MyGraph<Location> graph, out ArduinoGroupWrapper arduinoGroup) { var binder = new TypeNameSerializationBinder(); var graphString = File.ReadAllText(fileName); var deserialized = JsonConvert.DeserializeObject<SerializeWrapper>(graphString, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Binder = binder }); graph = deserialized.Graph; arduinoGroup = deserialized.ArduinoGroup; foreach (var edge in graph.Edges.OfType<MyEdge<Location>>().ToList()) { var from = edge.Source; var to = edge.Destination; var vertices = graph.SubGraphs.SelectMany(subgraph => subgraph.Vertices).ToList(); vertices.AddRange(graph.Vertices); graph.RemoveEdge(edge); graph.AddEdge( new MyEdge<Location>(vertices.First(vertex => vertex.Name == from.Name), vertices.First(vertex => vertex.Name == to.Name),edge.DestinationArrow) ); } }
public void GivenAGraph_WhenNodesHaveCycle_ShouldReturnTrue() { // Arrange var graph = new MyGraph <string>(); graph.AddNode("A"); graph.AddNode("B"); graph.AddNode("C"); graph.AddEdge("A", "B"); graph.AddEdge("B", "C"); graph.AddEdge("C", "A"); // Act var hasCycle = graph.HasCycle(); // Assert hasCycle.Should().BeTrue(); }
public void BuildOrder_Should_Check_For_Cycle() { //arrange var graph = new MyGraph <char>(6); graph.AddVertex(0, 'a'); graph.AddVertex(1, 'b'); graph.AddVertex(2, 'c'); graph.AddEdge(0, 1); graph.AddEdge(1, 2); graph.AddEdge(2, 0); //act Action act = () => _treesGraphs.BuildOrder(graph); //assert act.ShouldThrow <ArgumentException>(); }
public void GivenAGraphWithNode_WhenTheyHaveDependencyFromEachOther_ShouldTopologicalSortComThoseDependencies() { // Arrange var graph = new MyGraph <string>(); graph.AddNode("P"); graph.AddNode("A"); graph.AddNode("B"); graph.AddNode("X"); graph.AddEdge("X", "B"); graph.AddEdge("X", "A"); graph.AddEdge("A", "P"); graph.AddEdge("B", "P"); // Act var sort = graph.TopologicalSort(); // Assert sort.Should().BeEquivalentTo("X", "B", "A", "P"); }
public void Should_AddEdge_Throw_If_Out_Of_Range() { //arrange var graph = new MyGraph <int>(5); //act Action actLowerFrom = () => graph.AddEdge(-1, 1); Action actHigherFrom = () => graph.AddEdge(6, 1); Action actLowerTo = () => graph.AddEdge(1, -1); Action actHigherTo = () => graph.AddEdge(1, 6); //assert actLowerFrom.ShouldThrow <ArgumentOutOfRangeException>(); actHigherFrom.ShouldThrow <ArgumentOutOfRangeException>(); actLowerTo.ShouldThrow <ArgumentOutOfRangeException>(); actHigherTo.ShouldThrow <ArgumentOutOfRangeException>(); graph.Capacity.ShouldBeEquivalentTo(5); graph.Count.ShouldBeEquivalentTo(0); }
public void GivenTwoKeys_WhenGraphHaveThisNodesAndTheyDoNotHaveRelationship_ShouldConnectThisTwoNodes() { // Arrange var graph = new MyGraph <string>(); graph.AddNode("one"); graph.AddNode("two"); // Act graph.AddEdge("one", "two"); // Assert var values = graph.GetAll(); values.GetValue("one").Should().ContainSingle("two"); }
public void GivenTwoKeys_WhenGraphHaveTheseNodesAndTheyHaveRelationship_ShouldRemoveTheRelationship() { // Arrange var graph = new MyGraph <string>(); graph.AddNode("node1"); graph.AddNode("node2"); graph.AddEdge("node1", "node2"); // Act graph.RemoveEdge("node1", "node2"); // Assert foreach (var item in graph.GetAll()) { item.Value.Should().BeEmpty(); } }
public void AssignSwitchToLight() { var switches = _graph.SubGraphs.SelectMany(subGraph => subGraph.Vertices.OfType <Switch>()).ToList(); var switchFrom = switches.First(item => item.Name == AssignSwitchToLightSwitch); var lightes = _graph.SubGraphs.SelectMany(subGraph => subGraph.Vertices.OfType <Light>()).ToList(); var lightTo = lightes.First(item => item.Name == AssignSwitchToLightLight); //edge already exists if (_graph.Edges.Any(edge => ((Location)edge.Source).Name == AssignSwitchToLightSwitch && ((Location)edge.Destination).Name == AssignSwitchToLightLight)) { return; } _graph.AddEdge(new MyEdge <Location>(switchFrom, lightTo, new Arrow())); }
public void Should_RemoveEdge() { //arrange var graph = new MyGraph <int>(6); graph.AddVertex(0, 0); graph.AddVertex(1, 1); graph.AddVertex(2, 2); graph.AddVertex(3, 3); graph.AddVertex(4, 4); graph.AddVertex(5, 5); graph.AddEdge(0, 5); graph.AddEdge(0, 1); graph.AddEdge(0, 4); graph.AddEdge(1, 3); graph.AddEdge(1, 4); graph.AddEdge(2, 1); graph.AddEdge(3, 2); graph.AddEdge(3, 4); var resBfs = new[] { 0, 5, 4 }; //act graph.RemoveEdge(0, 1); var result = graph.BreadthFirstSearch(0).ToArray(); //assert result.Length.ShouldBeEquivalentTo(resBfs.Length); for (int i = 0; i < result.Length; i++) { result[i].ShouldBeEquivalentTo(resBfs[i]); } graph.Capacity.ShouldBeEquivalentTo(6); graph.Count.ShouldBeEquivalentTo(6); }
public void Should_Remove() { //arrange var graph = new MyGraph <int>(4); graph.AddVertex(0, 0); graph.AddVertex(1, 1); graph.AddVertex(2, 2); graph.AddVertex(3, 3); graph.AddEdge(0, 2); graph.AddEdge(1, 2); graph.AddEdge(2, 0); graph.AddEdge(2, 1); graph.AddEdge(2, 3); graph.AddEdge(3, 2); //act graph.Remove(2); var first = graph.BreadthFirstSearch(0).ToArray(); var second = graph.BreadthFirstSearch(1).ToArray(); var third = graph.BreadthFirstSearch(3).ToArray(); Action act = () => graph.BreadthFirstSearch(2).ToArray(); //assert first.Length.ShouldBeEquivalentTo(1); second.Length.ShouldBeEquivalentTo(1); third.Length.ShouldBeEquivalentTo(1); first[0].ShouldBeEquivalentTo(0); second[0].ShouldBeEquivalentTo(1); third[0].ShouldBeEquivalentTo(3); act.ShouldThrow <ArgumentException>(); graph.Capacity.ShouldBeEquivalentTo(4); graph.Count.ShouldBeEquivalentTo(3); }
public void Should_BidirectionalSearch_False() { //arrange var graph = new MyGraph <int>(15); graph.AddVertex(0, 0); graph.AddVertex(1, 1); graph.AddVertex(2, 2); graph.AddVertex(3, 3); graph.AddVertex(4, 4); graph.AddVertex(5, 5); graph.AddVertex(6, 6); graph.AddVertex(8, 8); graph.AddVertex(9, 9); graph.AddVertex(10, 10); graph.AddVertex(11, 11); graph.AddVertex(12, 12); graph.AddVertex(13, 13); graph.AddVertex(14, 14); graph.AddEdge(0, 4); graph.AddEdge(1, 4); graph.AddEdge(2, 5); graph.AddEdge(3, 5); graph.AddEdge(4, 0); graph.AddEdge(4, 1); graph.AddEdge(4, 6); graph.AddEdge(5, 2); graph.AddEdge(5, 3); graph.AddEdge(5, 6); graph.AddEdge(6, 4); graph.AddEdge(6, 5); graph.AddEdge(8, 9); graph.AddEdge(8, 10); graph.AddEdge(9, 8); graph.AddEdge(9, 11); graph.AddEdge(9, 12); graph.AddEdge(10, 8); graph.AddEdge(10, 13); graph.AddEdge(10, 14); graph.AddEdge(11, 9); graph.AddEdge(12, 9); graph.AddEdge(13, 10); graph.AddEdge(14, 10); //act var result = graph.BidirectionalSearch(1, 14); //assert result.ShouldBeEquivalentTo(null); graph.Capacity.ShouldBeEquivalentTo(15); graph.Count.ShouldBeEquivalentTo(14); }
public void Should_BidirectionalSearch() { //arrange var graph = new MyGraph <int>(15); graph.AddVertex(0, 0); graph.AddVertex(1, 1); graph.AddVertex(2, 2); graph.AddVertex(3, 3); graph.AddVertex(4, 4); graph.AddVertex(5, 5); graph.AddVertex(6, 6); graph.AddVertex(7, 7); graph.AddVertex(8, 8); graph.AddVertex(9, 9); graph.AddVertex(10, 10); graph.AddVertex(11, 11); graph.AddVertex(12, 12); graph.AddVertex(13, 13); graph.AddVertex(14, 14); graph.AddEdge(0, 4); graph.AddEdge(1, 4); graph.AddEdge(2, 5); graph.AddEdge(3, 5); graph.AddEdge(4, 0); graph.AddEdge(4, 1); graph.AddEdge(4, 6); graph.AddEdge(5, 2); graph.AddEdge(5, 3); graph.AddEdge(5, 6); graph.AddEdge(6, 4); graph.AddEdge(6, 5); graph.AddEdge(6, 7); graph.AddEdge(7, 6); graph.AddEdge(7, 8); graph.AddEdge(8, 7); graph.AddEdge(8, 9); graph.AddEdge(8, 10); graph.AddEdge(9, 8); graph.AddEdge(9, 11); graph.AddEdge(9, 12); graph.AddEdge(10, 8); graph.AddEdge(10, 13); graph.AddEdge(10, 14); graph.AddEdge(11, 9); graph.AddEdge(12, 9); graph.AddEdge(13, 10); graph.AddEdge(14, 10); var fromSearch = new[] { 1, 4, 0, 6, 5, 7 }; var toSearch = new[] { 14, 10, 8, 13, 7, 9 }; //act var result = graph.BidirectionalSearch(1, 14); //assert result[0].Count().ShouldBeEquivalentTo(fromSearch.Length); result[1].Count().ShouldBeEquivalentTo(toSearch.Length); for (int i = 0; i < fromSearch.Length; i++) { fromSearch[i].ShouldBeEquivalentTo(result[0].ElementAt(i)); } for (int i = 0; i < toSearch.Length; i++) { toSearch[i].ShouldBeEquivalentTo(result[1].ElementAt(i)); } graph.Capacity.ShouldBeEquivalentTo(15); graph.Count.ShouldBeEquivalentTo(15); }
private static void CreateGraph(ref MyGraph<string> myGraph) { //Adds nodes to our graph Node<String> n1 = myGraph.AddNode("OREGON"); Node<String> n2 = myGraph.AddNode("CALIFORNIA"); Node<String> n3 = myGraph.AddNode("IDAHO"); Node<String> n4 = myGraph.AddNode("UTAH"); Node<String> n5 = myGraph.AddNode("NEW MEXICO"); Node<String> n6 = myGraph.AddNode("KANSAS"); Node<String> n7 = myGraph.AddNode("SOUTH DAKOTA"); Node<String> n8 = myGraph.AddNode("NORTH DAKOTA"); Node<String> n9 = myGraph.AddNode("IOWA"); Node<String> n10 = myGraph.AddNode("TENNESSEE"); Node<String> n11 = myGraph.AddNode("NEW YORK"); Node<String> n12 = myGraph.AddNode("FLORIDA"); Node<String> n13 = myGraph.AddNode("TEXAS"); //Creates edges between the graphs nodes myGraph.AddEdge("OREGON", "CALIFORNIA"); myGraph.AddEdge("CALIFORNIA", "UTAH"); myGraph.AddEdge("UTAH", "IDAHO"); myGraph.AddEdge("UTAH", "NEW MEXICO"); myGraph.AddEdge("NEW MEXICO", "KANSAS"); myGraph.AddEdge("NEW MEXICO", "TEXAS"); myGraph.AddEdge("TEXAS", "TENNESSEE"); myGraph.AddEdge("TEXAS", "FLORIDA"); myGraph.AddEdge("TEXAS", "KANSAS"); myGraph.AddEdge("KANSAS", "SOUTH DAKOTA"); myGraph.AddEdge("SOUTH DAKOTA", "NORTH DAKOTA"); myGraph.AddEdge("NORTH DAKOTA", "IOWA"); myGraph.AddEdge("IOWA", "TENNESSEE"); myGraph.AddEdge("TENNESSEE", "FLORIDA"); myGraph.AddEdge("TENNESSEE", "NEW YORK"); }