/// <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();
            }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }