public void RemoveCluster()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();
            var graph        = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph);

            AssertNoCluster(graph);

            IClusteredGraph cluster            = graph.AddCluster();
            IClusteredGraph cluster2           = graph.AddCluster();
            IClusteredGraph cluster3           = graph.AddCluster();
            var             wrappedGraph2      = new AdjacencyGraph <int, Edge <int> >();
            var             graphNotInClusters = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph2);

            graph.RemoveCluster(graphNotInClusters);
            AssertHasClusters(graph, new[] { cluster, cluster2, cluster3 });

            graph.RemoveCluster(cluster2);
            AssertHasClusters(graph, new[] { cluster, cluster3 });

            graph.RemoveCluster(cluster);
            AssertHasClusters(graph, new[] { cluster3 });

            graph.RemoveCluster(cluster3);
            AssertNoCluster(graph);
        }
Esempio n. 2
0
        public void GenerateSameDot()
        {
            var graph = new AdjacencyGraph <int, Edge <int> >();

            // Empty graph
            TestGenerate(graph);

            // Only vertices
            graph.AddVertexRange(new[] { 1, 2 });
            TestGenerate(graph);

            // With edges
            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(2, 3),
                new Edge <int>(3, 1)
            });
            TestGenerate(graph);

            // With no cluster
            var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(graph);

            TestGenerate(clusteredGraph);

            // With clusters
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster();

            subGraph1.AddVertexRange(new[] { 4, 5 });
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster();

            subGraph2.AddVerticesAndEdge(new Edge <int>(1, 6));
            TestGenerate(clusteredGraph);

            #region Local function

            void TestGenerate <TVertex, TEdge>(IEdgeListGraph <TVertex, TEdge> g)
                where TEdge : IEdge <TVertex>
            {
                var    algorithm    = new GraphvizAlgorithm <TVertex, TEdge>(g);
                string generatedDot = algorithm.Generate();

                Assert.IsNotEmpty(generatedDot);

                var dotEngine = new TestDotEngine {
                    ExpectedDot = generatedDot
                };

                // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
                algorithm.Generate(dotEngine, "NotSaved.dot");
            }

            #endregion
        }
Esempio n. 3
0
        public void AddingClusterVertex()
        {
            var graph          = new AdjacencyGraph <int, IEdge <int> >();
            var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph);
            ClusteredAdjacencyGraph <int, IEdge <int> > cluster = clusteredGraph.AddCluster();

            cluster.AddVertex(5);

            Assert.IsTrue(ContainsVertexParent(clusteredGraph, 5));
        }
        public void AddingClustVertexTest1()
        {
            var graph          = new AdjacencyGraph <int, IEdge <int> >();
            var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph);
            var cluster1       = clusteredGraph.AddCluster();

            cluster1.AddVertex(5);
            var a = ContainsVertexParent(clusteredGraph, 5);

            Assert.IsTrue(a);
        }
        public void RemovingClustVertexTest1()
        {
            var graph          = new AdjacencyGraph <int, IEdge <int> >();
            var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph);
            var cluster1       = clusteredGraph.AddCluster();
            var cluster2       = cluster1.AddCluster();
            var cluster3       = cluster2.AddCluster();

            cluster3.AddVertex(5);
            cluster2.RemoveVertex(5);
            Assert.IsFalse(ContainsVertexParent(cluster3, 5));
        }
