From fe39e572dcbb18902039961979276e7474c649d7 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 15 May 2011 14:53:09 +0100 Subject: [PATCH] Add Invoke-InitializePackages cmdlet to run package init.ps1 PowerShell scripts. --- .../Project/PackageManagement.Cmdlets.csproj | 1 + .../Src/InvokeInitializePackagesCmdlet.cs | 56 +++++++++++ .../TestableInvokeInitializePackagesCmdlet.cs | 51 ++++++++++ .../PackageManagement.Cmdlets.Tests.csproj | 2 + .../InvokeInitializePackagesCmdletTests.cs | 93 +++++++++++++++++++ .../Project/Src/PackageManagementServices.cs | 3 +- .../IPackageInitializationScripts.cs | 1 + .../IPackageInitializationScriptsFactory.cs | 4 +- .../PackageInitializationScriptsFactory.cs | 8 +- ...alizationScriptsRunnerForOpenedSolution.cs | 23 ++++- ...ePackageInitializationScriptsInSolution.cs | 7 ++ ...eInitializationScriptsInSolutionFactory.cs | 6 +- .../FakePackageManagementConsoleHost.cs | 6 +- ...tionScriptsRunnerForOpenedSolutionTests.cs | 21 ++++- 14 files changed, 265 insertions(+), 17 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeInitializePackagesCmdlet.cs create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj index 45e720d59c..11bd3d4e7d 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj @@ -48,6 +48,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs new file mode 100644 index 0000000000..34a262defe --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs @@ -0,0 +1,56 @@ +// 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.Management.Automation; +using ICSharpCode.PackageManagement.Scripting; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.PackageManagement.Cmdlets +{ + [Cmdlet(VerbsLifecycle.Invoke, "InitializePackages", DefaultParameterSetName = ParameterAttribute.AllParameterSets)] + public class InvokeInitializePackagesCmdlet : PackageManagementCmdlet + { + IPackageManagementProjectService projectService; + IPackageInitializationScriptsFactory scriptsFactory; + + public InvokeInitializePackagesCmdlet() + : this( + PackageManagementServices.ProjectService, + new PackageInitializationScriptsFactory(PackageManagementServices.ConsoleHost), + PackageManagementServices.ConsoleHost, + null) + { + } + + public InvokeInitializePackagesCmdlet( + IPackageManagementProjectService projectService, + IPackageInitializationScriptsFactory scriptsFactory, + IPackageManagementConsoleHost consoleHost, + ICmdletTerminatingError terminatingError) + : base(consoleHost, terminatingError) + { + this.projectService = projectService; + this.scriptsFactory = scriptsFactory; + } + + protected override void ProcessRecord() + { + RunPackageInitializationScripts(); + } + + void RunPackageInitializationScripts() + { + IPackageInitializationScripts scripts = GetPackageInitializationScripts(); + if (scripts.Any()) { + scripts.Run(); + } + } + + IPackageInitializationScripts GetPackageInitializationScripts() + { + Solution solution = projectService.OpenSolution; + return scriptsFactory.CreatePackageInitializationScripts(solution, this); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeInitializePackagesCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeInitializePackagesCmdlet.cs new file mode 100644 index 0000000000..c6f03ed1e5 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeInitializePackagesCmdlet.cs @@ -0,0 +1,51 @@ +// 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 ICSharpCode.PackageManagement.Cmdlets; +using ICSharpCode.PackageManagement.Design; +using ICSharpCode.SharpDevelop.Project; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Cmdlets.Tests.Helpers +{ + public class TestableInvokeInitializePackagesCmdlet : InvokeInitializePackagesCmdlet + { + public FakeCmdletTerminatingError FakeCmdletTerminatingError; + public FakePackageManagementConsoleHost FakePackageManagementConsoleHost; + public FakePackageManagementProjectService FakeProjectService; + public FakePackageInitializationScriptsFactory FakeScriptsFactory; + public Solution Solution; + + public TestableInvokeInitializePackagesCmdlet() + : this( + new FakePackageManagementProjectService(), + new FakePackageInitializationScriptsFactory(), + new FakePackageManagementConsoleHost(), + new FakeCmdletTerminatingError()) + { + } + + public TestableInvokeInitializePackagesCmdlet( + FakePackageManagementProjectService projectService, + FakePackageInitializationScriptsFactory scriptsFactory, + FakePackageManagementConsoleHost consoleHost, + FakeCmdletTerminatingError cmdletTerminatingError) + : base(projectService, scriptsFactory, consoleHost, cmdletTerminatingError) + { + this.FakeProjectService = projectService; + this.FakeScriptsFactory = scriptsFactory; + this.FakePackageManagementConsoleHost = consoleHost; + this.FakeCmdletTerminatingError = cmdletTerminatingError; + + Solution = new Solution(); + Solution.FileName = @"d:\projects\MyProject\MyProject.sln"; + projectService.OpenSolution = Solution; + } + + public void CallProcessRecord() + { + base.ProcessRecord(); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj index e66a81a3ec..94f7b7c740 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj @@ -49,12 +49,14 @@ + + diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs new file mode 100644 index 0000000000..850318337f --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs @@ -0,0 +1,93 @@ +// 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 ICSharpCode.PackageManagement.Design; +using ICSharpCode.PackageManagement.Scripting; +using ICSharpCode.SharpDevelop.Project; +using NUnit.Framework; +using PackageManagement.Cmdlets.Tests.Helpers; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Cmdlets.Tests +{ + [TestFixture] + public class InvokeInitializePackagesCmdletTests + { + TestableInvokeInitializePackagesCmdlet cmdlet; + FakeCmdletTerminatingError fakeTerminatingError; + FakePackageManagementProjectService fakeProjectService; + FakePackageInitializationScriptsFactory scriptsFactory; + + void CreateCmdlet() + { + cmdlet = new TestableInvokeInitializePackagesCmdlet(); + fakeProjectService = cmdlet.FakeProjectService; + fakeTerminatingError = cmdlet.FakeCmdletTerminatingError; + scriptsFactory = cmdlet.FakeScriptsFactory; + } + + void RunCmdlet() + { + cmdlet.CallProcessRecord(); + } + + void SolutionHasPackageInitializationScripts() + { + scriptsFactory.FakePackageInitializationScripts.AnyReturnValue = true; + } + + void SolutionHasNoPackageInitializationScripts() + { + scriptsFactory.FakePackageInitializationScripts.AnyReturnValue = false; + } + + [Test] + public void ProcessRecord_SolutionHasPackageInitializationScripts_PackageInitializationScriptsAreRun() + { + CreateCmdlet(); + SolutionHasPackageInitializationScripts(); + RunCmdlet(); + + bool run = scriptsFactory.FakePackageInitializationScripts.IsRunCalled; + + Assert.IsTrue(run); + } + + [Test] + public void ProcessRecord_SolutionHasNoPackageInitializationScripts_PackageInitializationScriptsAreNotRun() + { + CreateCmdlet(); + SolutionHasNoPackageInitializationScripts(); + RunCmdlet(); + + bool run = scriptsFactory.FakePackageInitializationScripts.IsRunCalled; + + Assert.IsFalse(run); + } + + [Test] + public void ProcessRecord_SolutionIsOpen_SolutionUsedToCreatePackageInitializationScripts() + { + CreateCmdlet(); + RunCmdlet(); + + Solution expectedSolution = fakeProjectService.OpenSolution; + Solution actualSolution = scriptsFactory.SolutionPassedToCreatePackageInitializationScripts; + + Assert.AreEqual(expectedSolution, actualSolution); + } + + [Test] + public void ProcessRecord_SolutionHasPackageInitializationScripts_PackageScriptSessionIsCmdlet() + { + CreateCmdlet(); + SolutionHasPackageInitializationScripts(); + RunCmdlet(); + + IPackageScriptSession session = scriptsFactory.ScriptSessionPassedToCreatePackageInitializationScripts; + + Assert.AreEqual(cmdlet, session); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs index a24b66015d..705c91b400 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs @@ -26,7 +26,8 @@ namespace ICSharpCode.PackageManagement solution = new PackageManagementSolution(registeredPackageRepositories, packageManagementEvents); consoleHost = new PackageManagementConsoleHost(solution, registeredPackageRepositories); projectBrowserRefresher = new ProjectBrowserRefresher(projectService, packageManagementEvents); - packageInitializationScriptsRunner = new PackageInitializationScriptsRunnerForOpenedSolution(projectService); + packageInitializationScriptsRunner = + new PackageInitializationScriptsRunnerForOpenedSolution(projectService, consoleHost); } public static PackageManagementOptions Options { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScripts.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScripts.cs index d40422a1cb..7eeaea96a4 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScripts.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScripts.cs @@ -7,6 +7,7 @@ namespace ICSharpCode.PackageManagement.Scripting { public interface IPackageInitializationScripts { + bool Any(); void Run(); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs index 31098f4e8a..f0e1acb5d9 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageInitializationScriptsFactory.cs @@ -8,6 +8,8 @@ namespace ICSharpCode.PackageManagement.Scripting { public interface IPackageInitializationScriptsFactory { - IPackageInitializationScripts CreatePackageInitializationScripts(Solution solution); + IPackageInitializationScripts CreatePackageInitializationScripts( + Solution solution, + IPackageScriptSession scriptSession); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsFactory.cs index 9c939489f5..111f593e9e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsFactory.cs @@ -20,12 +20,12 @@ namespace ICSharpCode.PackageManagement.Scripting this.consoleHost = consoleHost; } - public IPackageInitializationScripts CreatePackageInitializationScripts(Solution solution) + public IPackageInitializationScripts CreatePackageInitializationScripts( + Solution solution, + IPackageScriptSession scriptSession) { - IPowerShellHost powerShellHost = consoleHost.PowerShellHost; - var session = new PowerShellPackageScriptSession(powerShellHost, consoleHost.ScriptingConsole); var repository = new SolutionPackageRepository(solution); - var scriptFactory = new PackageScriptFactory(session); + var scriptFactory = new PackageScriptFactory(scriptSession); return new PackageInitializationScripts(repository, scriptFactory); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolution.cs index 73bd0a8831..3fbda526c6 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolution.cs @@ -9,17 +9,22 @@ namespace ICSharpCode.PackageManagement.Scripting public class PackageInitializationScriptsRunnerForOpenedSolution { IPackageInitializationScriptsFactory scriptsFactory; + IPackageManagementConsoleHost consoleHost; - public PackageInitializationScriptsRunnerForOpenedSolution(IPackageManagementProjectService projectService) - : this(projectService, new PackageInitializationScriptsFactory()) + public PackageInitializationScriptsRunnerForOpenedSolution( + IPackageManagementProjectService projectService, + IPackageManagementConsoleHost consoleHost) + : this(projectService, consoleHost, new PackageInitializationScriptsFactory()) { } public PackageInitializationScriptsRunnerForOpenedSolution( IPackageManagementProjectService projectService, + IPackageManagementConsoleHost consoleHost, IPackageInitializationScriptsFactory scriptsFactory) { projectService.SolutionLoaded += SolutionLoaded; + this.consoleHost = consoleHost; this.scriptsFactory = scriptsFactory; } @@ -30,8 +35,20 @@ namespace ICSharpCode.PackageManagement.Scripting void RunScripts(Solution solution) { - IPackageInitializationScripts scripts = scriptsFactory.CreatePackageInitializationScripts(solution); + IPackageInitializationScripts scripts = CreatePackageInitializationScripts(solution); scripts.Run(); } + + IPackageInitializationScripts CreatePackageInitializationScripts(Solution solution) + { + PowerShellPackageScriptSession session = CreateScriptSession(); + return scriptsFactory.CreatePackageInitializationScripts(solution, session); + } + + PowerShellPackageScriptSession CreateScriptSession() + { + IPowerShellHost powerShellHost = consoleHost.PowerShellHost; + return new PowerShellPackageScriptSession(powerShellHost, consoleHost.ScriptingConsole); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolution.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolution.cs index 70653db46e..4324904864 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolution.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolution.cs @@ -14,5 +14,12 @@ namespace PackageManagement.Tests.Helpers { IsRunCalled = true; } + + public bool AnyReturnValue = true; + + public bool Any() + { + return AnyReturnValue; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs index e0f51df81b..c0d151b97b 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageInitializationScriptsInSolutionFactory.cs @@ -13,10 +13,14 @@ namespace PackageManagement.Tests.Helpers new FakePackageInitializationScripts(); public Solution SolutionPassedToCreatePackageInitializationScripts; + public IPackageScriptSession ScriptSessionPassedToCreatePackageInitializationScripts; - public IPackageInitializationScripts CreatePackageInitializationScripts(Solution solution) + public IPackageInitializationScripts CreatePackageInitializationScripts( + Solution solution, + IPackageScriptSession scriptSession) { SolutionPassedToCreatePackageInitializationScripts = solution; + ScriptSessionPassedToCreatePackageInitializationScripts = scriptSession; return FakePackageInitializationScripts; } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs index 5beedf62cb..05a986152e 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs @@ -95,10 +95,10 @@ namespace PackageManagement.Tests.Helpers return PackageSourceToReturnFromGetActivePackageSource; } + public FakePowerShellHost FakePowerShellHost = new FakePowerShellHost(); + public IPowerShellHost PowerShellHost { - get { - throw new NotImplementedException(); - } + get { return FakePowerShellHost; } } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolutionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolutionTests.cs index c1295eaf16..916735db28 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolutionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsRunnerForOpenedSolutionTests.cs @@ -16,12 +16,14 @@ namespace PackageManagement.Tests.Scripting FakePackageInitializationScriptsFactory fakeScriptsFactory; FakePackageManagementProjectService fakeProjectService; PackageInitializationScriptsRunnerForOpenedSolution runner; + FakePackageManagementConsoleHost fakeConsoleHost; void CreateRunner() { - fakeScriptsFactory = new FakePackageInitializationScriptsFactory(); fakeProjectService = new FakePackageManagementProjectService(); - runner = new PackageInitializationScriptsRunnerForOpenedSolution(fakeProjectService, fakeScriptsFactory); + fakeConsoleHost = new FakePackageManagementConsoleHost(); + fakeScriptsFactory = new FakePackageInitializationScriptsFactory(); + runner = new PackageInitializationScriptsRunnerForOpenedSolution(fakeProjectService, fakeConsoleHost, fakeScriptsFactory); } Solution OpenSolution() @@ -47,11 +49,22 @@ namespace PackageManagement.Tests.Scripting public void Instance_SolutionIsOpened_PackageInitializationScriptsCreatedUsingSolution() { CreateRunner(); - var expectedSolution = OpenSolution(); + Solution expectedSolution = OpenSolution(); - var actualSolution = fakeScriptsFactory.SolutionPassedToCreatePackageInitializationScripts; + Solution actualSolution = fakeScriptsFactory.SolutionPassedToCreatePackageInitializationScripts; Assert.AreEqual(expectedSolution, actualSolution); } + + [Test] + public void Instance_SolutionIsOpened_PowerShellPackageScriptSessionIsUsedToCreatePackageInitializationScripts() + { + CreateRunner(); + OpenSolution(); + + PowerShellPackageScriptSession session = fakeScriptsFactory.ScriptSessionPassedToCreatePackageInitializationScripts as PowerShellPackageScriptSession; + + Assert.IsNotNull(session); + } } }