Exemple #1
0
        public void FindNodesThatDependOn_ShouldFindAnyLevelDependency()
        {
            // Arrange
            using var dep2 = CreateProjectFile("dep2");

            // dep1 depends on dep2
            using var dep1 = CreateProjectFile("dep1", dep2);

            // root depends on dep1
            using var projectThatChanged = CreateProjectFile("projectThatChanged", dep1);

            var graph = new ProjectGraph(projectThatChanged.Path);

            var dep2Node = graph.FindNodeByPath(dep2.Path);

            // Act
            var affected = graph.FindNodesThatDependOn(dep2Node).ToList();

            // Assert
            Assert.Equal(2, affected.Count);

            var dep1Node = graph.FindNodeByPath(dep1.Path);
            var projectThatChangedNode = graph.FindNodeByPath(projectThatChanged.Path);

            Assert.Collection(affected,
                              k => Assert.Equal(dep1Node, k),
                              k => Assert.Equal(projectThatChangedNode, k)
                              );
        }
        public static IEnumerable <ProjectGraphNode> FindNodesThatDependOn(
            this ProjectGraph graph,
            IEnumerable <ProjectGraphNode> targetNodes)
        {
            var added = new HashSet <string>();

            foreach (var node in targetNodes)
            {
                foreach (var affected in graph.FindNodesThatDependOn(node).ToList())
                {
                    if (!added.Contains(affected.ProjectInstance.FullPath))
                    {
                        added.Add(affected.ProjectInstance.FullPath);
                        yield return(affected);
                    }
                }
            }
        }
Exemple #3
0
        public void FindNodesThatDependOn_ShouldFindDependenciesForAllProjects()
        {
            // Arrange
            using var dep2 = CreateProjectFile("dep2");

            // dep1 depends on dep2
            using var dep1 = CreateProjectFile("dep1", dep2);

            // root depends on dep1
            using var projectThatChanged = CreateProjectFile("projectThatChanged", dep1);

            // other dep
            using var dep3 = CreateProjectFile("dep3");

            // other root depends on other dep
            using var otherProjectThatChanged = CreateProjectFile("otherProject", dep3);

            var graph = new ProjectGraph(new string[] {
                projectThatChanged.Path,
                otherProjectThatChanged.Path
            });

            var dep2Node = graph.FindNodeByPath(dep2.Path);
            var dep3Node = graph.FindNodeByPath(dep3.Path);

            // Act
            var affected = graph.FindNodesThatDependOn(new[] {
                dep2Node,
                dep3Node,
            }).ToList();

            // Assert
            Assert.Equal(3, affected.Count);

            var dep1Node = graph.FindNodeByPath(dep1.Path);
            var projectThatChangedNode      = graph.FindNodeByPath(projectThatChanged.Path);
            var otherProjectThatChangedNode = graph.FindNodeByPath(otherProjectThatChanged.Path);

            Assert.Collection(affected,
                              k => Assert.Equal(dep1Node, k),
                              k => Assert.Equal(projectThatChangedNode, k),
                              k => Assert.Equal(otherProjectThatChangedNode, k)
                              );
        }
Exemple #4
0
        public void FindNodesThatDependOn_ShouldFindFirstLevelDependency()
        {
            // Arrange
            using var dep1 = CreateProjectFile("dep1");
            using var dep2 = CreateProjectFile("dep2");

            // child depends on dep1 and dep2
            using var child = CreateProjectFile("child", dep1, dep2);
            var graph = new ProjectGraph(child.Path);

            var dep1Node = graph.FindNodeByPath(dep1.Path);

            // Act
            var affected = graph.FindNodesThatDependOn(dep1Node).ToList();

            // Assert
            Assert.Single(affected);
            Assert.Contains(affected, k => k.ProjectInstance.FullPath == child.Path);
        }
        public static IEnumerable <ProjectGraphNode> FindNodesThatDependOn(
            this ProjectGraph graph,
            ProjectGraphNode targetNode)
        {
            var targetNodeIsKnown = false;

            foreach (var currentNode in graph.ProjectNodes)
            {
                // ignore the target node
                if (currentNode == targetNode)
                {
                    targetNodeIsKnown = true;
                    continue;
                }

                foreach (var dependency in currentNode.ProjectReferences)
                {
                    // current project depends on targetNode
                    if (dependency == targetNode)
                    {
                        // if targetNode changes, currentNode will be affected.
                        yield return(currentNode);

                        // since currentNode depends on targetNode,
                        // we also need to check which projects the currentNode depends on
                        // since they could be affected by the changes made on targetNode
                        foreach (var childDep in graph.FindNodesThatDependOn(currentNode))
                        {
                            yield return(childDep);
                        }
                    }
                }
            }

            if (!targetNodeIsKnown)
            {
                throw new InvalidOperationException($"Requested to find {targetNode.ProjectInstance.FullPath} but its not present in known projects");
            }
        }