Example #1
0
        public void BuildOrder_Should_Check_Example()
        {
            //arrange
            var graph = new MyGraph <char>(6);

            graph.AddVertex(0, 'a');
            graph.AddVertex(1, 'b');
            graph.AddVertex(2, 'c');
            graph.AddVertex(3, 'd');
            graph.AddVertex(4, 'e');
            graph.AddVertex(5, 'f');

            graph.AddEdge(5, 1);
            graph.AddEdge(5, 0);
            graph.AddEdge(0, 3);
            graph.AddEdge(1, 3);
            graph.AddEdge(3, 2);

            var order = new[] { 'e', 'f', 'a', 'b', 'd', 'c' };

            //act
            var result = _treesGraphs.BuildOrder(graph).ToArray();

            //assert
            result.Length.ShouldBeEquivalentTo(order.Length);

            for (int i = 0; i < result.Length; i++)
            {
                result[i].ShouldBeEquivalentTo(order[i]);
            }
        }
Example #2
0
        public void RouteBetweenNodes_Should_Check_False()
        {
            //arrange
            var graph = new MyGraph <int>(7);

            graph.AddVertex(0, 0);
            graph.AddVertex(1, 1);
            graph.AddVertex(2, 2);
            graph.AddVertex(3, 3);
            graph.AddVertex(4, 4);
            graph.AddVertex(5, 5);
            graph.AddVertex(6, 6);

            graph.AddEdge(0, 4);
            graph.AddEdge(1, 4);
            graph.AddEdge(2, 5);
            graph.AddEdge(3, 5);
            graph.AddEdge(4, 0);
            graph.AddEdge(4, 1);
            graph.AddEdge(5, 2);
            graph.AddEdge(5, 3);

            //act
            var result = _treesGraphs.RouteBetweenNodes(graph, 0, 3);

            //assert
            result.ShouldBeEquivalentTo(false);
        }
Example #3
0
        public void Deserialize(string fileName, out MyGraph<Location> graph, out ArduinoGroupWrapper arduinoGroup)
        {
            var binder = new TypeNameSerializationBinder();
            var graphString = File.ReadAllText(fileName);
            var deserialized = JsonConvert.DeserializeObject<SerializeWrapper>(graphString, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Auto,
                Binder = binder
            });

            graph = deserialized.Graph;
            arduinoGroup = deserialized.ArduinoGroup;

            foreach (var edge in graph.Edges.OfType<MyEdge<Location>>().ToList())
            {
                var from = edge.Source;
                var to = edge.Destination;

                var vertices = graph.SubGraphs.SelectMany(subgraph => subgraph.Vertices).ToList();
                vertices.AddRange(graph.Vertices);

                graph.RemoveEdge(edge);
                graph.AddEdge(
                    new MyEdge<Location>(vertices.First(vertex => vertex.Name == from.Name),
                    vertices.First(vertex => vertex.Name == to.Name),edge.DestinationArrow)
                );
            }
        }
        public void GivenAGraph_WhenNodesHaveCycle_ShouldReturnTrue()
        {
            // Arrange
            var graph = new MyGraph <string>();

            graph.AddNode("A");
            graph.AddNode("B");
            graph.AddNode("C");

            graph.AddEdge("A", "B");
            graph.AddEdge("B", "C");
            graph.AddEdge("C", "A");

            // Act
            var hasCycle = graph.HasCycle();

            // Assert
            hasCycle.Should().BeTrue();
        }
Example #5
0
        public void BuildOrder_Should_Check_For_Cycle()
        {
            //arrange
            var graph = new MyGraph <char>(6);

            graph.AddVertex(0, 'a');
            graph.AddVertex(1, 'b');
            graph.AddVertex(2, 'c');

            graph.AddEdge(0, 1);
            graph.AddEdge(1, 2);
            graph.AddEdge(2, 0);

            //act
            Action act = () => _treesGraphs.BuildOrder(graph);

            //assert
            act.ShouldThrow <ArgumentException>();
        }
        public void GivenAGraphWithNode_WhenTheyHaveDependencyFromEachOther_ShouldTopologicalSortComThoseDependencies()
        {
            // Arrange
            var graph = new MyGraph <string>();

            graph.AddNode("P");
            graph.AddNode("A");
            graph.AddNode("B");
            graph.AddNode("X");
            graph.AddEdge("X", "B");
            graph.AddEdge("X", "A");
            graph.AddEdge("A", "P");
            graph.AddEdge("B", "P");

            // Act
            var sort = graph.TopologicalSort();

            // Assert
            sort.Should().BeEquivalentTo("X", "B", "A", "P");
        }
