From e549d51049059a88d90943ecfcbfa7d426ab46d5 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 15 May 2011 10:47:14 +0100 Subject: [PATCH] Add methods to determine if a package PowerShell script file exists on the file system. --- .../Project/Src/Scripting/IPackageScript.cs | 1 + .../Scripting/PackageInitializationScripts.cs | 28 ++++++- .../Project/Src/Scripting/PackageScript.cs | 12 +-- .../Test/PackageManagement.Tests.csproj | 1 + .../Test/Src/Helpers/FakePackageScript.cs | 9 ++- .../Src/Helpers/FakePackageScriptFactory.cs | 5 ++ ...riptFactoryWithPredefinedPackageScripts.cs | 40 ++++++++++ .../PackageInitializationScriptsTests.cs | 75 ++++++++++++++++++- .../Scripting/PackageInstallScriptTests.cs | 22 ++++++ 9 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactoryWithPredefinedPackageScripts.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs index 57d5cfaa0e..9b7e690d9b 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs @@ -9,6 +9,7 @@ namespace ICSharpCode.PackageManagement.Scripting { IPackageManagementProject Project { get; set; } + bool Exists(); void Execute(); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScripts.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScripts.cs index 1cd9686f94..166e14c32c 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScripts.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializationScripts.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; + using NuGet; namespace ICSharpCode.PackageManagement.Scripting @@ -11,6 +12,7 @@ namespace ICSharpCode.PackageManagement.Scripting { ISolutionPackageRepository solutionPackageRepository; IPackageScriptFactory scriptFactory; + List scripts; public PackageInitializationScripts( ISolutionPackageRepository solutionPackageRepository, @@ -22,9 +24,27 @@ namespace ICSharpCode.PackageManagement.Scripting public void Run() { + foreach (IPackageScript script in GetScripts()) { + script.Execute(); + } + } + + List GetScripts() + { + if (scripts == null) { + CreatePackageInitializationScripts(); + } + return scripts; + } + + void CreatePackageInitializationScripts() + { + scripts = new List(); foreach (IPackage package in GetPackages()) { IPackageScript script = CreateInitializeScript(package); - script.Execute(); + if (script.Exists()) { + scripts.Add(script); + } } } @@ -38,5 +58,11 @@ namespace ICSharpCode.PackageManagement.Scripting string packageInstallDirectory = solutionPackageRepository.GetInstallPath(package); return scriptFactory.CreatePackageInitializeScript(packageInstallDirectory); } + + public bool Any() + { + List scripts = GetScripts(); + return scripts.Count > 0; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs index 56f22e0fa5..520ab6b2ac 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs @@ -23,10 +23,15 @@ namespace ICSharpCode.PackageManagement.Scripting public IPackage Package { get; set; } public IPackageManagementProject Project { get; set; } + public bool Exists() + { + return ScriptFileName.FileExists(); + } + public void Execute() { BeforeExecute(); - if (ScriptFileExists()) { + if (Exists()) { AddSessionVariables(); ExecuteScript(); RemoveSessionVariables(); @@ -37,11 +42,6 @@ namespace ICSharpCode.PackageManagement.Scripting { } - bool ScriptFileExists() - { - return ScriptFileName.FileExists(); - } - void AddSessionVariables() { Session.AddVariable("__rootPath", ScriptFileName.PackageInstallDirectory); diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 1b48c73e25..3afedbc469 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -90,6 +90,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs index 9429ffd3f7..b630cc2a57 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs @@ -9,6 +9,8 @@ namespace PackageManagement.Tests.Helpers { public class FakePackageScript : IPackageScript { + public IPackageManagementProject Project { get; set; } + public bool IsExecuted; public void Execute() @@ -16,6 +18,11 @@ namespace PackageManagement.Tests.Helpers IsExecuted = true; } - public IPackageManagementProject Project { get; set; } + public bool ExistsReturnValue = true; + + public bool Exists() + { + return ExistsReturnValue; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs index bd07ad31cd..4a0681166d 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs @@ -10,6 +10,8 @@ namespace PackageManagement.Tests.Helpers { public class FakePackageScriptFactory : IPackageScriptFactory { + public bool ScriptFileExistsReturnValue = true; + public List PackageInstallDirectoriesPassed = new List(); public string FirstPackageInstallDirectoryPassed { @@ -38,6 +40,7 @@ namespace PackageManagement.Tests.Helpers { PackageInstallDirectoriesPassed.Add(packageInstallDirectory); var script = new FakePackageScript(); + script.ExistsReturnValue = ScriptFileExistsReturnValue; FakePackageInitializeScriptsCreated.Add(script); return script; } @@ -46,6 +49,7 @@ namespace PackageManagement.Tests.Helpers { PackageInstallDirectoriesPassed.Add(packageInstallDirectory); var script = new FakePackageScript(); + script.ExistsReturnValue = ScriptFileExistsReturnValue; FakePackageUninstallScriptsCreated.Add(script); return script; } @@ -54,6 +58,7 @@ namespace PackageManagement.Tests.Helpers { PackageInstallDirectoriesPassed.Add(packageInstallDirectory); var script = new FakePackageScript(); + script.ExistsReturnValue = ScriptFileExistsReturnValue; FakePackageInstallScriptsCreated.Add(script); return script; } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactoryWithPredefinedPackageScripts.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactoryWithPredefinedPackageScripts.cs new file mode 100644 index 0000000000..bafd9fd90c --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactoryWithPredefinedPackageScripts.cs @@ -0,0 +1,40 @@ +// 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.Generic; +using ICSharpCode.PackageManagement.Scripting; + +namespace PackageManagement.Tests.Helpers +{ + public class FakePackageScriptFactoryWithPredefinedPackageScripts : IPackageScriptFactory + { + public List FakeInitializeScripts = new List(); + + public FakePackageScript AddFakeInitializationScript() + { + var script = new FakePackageScript(); + FakeInitializeScripts.Add(script); + return script; + } + + public IPackageScript CreatePackageInitializeScript(string packageInstallDirectory) + { + FakePackageScript script = FakeInitializeScripts[0]; + FakeInitializeScripts.RemoveAt(0); + return script; + } + + public IPackageScript CreatePackageUninstallScript(string packageInstallDirectory) + { + throw new NotImplementedException(); + } + + public IPackageScript CreatePackageInstallScript(string packageInstallDirectory) + { + throw new NotImplementedException(); + } + + + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsTests.cs index 1f9d473ade..2bee9040ca 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializationScriptsTests.cs @@ -16,12 +16,18 @@ namespace PackageManagement.Tests.Scripting PackageInitializationScripts scripts; FakePackageScriptFactory fakeScriptFactory; FakeSolutionPackageRepository fakeSolutionPackageRepository; + FakePackageScriptFactoryWithPredefinedPackageScripts fakeScriptFactoryWithPredefinedPackageScripts; void CreateScripts() { - fakeSolutionPackageRepository = new FakeSolutionPackageRepository(); fakeScriptFactory = new FakePackageScriptFactory(); - scripts = new PackageInitializationScripts(fakeSolutionPackageRepository, fakeScriptFactory); + CreateScripts(fakeScriptFactory); + } + + void CreateScripts(IPackageScriptFactory scriptFactory) + { + fakeSolutionPackageRepository = new FakeSolutionPackageRepository(); + scripts = new PackageInitializationScripts(fakeSolutionPackageRepository, scriptFactory); } FakePackage AddPackageToRepository(string packageId) @@ -31,6 +37,25 @@ namespace PackageManagement.Tests.Scripting return package; } + void CreateScriptsUsingScriptFactoryWithPredefinedScripts() + { + fakeScriptFactoryWithPredefinedPackageScripts = new FakePackageScriptFactoryWithPredefinedPackageScripts(); + CreateScripts(fakeScriptFactoryWithPredefinedPackageScripts); + } + + void CreateScriptsWithTwoPackagesInRepositoryAndLastPackageScriptFileExistsButNotFirst() + { + CreateScriptsUsingScriptFactoryWithPredefinedScripts(); + AddPackageToRepository("A"); + AddPackageToRepository("B"); + + var scriptForPackageA = fakeScriptFactoryWithPredefinedPackageScripts.AddFakeInitializationScript(); + scriptForPackageA.ExistsReturnValue = false; + + var scriptForPackageB = fakeScriptFactoryWithPredefinedPackageScripts.AddFakeInitializationScript(); + scriptForPackageB.ExistsReturnValue = true; + } + [Test] public void Run_OnePackageInRepository_OnePackageScriptExecuted() { @@ -82,5 +107,51 @@ namespace PackageManagement.Tests.Scripting Assert.IsTrue(executed); } + + [Test] + public void Any_OnePackageInRepositoryAndScriptFileExists_ReturnsTrue() + { + CreateScripts(); + AddPackageToRepository("A"); + fakeScriptFactory.ScriptFileExistsReturnValue = true; + + bool result = scripts.Any(); + + Assert.IsTrue(result); + } + + [Test] + public void Any_OnePackageInRepositoryAndScriptFileDoesNotExist_ReturnsFalse() + { + CreateScripts(); + AddPackageToRepository("A"); + fakeScriptFactory.ScriptFileExistsReturnValue = false; + + bool result = scripts.Any(); + + Assert.IsFalse(result); + } + + [Test] + public void Any_TwoPackagesInRepositoryAndLastPackageScriptFileExistsButNotFirst_ReturnsTrue() + { + CreateScriptsWithTwoPackagesInRepositoryAndLastPackageScriptFileExistsButNotFirst(); + + bool result = scripts.Any(); + + Assert.IsTrue(result); + } + + [Test] + public void Run_TwoPackagesInRepositoryAndLastPackageScriptFileExistsButNotFirst_FirstScriptNotExecuted() + { + CreateScriptsWithTwoPackagesInRepositoryAndLastPackageScriptFileExistsButNotFirst(); + FakePackageScript firstScript = fakeScriptFactoryWithPredefinedPackageScripts.FakeInitializeScripts[0]; + scripts.Run(); + + bool executed = firstScript.IsExecuted; + + Assert.IsFalse(executed); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs index eacdf24115..388579246f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs @@ -57,6 +57,28 @@ namespace PackageManagement.Tests.Scripting Assert.IsFalse(executed); } + [Test] + public void Exists_ScriptDoesNotExist_ReturnsFalse() + { + CreateScript(); + fakeFileSystem.FileExistsReturnValue = false; + + bool exists = script.Exists(); + + Assert.IsFalse(exists); + } + + [Test] + public void Exists_ScriptDoesExist_ReturnsTrue() + { + CreateScript(); + fakeFileSystem.FileExistsReturnValue = true; + + bool exists = script.Exists(); + + Assert.IsTrue(exists); + } + [Test] public void Execute_ScriptDoesNotExist_InstallScriptCheckedForExistence() {