Esempio n. 6
0
        public void AddingClusterEdge()
        {
            var graph          = new AdjacencyGraph <int, IEdge <int> >();
            var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph);
            ClusteredAdjacencyGraph <int, IEdge <int> > cluster1 = clusteredGraph.AddCluster();

            cluster1.AddVertex(5);
            cluster1.AddVertex(6);
            var edge = new TaggedEdge <int, int>(5, 6, 1);

            cluster1.AddEdge(edge);

            Assert.IsTrue(ContainsEdgeParent(clusteredGraph, edge));
        }
        public void RemovingClustEdgeTest1()
        {
            var graph          = new AdjacencyGraph <int, IEdge <int> >();
            var clusteredGraph = new ClusteredAdjacencyGraph <int, IEdge <int> >(graph);
            var cluster1       = clusteredGraph.AddCluster();
            var cluster2       = cluster1.AddCluster();
            var cluster3       = cluster2.AddCluster();

            cluster3.AddVertex(5);
            cluster3.AddVertex(6);
            var edge = new TaggedEdge <int, int>(5, 6, 1);

            cluster1.RemoveEdge(edge);
            Assert.IsFalse(ContainsEdgeParent(cluster2, edge));
        }
        public void AddCluster()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();
            var graph        = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph);

            AssertNoCluster(graph);

            IClusteredGraph cluster = graph.AddCluster();

            Assert.IsNotNull(cluster);
            AssertHasClusters(graph, new[] { cluster });

            IClusteredGraph cluster2 = ((IClusteredGraph)graph).AddCluster();

            Assert.IsNotNull(cluster2);
            AssertHasClusters(graph, new[] { cluster, cluster2 });
        }
