diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 89a4c5dd91..f0f5ae24d5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -73,6 +73,8 @@ + + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModel.cs new file mode 100644 index 0000000000..b2e52d233e --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModel.cs @@ -0,0 +1,46 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using NuGet; + +namespace ICSharpCode.PackageManagement +{ + public class InstalledPackageViewModel : PackageViewModel + { + public InstalledPackageViewModel( + IPackageFromRepository package, + PackageManagementSelectedProjects selectedProjects, + IPackageManagementEvents packageManagementEvents, + IPackageActionRunner actionRunner, + ILogger logger) + : base(package, selectedProjects, packageManagementEvents, actionRunner, logger) + { + } + + public override IList GetProcessPackageActionsForSelectedProjects( + IList selectedProjects) + { + var actions = new List(); + foreach (IPackageManagementSelectedProject selectedProject in selectedProjects) { + ProcessPackageAction action = CreatePackageAction(selectedProject); + actions.Add(action); + } + return actions; + } + + ProcessPackageAction CreatePackageAction(IPackageManagementSelectedProject selectedProject) + { + if (selectedProject.IsSelected) { + return base.CreateInstallPackageAction(selectedProject); + } + return base.CreateUninstallPackageAction(selectedProject); + } + + protected override bool AnyProjectsSelected(IList projects) + { + return true; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModelFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModelFactory.cs new file mode 100644 index 0000000000..4eed43a515 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModelFactory.cs @@ -0,0 +1,25 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.PackageManagement +{ + public class InstalledPackageViewModelFactory : PackageViewModelFactory + { + public InstalledPackageViewModelFactory(IPackageViewModelFactory packageViewModelFactory) + : base(packageViewModelFactory) + { + } + + public override PackageViewModel CreatePackageViewModel(IPackageFromRepository package) + { + return new InstalledPackageViewModel( + package, + SelectedProjects, + PackageManagementEvents, + PackageActionRunner, + Logger); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs index b8831b2200..02aa55bb97 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs @@ -19,7 +19,7 @@ namespace ICSharpCode.PackageManagement IPackageManagementSolution solution, IPackageManagementEvents packageManagementEvents, IRegisteredPackageRepositories registeredPackageRepositories, - IPackageViewModelFactory packageViewModelFactory, + InstalledPackageViewModelFactory packageViewModelFactory, ITaskFactory taskFactory) : base(registeredPackageRepositories, packageViewModelFactory, taskFactory) { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs index 15a949b83a..554390631d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs @@ -334,7 +334,7 @@ namespace ICSharpCode.PackageManagement } } - bool AnyProjectsSelected(IList projects) + protected virtual bool AnyProjectsSelected(IList projects) { return projects.Any(project => project.IsSelected); } @@ -342,17 +342,24 @@ namespace ICSharpCode.PackageManagement void InstallPackagesForSelectedProjects(IList projects) { if (CanInstallPackage(projects)) { - var actions = new List(); - foreach (IPackageManagementSelectedProject selectedProject in projects) { - if (selectedProject.IsSelected) { - ProcessPackageAction action = CreateInstallPackageAction(selectedProject); - actions.Add(action); - } - } + IList actions = GetProcessPackageActionsForSelectedProjects(projects); RunActionsIfAnyExist(actions); } } - + + public virtual IList GetProcessPackageActionsForSelectedProjects( + IList selectedProjects) + { + var actions = new List(); + foreach (IPackageManagementSelectedProject selectedProject in selectedProjects) { + if (selectedProject.IsSelected) { + ProcessPackageAction action = CreateInstallPackageAction(selectedProject); + actions.Add(action); + } + } + return actions; + } + bool CanInstallPackage(IList projects) { IPackageManagementSelectedProject project = projects.FirstOrDefault(); @@ -371,9 +378,9 @@ namespace ICSharpCode.PackageManagement return true; } - ProcessPackageOperationsAction CreateInstallPackageAction(IPackageManagementSelectedProject selectedProject) + protected ProcessPackageAction CreateInstallPackageAction(IPackageManagementSelectedProject selectedProject) { - IPackageManagementProject project = selectedProject.Project; + IPackageManagementProject project = selectedProject.Project; project.Logger = logger; ProcessPackageOperationsAction action = CreateInstallPackageAction(project); @@ -381,7 +388,17 @@ namespace ICSharpCode.PackageManagement return action; } - void RunActionsIfAnyExist(List actions) + protected ProcessPackageAction CreateUninstallPackageAction(IPackageManagementSelectedProject selectedProject) + { + IPackageManagementProject project = selectedProject.Project; + project.Logger = logger; + + ProcessPackageAction action = project.CreateUninstallPackageAction(); + action.Package = package; + return action; + } + + void RunActionsIfAnyExist(IList actions) { if (actions.Any()) { actionRunner.Run(actions); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModels.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModels.cs index c724ffddc5..bb9763b7b2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModels.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModels.cs @@ -15,10 +15,12 @@ namespace ICSharpCode.PackageManagement ITaskFactory taskFactory) { var packageViewModelFactory = new PackageViewModelFactory(solution, packageManagementEvents, actionRunner); + var updatedPackageViewModelFactory = new UpdatedPackageViewModelFactory(packageViewModelFactory); + var installedPackageViewModelFactory = new InstalledPackageViewModelFactory(packageViewModelFactory); AvailablePackagesViewModel = new AvailablePackagesViewModel(registeredPackageRepositories, packageViewModelFactory, taskFactory); - InstalledPackagesViewModel = new InstalledPackagesViewModel(solution, packageManagementEvents, registeredPackageRepositories, packageViewModelFactory, taskFactory); - UpdatedPackagesViewModel = new UpdatedPackagesViewModel(solution, registeredPackageRepositories, packageViewModelFactory, taskFactory); + InstalledPackagesViewModel = new InstalledPackagesViewModel(solution, packageManagementEvents, registeredPackageRepositories, installedPackageViewModelFactory, taskFactory); + UpdatedPackagesViewModel = new UpdatedPackagesViewModel(solution, registeredPackageRepositories, updatedPackageViewModelFactory, taskFactory); RecentPackagesViewModel = new RecentPackagesViewModel(packageManagementEvents, registeredPackageRepositories, packageViewModelFactory, taskFactory); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs index ba7f94e976..68336af790 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs @@ -2,8 +2,6 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.Collections.Generic; -using ICSharpCode.PackageManagement.Scripting; using NuGet; namespace ICSharpCode.PackageManagement diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs index b29748dd8e..408a605894 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs @@ -15,19 +15,6 @@ namespace ICSharpCode.PackageManagement UpdatedPackages updatedPackages; string errorMessage = String.Empty; - public UpdatedPackagesViewModel( - IPackageManagementSolution solution, - IRegisteredPackageRepositories registeredPackageRepositories, - IPackageViewModelFactory packageViewModelFactory, - ITaskFactory taskFactory) - : this( - solution, - registeredPackageRepositories, - new UpdatedPackageViewModelFactory(packageViewModelFactory), - taskFactory) - { - } - public UpdatedPackagesViewModel( IPackageManagementSolution solution, IRegisteredPackageRepositories registeredPackageRepositories, diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index be8ccb9c42..12b7b8baea 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -72,7 +72,9 @@ + + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstalledPackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstalledPackageViewModel.cs new file mode 100644 index 0000000000..d0ee2e2060 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstalledPackageViewModel.cs @@ -0,0 +1,66 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; +using NuGet; + +namespace PackageManagement.Tests.Helpers +{ + public class TestableInstalledPackageViewModel : InstalledPackageViewModel + { + public FakePackageOperationResolver FakePackageOperationResolver = new FakePackageOperationResolver(); + public FakePackageManagementSolution FakeSolution; + public FakePackageManagementEvents FakePackageManagementEvents; + public FakePackage FakePackage; + public FakeLogger FakeLogger; + public ILogger LoggerUsedWhenCreatingPackageResolver; + public FakePackageActionRunner FakeActionRunner; + + public TestableInstalledPackageViewModel() + : this(new FakePackageManagementSolution()) + { + } + + public TestableInstalledPackageViewModel(FakePackageManagementSolution solution) + : this( + new FakePackage(), + new PackageManagementSelectedProjects(solution), + new FakePackageManagementEvents(), + new FakePackageActionRunner(), + new FakeLogger()) + { + this.FakeSolution = solution; + solution.FakeActiveMSBuildProject = ProjectHelper.CreateTestProject("MyProject"); + } + + public TestableInstalledPackageViewModel( + FakePackage package, + PackageManagementSelectedProjects selectedProjects, + FakePackageManagementEvents packageManagementEvents, + FakePackageActionRunner actionRunner, + FakeLogger logger) + : base( + package, + selectedProjects, + packageManagementEvents, + actionRunner, + logger) + { + this.FakePackage = package; + this.FakeActionRunner = actionRunner; + this.FakeLogger = logger; + this.FakePackageManagementEvents = packageManagementEvents; + } + + public PackageViewModelOperationLogger OperationLoggerCreated; + + protected override PackageViewModelOperationLogger CreateLogger(ILogger logger) + { + OperationLoggerCreated = base.CreateLogger(logger); + return OperationLoggerCreated; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackageViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackageViewModelTests.cs new file mode 100644 index 0000000000..927f5a0232 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackageViewModelTests.cs @@ -0,0 +1,197 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.Generic; +using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; +using NuGet; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests +{ + [TestFixture] + public class InstalledPackageViewModelTests + { + TestableInstalledPackageViewModel viewModel; + FakePackageManagementSolution fakeSolution; + List fakeSelectedProjects; + IList packageActions; + FakePackageActionRunner fakeActionRunner; + + void CreateViewModel() + { + viewModel = new TestableInstalledPackageViewModel(); + fakeSolution = viewModel.FakeSolution; + fakeActionRunner = viewModel.FakeActionRunner; + } + + void CreateEmptyFakeSelectedProjectsList() + { + fakeSelectedProjects = new List(); + } + + void CreateOneFakeSelectedProject(string name) + { + CreateEmptyFakeSelectedProjectsList(); + AddFakeSelectedProject(name); + } + + void AddFakeSelectedProject(string name) + { + fakeSelectedProjects.Add(new FakeSelectedProject(name)); + } + + FakeSelectedProject FirstSelectedProject { + get { return fakeSelectedProjects[0] as FakeSelectedProject; } + } + + void GetPackageActionsForSelectedProjects() + { + packageActions = viewModel.GetProcessPackageActionsForSelectedProjects(fakeSelectedProjects); + } + + void AddProjectToSolution() + { + TestableProject project = ProjectHelper.CreateTestProject(); + fakeSolution.FakeMSBuildProjects.Add(project); + } + + void CreateViewModelWithTwoProjectsSelected(string projectName1, string projectName2) + { + CreateViewModel(); + AddProjectToSolution(); + AddProjectToSolution(); + fakeSolution.FakeMSBuildProjects[0].Name = projectName1; + fakeSolution.FakeMSBuildProjects[1].Name = projectName2; + fakeSolution.NoProjectsSelected(); + + fakeSolution.AddFakeProjectToReturnFromGetProject(projectName1); + fakeSolution.AddFakeProjectToReturnFromGetProject(projectName2); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectIsSelected_ReturnsOneAction() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = true; + GetPackageActionsForSelectedProjects(); + + Assert.AreEqual(1, packageActions.Count); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_NoProjects_ReturnsNoActions() + { + CreateViewModel(); + CreateEmptyFakeSelectedProjectsList(); + GetPackageActionsForSelectedProjects(); + + Assert.AreEqual(0, packageActions.Count); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectIsSelected_InstallActionCreatedFromProject() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = true; + GetPackageActionsForSelectedProjects(); + + var action = packageActions[0] as InstallPackageAction; + InstallPackageAction expectedAction = FirstSelectedProject.FakeProject.FakeInstallPackageAction; + + Assert.AreEqual(expectedAction, action); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectWithIsSelectedSetToFalse_UninstallActionCreatedFromProject() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = false; + GetPackageActionsForSelectedProjects(); + + var action = packageActions[0] as UninstallPackageAction; + UninstallPackageAction expectedAction = FirstSelectedProject.FakeProject.FakeUninstallPackageAction; + + Assert.AreEqual(expectedAction, action); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectIsSelected_InstallActionHasViewModelPackage() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = true; + GetPackageActionsForSelectedProjects(); + + var action = packageActions[0] as InstallPackageAction; + IPackage actualPackage = action.Package; + FakePackage expectedPackage = viewModel.FakePackage; + + Assert.AreEqual(expectedPackage, actualPackage); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectWithIsSelectedSetToFalse_UninstallActionHasViewModelPackage() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = false; + GetPackageActionsForSelectedProjects(); + + var action = packageActions[0] as UninstallPackageAction; + IPackage actualPackage = action.Package; + FakePackage expectedPackage = viewModel.FakePackage; + + Assert.AreEqual(expectedPackage, actualPackage); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectIsSelected_ProjectUsesViewModelLogger() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = true; + GetPackageActionsForSelectedProjects(); + + ILogger logger = FirstSelectedProject.Project.Logger; + ILogger expectedLogger = viewModel.OperationLoggerCreated; + + Assert.AreEqual(expectedLogger, logger); + } + + [Test] + public void GetProcessPackageActionsForSelectedProjects_OneProjectWithIsSelectedSetToFalse_ProjectUsesViewModelLogger() + { + CreateViewModel(); + CreateOneFakeSelectedProject("Test"); + FirstSelectedProject.IsSelected = false; + GetPackageActionsForSelectedProjects(); + + ILogger logger = FirstSelectedProject.Project.Logger; + ILogger expectedLogger = viewModel.OperationLoggerCreated; + + Assert.AreEqual(expectedLogger, logger); + } + + [Test] + public void ManagePackage_SolutionWithTwoProjectsAndUserUnselectsBothProjects_TwoProjectsAreUninstalled() + { + CreateViewModelWithTwoProjectsSelected("Project A", "Project B"); + viewModel.FakePackageManagementEvents.OnSelectProjectsReturnValue = true; + viewModel.ManagePackage(); + + List actions = fakeActionRunner.GetActionsRunInOneCallAsList(); + var firstAction = actions[0] as UninstallPackageAction; + var secondAction = actions[1] as UninstallPackageAction; + + Assert.AreEqual(2, actions.Count); + Assert.AreEqual(viewModel.FakePackage, firstAction.Package); + Assert.AreEqual(viewModel.FakePackage, secondAction.Package); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs index 338ac09bef..949d3fdfb5 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs @@ -41,6 +41,7 @@ namespace PackageManagement.Tests { registeredPackageRepositories = new FakeRegisteredPackageRepositories(); var packageViewModelFactory = new FakePackageViewModelFactory(); + var installedPackageViewModelFactory = new InstalledPackageViewModelFactory(packageViewModelFactory); taskFactory = new FakeTaskFactory(); packageManagementEvents = new PackageManagementEvents(); @@ -48,7 +49,7 @@ namespace PackageManagement.Tests solution, packageManagementEvents, registeredPackageRepositories, - packageViewModelFactory, + installedPackageViewModelFactory, taskFactory); } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs index b19e5226c1..24e0a986b5 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs @@ -40,10 +40,11 @@ namespace PackageManagement.Tests taskFactory = new FakeTaskFactory(); registeredPackageRepositories = new FakeRegisteredPackageRepositories(); var packageViewModelFactory = new FakePackageViewModelFactory(); + var updatedPackageViewModelFactory = new UpdatedPackageViewModelFactory(packageViewModelFactory); viewModel = new UpdatedPackagesViewModel( solution, registeredPackageRepositories, - packageViewModelFactory, + updatedPackageViewModelFactory, taskFactory); }