public void OutEdge_Throws()
        {
            var graph1 = new TransitionFactoryImplicitGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();

            OutEdge_NullThrows_Test(graph1);

            var graph2 = new TransitionFactoryImplicitGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();

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

            // ReSharper disable ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <VertexNotFoundException>(() => graph2.OutEdge(vertex1, 0));

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

            graph2.AddTransitionFactory(factory1);
            graph2.AddTransitionFactory(
                new TestTransitionFactory <CloneableTestVertex>(vertex2, Enumerable.Empty <Edge <CloneableTestVertex> >()));
            AssertIndexOutOfRange(() => graph2.OutEdge(vertex1, 0));

            graph2.RemoveTransitionFactory(factory1);
            graph2.AddTransitionFactory(
                new TestTransitionFactory <CloneableTestVertex>(vertex1, new[] { new Edge <CloneableTestVertex>(vertex1, vertex2) }));
            AssertIndexOutOfRange(() => graph2.OutEdge(vertex1, 5));
            // ReSharper restore ReturnValueOfPureMethodIsNotUsed
        }
        public void OutEdge_WithFilter()
        {
            var graph = new TransitionFactoryImplicitGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();

            var vertex1 = new CloneableTestVertex("1");
            var vertex2 = new CloneableTestVertex("2");
            var vertex3 = new CloneableTestVertex("3");
            var vertex4 = new CloneableTestVertex("4");
            var vertex5 = new CloneableTestVertex("5");
            var vertex6 = new CloneableTestVertex("6");
            var vertex7 = new CloneableTestVertex("7");

            var edge11 = new Edge <CloneableTestVertex>(vertex1, vertex1);
            var edge12 = new Edge <CloneableTestVertex>(vertex1, vertex2);
            var edge13 = new Edge <CloneableTestVertex>(vertex1, vertex3);
            var edge54 = new Edge <CloneableTestVertex>(vertex5, vertex4);
            var edge61 = new Edge <CloneableTestVertex>(vertex6, vertex1);
            var edge67 = new Edge <CloneableTestVertex>(vertex6, vertex7);

            graph.AddTransitionFactory(
                new TestTransitionFactory <CloneableTestVertex>(new[]
            {
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex1, new[] { edge11, edge12, edge13 }),
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex5, new[] { edge54 }),
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex6, new[] { edge61, edge67 }),
            }));

            graph.SuccessorVertexPredicate = vertex => vertex != vertex4;
            graph.SuccessorEdgePredicate   = edge => edge != edge61;

            Assert.AreSame(edge11, graph.OutEdge(vertex1, 0));
            Assert.AreSame(edge13, graph.OutEdge(vertex1, 2));
            // ReSharper disable ReturnValueOfPureMethodIsNotUsed
            AssertIndexOutOfRange(() => graph.OutEdge(vertex5, 0)); // Filtered
            Assert.AreSame(edge67, graph.OutEdge(vertex6, 0));      // Because of the filter
            AssertIndexOutOfRange(() => graph.OutEdge(vertex6, 1)); // Filtered
            // ReSharper restore ReturnValueOfPureMethodIsNotUsed

            // Restore no filter
            graph.SuccessorVertexPredicate = vertex => true;
            graph.SuccessorEdgePredicate   = edge => true;

            Assert.AreSame(edge54, graph.OutEdge(vertex5, 0));
            Assert.AreSame(edge61, graph.OutEdge(vertex6, 0));
            Assert.AreSame(edge67, graph.OutEdge(vertex6, 1));
        }
        public void OutEdge()
        {
            var graph = new TransitionFactoryImplicitGraph <CloneableTestVertex, Edge <CloneableTestVertex> >();

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

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

            graph.AddTransitionFactory(
                new TestTransitionFactory <CloneableTestVertex>(new[]
            {
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex1, new[] { edge11, edge12 }),
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex2, new[] { edge24 }),
                new TestTransitionFactory <CloneableTestVertex> .VertexEdgesSet(vertex3, new[] { edge33 }),
            }));

            graph.AddTransitionFactory(
                new TestTransitionFactory <CloneableTestVertex>(vertex1, new[] { edge13 }));
            graph.AddTransitionFactory(
                new TestTransitionFactory <CloneableTestVertex>(vertex4, new[] { edge41 }));

            Assert.AreSame(edge11, graph.OutEdge(vertex1, 0));
            Assert.AreSame(edge13, graph.OutEdge(vertex1, 2));
            Assert.AreSame(edge24, graph.OutEdge(vertex2, 0));
            Assert.AreSame(edge33, graph.OutEdge(vertex3, 0));
            Assert.AreSame(edge41, graph.OutEdge(vertex4, 0));
            Assert.AreSame(edge41, graph.OutEdge(vertex4, 0));
        }