public void ShouldOrderCommonDepsTopologicalBySolution(DependencySortOrder sortMode) { int projectCount = 10; var ws = testData.GetLinearSolution(projectCount); var before = ws.CurrentSolution.Projects.Select(p => p.Id).ToArray(); var sln = testData.AddRandomReferences(ws).CurrentSolution; sln.Projects.Select(p => p.Id).ToArray().Should().Equal(before); var projects = sln.Projects.ToDictionary(k => new FileInfoKey(k.FilePath), v => v); var dependencyOrder = new DependencyOrder(sln, sln.GetProjectDependencyGraph(), projects, sortMode, this.logger); var sorted = dependencyOrder.AllSortedProjectIds; sorted.Should().NotEqual(before); var result = sorted.Select(i => sln.GetProject(i)).ToArray(); var passed = new HashSet <string>(); int references = 0; foreach (var r in result) { var refedProjectNames = r.ProjectReferences.Select(p => sln.GetProject(p.ProjectId)?.Name).ToArray(); foreach (var name in refedProjectNames) { Assert.Contains(name, passed); references++; } passed.Add(r.Name); } }
public DependencyOrder(Solution solution, ProjectDependencyGraph solutionGraph, Dictionary <FileInfoKey, Project> allProjects, DependencySortOrder sortOrder, ILogger logger) { this.solution = solution; this.solutionGraph = solutionGraph; this.sortOrder = sortOrder; if (sortOrder == DependencySortOrder.DateModified) { this.AllSortedProjectIds = this.solution.Projects .OrderBy(p => GetProjectTime(p.FilePath, logger)).Select(p => p.Id) .ToArray(); //this.AllSortedProjectIds = this.solution.Projects // .GroupBy(p => Path.GetDirectoryName(p.FilePath)) // .SelectMany(g => g.Count()>1 ? g.SelectMany(i => (dir) g.AsEnumerable()) // .ToArray()); } else { this.AllSortedProjectIds = this.solutionGraph.GetTopologicallySortedProjects()//.Reverse() .ToArray(); } this.idToProject = allProjects.Values.ToDictionary(p => p.Id, p => p); }