From 64a7c8ab806f9457b555550e62758d5d58dfabe9 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 16 May 2011 21:17:48 +0100 Subject: [PATCH] Reset PowerShell working directory when solution is closed. --- .../Project/PackageManagement.csproj | 1 + .../Project/Src/PackageManagementServices.cs | 2 + ...erShellWorkingDirectoryOnSolutionClosed.cs | 33 +++++++++++ .../Test/PackageManagement.Tests.csproj | 1 + ...llWorkingDirectoryOnSolutionClosedTests.cs | 59 +++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosed.cs create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosedTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index 627df704bc..ceef7d2745 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 a24b66015d..60e55642a6 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs @@ -17,6 +17,7 @@ namespace ICSharpCode.PackageManagement static readonly ProjectBrowserRefresher projectBrowserRefresher; static readonly PackageManagementOutputMessagesView outputMessagesView; static readonly PackageInitializationScriptsRunnerForOpenedSolution packageInitializationScriptsRunner; + static readonly ResetPowerShellWorkingDirectoryOnSolutionClosed resetPowerShellWorkingDirectory; static PackageManagementServices() { @@ -27,6 +28,7 @@ namespace ICSharpCode.PackageManagement consoleHost = new PackageManagementConsoleHost(solution, registeredPackageRepositories); projectBrowserRefresher = new ProjectBrowserRefresher(projectService, packageManagementEvents); packageInitializationScriptsRunner = new PackageInitializationScriptsRunnerForOpenedSolution(projectService); + resetPowerShellWorkingDirectory = new ResetPowerShellWorkingDirectoryOnSolutionClosed(projectService, consoleHost); } public static PackageManagementOptions Options { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosed.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosed.cs new file mode 100644 index 0000000000..984078c323 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosed.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; + +namespace ICSharpCode.PackageManagement.Scripting +{ + public class ResetPowerShellWorkingDirectoryOnSolutionClosed + { + IPackageManagementConsoleHost consoleHost; + + public ResetPowerShellWorkingDirectoryOnSolutionClosed( + IPackageManagementProjectService projectService, + IPackageManagementConsoleHost consoleHost) + { + this.consoleHost = consoleHost; + projectService.SolutionClosed += SolutionClosed; + } + + void SolutionClosed(object sender, EventArgs e) + { + if (consoleHost.IsRunning) { + UpdateWorkingDirectory(); + } + } + + void UpdateWorkingDirectory() + { + string command = "Invoke-UpdateWorkingDirectory"; + consoleHost.ScriptingConsole.SendLine(command); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index eb632882fb..1f24ff5da4 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/ResetPowerShellWorkingDirectoryOnSolutionClosedTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosedTests.cs new file mode 100644 index 0000000000..6c15fa1b0c --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ResetPowerShellWorkingDirectoryOnSolutionClosedTests.cs @@ -0,0 +1,59 @@ +// 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.Scripting.Tests.Utils; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests.Scripting +{ + [TestFixture] + public class ResetPowerShellWorkingDirectoryOnSolutionClosedTests + { + FakePackageManagementProjectService fakeProjectService; + FakePackageManagementConsoleHost fakeConsoleHost; + FakeScriptingConsole fakeScriptingConsole; + ResetPowerShellWorkingDirectoryOnSolutionClosed reset; + + void CreateReset() + { + fakeProjectService = new FakePackageManagementProjectService(); + fakeConsoleHost = new FakePackageManagementConsoleHost(); + fakeScriptingConsole = new FakeScriptingConsole(); + fakeConsoleHost.ScriptingConsole = fakeScriptingConsole; + reset = new ResetPowerShellWorkingDirectoryOnSolutionClosed(fakeProjectService, fakeConsoleHost); + } + + bool IsWorkingDirectoryUpdated() + { + return fakeScriptingConsole.AllTextPassedToSendLine.Contains("Invoke-UpdateWorkingDirectory"); + } + + [Test] + public void Instance_SolutionClosedWhenConsoleHostIsRunning_WorkingDirectoryIsUpdated() + { + CreateReset(); + fakeConsoleHost.IsRunning = true; + fakeProjectService.FireSolutionClosedEvent(); + + bool workingDirectoryUpdated = IsWorkingDirectoryUpdated(); + + Assert.IsTrue(workingDirectoryUpdated); + } + + [Test] + public void Instance_SolutionClosedWhenConsoleHostIsNotRunning_WorkingDirectoryIsNotUpdated() + { + CreateReset(); + fakeConsoleHost.IsRunning = false; + fakeProjectService.FireSolutionClosedEvent(); + + bool workingDirectoryUpdated = IsWorkingDirectoryUpdated(); + + Assert.IsFalse(workingDirectoryUpdated); + } + } +}