Example #7
0
        public void Should_AddEdge_Throw_If_Out_Of_Range()
        {
            //arrange
            var graph = new MyGraph <int>(5);

            //act
            Action actLowerFrom  = () => graph.AddEdge(-1, 1);
            Action actHigherFrom = () => graph.AddEdge(6, 1);

            Action actLowerTo  = () => graph.AddEdge(1, -1);
            Action actHigherTo = () => graph.AddEdge(1, 6);

            //assert
            actLowerFrom.ShouldThrow <ArgumentOutOfRangeException>();
            actHigherFrom.ShouldThrow <ArgumentOutOfRangeException>();
            actLowerTo.ShouldThrow <ArgumentOutOfRangeException>();
            actHigherTo.ShouldThrow <ArgumentOutOfRangeException>();

            graph.Capacity.ShouldBeEquivalentTo(5);
            graph.Count.ShouldBeEquivalentTo(0);
        }
Example #8
0
        public void GivenTwoKeys_WhenGraphHaveThisNodesAndTheyDoNotHaveRelationship_ShouldConnectThisTwoNodes()
        {
            // Arrange
            var graph = new MyGraph <string>();

            graph.AddNode("one");
            graph.AddNode("two");

            // Act
            graph.AddEdge("one", "two");

            // Assert
            var values = graph.GetAll();

            values.GetValue("one").Should().ContainSingle("two");
        }
        public void GivenTwoKeys_WhenGraphHaveTheseNodesAndTheyHaveRelationship_ShouldRemoveTheRelationship()
        {
            // Arrange
            var graph = new MyGraph <string>();

            graph.AddNode("node1");
            graph.AddNode("node2");
            graph.AddEdge("node1", "node2");

            // Act
            graph.RemoveEdge("node1", "node2");

            // Assert
            foreach (var item in graph.GetAll())
            {
                item.Value.Should().BeEmpty();
            }
        }
Example #10
0
        public void AssignSwitchToLight()
        {
            var switches = _graph.SubGraphs.SelectMany(subGraph => subGraph.Vertices.OfType <Switch>()).ToList();

            var switchFrom = switches.First(item => item.Name == AssignSwitchToLightSwitch);


            var lightes = _graph.SubGraphs.SelectMany(subGraph => subGraph.Vertices.OfType <Light>()).ToList();

            var lightTo = lightes.First(item => item.Name == AssignSwitchToLightLight);

            //edge already exists
            if (_graph.Edges.Any(edge => ((Location)edge.Source).Name == AssignSwitchToLightSwitch && ((Location)edge.Destination).Name == AssignSwitchToLightLight))
            {
                return;
            }

            _graph.AddEdge(new MyEdge <Location>(switchFrom, lightTo, new Arrow()));
        }
Example #11
0
        public void Should_RemoveEdge()
        {
            //arrange
            var graph = new MyGraph <int>(6);

            graph.AddVertex(0, 0);
            graph.AddVertex(1, 1);
            graph.AddVertex(2, 2);
            graph.AddVertex(3, 3);
            graph.AddVertex(4, 4);
            graph.AddVertex(5, 5);

            graph.AddEdge(0, 5);
            graph.AddEdge(0, 1);
            graph.AddEdge(0, 4);
            graph.AddEdge(1, 3);
            graph.AddEdge(1, 4);
            graph.AddEdge(2, 1);
            graph.AddEdge(3, 2);
            graph.AddEdge(3, 4);

            var resBfs = new[] { 0, 5, 4 };

            //act
            graph.RemoveEdge(0, 1);
            var result = graph.BreadthFirstSearch(0).ToArray();

            //assert
            result.Length.ShouldBeEquivalentTo(resBfs.Length);
            for (int i = 0; i < result.Length; i++)
            {
                result[i].ShouldBeEquivalentTo(resBfs[i]);
            }

            graph.Capacity.ShouldBeEquivalentTo(6);
            graph.Count.ShouldBeEquivalentTo(6);
        }
