/// <summary> /// Tests if the class to check can be inserted into the parent class without creating a cycle. /// </summary> /// <param name="parent">The class into which </param> /// <param name="classToCheck">The class which should get inserted.</param> /// <param name="classes">An enumeration of all available classes.</param> /// <returns>True if a cycle is detected, false otherwise.</returns> public static bool IsCyclicIfClassIsAccessibleFromParent(ClassNode parent, ClassNode classToCheck, IEnumerable <ClassNode> classes) { Contract.Requires(parent != null); Contract.Requires(classToCheck != null); Contract.Requires(classes != null); Contract.Requires(Contract.ForAll(classes, c => c != null)); var graph = new DirectedGraph <ClassNode>(); graph.AddVertices(classes); graph.AddEdge(parent, classToCheck); foreach (var c in graph.Vertices) { foreach (var wrapperNode in c.Nodes.OfType <BaseWrapperNode>()) { if (wrapperNode.ShouldPerformCycleCheckForInnerNode() && wrapperNode.ResolveMostInnerNode() is ClassNode classNode) { graph.AddEdge(c, classNode); } } } return(graph.ContainsCycle()); }
public static void DoTest() { var graph = new DirectedGraph <Employee>(); var employeeA = new Employee("a", "", 10); var employeeB = new Employee("b", "a", 10); var employeeC = new Employee("c", "a", 10); var employeeD = new Employee("d", "a", 10); var employeeE = new Employee("e", "b", 10); var verticesSet1 = new Employee[] { employeeA, employeeB, employeeC, employeeD, employeeE }; graph.AddVertices(verticesSet1); graph.AddEdge(employeeA, employeeB); graph.AddEdge(employeeA, employeeC); graph.AddEdge(employeeA, employeeD); graph.AddEdge(employeeB, employeeE); var allEdges = graph.Edges.ToList(); Assert.True(graph.VerticesCount == 5, "Wrong vertices count."); Assert.True(graph.EdgesCount == 4, "Wrong edges count."); Assert.True(graph.EdgesCount == allEdges.Count, "Wrong edges count."); Assert.True(graph.OutgoingEdges(employeeA).ToList().Count == 3, "Wrong outgoing edges from 'a'."); Assert.True(graph.OutgoingEdges(employeeB).ToList().Count == 1, "Wrong outgoing edges from 'b'."); Assert.True(graph.OutgoingEdges(employeeC).ToList().Count == 0, "Wrong outgoing edges from 'c'."); Assert.True(graph.OutgoingEdges(employeeD).ToList().Count == 0, "Wrong outgoing edges from 'd'."); Assert.True(graph.OutgoingEdges(employeeE).ToList().Count == 0, "Wrong outgoing edges from 'e'."); Assert.True(graph.IncomingEdges(employeeA).ToList().Count == 0, "Wrong incoming edges from 'a'."); Assert.True(graph.IncomingEdges(employeeB).ToList().Count == 1, "Wrong incoming edges from 'b'."); Assert.True(graph.IncomingEdges(employeeC).ToList().Count == 1, "Wrong incoming edges from 'c'."); Assert.True(graph.IncomingEdges(employeeD).ToList().Count == 1, "Wrong incoming edges from 'd'."); Assert.True(graph.IncomingEdges(employeeE).ToList().Count == 1, "Wrong incoming edges from 'e'."); // DFS from A // Walk the graph using DFS from A: var dfsWalk = graph.DepthFirstWalk(employeeA); // output: (s) (a) (x) (z) (d) (c) (f) (v) // DFS from F // Walk the graph using DFS from F: //dfsWalk = graph.DepthFirstWalk(employeeB); // output: (s) (a) (x) (z) (d) (c) (f) (v) foreach (var node in dfsWalk) { Console.Write(string.Format("({0})", node.Id)); } graph.Clear(); }
public void TestContainsCycle(int[] vertices, int[][] edges, bool containsCycle) { var sut = new DirectedGraph <int>(); sut.AddVertices(vertices); foreach (var edge in edges) { sut.AddEdge(edge[0], edge[1]); } Check.That(sut.ContainsCycle()).IsEqualTo(containsCycle); }
public void TestGetNeighbours(int[] vertices, int[][] edges, int[] neighbours) { var sut = new DirectedGraph <int>(); sut.AddVertices(vertices); foreach (var edge in edges) { sut.AddEdge(edge[0], edge[1]); } Check.That(sut.GetNeighbours(vertices[0])).IsEquivalentTo(neighbours); }
public void TestAddContainsMultipleVertices() { var vertices = new[] { 0, 1, 2, 3 }; var sut = new DirectedGraph <int>(); sut.AddVertices(vertices); foreach (var vertex in vertices) { Check.That(sut.ContainsVertex(vertex)).IsTrue(); } Check.That(sut.Vertices).IsEquivalentTo(vertices); }