예제 #1
0
        public void TryGetEdge()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2, 3 },
                data.TryGetEdges);

            TryGetEdge_UndirectedGraph_Test(data, graph);

            // Additional tests
            var edge13 = new Edge <int>(1, 3);
            var edge14 = new Edge <int>(1, 4);
            var edge21 = new Edge <int>(2, 1);

            data.ShouldReturnValue = true;
            data.ShouldReturnEdges = new[] { edge13, edge14, edge21 };

            var edge12 = new Edge <int>(1, 2);

            Assert.IsTrue(graph.TryGetEdge(1, 2, out Edge <int> gotEdge));
            Assert.AreSame(edge21, gotEdge);

            data.ShouldReturnEdges = new[] { edge12, edge13, edge14, edge21 };
            Assert.IsTrue(graph.TryGetEdge(1, 2, out gotEdge));
            Assert.AreSame(edge12, gotEdge);

            var edge51 = new Edge <int>(5, 1);
            var edge56 = new Edge <int>(5, 6);

            data.ShouldReturnEdges = new[] { edge12, edge13, edge51, edge56 };
            Assert.IsFalse(graph.TryGetEdge(1, 5, out _));
            Assert.IsFalse(graph.TryGetEdge(5, 1, out _));
            Assert.IsFalse(graph.TryGetEdge(5, 6, out _));
        }
예제 #2
0
        public void Construction()
        {
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                Enumerable.Empty <int>(),
                GetEmptyGetter <int, Edge <int> >());

            AssertGraphProperties(graph);

            graph = new DelegateUndirectedGraph <int, Edge <int> >(
                Enumerable.Empty <int>(),
                GetEmptyGetter <int, Edge <int> >(),
                false);
            AssertGraphProperties(graph, false);

            #region Local function

            void AssertGraphProperties <TVertex, TEdge>(
                DelegateUndirectedGraph <TVertex, TEdge> g,
                bool parallelEdges = true)
                where TEdge : IEdge <TVertex>
            {
                Assert.IsFalse(g.IsDirected);
                Assert.AreEqual(parallelEdges, g.AllowParallelEdges);
                Assert.IsNotNull(g.EdgeEqualityComparer);
            }

            #endregion
        }
예제 #3
0
        public void AdjacentEdges_Throws()
        {
            var data1  = new GraphData <int, Edge <int> >();
            var graph1 = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1 },
                data1.TryGetEdges);

            AdjacentEdges_Throws_Test(data1, graph1);

            // Additional tests
            data1.ShouldReturnValue = true;
            var edge32 = new Edge <int>(3, 2);

            data1.ShouldReturnEdges = new[] { edge32 };
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <VertexNotFoundException>(() => graph1.AdjacentEdges(3));
            data1.CheckCalls(0); // Vertex is not in graph so no need to call user code


            var data2  = new GraphData <TestVertex, Edge <TestVertex> >();
            var graph2 = new DelegateUndirectedGraph <TestVertex, Edge <TestVertex> >(
                Enumerable.Empty <TestVertex>(),
                data2.TryGetEdges);

            AdjacentEdges_NullThrows_Test(graph2);
        }
예제 #4
0
        public void AdjacentEdge_Throws()
        {
            var data   = new GraphData <int, Edge <int> >();
            var graph1 = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2 },
                data.TryGetEdges);

            AdjacentEdge_Throws_Test(data, graph1);

            // Additional tests
            data.ShouldReturnValue = true;
            var edge32 = new Edge <int>(3, 2);

            data.ShouldReturnEdges = new[] { edge32 };
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <VertexNotFoundException>(() => graph1.AdjacentEdge(3, 0));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            var edge14 = new Edge <int>(1, 4);
            var edge12 = new Edge <int>(1, 2);

            data.ShouldReturnEdges = new[] { edge14, edge12 };
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            AssertIndexOutOfRange(() => graph1.AdjacentEdge(1, 1));
            data.CheckCalls(1);

            var graph2 = new DelegateUndirectedGraph <TestVertex, Edge <TestVertex> >(
                Enumerable.Empty <TestVertex>(),
                GetEmptyGetter <TestVertex, Edge <TestVertex> >());

            AdjacentEdge_NullThrows_Test(graph2);
        }
