From 034ced130a63d72b61dc8e048af62b3d503fd028 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 10 May 2011 19:57:17 +0100 Subject: [PATCH] Override the Clear-Host PowerShell function to support clearing the package management console on the command line. --- .../Project/PackageManagement.csproj | 1 + ...learPackageManagementConsoleHostCommand.cs | 22 ++++++++ .../IPackageManagementConsoleHost.cs | 1 + .../Src/Scripting/IPowerShellHostFactory.cs | 4 +- .../Scripting/PackageManagementConsoleHost.cs | 33 +++++++----- .../PackageManagementConsoleViewModel.cs | 1 + .../Project/Src/Scripting/PowerShellHost.cs | 20 +++++--- .../Src/Scripting/PowerShellHostFactory.cs | 6 ++- .../Test/PackageManagement.Tests.csproj | 1 + .../FakePackageManagementConsoleHost.cs | 6 +++ .../Src/Helpers/FakePowerShellHostFactory.cs | 10 ++-- ...ackageManagementConsoleHostCommandTests.cs | 33 ++++++++++++ .../PackageManagementConsoleHostTests.cs | 51 +++++++++++++++---- .../PackageManagementConsoleViewModelTests.cs | 9 ++++ 14 files changed, 164 insertions(+), 34 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ClearPackageManagementConsoleHostCommand.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ClearPackageManagementConsoleHostCommandTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 93dc3283f2..23af870ce1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -204,6 +204,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ClearPackageManagementConsoleHostCommand.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ClearPackageManagementConsoleHostCommand.cs new file mode 100644 index 0000000000..ed12214077 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ClearPackageManagementConsoleHostCommand.cs @@ -0,0 +1,22 @@ +// 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.Scripting +{ + public class ClearPackageManagementConsoleHostCommand + { + IPackageManagementConsoleHost consoleHost; + + public ClearPackageManagementConsoleHostCommand(IPackageManagementConsoleHost consoleHost) + { + this.consoleHost = consoleHost; + } + + public void ClearHost() + { + consoleHost.Clear(); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs index e255084474..2c09afe828 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs @@ -18,6 +18,7 @@ namespace ICSharpCode.PackageManagement.Scripting IPackageManagementSolution Solution { get; } void Clear(); + void WritePrompt(); void Run(); IPackageManagementProject GetProject(string packageSource, string projectName); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPowerShellHostFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPowerShellHostFactory.cs index 678886df8b..1101ca6d76 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPowerShellHostFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPowerShellHostFactory.cs @@ -8,6 +8,8 @@ namespace ICSharpCode.PackageManagement.Scripting { public interface IPowerShellHostFactory { - IPowerShellHost CreatePowerShellHost(IScriptingConsole scriptingConsole); + IPowerShellHost CreatePowerShellHost( + IPackageManagementConsoleHost consoleHost, + object privateData); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs index 3d6585d09a..1bda81b421 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs @@ -70,7 +70,11 @@ namespace ICSharpCode.PackageManagement.Scripting public void Clear() { ScriptingConsole.Clear(); - WritePrompt(); + } + + public void WritePrompt() + { + ScriptingConsole.Write(prompt, ScriptingStyle.Prompt); } public void Run() @@ -98,17 +102,13 @@ namespace ICSharpCode.PackageManagement.Scripting AddModulesToImport(); powerShellHost.SetRemoteSignedExecutionPolicy(); UpdateFormatting(); - } - - void UpdateFormatting() - { - IEnumerable fileNames = addinPath.GetPowerShellFormattingFileNames(); - powerShellHost.UpdateFormatting(fileNames); + RedefineClearHostFunction(); } void CreatePowerShellHost() { - powerShellHost = powerShellHostFactory.CreatePowerShellHost(ScriptingConsole); + var clearConsoleHostCommand = new ClearPackageManagementConsoleHostCommand(this); + powerShellHost = powerShellHostFactory.CreatePowerShellHost(this, clearConsoleHostCommand); } void AddModulesToImport() @@ -117,6 +117,18 @@ namespace ICSharpCode.PackageManagement.Scripting powerShellHost.ModulesToImport.Add(module); } + void UpdateFormatting() + { + IEnumerable fileNames = addinPath.GetPowerShellFormattingFileNames(); + powerShellHost.UpdateFormatting(fileNames); + } + + void RedefineClearHostFunction() + { + string command = "function Clear-Host { $host.PrivateData.ClearHost() }"; + powerShellHost.ExecuteCommand(command); + } + void WriteInfoBeforeFirstPrompt() { WriteNuGetVersionInfo(); @@ -151,11 +163,6 @@ namespace ICSharpCode.PackageManagement.Scripting return "Type 'get-help NuGet' for more information."; } - void WritePrompt() - { - ScriptingConsole.Write(prompt, ScriptingStyle.Prompt); - } - void ProcessUserCommands() { while (true) { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs index d7ff5a6e91..39a9f7b62f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs @@ -76,6 +76,7 @@ namespace ICSharpCode.PackageManagement.Scripting public void ClearConsole() { consoleHost.Clear(); + consoleHost.WritePrompt(); } void UpdatePackageSourceViewModels() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHost.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHost.cs index fd33c9f94d..cb2ba192b3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHost.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHost.cs @@ -17,18 +17,26 @@ namespace ICSharpCode.PackageManagement.Scripting { public class PowerShellHost : PSHost, IPowerShellHost { - IScriptingConsole scriptingConsole; + IPackageManagementConsoleHost consoleHost; CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture; CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; Guid instanceId = Guid.NewGuid(); Runspace runspace; PowerShellHostUserInterface userInterface; List modulesToImport = new List(); + PSObject privateData; - public PowerShellHost(IScriptingConsole scriptingConsole) + public PowerShellHost( + IPackageManagementConsoleHost consoleHost, + object privateData) { - this.scriptingConsole = scriptingConsole; - userInterface = new PowerShellHostUserInterface(scriptingConsole); + this.consoleHost = consoleHost; + this.privateData = new PSObject(privateData); + userInterface = new PowerShellHostUserInterface(consoleHost.ScriptingConsole); + } + + public override PSObject PrivateData { + get { return privateData; } } public IList ModulesToImport { @@ -57,7 +65,7 @@ namespace ICSharpCode.PackageManagement.Scripting pipeline.Invoke(); } catch (Exception ex) { - scriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error); + consoleHost.ScriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error); } } @@ -155,7 +163,7 @@ namespace ICSharpCode.PackageManagement.Scripting pipeline.Invoke(input); } catch (Exception ex) { - scriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error); + consoleHost.ScriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHostFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHostFactory.cs index 77bfe4a77b..d1f7520e56 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHostFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHostFactory.cs @@ -8,9 +8,11 @@ namespace ICSharpCode.PackageManagement.Scripting { public class PowerShellHostFactory : IPowerShellHostFactory { - public IPowerShellHost CreatePowerShellHost(IScriptingConsole scriptingConsole) + public IPowerShellHost CreatePowerShellHost( + IPackageManagementConsoleHost consoleHost, + object privateData) { - return new PowerShellHost(scriptingConsole); + return new PowerShellHost(consoleHost, privateData); } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 738154da32..0b888ff823 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -175,6 +175,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs index 74608a691b..8b9906065a 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs @@ -27,6 +27,7 @@ namespace PackageManagement.Tests.Helpers public bool IsDisposeCalled; public bool IsClearCalled; + public bool IsWritePromptCalled; public bool IsRunCalled; public void Dispose() @@ -39,6 +40,11 @@ namespace PackageManagement.Tests.Helpers IsClearCalled = true; } + public void WritePrompt() + { + IsWritePromptCalled = true; + } + public void Run() { IsRunCalled = true; diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellHostFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellHostFactory.cs index 93465b9f3e..96fe51e897 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellHostFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellHostFactory.cs @@ -9,12 +9,16 @@ namespace PackageManagement.Tests.Helpers { public class FakePowerShellHostFactory : IPowerShellHostFactory { - public IScriptingConsole ScriptingConsolePassedToCreatePowerShellHost; + public IPackageManagementConsoleHost ConsoleHostPassedToCreatePowerShellHost; + public object PrivateDataPassedToCreatePowerShellHost; public FakePowerShellHost FakePowerShellHost = new FakePowerShellHost(); - public IPowerShellHost CreatePowerShellHost(IScriptingConsole scriptingConsole) + public IPowerShellHost CreatePowerShellHost( + IPackageManagementConsoleHost consoleHost, + object privateData) { - ScriptingConsolePassedToCreatePowerShellHost = scriptingConsole; + ConsoleHostPassedToCreatePowerShellHost = consoleHost; + PrivateDataPassedToCreatePowerShellHost = privateData; return FakePowerShellHost; } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ClearPackageManagementConsoleHostCommandTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ClearPackageManagementConsoleHostCommandTests.cs new file mode 100644 index 0000000000..51ac35ead0 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ClearPackageManagementConsoleHostCommandTests.cs @@ -0,0 +1,33 @@ +// 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 ClearPackageManagementConsoleHostCommandTests + { + ClearPackageManagementConsoleHostCommand command; + FakePackageManagementConsoleHost fakeConsoleHost; + + void CreateCommand() + { + fakeConsoleHost = new FakePackageManagementConsoleHost(); + command = new ClearPackageManagementConsoleHostCommand(fakeConsoleHost); + } + + [Test] + public void ClearHost_MethodCalled_ClearsConsoleHost() + { + CreateCommand(); + command.ClearHost(); + + bool called = fakeConsoleHost.IsClearCalled; + Assert.IsTrue(called); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs index 5e5fd2d827..b118cd7985 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs @@ -92,10 +92,21 @@ namespace PackageManagement.Tests.Scripting CreateHost(); RunHost(); - var actualConsole = host.FakePowerShellHostFactory.ScriptingConsolePassedToCreatePowerShellHost; - var expectedConsole = scriptingConsole; + var actualHost = host.FakePowerShellHostFactory.ConsoleHostPassedToCreatePowerShellHost; + var expectedHost = host; - Assert.AreSame(expectedConsole, actualConsole); + Assert.AreSame(expectedHost, actualHost); + } + + [Test] + public void Run_ConsoleExitsOnFirstRead_PrivateDataIsSetToClearConsoleHostCommandObject() + { + CreateHost(); + RunHost(); + + var privateDataObject = host.FakePowerShellHostFactory.PrivateDataPassedToCreatePowerShellHost; + + Assert.IsInstanceOf(typeof(ClearPackageManagementConsoleHostCommand), privateDataObject); } [Test] @@ -107,6 +118,20 @@ namespace PackageManagement.Tests.Scripting Assert.IsTrue(powerShellHost.IsSetRemoteSignedExecutionPolicyCalled); } + [Test] + public void Run_ConsoleExitsOnFirstRead_ClearHostFunctionIsRedefined() + { + CreateHost(); + RunHost(); + + string expectedExecutedScript = + "function Clear-Host { $host.PrivateData.ClearHost() }"; + + bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(expectedExecutedScript); + + Assert.IsTrue(executed); + } + [Test] public void Run_ConsoleExitsOnFirstRead_PromptTextWrittenToConsole() { @@ -151,17 +176,22 @@ namespace PackageManagement.Tests.Scripting } [Test] - public void Run_ConsoleExitsOnFirstRead_NoCommandsPassedToPowerShellHost() + public void Run_TwoCommandsEnteredByUser_FirstCommandExecuted() { CreateHost(); - powerShellHost.CommandPassedToExecuteCommand = "test"; + var commands = new string[] { "one", "two" }; + scriptingConsole.AllTextToReturnFromReadLine.AddRange(commands); + + host.ScriptingConsole = scriptingConsole; RunHost(); - Assert.AreEqual("test", powerShellHost.CommandPassedToExecuteCommand); + bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("one"); + + Assert.IsTrue(executed); } [Test] - public void Run_TwoCommandsEnteredByUser_BothCommandsExecuted() + public void Run_TwoCommandsEnteredByUser_SecondCommandExecuted() { CreateHost(); var commands = new string[] { "one", "two" }; @@ -170,7 +200,9 @@ namespace PackageManagement.Tests.Scripting host.ScriptingConsole = scriptingConsole; RunHost(); - Assert.AreEqual(commands, powerShellHost.AllCommandsPassedToExecuteCommand); + bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("two"); + + Assert.IsTrue(executed); } [Test] @@ -407,10 +439,11 @@ namespace PackageManagement.Tests.Scripting } [Test] - public void Clear_ConsoleWindowHasOutputText_PromptWritten() + public void WritePrompt_ConsoleWindowHasOutputText_PromptWritten() { CreateHost(); host.Clear(); + host.WritePrompt(); var expectedTextPassedToWrite = new String[] { "PM> "}; var actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite; diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs index ae810f4dd5..67a77e5b4d 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs @@ -476,6 +476,15 @@ namespace PackageManagement.Tests.Scripting Assert.IsTrue(consoleHost.IsClearCalled); } + [Test] + public void ClearConsole_CommandExecuted_WritesPrompt() + { + CreateViewModel(); + viewModel.ClearConsole(); + + Assert.IsTrue(consoleHost.IsWritePromptCalled); + } + [Test] public void Constructor_NewViewModelCreated_ConsoleSetOnConsoleHost() {