Esempio n. 9
0
        public void ToGraphvizWithInit()
        {
            var wrappedGraph = new AdjacencyGraph <int, Edge <int> >();

            wrappedGraph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(1, 3),
                new Edge <int>(2, 4)
            });
            wrappedGraph.AddVertex(5);
            var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(wrappedGraph);
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster();

            subGraph1.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(6, 7),
                new Edge <int>(7, 8)
            });
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster();

            subGraph2.AddVerticesAndEdge(new Edge <int>(9, 10));
            subGraph2.AddVertex(11);

            string expectedDot =
                "digraph G {" + Environment.NewLine
                + "node [shape=diamond];" + Environment.NewLine
                + "edge [tooltip=\"Test Edge\"];" + Environment.NewLine
                + "subgraph cluster1 {" + Environment.NewLine
                + "5 [label=\"Test Vertex 6\"];" + Environment.NewLine
                + "6 [label=\"Test Vertex 7\"];" + Environment.NewLine
                + "7 [label=\"Test Vertex 8\"];" + Environment.NewLine
                + "5 -> 6;" + Environment.NewLine
                + "6 -> 7;" + Environment.NewLine
                + "}" + Environment.NewLine
                + "subgraph cluster2 {" + Environment.NewLine
                + "8 [label=\"Test Vertex 9\"];" + Environment.NewLine
                + "9 [label=\"Test Vertex 10\"];" + Environment.NewLine
                + "10 [label=\"Test Vertex 11\"];" + Environment.NewLine
                + "8 -> 9;" + Environment.NewLine
                + "}" + Environment.NewLine
                + "0 [label=\"Test Vertex 1\"];" + Environment.NewLine
                + "1 [label=\"Test Vertex 2\"];" + Environment.NewLine
                + "2 [label=\"Test Vertex 3\"];" + Environment.NewLine
                + "3 [label=\"Test Vertex 4\"];" + Environment.NewLine
                + "4 [label=\"Test Vertex 5\"];" + Environment.NewLine
                + "0 -> 1;" + Environment.NewLine
                + "0 -> 2;" + Environment.NewLine
                + "1 -> 3;" + Environment.NewLine
                + "}";
            string dotGraph = clusteredGraph.ToGraphviz(algorithm =>
            {
                algorithm.CommonVertexFormat.Shape = GraphvizVertexShape.Diamond;
                algorithm.CommonEdgeFormat.ToolTip = "Test Edge";
                algorithm.FormatVertex            += (sender, args) =>
                {
                    args.VertexFormat.Label = $"Test Vertex {args.Vertex}";
                };
            });

            Assert.AreEqual(expectedDot, dotGraph);
        }
        protected static void RemoveVertex_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge14 = new Edge <int>(1, 4);
            var edge24 = new Edge <int>(2, 4);
            var edge31 = new Edge <int>(3, 1);
            var edge33 = new Edge <int>(3, 3);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33 });

            Assert.IsFalse(graph.RemoveVertex(5));

            Assert.IsTrue(graph.RemoveVertex(3));
            AssertHasVertices(graph, new[] { 1, 2, 4 });
            AssertHasEdges(graph, new[] { edge12, edge14, edge24 });

            Assert.IsTrue(graph.RemoveVertex(1));
            AssertHasVertices(graph, new[] { 2, 4 });
            AssertHasEdges(graph, new[] { edge24 });

            Assert.IsTrue(graph.RemoveVertex(2));
            AssertHasVertices(graph, new[] { 4 });
            AssertNoEdge(graph);

            Assert.IsTrue(graph.RemoveVertex(4));
            AssertEmptyGraph(graph);


            // With cluster
            ClusteredAdjacencyGraph <int, Edge <int> > cluster1 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster2 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster3 = graph.AddCluster();

            cluster1.AddVertexRange(new[] { 1, 2 });
            AssertHasVertices(cluster1, new[] { 1, 2 });

            cluster2.AddVertexRange(new[] { 1, 2, 4 });
            AssertHasVertices(cluster2, new[] { 1, 2, 4 });

            cluster3.AddVertex(2);
            AssertHasVertices(cluster3, new[] { 2 });

            graph.AddVertexRange(new[] { 1, 2, 3, 4 });
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });


            graph.RemoveVertex(2);
            AssertHasVertices(graph, new[] { 1, 3, 4 });
            AssertHasVertices(cluster1, new[] { 1 });
            AssertHasVertices(cluster2, new[] { 1, 4 });
            AssertNoVertex(cluster3);

            graph.RemoveVertex(1);
            AssertHasVertices(graph, new[] { 3, 4 });
            AssertNoVertex(cluster1);
            AssertHasVertices(cluster2, new[] { 4 });
            AssertNoVertex(cluster3);

            graph.RemoveVertex(3);
            AssertHasVertices(graph, new[] { 4 });
            AssertNoVertex(cluster1);
            AssertHasVertices(cluster2, new[] { 4 });
            AssertNoVertex(cluster3);

            graph.RemoveVertex(4);
            AssertNoVertex(graph);
            AssertNoVertex(cluster1);
            AssertNoVertex(cluster2);
            AssertNoVertex(cluster3);
        }
        protected static void RemoveEdge_Clusters_Test(
            [NotNull] ClusteredAdjacencyGraph <int, Edge <int> > graph)
        {
            var edge12                     = new Edge <int>(1, 2);
            var edge13                     = new Edge <int>(1, 3);
            var edge13Bis                  = new Edge <int>(1, 3);
            var edge14                     = new Edge <int>(1, 4);
            var edge24                     = new Edge <int>(2, 4);
            var edge31                     = new Edge <int>(3, 1);
            var edge33                     = new Edge <int>(3, 3);
            var edgeNotInGraph             = new Edge <int>(3, 4);
            var edgeWithVertexNotInGraph1  = new Edge <int>(2, 10);
            var edgeWithVertexNotInGraph2  = new Edge <int>(10, 2);
            var edgeWithVerticesNotInGraph = new Edge <int>(10, 11);
            var edgeNotEquatable           = new Edge <int>(1, 2);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge13Bis, edge14, edge24, edge31, edge33 });

            Assert.IsFalse(graph.RemoveEdge(edgeNotInGraph));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVertexNotInGraph1));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVertexNotInGraph2));
            Assert.IsFalse(graph.RemoveEdge(edgeWithVerticesNotInGraph));
            Assert.IsFalse(graph.RemoveEdge(edgeNotEquatable));

            Assert.IsTrue(graph.RemoveEdge(edge13Bis));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge13, edge14, edge24, edge31, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge31));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge12, edge13, edge14, edge24, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge12));
            Assert.IsTrue(graph.RemoveEdge(edge13));
            Assert.IsTrue(graph.RemoveEdge(edge14));
            Assert.IsTrue(graph.RemoveEdge(edge24));
            Assert.IsTrue(graph.RemoveEdge(edge33));
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertNoEdge(graph);


            // With cluster
            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31 });
            AssertHasEdges(graph, new[] { edge12, edge13, edge14, edge24, edge31 });

            ClusteredAdjacencyGraph <int, Edge <int> > cluster1 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster2 = graph.AddCluster();
            ClusteredAdjacencyGraph <int, Edge <int> > cluster3 = graph.AddCluster();

            cluster1.AddVerticesAndEdgeRange(new[] { edge12, edge13 });
            AssertHasEdges(cluster1, new[] { edge12, edge13 });

            cluster2.AddVerticesAndEdgeRange(new[] { edge12, edge14, edge24 });
            AssertHasEdges(cluster2, new[] { edge12, edge14, edge24 });

            cluster3.AddVerticesAndEdge(edge12);
            AssertHasEdges(cluster3, new[] { edge12 });


            graph.RemoveEdge(edge12);
            AssertHasEdges(graph, new[] { edge13, edge14, edge24, edge31 });
            AssertHasEdges(cluster1, new[] { edge13 });
            AssertHasEdges(cluster2, new[] { edge14, edge24 });
            AssertNoEdge(cluster3);

            graph.RemoveEdge(edge13);
            AssertHasEdges(graph, new[] { edge14, edge24, edge31 });
            AssertNoEdge(cluster1);
            AssertHasEdges(cluster2, new[] { edge14, edge24 });
            AssertNoEdge(cluster3);

            graph.RemoveEdge(edge24);
            AssertHasEdges(graph, new[] { edge14, edge31 });
            AssertNoEdge(cluster1);
            AssertHasEdges(cluster2, new[] { edge14 });
            AssertNoEdge(cluster3);

            graph.RemoveEdge(edge14);
            AssertHasEdges(graph, new[] { edge31 });
            AssertNoEdge(cluster1);
            AssertNoEdge(cluster2);
            AssertNoEdge(cluster3);
        }
