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);
}