Browse Source

Installed tab now supports uninstalling NuGet packages by unchecking the project in the Select Projects dialog.

pull/16/merge
Matt Ward 15 years ago
parent
commit
c32cb0b018
  1. 2
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 46
      src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModel.cs
  3. 25
      src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModelFactory.cs
  4. 2
      src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs
  5. 41
      src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs
  6. 6
      src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModels.cs
  7. 2
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs
  8. 13
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs
  9. 2
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  10. 66
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstalledPackageViewModel.cs
  11. 197
      src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackageViewModelTests.cs
  12. 3
      src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs
  13. 3
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs

2
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -73,6 +73,8 @@ @@ -73,6 +73,8 @@
<Compile Include="Src\Design\DesignTimeSelectProjectsViewModel.cs" />
<Compile Include="Src\Design\FakePackageOperation.cs" />
<Compile Include="Src\Design\FakeSelectedProject.cs" />
<Compile Include="Src\InstalledPackageViewModel.cs" />
<Compile Include="Src\InstalledPackageViewModelFactory.cs" />
<Compile Include="Src\IPackageManagementSelectedProject.cs" />
<Compile Include="Src\ISelectProjectsService.cs" />
<Compile Include="Src\ISolutionPackageRepository.cs" />

46
src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModel.cs

@ -0,0 +1,46 @@ @@ -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<ProcessPackageAction> GetProcessPackageActionsForSelectedProjects(
IList<IPackageManagementSelectedProject> selectedProjects)
{
var actions = new List<ProcessPackageAction>();
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<IPackageManagementSelectedProject> projects)
{
return true;
}
}
}

25
src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackageViewModelFactory.cs

@ -0,0 +1,25 @@ @@ -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);
}
}
}

2
src/AddIns/Misc/PackageManagement/Project/Src/InstalledPackagesViewModel.cs

@ -19,7 +19,7 @@ namespace ICSharpCode.PackageManagement @@ -19,7 +19,7 @@ namespace ICSharpCode.PackageManagement
IPackageManagementSolution solution,
IPackageManagementEvents packageManagementEvents,
IRegisteredPackageRepositories registeredPackageRepositories,
IPackageViewModelFactory packageViewModelFactory,
InstalledPackageViewModelFactory packageViewModelFactory,
ITaskFactory taskFactory)
: base(registeredPackageRepositories, packageViewModelFactory, taskFactory)
{

41
src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs

@ -334,7 +334,7 @@ namespace ICSharpCode.PackageManagement @@ -334,7 +334,7 @@ namespace ICSharpCode.PackageManagement
}
}
bool AnyProjectsSelected(IList<IPackageManagementSelectedProject> projects)
protected virtual bool AnyProjectsSelected(IList<IPackageManagementSelectedProject> projects)
{
return projects.Any(project => project.IsSelected);
}
@ -342,17 +342,24 @@ namespace ICSharpCode.PackageManagement @@ -342,17 +342,24 @@ namespace ICSharpCode.PackageManagement
void InstallPackagesForSelectedProjects(IList<IPackageManagementSelectedProject> projects)
{
if (CanInstallPackage(projects)) {
var actions = new List<ProcessPackageAction>();
foreach (IPackageManagementSelectedProject selectedProject in projects) {
if (selectedProject.IsSelected) {
ProcessPackageAction action = CreateInstallPackageAction(selectedProject);
actions.Add(action);
}
}
IList<ProcessPackageAction> actions = GetProcessPackageActionsForSelectedProjects(projects);
RunActionsIfAnyExist(actions);
}
}
public virtual IList<ProcessPackageAction> GetProcessPackageActionsForSelectedProjects(
IList<IPackageManagementSelectedProject> selectedProjects)
{
var actions = new List<ProcessPackageAction>();
foreach (IPackageManagementSelectedProject selectedProject in selectedProjects) {
if (selectedProject.IsSelected) {
ProcessPackageAction action = CreateInstallPackageAction(selectedProject);
actions.Add(action);
}
}
return actions;
}
bool CanInstallPackage(IList<IPackageManagementSelectedProject> projects)
{
IPackageManagementSelectedProject project = projects.FirstOrDefault();
@ -371,9 +378,9 @@ namespace ICSharpCode.PackageManagement @@ -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 @@ -381,7 +388,17 @@ namespace ICSharpCode.PackageManagement
return action;
}
void RunActionsIfAnyExist(List<ProcessPackageAction> 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<ProcessPackageAction> actions)
{
if (actions.Any()) {
actionRunner.Run(actions);

6
src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModels.cs

@ -15,10 +15,12 @@ namespace ICSharpCode.PackageManagement @@ -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);
}

2
src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs

@ -2,8 +2,6 @@ @@ -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

13
src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs

@ -15,19 +15,6 @@ namespace ICSharpCode.PackageManagement @@ -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,

2
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -72,7 +72,9 @@ @@ -72,7 +72,9 @@
<Compile Include="Src\Helpers\FakeSelectProjectsService.cs" />
<Compile Include="Src\Helpers\FakeSolutionPackageRepositoryFactory.cs" />
<Compile Include="Src\Helpers\SelectedProjectCollectionAssert.cs" />
<Compile Include="Src\Helpers\TestableInstalledPackageViewModel.cs" />
<Compile Include="Src\Helpers\TestablePackageFromRepository.cs" />
<Compile Include="Src\InstalledPackageViewModelTests.cs" />
<Compile Include="Src\ManagePackagesCommandTests.cs" />
<Compile Include="Src\ConsolePackageActionRunnerTests.cs" />
<Compile Include="Src\DefaultProjectTemplatePackageSourceTests.cs" />

66
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableInstalledPackageViewModel.cs

@ -0,0 +1,66 @@ @@ -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;
}
}
}

197
src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackageViewModelTests.cs

@ -0,0 +1,197 @@ @@ -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<IPackageManagementSelectedProject> fakeSelectedProjects;
IList<ProcessPackageAction> packageActions;
FakePackageActionRunner fakeActionRunner;
void CreateViewModel()
{
viewModel = new TestableInstalledPackageViewModel();
fakeSolution = viewModel.FakeSolution;
fakeActionRunner = viewModel.FakeActionRunner;
}
void CreateEmptyFakeSelectedProjectsList()
{
fakeSelectedProjects = new List<IPackageManagementSelectedProject>();
}
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<ProcessPackageAction> 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);
}
}
}

3
src/AddIns/Misc/PackageManagement/Test/Src/InstalledPackagesViewModelTests.cs

@ -41,6 +41,7 @@ namespace PackageManagement.Tests @@ -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 @@ -48,7 +49,7 @@ namespace PackageManagement.Tests
solution,
packageManagementEvents,
registeredPackageRepositories,
packageViewModelFactory,
installedPackageViewModelFactory,
taskFactory);
}

3
src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs

@ -40,10 +40,11 @@ namespace PackageManagement.Tests @@ -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);
}

Loading…
Cancel
Save