Esempio n. 12
0
        public void FormatHandlers()
        {
            var graph     = new AdjacencyGraph <int, Edge <int> >();
            var algorithm = new GraphvizAlgorithm <int, Edge <int> >(graph);

            algorithm.FormatVertex  += NoVertexOnFormatVertex;
            algorithm.FormatEdge    += NoEdgeOnFormatEdge;
            algorithm.FormatCluster += NoClusterOnFormatCluster;

            // Empty graph
            algorithm.Generate();

            // Only vertices
            graph.AddVertexRange(new[] { 1, 2 });
            algorithm = new GraphvizAlgorithm <int, Edge <int> >(graph);
            List <int> notFormattedVertices = RegisterOnFormatVertex(algorithm, graph.Vertices);

            algorithm.FormatEdge    += NoEdgeOnFormatEdge;
            algorithm.FormatCluster += NoClusterOnFormatCluster;

            algorithm.Generate();

            CollectionAssert.IsEmpty(notFormattedVertices);

            // With edges
            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(2, 3),
                new Edge <int>(3, 1)
            });
            algorithm            = new GraphvizAlgorithm <int, Edge <int> >(graph);
            notFormattedVertices = RegisterOnFormatVertex(algorithm, graph.Vertices);
            List <Edge <int> > notFormattedEdges = RegisterOnFormatEdge(algorithm, graph.Edges);

            algorithm.FormatCluster += NoClusterOnFormatCluster;

            algorithm.Generate();

            CollectionAssert.IsEmpty(notFormattedVertices);
            CollectionAssert.IsEmpty(notFormattedEdges);

            // With no cluster
            var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(graph);

            algorithm                = new GraphvizAlgorithm <int, Edge <int> >(clusteredGraph);
            notFormattedVertices     = RegisterOnFormatVertex(algorithm, clusteredGraph.Vertices);
            notFormattedEdges        = RegisterOnFormatEdge(algorithm, clusteredGraph.Edges);
            algorithm.FormatCluster += NoClusterOnFormatCluster;

            algorithm.Generate();

            CollectionAssert.IsEmpty(notFormattedVertices);
            CollectionAssert.IsEmpty(notFormattedEdges);

            // With clusters
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster();

            subGraph1.AddVertexRange(new[] { 4, 5 });
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster();

            subGraph2.AddVerticesAndEdge(new Edge <int>(1, 6));
            algorithm            = new GraphvizAlgorithm <int, Edge <int> >(clusteredGraph);
            notFormattedVertices = RegisterOnFormatVertex(algorithm, clusteredGraph.Vertices);
            notFormattedEdges    = RegisterOnFormatEdge(algorithm, clusteredGraph.Edges);
            List <IVertexAndEdgeListGraph <int, Edge <int> > > notFormattedClusters = RegisterOnFormatCluster(
                algorithm,
                new[] { subGraph1, subGraph2 });

            algorithm.Generate();

            CollectionAssert.IsEmpty(notFormattedVertices);
            CollectionAssert.IsEmpty(notFormattedEdges);
            CollectionAssert.IsEmpty(notFormattedClusters);

            #region Local functions

            void NoVertexOnFormatVertex(object sender, FormatVertexEventArgs <int> args)
            {
                Assert.Fail($"{nameof(GraphvizAlgorithm<object, Edge<object>>.FormatVertex)} called while no vertex in graph.");
            }

            List <TVertex> RegisterOnFormatVertex <TVertex, TEdge>(GraphvizAlgorithm <TVertex, TEdge> algo, IEnumerable <TVertex> vertices)
                where TEdge : IEdge <TVertex>
            {
                var verticesList = new List <TVertex>(vertices);

                algo.FormatVertex += (sender, args) =>
                {
                    Assert.IsTrue(verticesList.Remove(args.Vertex));
                };
                return(verticesList);
            }

            void NoEdgeOnFormatEdge(object sender, FormatEdgeEventArgs <int, Edge <int> > args)
            {
                Assert.Fail($"{nameof(GraphvizAlgorithm<object, Edge<object>>.FormatEdge)} called while no edge in graph.");
            }

            List <TEdge> RegisterOnFormatEdge <TVertex, TEdge>(GraphvizAlgorithm <TVertex, TEdge> algo, IEnumerable <TEdge> edges)
                where TEdge : IEdge <TVertex>
            {
                var edgeList = new List <TEdge>(edges);

                algo.FormatEdge += (sender, args) =>
                {
                    Assert.IsTrue(edgeList.Remove(args.Edge));
                };
                return(edgeList);
            }

            void NoClusterOnFormatCluster(object sender, FormatClusterEventArgs <int, Edge <int> > args)
            {
                Assert.Fail($"{nameof(GraphvizAlgorithm<object, Edge<object>>.FormatCluster)} called while no cluster in graph.");
            }

            List <IVertexAndEdgeListGraph <TVertex, TEdge> > RegisterOnFormatCluster <TVertex, TEdge>(GraphvizAlgorithm <TVertex, TEdge> algo, IEnumerable <IVertexAndEdgeListGraph <TVertex, TEdge> > clusters)
                where TEdge : IEdge <TVertex>
            {
                var clusterList = new List <IVertexAndEdgeListGraph <TVertex, TEdge> >(clusters);

                algo.FormatCluster += (sender, args) =>
                {
                    Assert.IsTrue(clusterList.Remove(args.Cluster));
                };
                return(clusterList);
            }

            #endregion
        }
