From 52ada1773bbd6e0b55b9bca4e09046d099de9a63 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 21 May 2011 16:26:28 +0100 Subject: [PATCH] Add cmdlet to run a set of package scripts inside the PowerShell console. --- .../Project/PackageManagement.Cmdlets.csproj | 1 + .../Src/InvokeRunPackageScriptsCmdlet.cs | 51 ++++++ .../Project/Src/PackageManagementCmdlet.cs | 4 +- .../TestableInvokeRunPackageScriptsCmdlet.cs | 41 +++++ .../PackageManagement.Cmdlets.Tests.csproj | 2 + .../Src/InvokeRunPackageScriptsCmdletTests.cs | 95 +++++++++++ .../Test/Src/PackageManagementCmdletTests.cs | 14 ++ .../Project/PackageManagement.csproj | 1 + .../Project/Src/PackageManagementServices.cs | 5 + .../Src/Scripting/PackageScriptsToRun.cs | 32 ++++ .../Test/PackageManagement.Tests.csproj | 1 + .../Src/Scripting/PackageScriptsToRunTests.cs | 156 ++++++++++++++++++ 12 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.cs create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj index 67a029a19d..d92c43fd4f 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj @@ -49,6 +49,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.cs new file mode 100644 index 0000000000..7d91478ac4 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.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 System.Management.Automation; +using ICSharpCode.PackageManagement.Scripting; + +namespace ICSharpCode.PackageManagement.Cmdlets +{ + [Cmdlet(VerbsLifecycle.Invoke, "RunPackageScripts", DefaultParameterSetName = ParameterAttribute.AllParameterSets)] + public class InvokeRunPackageScriptsCmdlet : PackageManagementCmdlet + { + PackageScriptsToRun scriptsToBeRun; + + public InvokeRunPackageScriptsCmdlet() + : this( + PackageManagementServices.PackageScriptsToRun, + PackageManagementServices.ConsoleHost, + null) + { + } + + public InvokeRunPackageScriptsCmdlet( + PackageScriptsToRun scriptsToBeRun, + IPackageManagementConsoleHost consoleHost, + ICmdletTerminatingError terminatingError) + : base(consoleHost, terminatingError) + { + this.scriptsToBeRun = scriptsToBeRun; + } + + protected override void ProcessRecord() + { + RunPackageScripts(); + } + + void RunPackageScripts() + { + IPackageScript script = null; + while (GetNextScript(out script)) { + Run(script); + } + } + + bool GetNextScript(out IPackageScript script) + { + script = scriptsToBeRun.GetNextScript(); + return script != null; + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs index df1575589f..ba47bbff9f 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs @@ -99,7 +99,9 @@ namespace ICSharpCode.PackageManagement.Cmdlets public void Run(IPackageScript script) { - script.Execute(this); + if (script.Exists()) { + script.Execute(this); + } } } } diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs new file mode 100644 index 0000000000..2bd382ed3e --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs @@ -0,0 +1,41 @@ +// 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.Scripting; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Cmdlets.Tests.Helpers +{ + public class TestableInvokeRunPackageScriptsCmdlet : InvokeRunPackageScriptsCmdlet + { + public FakeCmdletTerminatingError FakeCmdletTerminatingError; + public FakePackageManagementConsoleHost FakePackageManagementConsoleHost; + public PackageScriptsToRun ScriptsToBeRun; + + public TestableInvokeRunPackageScriptsCmdlet() + : this( + new PackageScriptsToRun(), + new FakePackageManagementConsoleHost(), + new FakeCmdletTerminatingError()) + { + } + + public TestableInvokeRunPackageScriptsCmdlet( + PackageScriptsToRun scriptsToBeRun, + FakePackageManagementConsoleHost consoleHost, + FakeCmdletTerminatingError cmdletTerminatingError) + : base(scriptsToBeRun, consoleHost, cmdletTerminatingError) + { + this.ScriptsToBeRun = scriptsToBeRun; + this.FakePackageManagementConsoleHost = consoleHost; + this.FakeCmdletTerminatingError = cmdletTerminatingError; + } + + 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 caa4c79a62..516bdf1024 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj @@ -50,6 +50,7 @@ + @@ -60,6 +61,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs new file mode 100644 index 0000000000..42fc4d8a32 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs @@ -0,0 +1,95 @@ +// 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.Scripting; +using NUnit.Framework; +using PackageManagement.Cmdlets.Tests.Helpers; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Cmdlets.Tests +{ + [TestFixture] + public class InvokeRunPackageScriptsCmdletTests + { + TestableInvokeRunPackageScriptsCmdlet cmdlet; + FakeCmdletTerminatingError fakeTerminatingError; + PackageScriptsToRun scriptsToRun; + + void CreateCmdlet() + { + cmdlet = new TestableInvokeRunPackageScriptsCmdlet(); + fakeTerminatingError = cmdlet.FakeCmdletTerminatingError; + scriptsToRun = cmdlet.ScriptsToBeRun; + } + + void RunCmdlet() + { + cmdlet.CallProcessRecord(); + } + + FakePackageScript AddScript() + { + var script = new FakePackageScript(); + scriptsToRun.AddScript(script); + return script; + } + + [Test] + public void ProcessRecord_OnePackageScriptToRun_PackageScriptIsRun() + { + CreateCmdlet(); + FakePackageScript script = AddScript(); + RunCmdlet(); + + bool executed = script.IsExecuted; + + Assert.IsTrue(executed); + } + + [Test] + public void ProcessRecord_TwoPackageScriptsToRun_SecondPackageScriptIsRun() + { + CreateCmdlet(); + AddScript(); + FakePackageScript script = AddScript(); + RunCmdlet(); + + bool executed = script.IsExecuted; + + Assert.IsTrue(executed); + } + + [Test] + public void ProcessRecord_OnePackageScriptToRun_PackageScriptSessionIsCmdlet() + { + CreateCmdlet(); + FakePackageScript script = AddScript(); + RunCmdlet(); + + IPackageScriptSession session = script.SessionPassedToExecute; + + Assert.AreEqual(cmdlet, session); + } + + [Test] + public void ProcessRecord_TwoPackageScriptsToRun_TwoPackageScriptSessionIsCmdlet() + { + CreateCmdlet(); + AddScript(); + FakePackageScript script = AddScript(); + RunCmdlet(); + + IPackageScriptSession session = script.SessionPassedToExecute; + + Assert.AreEqual(cmdlet, session); + } + + [Test] + public void ProcessRecord_NoPackageScriptsToRun_NullReferenceExceptionIsNotThrown() + { + CreateCmdlet(); + Assert.DoesNotThrow(() => RunCmdlet()); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs index 98217db242..f12d98c180 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs @@ -124,5 +124,19 @@ namespace PackageManagement.Cmdlets.Tests Assert.AreEqual(cmdlet, session); } + + [Test] + public void Run_PackageScriptDoesNotExist_ScriptIsNotRun() + { + CreateCmdlet(); + + var script = new FakePackageScript(); + script.ExistsReturnValue = false; + cmdlet.Run(script); + + bool executed = script.IsExecuted; + + Assert.IsFalse(executed); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index cbd5a51198..b2116f11f2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -200,6 +200,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs index 1194dd03b7..684d8d43f0 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs @@ -18,6 +18,7 @@ namespace ICSharpCode.PackageManagement static readonly PackageManagementOutputMessagesView outputMessagesView; static readonly RunPackageInitializationScriptsOnSolutionOpen runPackageInitializationScripts; static readonly ResetPowerShellWorkingDirectoryOnSolutionClosed resetPowerShellWorkingDirectory; + static readonly PackageScriptsToRun packageScriptsToRun = new PackageScriptsToRun(); static PackageManagementServices() { @@ -58,5 +59,9 @@ namespace ICSharpCode.PackageManagement public static IPackageManagementProjectService ProjectService { get { return projectService; } } + + public static PackageScriptsToRun PackageScriptsToRun { + get { return packageScriptsToRun; } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs new file mode 100644 index 0000000000..135f80c942 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs @@ -0,0 +1,32 @@ +// 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.Concurrent; + +namespace ICSharpCode.PackageManagement.Scripting +{ + public class PackageScriptsToRun + { + ConcurrentQueue scripts = new ConcurrentQueue(); + + public IPackageScript GetNextScript() + { + IPackageScript script = null; + if (GetNextScript(out script)) { + return script; + } + return null; + } + + public bool GetNextScript(out IPackageScript script) + { + return scripts.TryDequeue(out script); + } + + public void AddScript(IPackageScript script) + { + scripts.Enqueue(script); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index af6a2f8191..9c4d40a356 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -178,6 +178,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs new file mode 100644 index 0000000000..7a96884fef --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs @@ -0,0 +1,156 @@ +// 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.Scripting; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests.Scripting +{ + [TestFixture] + public class PackageScriptsToRunTests + { + PackageScriptsToRun scriptsToRun; + + void CreateScriptsToBeRun() + { + scriptsToRun = new PackageScriptsToRun(); + } + + FakePackageScript AddScript() + { + var script = new FakePackageScript(); + scriptsToRun.AddScript(script); + return script; + } + + [Test] + public void GetNextScript_NewInstance_ReturnsNull() + { + CreateScriptsToBeRun(); + IPackageScript script = scriptsToRun.GetNextScript(); + + Assert.IsNull(script); + } + + [Test] + public void GetNextScript_NewInstance_ReturnsFalse() + { + CreateScriptsToBeRun(); + IPackageScript script = null; + bool result = scriptsToRun.GetNextScript(out script); + + Assert.IsFalse(result); + } + + [Test] + public void GetNextScript_OneScriptAdded_ReturnsScript() + { + CreateScriptsToBeRun(); + FakePackageScript expectedScript = AddScript(); + + IPackageScript script = scriptsToRun.GetNextScript(); + + Assert.AreEqual(expectedScript, script); + } + + [Test] + public void GetNextScript_OneScriptAdded_ReturnsScriptInOutParameter() + { + CreateScriptsToBeRun(); + FakePackageScript expectedScript = AddScript(); + + IPackageScript script = null; + scriptsToRun.GetNextScript(out script); + + Assert.AreEqual(expectedScript, script); + } + + [Test] + public void GetNextScript_OneScriptAdded_ReturnsTrue() + { + CreateScriptsToBeRun(); + FakePackageScript expectedScript = AddScript(); + + IPackageScript script = null; + bool result = scriptsToRun.GetNextScript(out script); + + Assert.IsTrue(result); + } + + [Test] + public void GetNextScript_CalledTwiceWithOneScriptAdded_ReturnsNullOnSecondCall() + { + CreateScriptsToBeRun(); + FakePackageScript expectedScript = AddScript(); + scriptsToRun.GetNextScript(); + IPackageScript script = scriptsToRun.GetNextScript(); + + Assert.IsNull(script); + } + + [Test] + public void GetNextScript_CalledTwiceWithOneScriptAdded_ReturnsNullScriptInOutParameterOnSecondCall() + { + CreateScriptsToBeRun(); + FakePackageScript expectedScript = AddScript(); + scriptsToRun.GetNextScript(); + IPackageScript script = null; + scriptsToRun.GetNextScript(out script); + + Assert.IsNull(script); + } + + [Test] + public void GetNextScript_CalledTwiceWithOneScriptAdded_ReturnsFalseOnSecondCall() + { + CreateScriptsToBeRun(); + FakePackageScript expectedScript = AddScript(); + scriptsToRun.GetNextScript(); + + IPackageScript script = null; + bool result = scriptsToRun.GetNextScript(out script); + + Assert.IsFalse(result); + } + + [Test] + public void GetNextScript_CalledTwiceWithTwoScriptsAdded_ReturnsSecondScriptAdded() + { + CreateScriptsToBeRun(); + AddScript(); + FakePackageScript expectedScript = AddScript(); + scriptsToRun.GetNextScript(); + IPackageScript script = scriptsToRun.GetNextScript(); + + Assert.AreEqual(expectedScript, script); + } + + [Test] + public void GetNextScript_CalledTwiceWithTwoScriptsAdded_ReturnsSecondScriptAddedInOutParameter() + { + CreateScriptsToBeRun(); + AddScript(); + FakePackageScript expectedScript = AddScript(); + scriptsToRun.GetNextScript(); + IPackageScript script = null; + scriptsToRun.GetNextScript(out script); + + Assert.AreEqual(expectedScript, script); + } + + [Test] + public void GetNextScript_CalledTwiceWithTwoScriptsAdded_ReturnsTrueOnSecondCall() + { + CreateScriptsToBeRun(); + AddScript(); + FakePackageScript expectedScript = AddScript(); + scriptsToRun.GetNextScript(); + IPackageScript script = null; + bool result = scriptsToRun.GetNextScript(out script); + + Assert.IsTrue(result); + } + } +}