public IEnumerable<Graph<IFileReference>> GetChangeGraphs(IMultiFileSystemDiff diff) { foreach (var changeList in diff.FileChanges) { var graph = new Graph<IFileReference>(m_FileReferenceComparer); foreach (var historyName in changeList.HistoryNames) { var changes = changeList.GetChanges(historyName).ToArray(); // add changes for the current history to the graph if (changes.Any()) { graph.AddEdgeFromStartNode(changes.First().FromVersion); foreach (var change in changes) { graph.AddEdge(change.FromVersion, change.ToVersion); } } // for histories without a change to the current file, add the current file version as node else { var rootDirectory = diff.ToSnapshot.GetSnapshot(historyName).RootDirectory; graph.AddEdgeFromStartNode(rootDirectory.GetFileReferenceOrDefault(changeList.Path)); } } yield return graph; } }
public void Graph_can_be_converted_to_acyclic_graph_02() { // ARRANGE var expectedValuesInOrder = new[] {0, 1, 2, 1}; var graph = new Graph<int>(EqualityComparer<int>.Default); // ACT graph.AddEdgeFromStartNode(0); graph.AddEdge(0, 1); graph.AddEdge(1, 2); graph.AddEdge(2, 1); var nodes = graph.ToAcyclicGraph().ValueNodes.ToArray(); // ASSERT Assert.Equal(4, nodes.Length); Assert.Equal(expectedValuesInOrder, nodes.Select(n => n.Value).ToArray()); // expected Graph 0 -> 1 -> 2 -> 1 (1 was added twice to prevent a cycle) Assert.Equal(1, nodes[0].Successors.Single().Value); Assert.Equal(2, nodes[1].Successors.Single().Value); Assert.Equal(1, nodes[2].Successors.Single().Value); Assert.Empty(nodes[3].Successors); }
public void Graph_can_be_converted_to_acyclic_graph_01() { var graph = new Graph<int>(EqualityComparer<int>.Default); graph.AddEdgeFromStartNode(0); graph.AddEdge(0,1); graph.AddEdge(1,2); graph.AddEdge(2,1); Assert.Equal(4, graph.ToAcyclicGraph().ValueNodes.Count()); }
public void Graph_can_be_converted_to_acyclic_graph_03() { // ARRANGE var expectedValuesInOrder = new[] { 0, 1, 2, 0 }; var graph = new Graph<int>(EqualityComparer<int>.Default); // ACT graph.AddEdgeFromStartNode(0); graph.AddEdge(0, 1); graph.AddEdge(1, 0); graph.AddEdge(2, 0); var nodes = graph.ToAcyclicGraph().ValueNodes.ToArray(); // ASSERT Assert.Equal(4, nodes.Length); Assert.Equal(expectedValuesInOrder, nodes.Select(n => n.Value).ToArray()); // expected Graph // 2 // | // v // 0 -> 1 -> 0 var node0_1 = nodes.First(n => n.Value == 0); var node0_2 = nodes.Last(n => n.Value == 0); var node1 = nodes.Single(n => n.Value == 1); var node2 = nodes.Single(n => n.Value == 2); Assert.Single(node2.Successors); Assert.Equal(node0_2, node2.Successors.Single()); Assert.Single(node0_1.Successors); Assert.Equal(node1, node0_1.Successors.Single()); Assert.Single(node1.Successors); Assert.Equal(node0_2, node1.Successors.Single()); Assert.Empty(node0_2.Successors); }