Esempio n. 13
0
        public void GenerateWithFormats()
        {
            var graph = new AdjacencyGraph <int, Edge <int> >();

            graph.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(1, 2),
                new Edge <int>(1, 3),
                new Edge <int>(3, 2),
                new Edge <int>(3, 4),
                new Edge <int>(4, 6),
                new Edge <int>(5, 2),
                new Edge <int>(5, 5)
            });
            graph.AddVertex(7);
            var clusteredGraph = new ClusteredAdjacencyGraph <int, Edge <int> >(graph);
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph1 = clusteredGraph.AddCluster();

            subGraph1.AddVertexRange(new[] { 8, 9, 10 });
            ClusteredAdjacencyGraph <int, Edge <int> > subGraph2 = clusteredGraph.AddCluster();

            subGraph2.AddVerticesAndEdgeRange(new[]
            {
                new Edge <int>(11, 12),
                new Edge <int>(11, 13),
                new Edge <int>(12, 13)
            });

            var algorithm = new GraphvizAlgorithm <int, Edge <int> >(clusteredGraph);

            algorithm.GraphFormat.Name             = "MyGraph";
            algorithm.GraphFormat.NodeSeparation   = 2;
            algorithm.GraphFormat.FontColor        = GraphvizColor.Red;
            algorithm.CommonVertexFormat.Url       = "https://myurl.com";
            algorithm.CommonVertexFormat.FillColor = GraphvizColor.LightYellow;
            algorithm.CommonVertexFormat.Style     = GraphvizVertexStyle.Filled;
            algorithm.CommonEdgeFormat.Direction   = GraphvizEdgeDirection.Back;
            algorithm.CommonEdgeFormat.ToolTip     = "Edge";

            algorithm.FormatCluster += (sender, args) =>
            {
                args.GraphFormat.Label = args.Cluster == subGraph1
                    ? "Only Vertices cluster"
                    : "Triangle cluster";
            };

            algorithm.FormatVertex += (sender, args) =>
            {
                if (args.Vertex == 2 || args.Vertex == 11)
                {
                    args.VertexFormat.Label = "Special Node";
                }
            };

            algorithm.FormatEdge += (sender, args) =>
            {
                if (args.Edge.Source == args.Edge.Target)
                {
                    args.EdgeFormat.StrokeColor = GraphvizColor.Gold;
                }
            };

            string dot         = algorithm.Generate();
            string expectedDot = "digraph MyGraph {" + Environment.NewLine
                                 + "fontcolor=\"#FF0000FF\"; nodesep=2;" + Environment.NewLine
                                 + "node [style=filled, fillcolor=\"#FFFFE0FF\", URL=\"https://myurl.com\"];" + Environment.NewLine
                                 + "edge [dir=back, tooltip=\"Edge\"];" + Environment.NewLine
                                 + "subgraph cluster1 {" + Environment.NewLine
                                 + "label=\"Only Vertices cluster\"" + Environment.NewLine
                                 + "7 [label=\"8\"];" + Environment.NewLine
                                 + "8 [label=\"9\"];" + Environment.NewLine
                                 + "9 [label=\"10\"];" + Environment.NewLine
                                 + "}" + Environment.NewLine
                                 + "subgraph cluster2 {" + Environment.NewLine
                                 + "label=\"Triangle cluster\"" + Environment.NewLine
                                 + "10 [label=\"Special Node\"];" + Environment.NewLine
                                 + "11 [label=\"12\"];" + Environment.NewLine
                                 + "12 [label=\"13\"];" + Environment.NewLine
                                 + "10 -> 11;" + Environment.NewLine
                                 + "10 -> 12;" + Environment.NewLine
                                 + "11 -> 12;" + Environment.NewLine
                                 + "}" + Environment.NewLine
                                 + "0 [label=\"1\"];" + Environment.NewLine
                                 + "1 [label=\"Special Node\"];" + Environment.NewLine
                                 + "2 [label=\"3\"];" + Environment.NewLine
                                 + "3 [label=\"4\"];" + Environment.NewLine
                                 + "4 [label=\"6\"];" + Environment.NewLine
                                 + "5 [label=\"5\"];" + Environment.NewLine
                                 + "6 [label=\"7\"];" + Environment.NewLine
                                 + "0 -> 1;" + Environment.NewLine
                                 + "0 -> 2;" + Environment.NewLine
                                 + "2 -> 1;" + Environment.NewLine
                                 + "2 -> 3;" + Environment.NewLine
                                 + "3 -> 4;" + Environment.NewLine
                                 + "5 -> 1;" + Environment.NewLine
                                 + "5 -> 5 [color=\"#FFD700FF\"];" + Environment.NewLine
                                 + "}";

            Assert.AreEqual(expectedDot, dot);
        }