Example #12
0
        public void Should_Remove()
        {
            //arrange
            var graph = new MyGraph <int>(4);

            graph.AddVertex(0, 0);
            graph.AddVertex(1, 1);
            graph.AddVertex(2, 2);
            graph.AddVertex(3, 3);

            graph.AddEdge(0, 2);
            graph.AddEdge(1, 2);
            graph.AddEdge(2, 0);
            graph.AddEdge(2, 1);
            graph.AddEdge(2, 3);
            graph.AddEdge(3, 2);

            //act
            graph.Remove(2);

            var    first  = graph.BreadthFirstSearch(0).ToArray();
            var    second = graph.BreadthFirstSearch(1).ToArray();
            var    third  = graph.BreadthFirstSearch(3).ToArray();
            Action act    = () => graph.BreadthFirstSearch(2).ToArray();

            //assert
            first.Length.ShouldBeEquivalentTo(1);
            second.Length.ShouldBeEquivalentTo(1);
            third.Length.ShouldBeEquivalentTo(1);

            first[0].ShouldBeEquivalentTo(0);
            second[0].ShouldBeEquivalentTo(1);
            third[0].ShouldBeEquivalentTo(3);

            act.ShouldThrow <ArgumentException>();

            graph.Capacity.ShouldBeEquivalentTo(4);
            graph.Count.ShouldBeEquivalentTo(3);
        }
Example #13
0
        public void Should_BidirectionalSearch_False()
        {
            //arrange
            var graph = new MyGraph <int>(15);

            graph.AddVertex(0, 0);
            graph.AddVertex(1, 1);
            graph.AddVertex(2, 2);
            graph.AddVertex(3, 3);
            graph.AddVertex(4, 4);
            graph.AddVertex(5, 5);
            graph.AddVertex(6, 6);

            graph.AddVertex(8, 8);
            graph.AddVertex(9, 9);
            graph.AddVertex(10, 10);
            graph.AddVertex(11, 11);
            graph.AddVertex(12, 12);
            graph.AddVertex(13, 13);
            graph.AddVertex(14, 14);

            graph.AddEdge(0, 4);
            graph.AddEdge(1, 4);
            graph.AddEdge(2, 5);
            graph.AddEdge(3, 5);
            graph.AddEdge(4, 0);
            graph.AddEdge(4, 1);
            graph.AddEdge(4, 6);
            graph.AddEdge(5, 2);
            graph.AddEdge(5, 3);
            graph.AddEdge(5, 6);
            graph.AddEdge(6, 4);
            graph.AddEdge(6, 5);
            graph.AddEdge(8, 9);
            graph.AddEdge(8, 10);
            graph.AddEdge(9, 8);
            graph.AddEdge(9, 11);
            graph.AddEdge(9, 12);
            graph.AddEdge(10, 8);
            graph.AddEdge(10, 13);
            graph.AddEdge(10, 14);
            graph.AddEdge(11, 9);
            graph.AddEdge(12, 9);
            graph.AddEdge(13, 10);
            graph.AddEdge(14, 10);

            //act
            var result = graph.BidirectionalSearch(1, 14);

            //assert
            result.ShouldBeEquivalentTo(null);

            graph.Capacity.ShouldBeEquivalentTo(15);
            graph.Count.ShouldBeEquivalentTo(14);
        }
