public void ClearTransitionFactories()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            var vertex1 = new CloneableTestVertex("1");
            var vertex2 = new CloneableTestVertex("2");
            var vertex3 = new CloneableTestVertex("3");

            var edge11 = new Edge <CloneableTestVertex>(vertex1, vertex1);
            var edge12 = new Edge <CloneableTestVertex>(vertex1, vertex2);
            var edge13 = new Edge <CloneableTestVertex>(vertex1, vertex3);
            var edge23 = new Edge <CloneableTestVertex>(vertex2, vertex3);
            var edge33 = new Edge <CloneableTestVertex>(vertex3, vertex3);

            var factory1 = new TestTransitionFactory <CloneableTestVertex>(new[]
            {
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex1, new[] { edge11, edge12, edge13 }),
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex2, new[] { edge23 })
            });

            algorithm.AddTransitionFactory(factory1);

            var factory2 = new TestTransitionFactory <CloneableTestVertex>(vertex3, new[] { edge33 });

            algorithm.AddTransitionFactory(factory2);

            algorithm.ClearTransitionFactories();

            Assert.IsFalse(algorithm.ContainsTransitionFactory(factory1));
            Assert.IsFalse(algorithm.ContainsTransitionFactory(factory2));
        }
        public void Constructor()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            AssertAlgorithmProperties(algorithm, graph);

            algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(null, graph);
            AssertAlgorithmProperties(algorithm, graph);

            #region Local function

            void AssertAlgorithmProperties <TVertex, TEdge>(
                CloneableVertexGraphExplorerAlgorithm <TVertex, TEdge> algo,
                IMutableVertexAndEdgeSet <TVertex, TEdge> g)
                where TVertex : ICloneable
                where TEdge : IEdge <TVertex>
            {
                AssertAlgorithmState(algo, g);
                Assert.IsNotNull(algo.AddVertexPredicate);
                Assert.IsNotNull(algo.AddEdgePredicate);
                Assert.IsNotNull(algo.ExploreVertexPredicate);
                Assert.IsNotNull(algo.FinishedSuccessfully);
                Assert.IsFalse(algo.FinishedSuccessfully);
            }

            #endregion
        }
        public void GraphExploration()
        {
            var graph     = new AdjacencyGraph <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >(graph);

            IEnumerable <ITransitionFactory <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> > > factories =
                GenerateTransitionFactories(
                    out IEnumerable <EquatableCloneableTestVertex> vertices,
                    out _);

            EquatableCloneableTestVertex[] verticesArray = vertices.ToArray();

            algorithm.AddTransitionFactories(factories);

            var discoveredVertices = new List <EquatableCloneableTestVertex>(verticesArray);

            algorithm.DiscoverVertex += vertex =>
            {
                Assert.IsTrue(discoveredVertices.Remove(vertex));
            };

            algorithm.TreeEdge    += Assert.IsNotNull;
            algorithm.BackEdge    += Assert.IsNotNull;
            algorithm.EdgeSkipped += _ => Assert.Fail("Edge must not be skipped.");

            algorithm.Compute(verticesArray[0]);

            CollectionAssert.AreEquivalent(
                new[] { verticesArray[7] },
                discoveredVertices);
            // Isolated vertex are not considered unexplored
            CollectionAssert.IsEmpty(algorithm.UnExploredVertices);
            Assert.IsTrue(algorithm.FinishedSuccessfully);
        }
        public void ComputeWithoutRoot_Throws()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            Assert.Throws <InvalidOperationException>(algorithm.Compute);
        }
        public void ContainsTransitionFactories()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            var vertex1  = new CloneableTestVertex("1");
            var factory1 = new TestTransitionFactory <CloneableTestVertex>(vertex1, Enumerable.Empty <Edge <CloneableTestVertex> >());

            Assert.IsFalse(algorithm.ContainsTransitionFactory(null));
            Assert.IsFalse(algorithm.ContainsTransitionFactory(factory1));

            algorithm.AddTransitionFactory(factory1);

            Assert.IsFalse(algorithm.ContainsTransitionFactory(null));
            Assert.IsTrue(algorithm.ContainsTransitionFactory(factory1));

            var vertex2  = new CloneableTestVertex("2");
            var factory2 = new TestTransitionFactory <CloneableTestVertex>(vertex2, Enumerable.Empty <Edge <CloneableTestVertex> >());

            algorithm.AddTransitionFactory(factory2);

            Assert.IsFalse(algorithm.ContainsTransitionFactory(null));
            Assert.IsTrue(algorithm.ContainsTransitionFactory(factory1));
            Assert.IsTrue(algorithm.ContainsTransitionFactory(factory2));

            algorithm.RemoveTransitionFactory(factory1);

            Assert.IsFalse(algorithm.ContainsTransitionFactory(null));
            Assert.IsFalse(algorithm.ContainsTransitionFactory(factory1));
            Assert.IsTrue(algorithm.ContainsTransitionFactory(factory2));
        }
        public void ClearRootVertex()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            ClearRootVertex_Test(algorithm);
        }
        public void SetRootVertex()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            int rootVertexChangeCount = 0;

            algorithm.RootVertexChanged += (_, _) => ++ rootVertexChangeCount;

            var vertex1 = new CloneableTestVertex("1");

            algorithm.SetRootVertex(vertex1);
            Assert.AreEqual(1, rootVertexChangeCount);
            algorithm.TryGetRootVertex(out CloneableTestVertex root);
            Assert.AreSame(vertex1, root);

            // Not changed
            algorithm.SetRootVertex(vertex1);
            Assert.AreEqual(1, rootVertexChangeCount);
            algorithm.TryGetRootVertex(out root);
            Assert.AreSame(vertex1, root);

            var vertex2 = new CloneableTestVertex("2");

            algorithm.SetRootVertex(vertex2);
            Assert.AreEqual(2, rootVertexChangeCount);
            algorithm.TryGetRootVertex(out root);
            Assert.AreSame(vertex2, root);

            algorithm.SetRootVertex(vertex1);
            Assert.AreEqual(3, rootVertexChangeCount);
            algorithm.TryGetRootVertex(out root);
            Assert.AreSame(vertex1, root);
        }
        public void AddTransitionFactories_Throws()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            // ReSharper disable once AssignNullToNotNullAttribute
            Assert.Throws <ArgumentNullException>(() => algorithm.AddTransitionFactories(null));
        }
        public void ComputeWithRoot_Throws()
        {
            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            // ReSharper disable once AssignNullToNotNullAttribute
            Assert.Throws <ArgumentNullException>(() => algorithm.Compute(null));
            Assert.IsFalse(algorithm.TryGetRootVertex(out _));
        }
        public void ComputeWithRoot()
        {
            var graph = new AdjacencyGraph <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >();

            graph.AddVertexRange(new[] { new EquatableCloneableTestVertex() });
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >(graph);

            ComputeWithRoot_Test(algorithm);
        }