Esempio n. 14
0
        public void Run()
        {
            // create an adjacency graph
            AdjacencyGraph g = new AdjacencyGraph(
                new NamedVertexProvider(),
                new NamedEdgeProvider(),
                true
                );

            // create a clustered graph
            ClusteredAdjacencyGraph cg = new ClusteredAdjacencyGraph(g);

            // adding some vertices to the main graph
            NamedVertex a = cg.AddVertex() as NamedVertex; a.Name = "a";
            NamedVertex b = cg.AddVertex() as NamedVertex; b.Name = "b";
            NamedVertex c = cg.AddVertex() as NamedVertex; c.Name = "c";

            NamedEdge ab = cg.AddEdge(a, b) as NamedEdge; ab.Name = "ab";
            NamedEdge ac = cg.AddEdge(a, c) as NamedEdge; ac.Name = "ac";

            // adding a cluster
            ClusteredAdjacencyGraph cg1 = cg.AddCluster();
            // adding vertices and edges to the cluster
            NamedVertex d  = cg1.AddVertex() as NamedVertex; d.Name = "d";
            NamedVertex e  = cg1.AddVertex() as NamedVertex; e.Name = "e";
            NamedVertex f  = cg1.AddVertex() as NamedVertex; f.Name = "f";
            NamedEdge   de = cg1.AddEdge(d, e) as NamedEdge; de.Name = "de";
            NamedEdge   df = cg1.AddEdge(d, f) as NamedEdge; df.Name = "df";

            // adding a second cluster
            ClusteredAdjacencyGraph cg2 = cg.AddCluster();
            // adding vertices
            NamedVertex h  = cg2.AddVertex() as NamedVertex; h.Name = "h";
            NamedVertex i  = cg2.AddVertex() as NamedVertex; i.Name = "i";
            NamedEdge   hi = cg2.AddEdge(h, i) as NamedEdge; hi.Name = "hi";

            // adding a sub-sub-cluster
            ClusteredAdjacencyGraph cg21 = cg2.AddCluster();
            // adding vertices
            NamedVertex k  = cg21.AddVertex() as NamedVertex; k.Name = "k";
            NamedVertex l  = cg21.AddVertex() as NamedVertex; l.Name = "l";
            NamedEdge   ak = cg.AddEdge(a, k) as NamedEdge; ak.Name = "ak";
            NamedEdge   kl = cg21.AddEdge(k, l) as NamedEdge; kl.Name = "kl";


            // interconnecting
            NamedEdge cd = cg.AddEdge(c, d) as NamedEdge; cd.Name = "cd";
            NamedEdge bh = cg.AddEdge(b, h) as NamedEdge; bh.Name = "bh";
            NamedEdge ei = cg.AddEdge(e, i) as NamedEdge; ei.Name = "ei";

            GraphvizAlgorithm gw = new GraphvizAlgorithm(
                cg,
                "../cluster",
                GraphvizImageType.Svgz
                );

            gw.FormatVertex += new FormatVertexEventHandler(this.FormatVertex);
            gw.FormatEdge   += new FormatEdgeEventHandler(this.FormatEdge);
            gw.Write("cluster");

            cg2.Colapsed = true;
            gw.Write("cluster_collapsed");
        }