Example #14
0
        public void Should_BidirectionalSearch()
        {
            //arrange
            var graph = new MyGraph <int>(15);

            graph.AddVertex(0, 0);
            graph.AddVertex(1, 1);
            graph.AddVertex(2, 2);
            graph.AddVertex(3, 3);
            graph.AddVertex(4, 4);
            graph.AddVertex(5, 5);
            graph.AddVertex(6, 6);
            graph.AddVertex(7, 7);
            graph.AddVertex(8, 8);
            graph.AddVertex(9, 9);
            graph.AddVertex(10, 10);
            graph.AddVertex(11, 11);
            graph.AddVertex(12, 12);
            graph.AddVertex(13, 13);
            graph.AddVertex(14, 14);

            graph.AddEdge(0, 4);
            graph.AddEdge(1, 4);
            graph.AddEdge(2, 5);
            graph.AddEdge(3, 5);
            graph.AddEdge(4, 0);
            graph.AddEdge(4, 1);
            graph.AddEdge(4, 6);
            graph.AddEdge(5, 2);
            graph.AddEdge(5, 3);
            graph.AddEdge(5, 6);
            graph.AddEdge(6, 4);
            graph.AddEdge(6, 5);
            graph.AddEdge(6, 7);
            graph.AddEdge(7, 6);
            graph.AddEdge(7, 8);
            graph.AddEdge(8, 7);
            graph.AddEdge(8, 9);
            graph.AddEdge(8, 10);
            graph.AddEdge(9, 8);
            graph.AddEdge(9, 11);
            graph.AddEdge(9, 12);
            graph.AddEdge(10, 8);
            graph.AddEdge(10, 13);
            graph.AddEdge(10, 14);
            graph.AddEdge(11, 9);
            graph.AddEdge(12, 9);
            graph.AddEdge(13, 10);
            graph.AddEdge(14, 10);

            var fromSearch = new[] { 1, 4, 0, 6, 5, 7 };
            var toSearch   = new[] { 14, 10, 8, 13, 7, 9 };

            //act
            var result = graph.BidirectionalSearch(1, 14);

            //assert
            result[0].Count().ShouldBeEquivalentTo(fromSearch.Length);
            result[1].Count().ShouldBeEquivalentTo(toSearch.Length);

            for (int i = 0; i < fromSearch.Length; i++)
            {
                fromSearch[i].ShouldBeEquivalentTo(result[0].ElementAt(i));
            }
            for (int i = 0; i < toSearch.Length; i++)
            {
                toSearch[i].ShouldBeEquivalentTo(result[1].ElementAt(i));
            }

            graph.Capacity.ShouldBeEquivalentTo(15);
            graph.Count.ShouldBeEquivalentTo(15);
        }
Example #15
0
        private static void CreateGraph(ref MyGraph<string> myGraph)
        {
            //Adds nodes to our graph
            Node<String> n1 = myGraph.AddNode("OREGON");
            Node<String> n2 = myGraph.AddNode("CALIFORNIA");
            Node<String> n3 = myGraph.AddNode("IDAHO");
            Node<String> n4 = myGraph.AddNode("UTAH");
            Node<String> n5 = myGraph.AddNode("NEW MEXICO");
            Node<String> n6 = myGraph.AddNode("KANSAS");
            Node<String> n7 = myGraph.AddNode("SOUTH DAKOTA");
            Node<String> n8 = myGraph.AddNode("NORTH DAKOTA");
            Node<String> n9 = myGraph.AddNode("IOWA");
            Node<String> n10 = myGraph.AddNode("TENNESSEE");
            Node<String> n11 = myGraph.AddNode("NEW YORK");
            Node<String> n12 = myGraph.AddNode("FLORIDA");
            Node<String> n13 = myGraph.AddNode("TEXAS");

            //Creates edges between the graphs nodes
            myGraph.AddEdge("OREGON", "CALIFORNIA");
            myGraph.AddEdge("CALIFORNIA", "UTAH");
            myGraph.AddEdge("UTAH", "IDAHO");
            myGraph.AddEdge("UTAH", "NEW MEXICO");
            myGraph.AddEdge("NEW MEXICO", "KANSAS");
            myGraph.AddEdge("NEW MEXICO", "TEXAS");
            myGraph.AddEdge("TEXAS", "TENNESSEE");
            myGraph.AddEdge("TEXAS", "FLORIDA");
            myGraph.AddEdge("TEXAS", "KANSAS");
            myGraph.AddEdge("KANSAS", "SOUTH DAKOTA");
            myGraph.AddEdge("SOUTH DAKOTA", "NORTH DAKOTA");
            myGraph.AddEdge("NORTH DAKOTA", "IOWA");
            myGraph.AddEdge("IOWA", "TENNESSEE");
            myGraph.AddEdge("TENNESSEE", "FLORIDA");
            myGraph.AddEdge("TENNESSEE", "NEW YORK");
        }