Exemplo n.º 11
0
            public bool Test(CloneableVertexGraphExplorerAlgorithm <TVertex, TEdge> algorithm)
            {
                if (algorithm.VisitedGraph.VertexCount > MaxVertexCount)
                {
                    return(false);
                }

                if (algorithm.VisitedGraph.EdgeCount > MaxEdgeCount)
                {
                    return(false);
                }

                return(true);
            }
        public void GraphExploration_Throws()
        {
            var vertex1 = new CloneableTestVertex();

            var graph = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();

            graph.AddVertex(vertex1);

            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph)
            {
                AddVertexPredicate = vertex => vertex != vertex1
            };

            Assert.Throws <InvalidOperationException>(() => algorithm.Compute(vertex1));
        }
        public void Constructor_Throws()
        {
            // ReSharper disable ObjectCreationAsStatement
            // ReSharper disable AssignNullToNotNullAttribute
            Assert.Throws <ArgumentNullException>(
                () => new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(null));
            Assert.Throws <ArgumentNullException>(
                () => new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(null, null));

            var graph     = new AdjacencyGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <CloneableTestVertex, Edge <CloneableTestVertex> >(graph);

            Assert.Throws <ArgumentNullException>(() => algorithm.AddEdgePredicate       = null);
            Assert.Throws <ArgumentNullException>(() => algorithm.ExploreVertexPredicate = null);
            Assert.Throws <ArgumentNullException>(() => algorithm.AddEdgePredicate       = null);
            Assert.Throws <ArgumentNullException>(() => algorithm.FinishedPredicate      = null);
            // ReSharper restore AssignNullToNotNullAttribute
            // ReSharper restore ObjectCreationAsStatement
        }
        public void GraphExplorationWithPredicates()
        {
            var graph     = new AdjacencyGraph <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >(graph);

            IEnumerable <ITransitionFactory <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> > > factories =
                GenerateTransitionFactories(
                    out IEnumerable <EquatableCloneableTestVertex> vertices,
                    out IEnumerable <Edge <EquatableCloneableTestVertex> > edges);

            EquatableCloneableTestVertex[]        verticesArray = vertices.ToArray();
            Edge <EquatableCloneableTestVertex>[] edgesArray    = edges.ToArray();

            algorithm.AddTransitionFactories(factories);

            algorithm.AddVertexPredicate     = vertex => !vertex.Equals(verticesArray[1]); // vertex2
            algorithm.ExploreVertexPredicate = vertex => !vertex.Equals(verticesArray[4]); // vertex5
            algorithm.AddEdgePredicate       = edge => edge != edgesArray[1];              // edge13

            var discoveredVertices = new List <EquatableCloneableTestVertex>(verticesArray);

            algorithm.DiscoverVertex += vertex =>
            {
                Assert.IsTrue(discoveredVertices.Remove(vertex));
            };

            algorithm.TreeEdge += Assert.IsNotNull;
            algorithm.BackEdge += Assert.IsNotNull;
            var skippedEdge = new List <Edge <EquatableCloneableTestVertex> >();

            algorithm.EdgeSkipped += edge => skippedEdge.Add(edge);

            algorithm.Compute(verticesArray[0]);

            CollectionAssert.AreEquivalent(
                new[] { verticesArray[1], verticesArray[6], verticesArray[7] },
                discoveredVertices);
            CollectionAssert.AreEquivalent(
                new[] { edgesArray[0], edgesArray[1], edgesArray[3] },
                skippedEdge);
            CollectionAssert.IsEmpty(algorithm.UnExploredVertices);
            Assert.IsTrue(algorithm.FinishedSuccessfully);
        }
            public bool Test([NotNull] CloneableVertexGraphExplorerAlgorithm <TVertex, TEdge> algorithm)
            {
                if (algorithm is null)
                {
                    throw new ArgumentNullException(nameof(algorithm));
                }

                if (algorithm.VisitedGraph.VertexCount > MaxVertexCount)
                {
                    return(false);
                }

                if (algorithm.VisitedGraph.EdgeCount > MaxEdgeCount)
                {
                    return(false);
                }

                return(true);
            }
        public void GraphExplorationWithEarlyEndingEdge()
        {
            var graph     = new AdjacencyGraph <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >();
            var algorithm = new CloneableVertexGraphExplorerAlgorithm <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> >(graph);

            IEnumerable <ITransitionFactory <EquatableCloneableTestVertex, Edge <EquatableCloneableTestVertex> > > factories =
                GenerateTransitionFactories(
                    out IEnumerable <EquatableCloneableTestVertex> vertices,
                    out _);

            EquatableCloneableTestVertex[] verticesArray = vertices.ToArray();

            algorithm.AddTransitionFactories(factories);

            algorithm.FinishedPredicate =
                new CloneableVertexGraphExplorerAlgorithm
                <
                    EquatableCloneableTestVertex,
                    Edge <EquatableCloneableTestVertex>
                > .DefaultFinishedPredicate(int.MaxValue, 3).Test;

            var discoveredVertices = new List <EquatableCloneableTestVertex>(verticesArray);

            algorithm.DiscoverVertex += vertex =>
            {
                Assert.IsTrue(discoveredVertices.Remove(vertex));
            };

            algorithm.TreeEdge    += Assert.IsNotNull;
            algorithm.BackEdge    += Assert.IsNotNull;
            algorithm.EdgeSkipped += _ => Assert.Fail("Edge must not be skipped.");

            algorithm.Compute(verticesArray[0]);

            CollectionAssert.AreEquivalent(
                new[] { verticesArray[3], verticesArray[4], verticesArray[6], verticesArray[7] },
                discoveredVertices);
            CollectionAssert.AreEquivalent(
                new[] { verticesArray[5] },
                algorithm.UnExploredVertices);
            Assert.IsFalse(algorithm.FinishedSuccessfully);
        }