예제 #5
0
        public void ContainsVertex()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                Enumerable.Empty <int>(),
                data.TryGetEdges);

            data.CheckCalls(0);

            data.ShouldReturnValue = false;
            Assert.IsFalse(graph.ContainsVertex(1));
            data.CheckCalls(0); // Implementation override

            data.ShouldReturnValue = true;
            Assert.IsFalse(graph.ContainsVertex(1));
            data.CheckCalls(0); // Implementation override


            graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2 },
                data.TryGetEdges);
            data.ShouldReturnValue = false;
            Assert.IsFalse(graph.ContainsVertex(10));
            data.CheckCalls(0); // Implementation override
            Assert.IsTrue(graph.ContainsVertex(2));
            data.CheckCalls(0); // Implementation override

            data.ShouldReturnValue = true;
            Assert.IsFalse(graph.ContainsVertex(10));
            data.CheckCalls(0); // Implementation override
            Assert.IsTrue(graph.ContainsVertex(2));
            data.CheckCalls(0); // Implementation override
        }
예제 #6
0
        public void TryGetAdjacentEdges_Throws()
        {
            var graph = new DelegateUndirectedGraph <TestVertex, Edge <TestVertex> >(
                Enumerable.Empty <TestVertex>(),
                GetEmptyGetter <TestVertex, Edge <TestVertex> >());

            TryGetAdjacentEdges_Throws_Test(graph);
        }
예제 #7
0
        public void ContainsVertex_Throws()
        {
            var graph = new DelegateUndirectedGraph <TestVertex, Edge <TestVertex> >(
                Enumerable.Empty <TestVertex>(),
                GetEmptyGetter <TestVertex, Edge <TestVertex> >());

            ContainsVertex_Throws_Test(graph);
        }
예제 #8
0
        public void TryGetAdjacentEdges()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2, 3, 4 },
                data.TryGetEdges);

            TryGetAdjacentEdges_Test(data, graph);
        }
예제 #9
0
        public void TryGetEdge_Throws()
        {
            var data  = new GraphData <TestVertex, Edge <TestVertex> >();
            var graph = new DelegateUndirectedGraph <TestVertex, Edge <TestVertex> >(
                Enumerable.Empty <TestVertex>(),
                data.TryGetEdges);

            TryGetEdge_Throws_UndirectedGraph_Test(graph);
        }
예제 #10
0
        public void ContainsEdge()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2, 3 },
                data.TryGetEdges);

            ContainsEdge_Test(data, graph);
        }
예제 #11
0
        public void ContainsEdge_SourceTarget()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                Enumerable.Empty <int>(),
                data.TryGetEdges);

            data.CheckCalls(0);

            data.ShouldReturnValue = false;
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code
            Assert.IsFalse(graph.ContainsEdge(2, 1));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            data.ShouldReturnValue = true;
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code
            Assert.IsFalse(graph.ContainsEdge(2, 1));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            data.ShouldReturnEdges = new[] { new Edge <int>(1, 3), new Edge <int>(1, 2) };
            Assert.IsFalse(graph.ContainsEdge(1, 2)); // Vertices 1 and 2 are not part or the graph
            data.CheckCalls(0);                       // Vertex is not in graph so no need to call user code
            Assert.IsFalse(graph.ContainsEdge(2, 1));
            data.CheckCalls(0);                       // Vertex is not in graph so no need to call user code


            graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 3 },
                data.TryGetEdges);

            data.ShouldReturnValue = false;
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            data.CheckCalls(1);
            Assert.IsFalse(graph.ContainsEdge(2, 1));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            data.ShouldReturnValue = true;
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            data.CheckCalls(1);
            Assert.IsFalse(graph.ContainsEdge(2, 1));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            data.ShouldReturnEdges = new[] { new Edge <int>(1, 2), new Edge <int>(1, 3) };
            Assert.IsFalse(graph.ContainsEdge(1, 2));   // Vertices 2 is not part or the graph
            data.CheckCalls(1);
            Assert.IsFalse(graph.ContainsEdge(2, 1));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            Assert.IsTrue(graph.ContainsEdge(1, 3));
            data.CheckCalls(1);
            Assert.IsTrue(graph.ContainsEdge(3, 1));
            data.CheckCalls(1);
        }
예제 #12
0
        public void Vertices()
        {
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                Enumerable.Empty <int>(),
                GetEmptyGetter <int, Edge <int> >());

            AssertNoVertex(graph);
            AssertNoVertex(graph);

            graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2, 3 },
                GetEmptyGetter <int, Edge <int> >());
            AssertHasVertices(graph, new[] { 1, 2, 3 });
            AssertHasVertices(graph, new[] { 1, 2, 3 });
        }
