From dad6cd4f7710bfe87450bb3c056d9aff9fd3e902 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Mon, 16 May 2011 20:18:29 +0100 Subject: [PATCH] Create cmdlet to update the PowerShell working directory. --- .../Project/PackageManagement.Cmdlets.csproj | 1 + .../Src/InvokeInitializePackagesCmdlet.cs | 16 +---- .../Src/InvokeUpdateWorkingDirectoryCmdlet.cs | 55 ++++++++++++++++++ ...tableInvokeUpdateWorkingDirectoryCmdlet.cs | 54 +++++++++++++++++ .../PackageManagement.Cmdlets.Tests.csproj | 2 + .../InvokeInitializePackagesCmdletTests.cs | 7 +-- ...InvokeUpdateWorkingDirectoryCmdletTests.cs | 58 +++++++++++++++++++ 7 files changed, 175 insertions(+), 18 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeUpdateWorkingDirectoryCmdlet.cs create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeUpdateWorkingDirectoryCmdlet.cs create mode 100644 src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeUpdateWorkingDirectoryCmdletTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj index 11bd3d4e7d..67a029a19d 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/InvokeInitializePackagesCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs index 248df45ee3..e2e33cb3ca 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeInitializePackagesCmdlet.cs @@ -42,19 +42,7 @@ namespace ICSharpCode.PackageManagement.Cmdlets void UpdateWorkingDirectory() { - string directory = GetWorkingDirectory(); - UpdateWorkingDirectory(directory); - } - - string GetWorkingDirectory() - { - var workingDirectory = new PowerShellWorkingDirectory(projectService); - return workingDirectory.GetWorkingDirectory(); - } - - void UpdateWorkingDirectory(string directory) - { - string command = String.Format("Set-Location '{0}'", directory); + string command = "Invoke-UpdateWorkingDirectory"; InvokeScript(command); } @@ -63,7 +51,7 @@ namespace ICSharpCode.PackageManagement.Cmdlets IPackageInitializationScripts scripts = GetPackageInitializationScripts(); if (scripts.Any()) { scripts.Run(); - } + } } IPackageInitializationScripts GetPackageInitializationScripts() diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeUpdateWorkingDirectoryCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeUpdateWorkingDirectoryCmdlet.cs new file mode 100644 index 0000000000..2d0f2f09f5 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeUpdateWorkingDirectoryCmdlet.cs @@ -0,0 +1,55 @@ +// 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, "UpdateWorkingDirectory", DefaultParameterSetName = ParameterAttribute.AllParameterSets)] + public class InvokeUpdateWorkingDirectoryCmdlet : PackageManagementCmdlet + { + IPackageManagementProjectService projectService; + + public InvokeUpdateWorkingDirectoryCmdlet() + : this( + PackageManagementServices.ProjectService, + PackageManagementServices.ConsoleHost, + null) + { + } + + public InvokeUpdateWorkingDirectoryCmdlet( + IPackageManagementProjectService projectService, + IPackageManagementConsoleHost consoleHost, + ICmdletTerminatingError terminatingError) + : base(consoleHost, terminatingError) + { + this.projectService = projectService; + } + + protected override void ProcessRecord() + { + UpdateWorkingDirectory(); + } + + void UpdateWorkingDirectory() + { + string directory = GetWorkingDirectory(); + UpdateWorkingDirectory(directory); + } + + string GetWorkingDirectory() + { + var workingDirectory = new PowerShellWorkingDirectory(projectService); + return workingDirectory.GetWorkingDirectory(); + } + + void UpdateWorkingDirectory(string directory) + { + string command = String.Format("Set-Location '{0}'", directory); + InvokeScript(command); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeUpdateWorkingDirectoryCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeUpdateWorkingDirectoryCmdlet.cs new file mode 100644 index 0000000000..05e066b289 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeUpdateWorkingDirectoryCmdlet.cs @@ -0,0 +1,54 @@ +// 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 TestableInvokeUpdateWorkingDirectoryCmdlet : InvokeUpdateWorkingDirectoryCmdlet + { + public FakeCmdletTerminatingError FakeCmdletTerminatingError; + public FakePackageManagementConsoleHost FakePackageManagementConsoleHost; + public FakePackageManagementProjectService FakeProjectService; + public Solution Solution; + + public TestableInvokeUpdateWorkingDirectoryCmdlet() + : this( + new FakePackageManagementProjectService(), + new FakePackageManagementConsoleHost(), + new FakeCmdletTerminatingError()) + { + } + + public TestableInvokeUpdateWorkingDirectoryCmdlet( + FakePackageManagementProjectService projectService, + FakePackageManagementConsoleHost consoleHost, + FakeCmdletTerminatingError cmdletTerminatingError) + : base(projectService, consoleHost, cmdletTerminatingError) + { + this.FakeProjectService = projectService; + this.FakePackageManagementConsoleHost = consoleHost; + this.FakeCmdletTerminatingError = cmdletTerminatingError; + + Solution = new Solution(); + Solution.FileName = @"d:\projects\MyProject\MyProject.sln"; + projectService.OpenSolution = Solution; + } + + public void CallProcessRecord() + { + base.ProcessRecord(); + } + + public string ScriptPassedToInvokeScript; + + public override void InvokeScript(string script) + { + ScriptPassedToInvokeScript = script; + } + } +} 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 94f7b7c740..caa4c79a62 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 @@ + @@ -59,6 +60,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs index 44c6e9ad38..9ba71e2f86 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeInitializePackagesCmdletTests.cs @@ -91,16 +91,15 @@ namespace PackageManagement.Cmdlets.Tests } [Test] - public void ProcessRecord_SolutionHasPackageInitializationScripts_PowerShellWorkingDirectoryIsSetToSolutionDirectory() + public void ProcessRecord_SolutionHasPackageInitializationScripts_PowerShellWorkingDirectoryIsUpdated() { CreateCmdlet(); - SolutionHasPackageInitializationScripts(); - fakeProjectService.OpenSolution.FileName = @"d:\projects\MySolution\MySolution.sln"; + fakeProjectService.OpenSolution = null; RunCmdlet(); string commandExecuted = cmdlet.ScriptPassedToInvokeScript; - string expectedCommandExecuted = @"Set-Location 'd:\projects\MySolution'"; + string expectedCommandExecuted = @"Invoke-UpdateWorkingDirectory"; Assert.AreEqual(expectedCommandExecuted, commandExecuted); } diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeUpdateWorkingDirectoryCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeUpdateWorkingDirectoryCmdletTests.cs new file mode 100644 index 0000000000..1c438411ec --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeUpdateWorkingDirectoryCmdletTests.cs @@ -0,0 +1,58 @@ +// 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 NUnit.Framework; +using PackageManagement.Cmdlets.Tests.Helpers; + +namespace PackageManagement.Cmdlets.Tests +{ + [TestFixture] + public class InvokeUpdateWorkingDirectoryCmdletTests + { + TestableInvokeUpdateWorkingDirectoryCmdlet cmdlet; + FakeCmdletTerminatingError fakeTerminatingError; + FakePackageManagementProjectService fakeProjectService; + + void CreateCmdlet() + { + cmdlet = new TestableInvokeUpdateWorkingDirectoryCmdlet(); + fakeProjectService = cmdlet.FakeProjectService; + fakeTerminatingError = cmdlet.FakeCmdletTerminatingError; + } + + void RunCmdlet() + { + cmdlet.CallProcessRecord(); + } + + [Test] + public void ProcessRecord_SolutionIsOpen_PowerShellWorkingDirectoryIsSetToSolutionDirectory() + { + CreateCmdlet(); + fakeProjectService.OpenSolution.FileName = @"d:\projects\MySolution\MySolution.sln"; + RunCmdlet(); + + string commandExecuted = cmdlet.ScriptPassedToInvokeScript; + + string expectedCommandExecuted = @"Set-Location 'd:\projects\MySolution'"; + + Assert.AreEqual(expectedCommandExecuted, commandExecuted); + } + + [Test] + public void ProcessRecord_SolutionIsNotOpen_PowerShellWorkingDirectoryIsSetUserProfileFolder() + { + CreateCmdlet(); + fakeProjectService.OpenSolution = null; + RunCmdlet(); + + string commandExecuted = cmdlet.ScriptPassedToInvokeScript; + + string expectedCommandExecuted = @"Set-Location '$env:USERPROFILE'"; + + Assert.AreEqual(expectedCommandExecuted, commandExecuted); + } + } +}