diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs index 1d54b972f9..22e2bc5da8 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs @@ -51,15 +51,25 @@ namespace ICSharpCode.PackageManagement.Cmdlets protected override void ProcessRecord() { ThrowErrorIfProjectNotOpen(); - if (IsPackageIdMissing) { - UpdateAllPackagesInProject(); + if (IsPackageIdMissing()) { + if (HasProjectName()) { + UpdateAllPackagesInProject(); + } else { + UpdateAllPackagesInSolution(); + } } else { UpdatePackageInSingleProject(); } } - bool IsPackageIdMissing { - get { return Id == null; } + bool IsPackageIdMissing() + { + return String.IsNullOrEmpty(Id); + } + + bool HasProjectName() + { + return ProjectName != null; } void UpdateAllPackagesInProject() @@ -74,6 +84,25 @@ namespace ICSharpCode.PackageManagement.Cmdlets return updatePackageActionsFactory.CreateUpdateAllPackagesInProject(project); } + void UpdateAllPackagesInSolution() + { + IUpdatePackageActions actions = CreateUpdateAllPackagesInSolution(); + RunActions(actions); + } + + IUpdatePackageActions CreateUpdateAllPackagesInSolution() + { + IPackageManagementSolution solution = ConsoleHost.Solution; + IPackageRepository repository = GetActivePackageRepository(); + return updatePackageActionsFactory.CreateUpdateAllPackagesInSolution(solution, repository); + } + + IPackageRepository GetActivePackageRepository() + { + PackageSource packageSource = ConsoleHost.GetActivePackageSource(Source); + return ConsoleHost.GetPackageRepository(packageSource); + } + void UpdatePackageInSingleProject() { IPackageManagementProject project = GetProject(); diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs index cdf276245a..b9dc861063 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs @@ -6,6 +6,7 @@ using System.Management.Automation; using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Scripting; +using NuGet; using NUnit.Framework; using PackageManagement.Cmdlets.Tests.Helpers; using PackageManagement.Tests.Helpers; @@ -20,15 +21,19 @@ namespace PackageManagement.Cmdlets.Tests FakePackageManagementProject fakeProject; FakeUpdatePackageActionsFactory fakeUpdateActionsFactory; FakeUpdatePackageActions fakeUpdateAllPackagesInProject; + FakePackageManagementSolution fakeSolution; + FakeUpdatePackageActions fakeUpdateAllPackagesInSolution; void CreateCmdletWithoutActiveProject() { cmdlet = new TestableUpdatePackageCmdlet(); fakeTerminatingError = cmdlet.FakeCmdletTerminatingError; fakeConsoleHost = cmdlet.FakePackageManagementConsoleHost; + fakeSolution = fakeConsoleHost.FakeSolution; fakeProject = fakeConsoleHost.FakeProject; fakeUpdateActionsFactory = cmdlet.FakeUpdatePackageActionsFactory; fakeUpdateAllPackagesInProject = fakeUpdateActionsFactory.FakeUpdateAllPackagesInProject; + fakeUpdateAllPackagesInSolution = fakeUpdateActionsFactory.FakeUpdateAllPackagesInSolution; } FakeUpdatePackageAction UpdatePackageInSingleProjectAction { @@ -48,6 +53,19 @@ namespace PackageManagement.Cmdlets.Tests get { return GetUpdatingAllPackagesInProjectAction(1); } } + FakeUpdatePackageAction FirstUpdateActionWhenUpdatingAllPackagesInSolution { + get { return GetUpdatingAllPackagesInSolutionAction(0); } + } + + FakeUpdatePackageAction GetUpdatingAllPackagesInSolutionAction(int index) + { + return fakeUpdateActionsFactory.FakeUpdateAllPackagesInSolution.FakeActions[index]; + } + + FakeUpdatePackageAction SecondUpdateActionWhenUpdatingAllPackagesInSolution { + get { return GetUpdatingAllPackagesInSolutionAction(1); } + } + void CreateCmdletWithActivePackageSourceAndProject() { CreateCmdletWithoutActiveProject(); @@ -98,6 +116,19 @@ namespace PackageManagement.Cmdlets.Tests fakeUpdateActionsFactory.FakeUpdateAllPackagesInProject.FakeActions.Add(action); } + void CreateTwoUpdateActionsWhenUpdatingAllPackagesInSolution(string packageId1, string packageId2) + { + CreateUpdateActionWhenUpdatingAllPackagesInSolution(packageId1); + CreateUpdateActionWhenUpdatingAllPackagesInSolution(packageId2); + } + + void CreateUpdateActionWhenUpdatingAllPackagesInSolution(string packageId) + { + var action = new FakeUpdatePackageAction(fakeProject); + action.PackageId = packageId; + fakeUpdateActionsFactory.FakeUpdateAllPackagesInSolution.FakeActions.Add(action); + } + [Test] public void ProcessRecord_NoActiveProject_ThrowsNoProjectOpenTerminatingError() { @@ -150,7 +181,7 @@ namespace PackageManagement.Cmdlets.Tests } [Test] - public void ProcessRecord_PackageIdSpecified_UpdatePackageActionIsExecuted() + public void ProcessRecord_PackageIdAndProjectNameSpecified_UpdatePackageActionIsExecuted() { CreateCmdletWithActivePackageSourceAndProject(); SetIdParameter("Test"); @@ -239,7 +270,7 @@ namespace PackageManagement.Cmdlets.Tests } [Test] - public void ProcessRecord_UpdateAllPackagesInProject_CreatesUpdateAllPackagesProject() + public void ProcessRecord_UpdateAllPackagesInProject_CreatesUpdateAllPackagesInProject() { CreateCmdletWithActivePackageSourceAndProject(); SetProjectNameParameter("MyProject"); @@ -250,7 +281,21 @@ namespace PackageManagement.Cmdlets.Tests Assert.AreEqual(fakeProject, project); } - + + [Test] + public void ProcessRecord_UpdateAllPackagesInProjectWhenPackageIdIsEmptyString_CreatesUpdateAllPackagesInProject() + { + CreateCmdletWithActivePackageSourceAndProject(); + SetProjectNameParameter("MyProject"); + SetIdParameter(String.Empty); + RunCmdlet(); + + IPackageManagementProject project = + fakeUpdateActionsFactory.ProjectPassedToCreateUpdateAllPackagesInProject; + + Assert.AreEqual(fakeProject, project); + } + [Test] public void ProcessRecord_UpdateAllPackagesInProject_ProjectNameUsedToCreateProject() { @@ -325,7 +370,7 @@ namespace PackageManagement.Cmdlets.Tests } [Test] - public void ProcessRecord_UpdateAllPackagesInProjectWhenOnePackageInProject_ActionsUsesCmdletAsScriptRunner() + public void ProcessRecord_UpdateAllPackagesInProjectWhenOnePackageInProject_ActionsUseCmdletAsScriptRunner() { CreateCmdletWithActivePackageSourceAndProject(); SetProjectNameParameter("MyProject"); @@ -336,5 +381,110 @@ namespace PackageManagement.Cmdlets.Tests Assert.AreEqual(cmdlet, runner); } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolution_CreatesUpdateAllPackagesSolution() + { + CreateCmdletWithActivePackageSourceAndProject(); + RunCmdlet(); + + IPackageManagementSolution solution = + fakeUpdateActionsFactory.SolutionPassedToCreateUpdateAllPackagesInSolution; + + Assert.AreEqual(fakeSolution, solution); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolutionWhenSourceSpecified_PackageSourceUsedToGetRepository() + { + CreateCmdletWithActivePackageSourceAndProject(); + SetSourceParameter("Test"); + RunCmdlet(); + + PackageSource packageSource = fakeConsoleHost.PackageSourcePassedToGetRepository; + PackageSource expectedPackageSource = fakeConsoleHost.PackageSourceToReturnFromGetActivePackageSource; + + Assert.AreEqual(expectedPackageSource, packageSource); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolutionWhenSourceSpecified_SourceUsedPassedGetActvePackageSourceFromConsoleHost() + { + CreateCmdletWithActivePackageSourceAndProject(); + SetSourceParameter("Test"); + RunCmdlet(); + + string packageSource = fakeConsoleHost.PackageSourcePassedToGetActivePackageSource; + + Assert.AreEqual("Test", packageSource); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolution_RepositoryUsedToCreateUpdateAllPackagesInSolution() + { + CreateCmdletWithActivePackageSourceAndProject(); + RunCmdlet(); + + IPackageRepository repository = fakeUpdateActionsFactory.SourceRepositoryPassedToCreateUpdateAllPackagesInSolution; + IPackageRepository expectedRepository = fakeConsoleHost.FakePackageRepository; + + Assert.AreEqual(expectedRepository, repository); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolutionWhenTwoUpdateActionsReturned_TwoUpdateActionsAreExecuted() + { + CreateCmdletWithActivePackageSourceAndProject(); + CreateTwoUpdateActionsWhenUpdatingAllPackagesInSolution("PackageA", "PackageB"); + RunCmdlet(); + + bool[] executedActions = new bool[] { + FirstUpdateActionWhenUpdatingAllPackagesInSolution.IsExecuted, + SecondUpdateActionWhenUpdatingAllPackagesInSolution.IsExecuted + }; + + bool[] expectedExecutedActions = new bool[] { + true, + true + }; + + CollectionAssert.AreEqual(expectedExecutedActions, executedActions); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolutionAndIgnoreDependenciesIsTrue_ActionDoesNotUpdateDependencies() + { + CreateCmdletWithActivePackageSourceAndProject(); + CreateUpdateActionWhenUpdatingAllPackagesInSolution("PackageA"); + EnableIgnoreDependenciesParameter(); + RunCmdlet(); + + bool update = fakeUpdateAllPackagesInSolution.UpdateDependencies; + + Assert.IsFalse(update); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolutionAndIgnoreDependenciesIsFalse_ActionUpdatesDependencies() + { + CreateCmdletWithActivePackageSourceAndProject(); + CreateUpdateActionWhenUpdatingAllPackagesInSolution("PackageA"); + RunCmdlet(); + + bool update = fakeUpdateAllPackagesInSolution.UpdateDependencies; + + Assert.IsTrue(update); + } + + [Test] + public void ProcessRecord_UpdateAllPackagesInSolution_ActionsUseCmdletAsScriptRunner() + { + CreateCmdletWithActivePackageSourceAndProject(); + RunCmdlet(); + + IPackageScriptRunner runner = fakeUpdateAllPackagesInSolution.PackageScriptRunner; + + Assert.AreEqual(cmdlet, runner); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 1d076f7dfb..bc88582a7f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -318,6 +318,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs index 6b4da6b517..e837bcadc3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs @@ -33,6 +33,10 @@ namespace ICSharpCode.PackageManagement.Design get { return FakeUpdatePackageActionsCreated[0]; } } + public FakeUpdatePackageAction SecondFakeUpdatePackageActionCreated { + get { return FakeUpdatePackageActionsCreated[1]; } + } + public List FakeUpdatePackageActionsCreated = new List(); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementSolution.cs index 1d377e058f..656ea31869 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementSolution.cs @@ -132,5 +132,31 @@ namespace ICSharpCode.PackageManagement.Design FakeProjectsToReturnFromGetProject.Add(name, project); return project; } + + public List FakePackagesInReverseDependencyOrder = + new List(); + + public IEnumerable GetPackagesInReverseDependencyOrder() + { + return FakePackagesInReverseDependencyOrder; + } + + public List FakeProjects = + new List(); + + public IPackageRepository SourceRepositoryPassedToGetProjects; + + public IEnumerable GetProjects(IPackageRepository sourceRepository) + { + SourceRepositoryPassedToGetProjects = sourceRepository; + return FakeProjects; + } + + public FakePackageManagementProject AddFakeProject(string projectName) + { + var project = new FakePackageManagementProject(projectName); + FakeProjects.Add(project); + return project; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementSolution.cs index 6469672624..21c98bce0b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementSolution.cs @@ -17,6 +17,7 @@ namespace ICSharpCode.PackageManagement IPackageManagementProject GetProject(PackageSource source, string projectName); IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName); IPackageManagementProject GetProject(IPackageRepository sourceRepository, IProject project); + IEnumerable GetProjects(IPackageRepository sourceRepository); IProject GetActiveMSBuildProject(); IEnumerable GetMSBuildProjects(); @@ -24,6 +25,7 @@ namespace ICSharpCode.PackageManagement bool IsPackageInstalled(IPackage package); IQueryable GetPackages(); + IEnumerable GetPackagesInReverseDependencyOrder(); bool IsOpen { get; } string FileName { get; } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepository.cs index 99b41d25d3..7bbf76eae6 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ISolutionPackageRepository.cs @@ -13,6 +13,7 @@ namespace ICSharpCode.PackageManagement { string GetInstallPath(IPackage package); IEnumerable GetPackagesByDependencyOrder(); + IEnumerable GetPackagesByReverseDependencyOrder(); IQueryable GetPackages(); bool IsInstalled(IPackage package); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IUpdatePackageActionsFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IUpdatePackageActionsFactory.cs index 4ef9b9d622..490767dff8 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IUpdatePackageActionsFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IUpdatePackageActionsFactory.cs @@ -2,11 +2,16 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using NuGet; namespace ICSharpCode.PackageManagement { public interface IUpdatePackageActionsFactory { IUpdatePackageActions CreateUpdateAllPackagesInProject(IPackageManagementProject project); + + IUpdatePackageActions CreateUpdateAllPackagesInSolution( + IPackageManagementSolution solution, + IPackageRepository sourceRepository); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs index 4f7193c751..656d6fdc75 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs @@ -154,5 +154,18 @@ namespace ICSharpCode.PackageManagement ISolutionPackageRepository repository = CreateSolutionPackageRepository(); return repository.GetPackages(); } + + public IEnumerable GetPackagesInReverseDependencyOrder() + { + ISolutionPackageRepository repository = CreateSolutionPackageRepository(); + return repository.GetPackagesByReverseDependencyOrder(); + } + + public IEnumerable GetProjects(IPackageRepository sourceRepository) + { + foreach (MSBuildBasedProject msbuildProject in GetMSBuildProjects()) { + yield return projectFactory.CreateProject(sourceRepository, msbuildProject); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs index fc7aab6c87..bcff95c424 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs @@ -27,5 +27,7 @@ namespace ICSharpCode.PackageManagement.Scripting IPackageManagementProject GetProject(string packageSource, string projectName); IPackageManagementProject GetProject(IPackageRepository sourceRepository, string projectName); PackageSource GetActivePackageSource(string source); + + IPackageRepository GetPackageRepository(PackageSource packageSource); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs index 1e2127babd..80bf6bde47 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs @@ -250,5 +250,10 @@ namespace ICSharpCode.PackageManagement.Scripting { ScriptingConsole.SendLine(command); } + + public IPackageRepository GetPackageRepository(PackageSource packageSource) + { + return registeredRepositories.CreateRepository(packageSource); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellMissingConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellMissingConsoleHost.cs index b1dd109526..5444614a35 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellMissingConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellMissingConsoleHost.cs @@ -71,5 +71,10 @@ namespace ICSharpCode.PackageManagement.Scripting "The Package Management Console requires Windows PowerShell 2.0.\r\n" + "PowerShell 2.0 can be downloaded from http://support.microsoft.com/kb/968929"; } + + public IPackageRepository GetPackageRepository(PackageSource packageSource) + { + return null; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs index ea47184ce5..9773d016a2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/SolutionPackageRepository.cs @@ -76,6 +76,11 @@ namespace ICSharpCode.PackageManagement return packageSorter.GetPackagesByDependencyOrder(repository); } + public IEnumerable GetPackagesByReverseDependencyOrder() + { + return GetPackagesByDependencyOrder().Reverse(); + } + public bool IsInstalled(IPackage package) { return repository.Exists(package); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdateAllPackagesInSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdateAllPackagesInSolution.cs new file mode 100644 index 0000000000..5e0484306a --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdateAllPackagesInSolution.cs @@ -0,0 +1,65 @@ +// 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 System.Linq; +using ICSharpCode.PackageManagement.Scripting; +using NuGet; + +namespace ICSharpCode.PackageManagement +{ + public class UpdateAllPackagesInSolution : IUpdatePackageActions + { + IPackageManagementSolution solution; + IPackageRepository sourceRepository; + List projects; + + public UpdateAllPackagesInSolution( + IPackageManagementSolution solution, + IPackageRepository sourceRepository) + { + this.solution = solution; + this.sourceRepository = sourceRepository; + } + + public bool UpdateDependencies { get; set; } + public IPackageScriptRunner PackageScriptRunner { get; set; } + + public IEnumerable CreateActions() + { + GetProjects(); + foreach (IPackage package in GetPackages()) { + foreach (IPackageManagementProject project in projects) { + yield return CreateAction(project, package); + } + } + } + + void GetProjects() + { + projects = new List(); + projects.AddRange(solution.GetProjects(sourceRepository)); + } + + IEnumerable GetPackages() + { + return solution.GetPackagesInReverseDependencyOrder(); + } + + UpdatePackageAction CreateAction(IPackageManagementProject project, IPackage package) + { + UpdatePackageAction action = project.CreateUpdatePackageAction(); + SetUpdateActionParameters(action, package); + return action; + } + + void SetUpdateActionParameters(UpdatePackageAction action, IPackage package) + { + action.PackageId = package.Id; + action.PackageScriptRunner = PackageScriptRunner; + action.UpdateIfPackageDoesNotExistInProject = false; + action.UpdateDependencies = UpdateDependencies; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageActionsFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageActionsFactory.cs index 8083ca26ad..cd692ce51e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageActionsFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackageActionsFactory.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using NuGet; namespace ICSharpCode.PackageManagement { @@ -11,5 +12,12 @@ namespace ICSharpCode.PackageManagement { return new UpdateAllPackagesInProject(project); } + + public IUpdatePackageActions CreateUpdateAllPackagesInSolution( + IPackageManagementSolution solution, + IPackageRepository sourceRepository) + { + return new UpdateAllPackagesInSolution(solution, sourceRepository); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index eed2b1d123..09db0465c1 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -246,6 +246,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs index 5d44708695..9be5607810 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs @@ -118,5 +118,16 @@ namespace PackageManagement.Tests.Helpers { CommandsExecuted.Add(command); } + + public FakePackageRepository FakePackageRepository = + new FakePackageRepository(); + + public PackageSource PackageSourcePassedToGetRepository; + + public IPackageRepository GetPackageRepository(PackageSource packageSource) + { + PackageSourcePassedToGetRepository = packageSource; + return FakePackageRepository; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs index 3a81b7955e..496975d9dc 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs @@ -2,6 +2,7 @@ // 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 ICSharpCode.SharpDevelop.Project; @@ -11,15 +12,35 @@ namespace PackageManagement.Tests.Helpers { public class FakePackageManagementProjectFactory : IPackageManagementProjectFactory { - public FakePackageManagementProject FakeProject = new FakePackageManagementProject(); - public IPackageRepository RepositoryPassedToCreateProject; - public MSBuildBasedProject ProjectPassedToCreateProject; + public List FakeProjectsCreated = + new List(); + + public FakePackageManagementProject FirstFakeProjectCreated { + get { return FakeProjectsCreated[0]; } + } + + public IPackageRepository FirstRepositoryPassedToCreateProject { + get { return RepositoriesPassedToCreateProject[0]; } + } + + public List RepositoriesPassedToCreateProject = + new List(); + + public MSBuildBasedProject FirstProjectPassedToCreateProject { + get { return ProjectsPassedToCreateProject[0]; } + } + + public List ProjectsPassedToCreateProject = + new List(); public IPackageManagementProject CreateProject(IPackageRepository sourceRepository, MSBuildBasedProject project) { - RepositoryPassedToCreateProject = sourceRepository; - ProjectPassedToCreateProject = project; - return FakeProject; + RepositoriesPassedToCreateProject.Add(sourceRepository); + ProjectsPassedToCreateProject.Add(project); + + var fakeProject = new FakePackageManagementProject(); + FakeProjectsCreated.Add(fakeProject); + return fakeProject; } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepository.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepository.cs index 03f028e8d0..f4d3595a73 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeSolutionPackageRepository.cs @@ -35,6 +35,13 @@ namespace PackageManagement.Tests.Helpers return FakePackages; } + public List FakePackagesByReverseDependencyOrder = new List(); + + public IEnumerable GetPackagesByReverseDependencyOrder() + { + return FakePackagesByReverseDependencyOrder; + } + public bool IsInstalled(IPackage package) { return FakeSharedRepository.FakePackages.Exists(p => p == package); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeUpdatePackageActionsFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeUpdatePackageActionsFactory.cs index 2a6052eee3..35bbf442d0 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeUpdatePackageActionsFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeUpdatePackageActionsFactory.cs @@ -3,6 +3,7 @@ using System; using ICSharpCode.PackageManagement; +using NuGet; namespace PackageManagement.Tests.Helpers { @@ -10,6 +11,7 @@ namespace PackageManagement.Tests.Helpers { public FakeUpdatePackageActions FakeUpdateAllPackagesInProject = new FakeUpdatePackageActions(); + public IPackageManagementProject ProjectPassedToCreateUpdateAllPackagesInProject; public IUpdatePackageActions CreateUpdateAllPackagesInProject(IPackageManagementProject project) @@ -17,5 +19,20 @@ namespace PackageManagement.Tests.Helpers ProjectPassedToCreateUpdateAllPackagesInProject = project; return FakeUpdateAllPackagesInProject; } + + public FakeUpdatePackageActions FakeUpdateAllPackagesInSolution = + new FakeUpdatePackageActions(); + + public IPackageManagementSolution SolutionPassedToCreateUpdateAllPackagesInSolution; + public IPackageRepository SourceRepositoryPassedToCreateUpdateAllPackagesInSolution; + + public IUpdatePackageActions CreateUpdateAllPackagesInSolution( + IPackageManagementSolution solution, + IPackageRepository sourceRepository) + { + SolutionPassedToCreateUpdateAllPackagesInSolution = solution; + SourceRepositoryPassedToCreateUpdateAllPackagesInSolution = sourceRepository; + return FakeUpdateAllPackagesInSolution; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs index 97c1f0f491..d1f4fcd5d3 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs @@ -65,13 +65,20 @@ namespace PackageManagement.Tests return project; } + FakePackage AddPackageInReverseDependencyOrderToSolution(string packageId) + { + var package = new FakePackage(packageId); + fakeSolutionPackageRepository.FakePackagesByReverseDependencyOrder.Add(package); + return package; + } + [Test] public void GetActiveProject_ProjectIsSelected_CreatesProjectUsingCurrentProjectSelectedInSharpDevelop() { CreateSolution(); IPackageManagementProject activeProject = solution.GetActiveProject(); - IProject actualProject = fakeProjectFactory.ProjectPassedToCreateProject; + IProject actualProject = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(testProject, actualProject); } @@ -83,7 +90,7 @@ namespace PackageManagement.Tests IPackageManagementProject activeProject = solution.GetActiveProject(); - IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject; + IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject; IPackageRepository expectedRepository = fakeRegisteredPackageRepositories.ActiveRepository; Assert.AreEqual(expectedRepository, repository); @@ -95,7 +102,7 @@ namespace PackageManagement.Tests CreateSolution(); IPackageManagementProject activeProject = solution.GetActiveProject(); - IPackageManagementProject expectedProject = fakeProjectFactory.FakeProject; + IPackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated; Assert.AreEqual(expectedProject, activeProject); } @@ -107,7 +114,7 @@ namespace PackageManagement.Tests var expectedRepository = new FakePackageRepository(); solution.GetActiveProject(expectedRepository); - IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject; + IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject; Assert.AreEqual(expectedRepository, repository); } @@ -122,7 +129,7 @@ namespace PackageManagement.Tests solution.GetActiveProject(expectedRepository); - MSBuildBasedProject project = fakeProjectFactory.ProjectPassedToCreateProject; + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(expectedProject, project); } @@ -134,7 +141,7 @@ namespace PackageManagement.Tests var expectedRepository = new FakePackageRepository(); IPackageManagementProject project = solution.GetActiveProject(expectedRepository); - FakePackageManagementProject expectedProject = fakeProjectFactory.FakeProject; + FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated; Assert.AreEqual(expectedProject, project); } @@ -148,7 +155,7 @@ namespace PackageManagement.Tests solution.GetProject(source, "Test"); - MSBuildBasedProject project = fakeProjectFactory.ProjectPassedToCreateProject; + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(expectedProject, project); } @@ -162,7 +169,7 @@ namespace PackageManagement.Tests solution.GetProject(source, "TEST"); - MSBuildBasedProject project = fakeProjectFactory.ProjectPassedToCreateProject; + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(expectedProject, project); } @@ -175,7 +182,7 @@ namespace PackageManagement.Tests var source = new PackageSource("http://sharpdevelop.net"); IPackageManagementProject project = solution.GetProject(source, "Test"); - FakePackageManagementProject expectedProject = fakeProjectFactory.FakeProject; + FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated; Assert.AreEqual(expectedProject, project); } @@ -202,7 +209,7 @@ namespace PackageManagement.Tests solution.GetProject(repository, "Test"); - MSBuildBasedProject project = fakeProjectFactory.ProjectPassedToCreateProject; + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(expectedProject, project); } @@ -216,7 +223,7 @@ namespace PackageManagement.Tests solution.GetProject(repository, expectedProject); - MSBuildBasedProject project = fakeProjectFactory.ProjectPassedToCreateProject; + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(expectedProject, project); } @@ -230,7 +237,7 @@ namespace PackageManagement.Tests IPackageManagementProject project = solution.GetProject(repository, msbuildProject); - FakePackageManagementProject expectedProject = fakeProjectFactory.FakeProject; + FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated; Assert.AreEqual(expectedProject, project); } @@ -244,7 +251,7 @@ namespace PackageManagement.Tests solution.GetProject(expectedRepository, expectedProject); - IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject; + IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject; Assert.AreEqual(expectedRepository, repository); } @@ -258,7 +265,7 @@ namespace PackageManagement.Tests solution.GetProject(repository, "TEST"); - MSBuildBasedProject project = fakeProjectFactory.ProjectPassedToCreateProject; + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(expectedProject, project); } @@ -272,7 +279,7 @@ namespace PackageManagement.Tests IPackageManagementProject project = solution.GetProject(repository, "Test"); - FakePackageManagementProject expectedProject = fakeProjectFactory.FakeProject; + FakePackageManagementProject expectedProject = fakeProjectFactory.FirstFakeProjectCreated; Assert.AreEqual(expectedProject, project); } @@ -286,7 +293,7 @@ namespace PackageManagement.Tests solution.GetProject(expectedRepository, "Test"); - IPackageRepository actualRepository = fakeProjectFactory.RepositoryPassedToCreateProject; + IPackageRepository actualRepository = fakeProjectFactory.FirstRepositoryPassedToCreateProject; Assert.AreEqual(expectedRepository, actualRepository); } @@ -454,5 +461,83 @@ namespace PackageManagement.Tests PackageCollectionAssert.AreEqual(expectedPackages, packages); } + + [Test] + public void GetPackagesInReverseDependencyOrder_TwoPackages_ReturnsPackagesFromSolutionLocalRepositoryInCorrectOrder() + { + CreateSolution(); + FakePackage packageA = AddPackageInReverseDependencyOrderToSolution("A"); + FakePackage packageB = AddPackageInReverseDependencyOrderToSolution("A"); + + packageB.DependenciesList.Add(new PackageDependency("A")); + + var expectedPackages = new FakePackage[] { + packageB, + packageA + }; + + IEnumerable packages = solution.GetPackagesInReverseDependencyOrder(); + + PackageCollectionAssert.AreEqual(expectedPackages, packages); + } + + [Test] + public void GetProjects_SolutionHasOneProject_ReturnsOneProject() + { + CreateSolution(); + AddProjectToOpenProjects("MyProject"); + var repository = new FakePackageRepository(); + List projects = solution.GetProjects(repository).ToList(); + + Assert.AreEqual(1, projects.Count); + } + + [Test] + public void GetProjects_SolutionHasOneProject_RepositoryUsedToCreateProject() + { + CreateSolution(); + AddProjectToOpenProjects("MyProject"); + var expectedRepository = new FakePackageRepository(); + List projects = solution.GetProjects(expectedRepository).ToList(); + + IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject; + + Assert.AreEqual(expectedRepository, repository); + } + + [Test] + public void GetProjects_SolutionHasOneProject_MSBuildProjectUsedToCreateProject() + { + CreateSolution(); + TestableProject expectedProject = AddProjectToOpenProjects("MyProject"); + var repository = new FakePackageRepository(); + List projects = solution.GetProjects(repository).ToList(); + + MSBuildBasedProject project = fakeProjectFactory.FirstProjectPassedToCreateProject; + + Assert.AreEqual(expectedProject, project); + } + + [Test] + public void GetProjects_SolutionHasNoProjects_ReturnsNoProjects() + { + CreateSolution(); + var repository = new FakePackageRepository(); + List projects = solution.GetProjects(repository).ToList(); + + Assert.AreEqual(0, projects.Count); + } + + [Test] + public void GetProjects_SolutionHasTwoProjects_ReturnsTwoProjects() + { + CreateSolution(); + AddProjectToOpenProjects("One"); + AddProjectToOpenProjects("Two"); + var repository = new FakePackageRepository(); + List projects = solution.GetProjects(repository).ToList(); + + Assert.AreEqual(2, projects.Count); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs index 8ab8914e65..f706e9dc30 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs @@ -66,7 +66,7 @@ namespace PackageManagement.Tests InstallPackages(); MSBuildBasedProject projectUsedToCreatePackageManagementProject - = fakeProjectFactory.ProjectPassedToCreateProject; + = fakeProjectFactory.FirstProjectPassedToCreateProject; Assert.AreEqual(project, projectUsedToCreatePackageManagementProject); } @@ -78,7 +78,7 @@ namespace PackageManagement.Tests AddPackageReference("PackageId", "1.3.4.5"); InstallPackages(); - IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject; + IPackageRepository repository = fakeProjectFactory.FirstRepositoryPassedToCreateProject; IPackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository; Assert.AreEqual(expectedRepository, repository); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs index 24b933d210..20d14baffc 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs @@ -623,5 +623,29 @@ namespace PackageManagement.Tests.Scripting Assert.AreEqual(expectedText, text); } + + [Test] + public void GetPackageRepository_PackageSourceSpecified_ReturnsPackageRepositoryFromRegisteredRepositories() + { + CreateHost(); + + var packageSource = new PackageSource("Test"); + IPackageRepository repository = host.GetPackageRepository(packageSource); + FakePackageRepository expectedRepository = fakeRegisteredPackageRepositories.FakePackageRepository; + + Assert.AreEqual(expectedRepository, repository); + } + + [Test] + public void GetPackageRepository_PackageSourceSpecified_PackagSourceUsedToGetRepository() + { + CreateHost(); + + var expectedPackageSource = new PackageSource("Test"); + IPackageRepository repository = host.GetPackageRepository(expectedPackageSource); + PackageSource packageSource = fakeRegisteredPackageRepositories.PackageSourcePassedToCreateRepository; + + Assert.AreEqual(expectedPackageSource, packageSource); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs index 9f56d77438..b4707a48b6 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SolutionPackageRepositoryTests.cs @@ -150,6 +150,25 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedPackages, actualPackages); } + [Test] + public void GetPackagesByReverseDependencyOrder_TwoPackagesInSharedRepositorySecondPackageDependsOnFirst_ReturnsSecondPackageFirst() + { + CreateSolution(@"d:\projects\myproject\myproject.sln"); + CreateRepository(solution); + FakePackage firstPackage = AddPackageToSharedRepository("First"); + FakePackage secondPackage = AddPackageToSharedRepository("Second"); + secondPackage.AddDependency("First"); + + List actualPackages = repository.GetPackagesByReverseDependencyOrder().ToList(); + + var expectedPackages = new IPackage[] { + secondPackage, + firstPackage + }; + + Assert.AreEqual(expectedPackages, actualPackages); + } + [Test] public void IsInstalled_PackageIsInSharedRepository_ReturnsTrue() { diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdateAllPackagesInSolutionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdateAllPackagesInSolutionTests.cs new file mode 100644 index 0000000000..e579925fdf --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdateAllPackagesInSolutionTests.cs @@ -0,0 +1,223 @@ +// 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 System.Linq; +using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; +using ICSharpCode.PackageManagement.Scripting; +using NuGet; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests +{ + [TestFixture] + public class UpdateAllPackagesInSolutionTests + { + UpdateAllPackagesInSolution updateAllPackagesInSolution; + FakePackageManagementSolution fakeSolution; + List updateActions; + FakePackageRepository fakeSourceRepository; + + void CreateUpdateAllPackagesInSolution() + { + fakeSolution = new FakePackageManagementSolution(); + fakeSourceRepository = new FakePackageRepository(); + updateAllPackagesInSolution = new UpdateAllPackagesInSolution(fakeSolution, fakeSourceRepository); + } + + void AddPackageToSolution(string packageId) + { + var package = new FakePackage(packageId, "1.0"); + fakeSolution.FakePackagesInReverseDependencyOrder.Add(package); + } + + FakePackageManagementProject AddProjectToSolution(string projectName) + { + return fakeSolution.AddFakeProject(projectName); + } + + void CallCreateActions() + { + IEnumerable actions = updateAllPackagesInSolution.CreateActions(); + updateActions = actions.ToList(); + } + + UpdatePackageAction FirstUpdateAction { + get { return updateActions[0]; } + } + + FakePackageManagementProject FirstProjectInSolution { + get { return fakeSolution.FakeProjects[0]; } + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProject_ReturnsOneAction() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + CallCreateActions(); + + Assert.AreEqual(1, updateActions.Count); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProject_UpdateActionCreatedFromProject() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + CallCreateActions(); + + UpdatePackageAction action = FirstUpdateAction; + UpdatePackageAction expectedAction = FirstProjectInSolution.FirstFakeUpdatePackageActionCreated; + + Assert.AreEqual(expectedAction, action); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProject_UpdateActionCreatedUsingSourceRepositoryPassedInConstructor() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + CallCreateActions(); + + IPackageRepository repository = fakeSolution.SourceRepositoryPassedToGetProjects; + FakePackageRepository expectedRepository = fakeSourceRepository; + + Assert.AreEqual(expectedRepository, repository); + } + + [Test] + public void CreateActions_NoPackagesInSolution_NoActionsReturned() + { + CreateUpdateAllPackagesInSolution(); + CallCreateActions(); + + Assert.AreEqual(0, updateActions.Count); + } + + [Test] + public void CreateActions_TwoPackagesInSolutionWithOneProject_ReturnsTwoActions() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test1"); + AddPackageToSolution("Test2"); + CallCreateActions(); + + Assert.AreEqual(2, updateActions.Count); + } + + [Test] + public void CreateActions_TwoPackagesInSolutionWithOneProject_ReturnsTwoActionsWithPackageIdsForTwoPackages() + { + CreateUpdateAllPackagesInSolution(); + FakePackageManagementProject project = AddProjectToSolution("MyProject"); + AddPackageToSolution("Test1"); + AddPackageToSolution("Test2"); + CallCreateActions(); + + string[] packageIds = new string[] { + project.FirstFakeUpdatePackageActionCreated.PackageId, + project.SecondFakeUpdatePackageActionCreated.PackageId + }; + + string [] expectedPackageIds = new string[] { + "Test1", + "Test2" + }; + + Assert.AreEqual(expectedPackageIds, packageIds); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithTwoProjects_ReturnsTwoActions() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject1"); + AddProjectToSolution("MyProject2"); + AddPackageToSolution("Test"); + CallCreateActions(); + + Assert.AreEqual(2, updateActions.Count); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithTwoProjects_ReturnsTwoActionsCreatedFromProjects() + { + CreateUpdateAllPackagesInSolution(); + FakePackageManagementProject project1 = AddProjectToSolution("MyProject1"); + FakePackageManagementProject project2 = AddProjectToSolution("MyProject2"); + AddPackageToSolution("Test"); + CallCreateActions(); + + var expectedActions = new UpdatePackageAction[] { + project1.FirstFakeUpdatePackageActionCreated, + project2.FirstFakeUpdatePackageActionCreated + }; + + Assert.AreEqual(expectedActions, updateActions); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProjectAndScriptRunnerIsSet_UpdateActionUsesSameScriptRunner() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + var expectedRunner = new FakePackageScriptRunner(); + updateAllPackagesInSolution.PackageScriptRunner = expectedRunner; + CallCreateActions(); + + IPackageScriptRunner runner = FirstUpdateAction.PackageScriptRunner; + + Assert.AreEqual(expectedRunner, runner); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProject_UpdateActionDoesNotUpdatePackageIfProjectDoesNotHavePackage() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + CallCreateActions(); + + bool updateIfPackageDoesNotExist = FirstUpdateAction.UpdateIfPackageDoesNotExistInProject; + + Assert.IsFalse(updateIfPackageDoesNotExist); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProjectAndUpdateDependenciesIsFalse_UpdateActionDoesNotUpdateDependencies() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + updateAllPackagesInSolution.UpdateDependencies = false; + CallCreateActions(); + + bool updateDependencies = FirstUpdateAction.UpdateDependencies; + + Assert.IsFalse(updateDependencies); + } + + [Test] + public void CreateActions_OnePackageInSolutionWithOneProjectAndUpdateDependenciesIsTrue_UpdateActionDoesUpdateDependencies() + { + CreateUpdateAllPackagesInSolution(); + AddProjectToSolution("MyProject"); + AddPackageToSolution("Test"); + updateAllPackagesInSolution.UpdateDependencies = true; + CallCreateActions(); + + bool updateDependencies = FirstUpdateAction.UpdateDependencies; + + Assert.IsTrue(updateDependencies); + } + } +}