diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs index 5a6069d467..df32498974 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs @@ -69,7 +69,7 @@ namespace ICSharpCode.PackageManagement IPackageRepository ActivePackageRepository { get { return registeredPackageRepositories.ActiveRepository; } } - + public IPackageManagementProject GetActiveProject(IPackageRepository sourceRepository) { MSBuildBasedProject activeProject = GetActiveMSBuildBasedProject(); @@ -152,7 +152,18 @@ namespace ICSharpCode.PackageManagement public IQueryable<IPackage> GetPackages() { ISolutionPackageRepository repository = CreateSolutionPackageRepository(); - return repository.GetPackages(); + List<IPackageManagementProject> projects = GetProjects(ActivePackageRepository).ToList(); + return repository + .GetPackages() + .Where(package => IsPackageInstalledInSolutionOrAnyProject(projects, package)); + } + + bool IsPackageInstalledInSolutionOrAnyProject(IList<IPackageManagementProject> projects, IPackage package) + { + if (projects.Any(project => project.IsPackageInstalled(package))) { + return true; + } + return false; } public string GetInstallPath(IPackage package) diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs index 496975d9dc..6749893d27 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs @@ -12,6 +12,17 @@ namespace PackageManagement.Tests.Helpers { public class FakePackageManagementProjectFactory : IPackageManagementProjectFactory { + public FakePackageManagementProjectFactory() + { + CreatePackageManagementProject = (sourceRepository, project) => { + RepositoriesPassedToCreateProject.Add(sourceRepository); + ProjectsPassedToCreateProject.Add(project); + + var fakeProject = new FakePackageManagementProject(); + FakeProjectsCreated.Add(fakeProject); + return fakeProject; + }; + } public List<FakePackageManagementProject> FakeProjectsCreated = new List<FakePackageManagementProject>(); @@ -30,17 +41,17 @@ namespace PackageManagement.Tests.Helpers get { return ProjectsPassedToCreateProject[0]; } } + public Func<IPackageRepository, MSBuildBasedProject, FakePackageManagementProject> + CreatePackageManagementProject = (sourceRepository, project) => { + return null; + }; + public List<MSBuildBasedProject> ProjectsPassedToCreateProject = new List<MSBuildBasedProject>(); public IPackageManagementProject CreateProject(IPackageRepository sourceRepository, MSBuildBasedProject project) { - RepositoriesPassedToCreateProject.Add(sourceRepository); - ProjectsPassedToCreateProject.Add(project); - - var fakeProject = new FakePackageManagementProject(); - FakeProjectsCreated.Add(fakeProject); - return fakeProject; + return CreatePackageManagementProject(sourceRepository, project); } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs index e3f2420b5d..a8bced1827 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs @@ -452,13 +452,18 @@ namespace PackageManagement.Tests fakeProjectService.CurrentProject = null; FakePackage package = FakePackage.CreatePackageWithVersion("Test", "1.3.4.5"); fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add(package); + TestableProject testProject = AddProjectToOpenProjects("Test"); + var project = new FakePackageManagementProject(); + fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => { + return project; + }; + project.FakePackages.Add(package); IQueryable<IPackage> packages = solution.GetPackages(); var expectedPackages = new FakePackage[] { package }; - PackageCollectionAssert.AreEqual(expectedPackages, packages); } @@ -553,5 +558,44 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedInstallPath, installPath); Assert.AreEqual(package, fakeSolutionPackageRepository.PackagePassedToGetInstallPath); } + + [Test] + public void GetPackages_OnePackageInstalledIntoOneProjectButTwoPackagesInSolutionRepository_ReturnsOnlyPackageInstalled() + { + CreateSolution(); + fakeProjectService.CurrentProject = null; + TestableProject testProject = AddProjectToOpenProjects("Test"); + var project = new FakePackageManagementProject(); + fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => { + return project; + }; + FakePackage notInstalledPackage = FakePackage.CreatePackageWithVersion("NotInstalled", "1.0.0.0"); + fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add(notInstalledPackage); + FakePackage installedPackage = FakePackage.CreatePackageWithVersion("Installed", "1.0.0.0"); + fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add(installedPackage); + project.FakePackages.Add(installedPackage); + + IQueryable<IPackage> packages = solution.GetPackages(); + + var expectedPackages = new FakePackage[] { + installedPackage + }; + } + + [Test] + public void GetPackages_TwoProjectsButNoPackagesInstalled_PackageProjectsCreatedUsingActiveRepository() + { + CreateSolution(); + fakeProjectService.CurrentProject = null; + TestableProject testProject1 = AddProjectToOpenProjects("Test1"); + TestableProject testProject2 = AddProjectToOpenProjects("Test2"); + + IQueryable<IPackage> packages = solution.GetPackages(); + + Assert.AreEqual(testProject1, fakeProjectFactory.ProjectsPassedToCreateProject[0]); + Assert.AreEqual(testProject2, fakeProjectFactory.ProjectsPassedToCreateProject[1]); + Assert.AreEqual(fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject[0]); + Assert.AreEqual(fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject[1]); + } } }