예제 #13
0
        public void AdjacentEdge()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2, 3 },
                data.TryGetEdges);

            AdjacentEdge_Test(data, graph);

            // Additional tests
            var edge14 = new Edge <int>(1, 4);
            var edge12 = new Edge <int>(1, 2);

            data.ShouldReturnValue = true;
            data.ShouldReturnEdges = new[] { edge14, edge12 };
            Assert.AreSame(edge12, graph.AdjacentEdge(1, 0));
            data.CheckCalls(1);
        }
예제 #14
0
        protected static void TryGetAdjacentEdges_Test(
            [NotNull] GraphData <int, Edge <int> > data,
            [NotNull] DelegateUndirectedGraph <int, Edge <int> > graph)
        {
            data.CheckCalls(0);

            data.ShouldReturnValue = false;
            Assert.IsFalse(graph.TryGetAdjacentEdges(5, out _));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code

            data.ShouldReturnValue = true;
            Assert.IsTrue(graph.TryGetAdjacentEdges(1, out IEnumerable <Edge <int> > edges));
            CollectionAssert.IsEmpty(edges);
            data.CheckCalls(1);

            data.ShouldReturnEdges = new[] { new Edge <int>(1, 4), new Edge <int>(1, 2) };
            Assert.IsTrue(graph.TryGetAdjacentEdges(1, out edges));
            CollectionAssert.AreEqual(data.ShouldReturnEdges, edges);
            data.CheckCalls(1);

            data.ShouldReturnEdges = null;
            Assert.IsTrue(graph.TryGetAdjacentEdges(1, out IEnumerable <Edge <int> > adjacentEdges));
            CollectionAssert.IsEmpty(adjacentEdges);
            data.CheckCalls(1);

            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge15 = new Edge <int>(1, 5);
            var edge21 = new Edge <int>(2, 1);
            var edge23 = new Edge <int>(2, 3);

            data.ShouldReturnEdges = new[] { edge12, edge13, edge15, edge21, edge23 };
            Assert.IsTrue(graph.TryGetAdjacentEdges(1, out adjacentEdges));
            CollectionAssert.AreEqual(
                new[] { edge12, edge13, edge21 },
                adjacentEdges);
            data.CheckCalls(1);

            var edge52 = new Edge <int>(5, 2);

            data.ShouldReturnEdges = new[] { edge15, edge52 };
            Assert.IsFalse(graph.TryGetAdjacentEdges(5, out _));
            data.CheckCalls(0); // Vertex is not in graph so no need to call user code
        }
예제 #15
0
        public void Edges()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                Enumerable.Empty <int>(),
                data.TryGetEdges);

            data.ShouldReturnValue = false;
            data.ShouldReturnEdges = null;
            AssertNoEdge(graph);

            data.ShouldReturnValue = true;
            AssertNoEdge(graph);

            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);

            data.ShouldReturnEdges = new[] { edge12, edge13 };
            AssertNoEdge(graph);    // No vertex so no possible edge!

            graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new[] { 1, 2, 3 },
                data.TryGetEdges);

            data.ShouldReturnValue = true;
            data.ShouldReturnEdges = null;
            AssertNoEdge(graph);

            var edge22 = new Edge <int>(2, 2);
            var edge31 = new Edge <int>(3, 1);

            data.ShouldReturnEdges = new[] { edge12, edge13, edge22, edge31 };
            AssertHasEdges(graph, new[] { edge12, edge13, edge22, edge31 });

            var edge15 = new Edge <int>(1, 5);
            var edge51 = new Edge <int>(5, 1);
            var edge56 = new Edge <int>(5, 6);

            data.ShouldReturnEdges = new[] { edge12, edge13, edge22, edge31, edge15, edge51, edge56 };
            // Some edges skipped because they have vertices not in the graph
            AssertHasEdges(graph, new[] { edge12, edge13, edge22, edge31 });
        }
예제 #16
0
        public void AdjacentEdges()
        {
            var data  = new GraphData <int, Edge <int> >();
            var graph = new DelegateUndirectedGraph <int, Edge <int> >(
                new [] { 1, 2, 3 },
                data.TryGetEdges);

            AdjacentEdges_Test(data, graph);

            // Additional tests
            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge14 = new Edge <int>(1, 4);
            var edge21 = new Edge <int>(2, 1);

            data.ShouldReturnValue = true;
            data.ShouldReturnEdges = new[] { edge12, edge13, edge14, edge21 };
            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            AssertHasAdjacentEdges(graph, 1, new[] { edge12, edge13, edge21 });
            data.CheckCalls(3);
        }