public void DfsTopologicalSort_WhenAcyclicGraph_ThenTopologicalOrder() { // given DirectedSimpleGraph <int, object, object> graph = new DirectedSimpleGraph <int, object, object>( Enumerable.Range(0, 6).ToArray()); graph.AddEdgeBetween(graph[0], graph[2]); graph.AddEdgeBetween(graph[0], graph[4]); graph.AddEdgeBetween(graph[1], graph[0]); graph.AddEdgeBetween(graph[1], graph[4]); graph.AddEdgeBetween(graph[3], graph[1]); graph.AddEdgeBetween(graph[3], graph[0]); graph.AddEdgeBetween(graph[3], graph[2]); graph.AddEdgeBetween(graph[5], graph[1]); graph.AddEdgeBetween(graph[5], graph[2]); graph.AddEdgeBetween(graph[5], graph[4]); var expecteds = new Vertex <int>[][] { new Vertex <int>[] { graph[3], graph[5], graph[1], graph[0], graph[2], graph[4] }, new Vertex <int>[] { graph[5], graph[3], graph[1], graph[0], graph[2], graph[4] }, new Vertex <int>[] { graph[3], graph[5], graph[1], graph[0], graph[4], graph[2] }, new Vertex <int>[] { graph[5], graph[3], graph[1], graph[0], graph[4], graph[2] } }; // when IEnumerable <Vertex <int> > result = TopologicalSorting.DfsTopologicalSort(graph); // then expecteds.Should().ContainEquivalentOf(result.ToArray()); }
public void InputsTopologicalSort_WhenAcyclicGraph_ThenTopologicalOrder() { // given DirectedSimpleGraph <int, object, object> graph = new DirectedSimpleGraph <int, object, object>( Enumerable.Range(0, 6).ToArray()); graph.AddEdgeBetween(graph[0], graph[2]); graph.AddEdgeBetween(graph[0], graph[4]); graph.AddEdgeBetween(graph[1], graph[0]); graph.AddEdgeBetween(graph[1], graph[4]); graph.AddEdgeBetween(graph[3], graph[1]); graph.AddEdgeBetween(graph[3], graph[0]); graph.AddEdgeBetween(graph[3], graph[2]); graph.AddEdgeBetween(graph[5], graph[1]); graph.AddEdgeBetween(graph[5], graph[2]); graph.AddEdgeBetween(graph[5], graph[4]); // when IEnumerable <Vertex <int> > result = TopologicalSorting.InputsTopologicalSort(graph); // then result.Should().ContainInOrder(graph[3], graph[5], graph[1], graph[0], graph[2], graph[4]); }
public void InputsTopologicalSort_WhenCyclicGraph_ThenDirectedCyclicGraphException() { // given DirectedSimpleGraph <int, object, object> graph = new DirectedSimpleGraph <int, object, object>( Enumerable.Range(0, 6).ToArray()); graph.AddEdgeBetween(graph[0], graph[2]); graph.AddEdgeBetween(graph[0], graph[4]); graph.AddEdgeBetween(graph[1], graph[0]); graph.AddEdgeBetween(graph[1], graph[4]); graph.AddEdgeBetween(graph[2], graph[1]); graph.AddEdgeBetween(graph[3], graph[1]); graph.AddEdgeBetween(graph[3], graph[0]); graph.AddEdgeBetween(graph[3], graph[2]); graph.AddEdgeBetween(graph[5], graph[1]); graph.AddEdgeBetween(graph[5], graph[2]); graph.AddEdgeBetween(graph[5], graph[4]); // when Action action = () => TopologicalSorting.InputsTopologicalSort(graph); // then action.Should().Throw <DirectedCyclicGraphException>(); }