diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InstallPackageCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InstallPackageCmdlet.cs
index 201ca23b0f..e55ac03fb5 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InstallPackageCmdlet.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InstallPackageCmdlet.cs
@@ -49,17 +49,23 @@ namespace ICSharpCode.PackageManagement.Cmdlets
void InstallPackage()
{
- InstallPackageAction action = CreateInstallPackageTask();
+ IPackageManagementProject project = GetProject();
+ InstallPackageAction action = CreateInstallPackageTask(project);
action.Execute();
}
- InstallPackageAction CreateInstallPackageTask()
+ IPackageManagementProject GetProject()
+ {
+ return ConsoleHost.GetProject(Source, ProjectName);
+ }
+
+ InstallPackageAction CreateInstallPackageTask(IPackageManagementProject project)
{
- IPackageManagementProject project = ConsoleHost.GetProject(Source, ProjectName);
InstallPackageAction action = project.CreateInstallPackageAction();
action.PackageId = Id;
action.PackageVersion = Version;
action.IgnoreDependencies = IgnoreDependencies.IsPresent;
+ action.PackageScriptSession = this;
return action;
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs
index 0fb635e937..f0f3154a60 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs
@@ -9,8 +9,10 @@ using NuGet;
namespace ICSharpCode.PackageManagement.Cmdlets
{
- public abstract class PackageManagementCmdlet : PSCmdlet, ITerminatingCmdlet
+ public abstract class PackageManagementCmdlet : PSCmdlet, ITerminatingCmdlet, IPackageScriptSession
{
+ static readonly string EnvironmentPathVariableName = "env:path";
+
IPackageManagementConsoleHost consoleHost;
ICmdletTerminatingError terminatingError;
@@ -50,5 +52,45 @@ namespace ICSharpCode.PackageManagement.Cmdlets
{
TerminatingError.ThrowNoProjectOpenError();
}
+
+ public void SetEnvironmentPath(string path)
+ {
+ SetSessionVariable(EnvironmentPathVariableName, path);
+ }
+
+ protected virtual void SetSessionVariable(string name, object value)
+ {
+ SessionState.PSVariable.Set(name, value);
+ }
+
+ public string GetEnvironmentPath()
+ {
+ return (string)GetSessionVariable(EnvironmentPathVariableName);
+ }
+
+ protected virtual object GetSessionVariable(string name)
+ {
+ return GetVariableValue(name);
+ }
+
+ public void AddVariable(string name, object value)
+ {
+ SetSessionVariable(name, value);
+ }
+
+ public void RemoveVariable(string name)
+ {
+ RemoveSessionVariable(name);
+ }
+
+ protected virtual void RemoveSessionVariable(string name)
+ {
+ SessionState.PSVariable.Remove(name);
+ }
+
+ public void InvokeScript(string script)
+ {
+ InvokeCommand.InvokeScript(script);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UninstallPackageCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UninstallPackageCmdlet.cs
index 4f5d12b6db..064d6d3cb7 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UninstallPackageCmdlet.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UninstallPackageCmdlet.cs
@@ -49,19 +49,25 @@ namespace ICSharpCode.PackageManagement.Cmdlets
void UninstallPackage()
{
- UninstallPackageAction action = CreateUninstallPackageAction();
+ IPackageManagementProject project = GetProject();
+ UninstallPackageAction action = CreateUninstallPackageAction(project);
action.Execute();
}
- UninstallPackageAction CreateUninstallPackageAction()
+ IPackageManagementProject GetProject()
{
string source = null;
- IPackageManagementProject project = ConsoleHost.GetProject(source, ProjectName);
+ return ConsoleHost.GetProject(source, ProjectName);
+ }
+
+ UninstallPackageAction CreateUninstallPackageAction(IPackageManagementProject project)
+ {
UninstallPackageAction action = project.CreateUninstallPackageAction();
action.PackageId = Id;
action.PackageVersion = Version;
action.ForceRemove = Force.IsPresent;
action.RemoveDependencies = RemoveDependencies.IsPresent;
+ action.PackageScriptSession = this;
return action;
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs
index b010432ce5..276f447f8a 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs
@@ -49,17 +49,23 @@ namespace ICSharpCode.PackageManagement.Cmdlets
void UpdatePackage()
{
- UpdatePackageAction action = CreateUpdatePackageAction();
+ IPackageManagementProject project = GetProject();
+ UpdatePackageAction action = CreateUpdatePackageAction(project);
action.Execute();
}
- UpdatePackageAction CreateUpdatePackageAction()
+ IPackageManagementProject GetProject()
+ {
+ return ConsoleHost.GetProject(Source, ProjectName);
+ }
+
+ UpdatePackageAction CreateUpdatePackageAction(IPackageManagementProject project)
{
- IPackageManagementProject project = ConsoleHost.GetProject(Source, ProjectName);
UpdatePackageAction action = project.CreateUpdatePackageAction();
action.PackageId = Id;
action.PackageVersion = Version;
action.UpdateDependencies = !IgnoreDependencies.IsPresent;
+ action.PackageScriptSession = this;
return action;
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestablePackageManagementCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestablePackageManagementCmdlet.cs
index 0eceb9e08f..9dbc8deb23 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestablePackageManagementCmdlet.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestablePackageManagementCmdlet.cs
@@ -10,6 +10,11 @@ namespace PackageManagement.Cmdlets.Tests.Helpers
{
public class TestablePackageManagementCmdlet : PackageManagementCmdlet
{
+ public TestablePackageManagementCmdlet()
+ : this(new FakeCmdletTerminatingError())
+ {
+ }
+
public TestablePackageManagementCmdlet(FakeCmdletTerminatingError terminatingError)
: base(
new FakePackageManagementConsoleHost(),
@@ -22,5 +27,30 @@ namespace PackageManagement.Cmdlets.Tests.Helpers
{
base.ThrowProjectNotOpenTerminatingError();
}
+
+ public object GetSessionVariableReturnValue;
+ public string NamePassedToGetSessionVariable;
+
+ protected override object GetSessionVariable(string name)
+ {
+ NamePassedToGetSessionVariable = name;
+ return GetSessionVariableReturnValue;
+ }
+
+ public object ValuePassedToSetSessionVariable;
+ public string NamePassedToSetSessionVariable;
+
+ protected override void SetSessionVariable(string name, object value)
+ {
+ NamePassedToSetSessionVariable = name;
+ ValuePassedToSetSessionVariable = value;
+ }
+
+ public string NamePassedToRemoveVariable;
+
+ protected override void RemoveSessionVariable(string name)
+ {
+ NamePassedToRemoveVariable = name;
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InstallPackageCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InstallPackageCmdletTests.cs
index 46675f7fb9..037bbb8380 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InstallPackageCmdletTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InstallPackageCmdletTests.cs
@@ -19,7 +19,7 @@ namespace PackageManagement.Cmdlets.Tests
TestableInstallPackageCmdlet cmdlet;
FakeCmdletTerminatingError fakeTerminatingError;
FakePackageManagementProject fakeProject;
- FakeInstallPackageAction fakeInstallPackageTask;
+ FakeInstallPackageAction fakeInstallPackageAction;
void CreateCmdletWithoutActiveProject()
{
@@ -27,7 +27,7 @@ namespace PackageManagement.Cmdlets.Tests
fakeTerminatingError = cmdlet.FakeCmdletTerminatingError;
fakeConsoleHost = cmdlet.FakePackageManagementConsoleHost;
fakeProject = fakeConsoleHost.FakeProject;
- fakeInstallPackageTask = fakeProject.FakeInstallPackageAction;
+ fakeInstallPackageAction = fakeProject.FakeInstallPackageAction;
}
void CreateCmdletWithActivePackageSourceAndProject()
@@ -97,7 +97,7 @@ namespace PackageManagement.Cmdlets.Tests
SetIdParameter("Test");
RunCmdlet();
- var actualPackageId = fakeInstallPackageTask.PackageId;
+ var actualPackageId = fakeInstallPackageAction.PackageId;
Assert.AreEqual("Test", actualPackageId);
}
@@ -111,7 +111,7 @@ namespace PackageManagement.Cmdlets.Tests
EnableIgnoreDependenciesParameter();
RunCmdlet();
- bool result = fakeInstallPackageTask.IgnoreDependencies;
+ bool result = fakeInstallPackageAction.IgnoreDependencies;
Assert.IsTrue(result);
}
@@ -124,7 +124,7 @@ namespace PackageManagement.Cmdlets.Tests
SetIdParameter("Test");
RunCmdlet();
- bool result = fakeInstallPackageTask.IgnoreDependencies;
+ bool result = fakeInstallPackageAction.IgnoreDependencies;
Assert.IsFalse(result);
}
@@ -154,7 +154,7 @@ namespace PackageManagement.Cmdlets.Tests
SetVersionParameter(version);
RunCmdlet();
- var actualVersion = fakeInstallPackageTask.PackageVersion;
+ var actualVersion = fakeInstallPackageAction.PackageVersion;
Assert.AreEqual(version, actualVersion);
}
@@ -167,7 +167,7 @@ namespace PackageManagement.Cmdlets.Tests
SetIdParameter("Test");
RunCmdlet();
- var actualVersion = fakeInstallPackageTask.PackageVersion;
+ var actualVersion = fakeInstallPackageAction.PackageVersion;
Assert.IsNull(actualVersion);
}
@@ -210,9 +210,23 @@ namespace PackageManagement.Cmdlets.Tests
SetIdParameter("Test");
RunCmdlet();
- bool result = fakeInstallPackageTask.IsExecuteCalled;
+ bool result = fakeInstallPackageAction.IsExecuteCalled;
Assert.IsTrue(result);
}
+
+ [Test]
+ public void ProcessRecord_PackageIdSpecified_CmdletUsedAsScriptSession()
+ {
+ CreateCmdletWithoutActiveProject();
+ AddDefaultProjectToConsoleHost();
+ var packageSource = AddPackageSourceToConsoleHost();
+ SetIdParameter("Test");
+ RunCmdlet();
+
+ var actualSession = fakeInstallPackageAction.PackageScriptSession;
+
+ Assert.AreEqual(cmdlet, actualSession);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs
index c36ae5103f..d23e374cc1 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs
@@ -17,6 +17,11 @@ namespace PackageManagement.Cmdlets.Tests
cmdlet = new TestablePackageManagementCmdlet(null);
}
+ void CreateCmdlet()
+ {
+ cmdlet = new TestablePackageManagementCmdlet();
+ }
+
[Test]
public void ThrowProjectNotOpenTerminatingError_TerminatingErrorIsNull_NullReferenceExceptionIsNotThrown()
{
@@ -24,5 +29,85 @@ namespace PackageManagement.Cmdlets.Tests
Assert.DoesNotThrow(() => cmdlet.CallThrowProjectNotOpenTerminatingError());
}
+
+ [Test]
+ public void GetEnvironmentPath_MethodCalled_ReturnsEnvPathFromSessionState()
+ {
+ CreateCmdlet();
+ object expectedPath = "Test";
+ cmdlet.GetSessionVariableReturnValue = expectedPath;
+
+ object path = cmdlet.GetEnvironmentPath();
+
+ Assert.AreEqual(expectedPath, path);
+ }
+
+ [Test]
+ public void GetEnvironmentPath_MethodCalled_EnvPathVariableRetrievedFromSessionState()
+ {
+ CreateCmdlet();
+ cmdlet.GetSessionVariableReturnValue = "Test";
+
+ cmdlet.GetEnvironmentPath();
+
+ string variableName = cmdlet.NamePassedToGetSessionVariable;
+
+ Assert.AreEqual("env:path", variableName);
+ }
+
+ [Test]
+ public void SetEnvironmentPath_PathSet_EnvPathVariableUpdated()
+ {
+ CreateCmdlet();
+ cmdlet.SetEnvironmentPath("Test");
+
+ string variableName = cmdlet.NamePassedToSetSessionVariable;
+
+ Assert.AreEqual("env:path", variableName);
+ }
+
+ [Test]
+ public void SetEnvironmentPath_PathSet_EnvPathUpdated()
+ {
+ CreateCmdlet();
+ cmdlet.SetEnvironmentPath("Test");
+
+ object path = cmdlet.ValuePassedToSetSessionVariable;
+
+ Assert.AreEqual("Test", path);
+ }
+
+ [Test]
+ public void AddVariable_NameAndValuePassed_VariableWithNameIsUpdated()
+ {
+ CreateCmdlet();
+ cmdlet.AddVariable("Test", "Value");
+
+ string variableName = cmdlet.NamePassedToSetSessionVariable;
+
+ Assert.AreEqual("Test", variableName);
+ }
+
+ [Test]
+ public void AddVariable_NameAndValuePassed_VariableValueUpdated()
+ {
+ CreateCmdlet();
+ cmdlet.AddVariable("Test", "Value");
+
+ object value = cmdlet.ValuePassedToSetSessionVariable;
+
+ Assert.AreEqual("Value", value);
+ }
+
+ [Test]
+ public void RemoveVariable_NamePassed_VariableRemoved()
+ {
+ CreateCmdlet();
+ cmdlet.RemoveVariable("Test");
+
+ string name = cmdlet.NamePassedToRemoveVariable;
+
+ Assert.AreEqual("Test", name);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UninstallPackageCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UninstallPackageCmdletTests.cs
index 7f7922c627..e591a5e925 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UninstallPackageCmdletTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UninstallPackageCmdletTests.cs
@@ -221,5 +221,19 @@ namespace PackageManagement.Cmdlets.Tests
Assert.IsTrue(uninstallPackageAction.IsExecuted);
}
+
+ [Test]
+ public void ProcessRecord_PackageIdSpecified_CmdletUsedAsScriptSession()
+ {
+ CreateCmdletWithoutActiveProject();
+ AddDefaultProjectToConsoleHost();
+ var packageSource = AddPackageSourceToConsoleHost();
+ SetIdParameter("Test");
+ RunCmdlet();
+
+ var actualSession = uninstallPackageAction.PackageScriptSession;
+
+ Assert.AreEqual(cmdlet, actualSession);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs
index 8e40dc336d..7eb710af82 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs
@@ -217,7 +217,7 @@ namespace PackageManagement.Cmdlets.Tests
{
CreateCmdletWithoutActiveProject();
AddDefaultProjectToConsoleHost();
- var packageSource = AddPackageSourceToConsoleHost();
+ AddPackageSourceToConsoleHost();
SetIdParameter("Test");
RunCmdlet();
@@ -225,5 +225,19 @@ namespace PackageManagement.Cmdlets.Tests
Assert.IsTrue(executed);
}
+
+ [Test]
+ public void ProcessRecord_PackageIdSpecified_CmdletUsedAsScriptSession()
+ {
+ CreateCmdletWithoutActiveProject();
+ AddDefaultProjectToConsoleHost();
+ AddPackageSourceToConsoleHost();
+ SetIdParameter("Test");
+ RunCmdlet();
+
+ var actualSession = fakeUpdatePackageAction.PackageScriptSession;
+
+ Assert.AreEqual(cmdlet, actualSession);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
index b6b8fd233e..cfcfe19da2 100644
--- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
+++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
@@ -58,6 +58,7 @@
+
@@ -167,7 +168,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeFileSystem.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeFileSystem.cs
index 676701d5ae..675430376e 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeFileSystem.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeFileSystem.cs
@@ -12,16 +12,15 @@ namespace ICSharpCode.PackageManagement.Design
public class FakeFileSystem : IFileSystem
{
public bool FileExistsReturnValue;
+ public string PathPassedToFileExists;
public string FileToReturnFromOpenFile;
public string PathToReturnFromGetFullPath;
+ public bool DirectoryExistsReturnValue;
+ public string PathPassedToDirectoryExists;
public ILogger Logger { get; set; }
- public string Root {
- get {
- throw new NotImplementedException();
- }
- }
+ public string Root { get; set; }
public void DeleteDirectory(string path, bool recursive)
{
@@ -55,12 +54,14 @@ namespace ICSharpCode.PackageManagement.Design
public bool FileExists(string path)
{
+ PathPassedToFileExists = path;
return FileExistsReturnValue;
}
public bool DirectoryExists(string path)
{
- throw new NotImplementedException();
+ PathPassedToDirectoryExists = path;
+ return DirectoryExistsReturnValue;
}
public void AddFile(string path, Stream stream)
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeInstallPackageTask.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeInstallPackageTask.cs
index 44b7e1b423..6b6196c317 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeInstallPackageTask.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeInstallPackageTask.cs
@@ -7,8 +7,8 @@ namespace ICSharpCode.PackageManagement.Design
{
public class FakeInstallPackageAction : InstallPackageAction
{
- public FakeInstallPackageAction()
- : base((IPackageManagementProject)null, null)
+ public FakeInstallPackageAction(IPackageManagementProject project)
+ : base(project, null)
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
index f94f78f0cf..f00a8ee3de 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
@@ -6,12 +6,24 @@ using System.Collections.Generic;
using System.Linq;
using ICSharpCode.PackageManagement;
+using ICSharpCode.PackageManagement.EnvDTE;
using NuGet;
namespace ICSharpCode.PackageManagement.Design
{
public class FakePackageManagementProject : IPackageManagementProject
{
+ public FakePackageManagementProject()
+ {
+ FakeInstallPackageAction = new FakeInstallPackageAction(this);
+ FakeUninstallPackageAction = new FakeUninstallPackageAction(this);
+ FakeUpdatePackageAction = new FakeUpdatePackageAction(this);
+ }
+
+ public FakeInstallPackageAction FakeInstallPackageAction;
+ public FakeUpdatePackageAction FakeUpdatePackageAction;
+ public FakeUninstallPackageAction FakeUninstallPackageAction;
+
public bool IsInstalledReturnValue;
public IPackage PackagePassedToIsInstalled;
@@ -87,25 +99,62 @@ namespace ICSharpCode.PackageManagement.Design
UpdateDependenciesPassedToUpdatePackage = updateDependencies;
}
- public FakeInstallPackageAction FakeInstallPackageAction = new FakeInstallPackageAction();
-
public virtual InstallPackageAction CreateInstallPackageAction()
{
return FakeInstallPackageAction;
}
- public FakeUninstallPackageAction FakeUninstallPackageAction = new FakeUninstallPackageAction();
-
public virtual UninstallPackageAction CreateUninstallPackageAction()
{
return FakeUninstallPackageAction;
}
-
- public FakeUpdatePackageAction FakeUpdatePackageAction = new FakeUpdatePackageAction();
-
+
public UpdatePackageAction CreateUpdatePackageAction()
{
return FakeUpdatePackageAction;
}
+
+ public event EventHandler PackageInstalled;
+
+ public void FirePackageInstalledEvent(PackageOperationEventArgs e)
+ {
+ if (PackageInstalled != null) {
+ PackageInstalled(this, e);
+ }
+ }
+
+ public event EventHandler PackageUninstalled;
+
+ public void FirePackageUninstalledEvent(PackageOperationEventArgs e)
+ {
+ if (PackageUninstalled != null) {
+ PackageUninstalled(this, e);
+ }
+ }
+
+ public event EventHandler PackageReferenceAdded;
+
+ public void FirePackageReferenceAddedEvent(PackageOperationEventArgs e)
+ {
+ if (PackageReferenceAdded != null) {
+ PackageReferenceAdded(this, e);
+ }
+ }
+
+ public event EventHandler PackageReferenceRemoved;
+
+ public void FirePackageReferenceRemovedEvent(PackageOperationEventArgs e)
+ {
+ if (PackageReferenceRemoved != null) {
+ PackageReferenceRemoved(this, e);
+ }
+ }
+
+ public Project DTEProject = new Project();
+
+ public Project ConvertToDTEProject()
+ {
+ return DTEProject;
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManager.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManager.cs
index e1c3aa3c74..b038499e56 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManager.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManager.cs
@@ -37,7 +37,7 @@ namespace ICSharpCode.PackageManagement.Design
}
#pragma warning disable 67
- public event EventHandler PackageInstalled;
+ public event EventHandler PackageInstalled;
public event EventHandler PackageInstalling;
public event EventHandler PackageUninstalled;
public event EventHandler PackageUninstalling;
@@ -141,5 +141,15 @@ namespace ICSharpCode.PackageManagement.Design
PackageOperationsPassedToUpdatePackage = operations;
UpdateDependenciesPassedToUpdatePackage = updateDependencies;
}
+
+ public void FirePackageInstalled(PackageOperationEventArgs e)
+ {
+ PackageInstalled(this, e);
+ }
+
+ public void FirePackageUninstalled(PackageOperationEventArgs e)
+ {
+ PackageUninstalled(this, e);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs
index 6dd0da4369..a2ce40a025 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeProjectManager.cs
@@ -35,9 +35,17 @@ namespace ICSharpCode.PackageManagement.Design
}
}
+ public event EventHandler PackageReferenceRemoved;
+
+ protected virtual void OnPackageReferenceRemoved(IPackage package)
+ {
+ if (PackageReferenceRemoved != null) {
+ PackageReferenceRemoved(this, new PackageOperationEventArgs(package, String.Empty));
+ }
+ }
+
#pragma warning disable 67
public event EventHandler PackageReferenceAdding;
- public event EventHandler PackageReferenceRemoved;
public event EventHandler PackageReferenceRemoving;
#pragma warning restore 67
@@ -80,5 +88,10 @@ namespace ICSharpCode.PackageManagement.Design
{
OnPackageReferenceAdded(package);
}
+
+ public void FirePackageReferenceRemoved(IPackage package)
+ {
+ OnPackageReferenceRemoved(package);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUninstallPackageAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUninstallPackageAction.cs
index 853eddd604..1744cb4815 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUninstallPackageAction.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUninstallPackageAction.cs
@@ -9,8 +9,8 @@ namespace ICSharpCode.PackageManagement.Design
{
public bool IsExecuted;
- public FakeUninstallPackageAction()
- : base((IPackageManagementProject)null, null)
+ public FakeUninstallPackageAction(IPackageManagementProject project)
+ : base(project, null)
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUpdatePackageAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUpdatePackageAction.cs
index 200e06ebca..a143fd9988 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUpdatePackageAction.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakeUpdatePackageAction.cs
@@ -9,8 +9,8 @@ namespace ICSharpCode.PackageManagement.Design
{
public bool IsExecuted;
- public FakeUpdatePackageAction()
- : base((IPackageManagementProject)null, null)
+ public FakeUpdatePackageAction(IPackageManagementProject project)
+ : base(project, null)
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
new file mode 100644
index 0000000000..391e5f7c3e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
@@ -0,0 +1,11 @@
+// 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.EnvDTE
+{
+ public class Project
+ {
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
index 309ea6ef34..dd075f3612 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
@@ -5,15 +5,23 @@ using System;
using System.Collections.Generic;
using System.Linq;
+using ICSharpCode.PackageManagement.EnvDTE;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public interface IPackageManagementProject
{
+ event EventHandler PackageInstalled;
+ event EventHandler PackageUninstalled;
+ event EventHandler PackageReferenceAdded;
+ event EventHandler PackageReferenceRemoved;
+
ILogger Logger { get; set; }
IPackageRepository SourceRepository { get; }
+ Project ConvertToDTEProject();
+
bool IsInstalled(IPackage package);
IQueryable GetPackages();
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
index bd445a4b6f..de4477cfea 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
+using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Project;
using NuGet;
@@ -42,6 +43,26 @@ namespace ICSharpCode.PackageManagement
}
}
+ public event EventHandler PackageInstalled {
+ add { packageManager.PackageInstalled += value; }
+ remove { packageManager.PackageInstalled -= value; }
+ }
+
+ public event EventHandler PackageUninstalled {
+ add { packageManager.PackageUninstalled += value; }
+ remove { packageManager.PackageUninstalled -= value; }
+ }
+
+ public event EventHandler PackageReferenceAdded {
+ add { projectManager.PackageReferenceAdded += value; }
+ remove { projectManager.PackageReferenceAdded -= value; }
+ }
+
+ public event EventHandler PackageReferenceRemoved {
+ add { projectManager.PackageReferenceRemoved += value; }
+ remove { projectManager.PackageReferenceRemoved -= value; }
+ }
+
public bool IsInstalled(IPackage package)
{
return projectManager.IsInstalled(package);
@@ -86,5 +107,10 @@ namespace ICSharpCode.PackageManagement
{
return new UpdatePackageAction(this, packageManagementEvents);
}
+
+ public Project ConvertToDTEProject()
+ {
+ return null;
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
index 310de59a89..5e32cf53f5 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
@@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
+using ICSharpCode.PackageManagement.Scripting;
using ICSharpCode.SharpDevelop.Project;
using NuGet;
@@ -24,6 +25,7 @@ namespace ICSharpCode.PackageManagement
public IPackage Package { get; set; }
public Version PackageVersion { get; set; }
public string PackageId { get; set; }
+ public IPackageScriptSession PackageScriptSession { get; set; }
protected void OnParentPackageInstalled()
{
@@ -38,7 +40,9 @@ namespace ICSharpCode.PackageManagement
public void Execute()
{
BeforeExecute();
- ExecuteCore();
+ using (RunPackageScriptsAction runScriptsAction = CreateRunPackageScriptsAction()) {
+ ExecuteCore();
+ }
}
protected virtual void BeforeExecute()
@@ -48,6 +52,18 @@ namespace ICSharpCode.PackageManagement
GetPackageIfMissing();
}
+ RunPackageScriptsAction CreateRunPackageScriptsAction()
+ {
+ return CreateRunPackageScriptsAction(PackageScriptSession, Project);
+ }
+
+ protected virtual RunPackageScriptsAction CreateRunPackageScriptsAction(
+ IPackageScriptSession session,
+ IPackageManagementProject project)
+ {
+ return new RunPackageScriptsAction(session, project);
+ }
+
protected virtual void ExecuteCore()
{
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs
new file mode 100644
index 0000000000..57d5cfaa0e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScript.cs
@@ -0,0 +1,14 @@
+// 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 interface IPackageScript
+ {
+ IPackageManagementProject Project { get; set; }
+
+ void Execute();
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScriptFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScriptFactory.cs
new file mode 100644
index 0000000000..0ad7a29679
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScriptFactory.cs
@@ -0,0 +1,15 @@
+// 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 NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public interface IPackageScriptFactory
+ {
+ IPackageScript CreatePackageInitializeScript(string packageInstallDirectory);
+ IPackageScript CreatePackageUninstallScript(string packageInstallDirectory);
+ IPackageScript CreatePackageInstallScript(string packageInstallDirectory);
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScriptSession.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScriptSession.cs
new file mode 100644
index 0000000000..2dffa79f24
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageScriptSession.cs
@@ -0,0 +1,18 @@
+// 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 interface IPackageScriptSession
+ {
+ void SetEnvironmentPath(string path);
+ string GetEnvironmentPath();
+
+ void AddVariable(string name, object value);
+ void RemoveVariable(string name);
+
+ void InvokeScript(string script);
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializeScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializeScript.cs
new file mode 100644
index 0000000000..b8563585c2
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializeScript.cs
@@ -0,0 +1,37 @@
+// 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 NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageInitializeScript : PackageScript
+ {
+ public PackageInitializeScript(
+ PackageInitializeScriptFileName fileName,
+ IPackageScriptSession session)
+ : base(fileName, session)
+ {
+ }
+
+ protected override void BeforeExecute()
+ {
+ AddScriptDirectoryToEnvironmentPath();
+ }
+
+ void AddScriptDirectoryToEnvironmentPath()
+ {
+ if (ScriptFileName.ScriptDirectoryExists()) {
+ string directory = ScriptFileName.GetScriptDirectory();
+ AddScriptDirectoryToEnvironmentPath(directory);
+ }
+ }
+
+ void AddScriptDirectoryToEnvironmentPath(string directory)
+ {
+ var environmentPath = new PowerShellSessionEnvironmentPath(Session);
+ environmentPath.Append(directory);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializeScriptFileName.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializeScriptFileName.cs
new file mode 100644
index 0000000000..c264e58a1e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInitializeScriptFileName.cs
@@ -0,0 +1,26 @@
+// 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.IO;
+using NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageInitializeScriptFileName : PackageScriptFileName
+ {
+ public PackageInitializeScriptFileName(string packageInstallDirectory)
+ : base(packageInstallDirectory)
+ {
+ }
+
+ public PackageInitializeScriptFileName(IFileSystem fileSystem)
+ : base(fileSystem)
+ {
+ }
+
+ public override string Name {
+ get { return "init.ps1"; }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInstallScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInstallScript.cs
new file mode 100644
index 0000000000..7108fcf4bf
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInstallScript.cs
@@ -0,0 +1,17 @@
+// 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 PackageInstallScript : PackageScript
+ {
+ public PackageInstallScript(
+ PackageInstallScriptFileName fileName,
+ IPackageScriptSession session)
+ : base(fileName, session)
+ {
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInstallScriptFileName.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInstallScriptFileName.cs
new file mode 100644
index 0000000000..6a77c46022
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageInstallScriptFileName.cs
@@ -0,0 +1,25 @@
+// 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 NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageInstallScriptFileName : PackageScriptFileName
+ {
+ public PackageInstallScriptFileName(string packageInstallDirectory)
+ : base(packageInstallDirectory)
+ {
+ }
+
+ public PackageInstallScriptFileName(IFileSystem fileSystem)
+ : base(fileSystem)
+ {
+ }
+
+ public override string Name {
+ get { return "install.ps1"; }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs
new file mode 100644
index 0000000000..cbe4aa29ed
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScript.cs
@@ -0,0 +1,75 @@
+// 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.EnvDTE;
+using NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageScript : IPackageScript
+ {
+ public PackageScript(
+ PackageScriptFileName fileName,
+ IPackageScriptSession session)
+ {
+ this.ScriptFileName = fileName;
+ this.Session = session;
+ }
+
+ protected PackageScriptFileName ScriptFileName { get; private set; }
+ protected IPackageScriptSession Session { get; private set; }
+
+ public IPackage Package { get; set; }
+ public IPackageManagementProject Project { get; set; }
+
+ public void Execute()
+ {
+ BeforeExecute();
+ AddSessionVariables();
+ ExecuteScript();
+ RemoveSessionVariables();
+ }
+
+ protected virtual void BeforeExecute()
+ {
+ }
+
+ void AddSessionVariables()
+ {
+ Session.AddVariable("__rootPath", ScriptFileName.PackageInstallDirectory);
+ Session.AddVariable("__toolsPath", ScriptFileName.GetScriptDirectory());
+ Session.AddVariable("__package", Package);
+ Session.AddVariable("__project", GetProject());
+ }
+
+ Project GetProject()
+ {
+ if (Project != null) {
+ return Project.ConvertToDTEProject();
+ }
+ return null;
+ }
+
+ void ExecuteScript()
+ {
+ string script = GetScript();
+ Session.InvokeScript(script);
+ }
+
+ string GetScript()
+ {
+ return String.Format(
+ "& '{0}' $__rootPath $__toolsPath $__package $__project",
+ ScriptFileName);
+ }
+
+ void RemoveSessionVariables()
+ {
+ Session.RemoveVariable("__rootPath");
+ Session.RemoveVariable("__toolsPath");
+ Session.RemoveVariable("__package");
+ Session.RemoveVariable("__project");
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptFactory.cs
new file mode 100644
index 0000000000..3d95676d4b
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptFactory.cs
@@ -0,0 +1,36 @@
+// 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 NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageScriptFactory : IPackageScriptFactory
+ {
+ IPackageScriptSession session;
+
+ public PackageScriptFactory(IPackageScriptSession session)
+ {
+ this.session = session;
+ }
+
+ public IPackageScript CreatePackageInitializeScript(string packageInstallDirectory)
+ {
+ var scriptFileName = new PackageInitializeScriptFileName(packageInstallDirectory);
+ return new PackageInitializeScript(scriptFileName, session);
+ }
+
+ public IPackageScript CreatePackageUninstallScript(string packageInstallDirectory)
+ {
+ var scriptFileName = new PackageUninstallScriptFileName(packageInstallDirectory);
+ return new PackageUninstallScript(scriptFileName, session);
+ }
+
+ public IPackageScript CreatePackageInstallScript(string packageInstallDirectory)
+ {
+ var scriptFileName = new PackageInstallScriptFileName(packageInstallDirectory);
+ return new PackageInstallScript(scriptFileName, session);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptFileName.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptFileName.cs
new file mode 100644
index 0000000000..998aa788b2
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptFileName.cs
@@ -0,0 +1,57 @@
+// 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.IO;
+using NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public abstract class PackageScriptFileName
+ {
+ IFileSystem fileSystem;
+ string relativeScriptFilePath;
+
+ public PackageScriptFileName(string packageInstallDirectory)
+ : this(new PhysicalFileSystem(packageInstallDirectory))
+ {
+ }
+
+ public PackageScriptFileName(IFileSystem fileSystem)
+ {
+ this.fileSystem = fileSystem;
+ GetRelativeScriptFilePath();
+ }
+
+ void GetRelativeScriptFilePath()
+ {
+ relativeScriptFilePath = Path.Combine("tools", Name);
+ }
+
+ public abstract string Name { get; }
+
+ public string PackageInstallDirectory {
+ get { return fileSystem.Root; }
+ }
+
+ public override string ToString()
+ {
+ return fileSystem.GetFullPath(relativeScriptFilePath);
+ }
+
+ public bool ScriptDirectoryExists()
+ {
+ return fileSystem.DirectoryExists("tools");
+ }
+
+ public bool FileExists()
+ {
+ return fileSystem.FileExists(relativeScriptFilePath);
+ }
+
+ public string GetScriptDirectory()
+ {
+ return fileSystem.GetFullPath("tools");
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageUninstallScript.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageUninstallScript.cs
new file mode 100644
index 0000000000..717ea3afad
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageUninstallScript.cs
@@ -0,0 +1,17 @@
+// 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 PackageUninstallScript : PackageScript
+ {
+ public PackageUninstallScript(
+ PackageUninstallScriptFileName fileName,
+ IPackageScriptSession session)
+ : base(fileName, session)
+ {
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageUninstallScriptFileName.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageUninstallScriptFileName.cs
new file mode 100644
index 0000000000..0a3e17f5bb
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageUninstallScriptFileName.cs
@@ -0,0 +1,25 @@
+// 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 NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageUninstallScriptFileName : PackageScriptFileName
+ {
+ public PackageUninstallScriptFileName(string packageInstallDirectory)
+ : base(packageInstallDirectory)
+ {
+ }
+
+ public PackageUninstallScriptFileName(IFileSystem fileSystem)
+ : base(fileSystem)
+ {
+ }
+
+ public override string Name {
+ get { return "uninstall.ps1"; }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellSessionEnvironmentPath.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellSessionEnvironmentPath.cs
new file mode 100644
index 0000000000..f8e8cfe7cf
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellSessionEnvironmentPath.cs
@@ -0,0 +1,46 @@
+// 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 PowerShellSessionEnvironmentPath
+ {
+ IPackageScriptSession session;
+
+ public PowerShellSessionEnvironmentPath(IPackageScriptSession session)
+ {
+ this.session = session;
+ }
+
+ public void Append(string path)
+ {
+ string environmentPath = GetEnvironmentPath();
+ environmentPath = AppendPathSeparatorIfMissing(environmentPath);
+ SetEnvironmentPath(environmentPath + path);
+ }
+
+ string GetEnvironmentPath()
+ {
+ return session.GetEnvironmentPath();
+ }
+
+ string AppendPathSeparatorIfMissing(string path)
+ {
+ if (String.IsNullOrEmpty(path)) {
+ return String.Empty;
+ }
+
+ if (path.EndsWith(";")) {
+ return path;
+ }
+ return path + ";";
+ }
+
+ void SetEnvironmentPath(string path)
+ {
+ session.SetEnvironmentPath(path);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/RunPackageScriptsAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/RunPackageScriptsAction.cs
new file mode 100644
index 0000000000..721d64bddf
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/RunPackageScriptsAction.cs
@@ -0,0 +1,88 @@
+// 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 NuGet;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class RunPackageScriptsAction : IDisposable
+ {
+ IPackageManagementProject project;
+ IPackageScriptFactory scriptFactory;
+
+ public RunPackageScriptsAction(
+ IPackageScriptSession session,
+ IPackageManagementProject project)
+ : this(project, new PackageScriptFactory(session))
+ {
+ }
+
+ public RunPackageScriptsAction(
+ IPackageManagementProject project,
+ IPackageScriptFactory scriptFactory)
+ {
+ this.project = project;
+ this.scriptFactory = scriptFactory;
+
+ RegisterEvents();
+ }
+
+ void RegisterEvents()
+ {
+ project.PackageInstalled += PackageInstalled;
+ project.PackageReferenceAdded += PackageReferenceAdded;
+ project.PackageReferenceRemoved += PackageReferenceRemoved;
+ }
+
+ void UnregisterEvents()
+ {
+ project.PackageInstalled -= PackageInstalled;
+ project.PackageReferenceAdded -= PackageReferenceAdded;
+ project.PackageReferenceRemoved -= PackageReferenceRemoved;
+ }
+
+ void PackageInstalled(object sender, PackageOperationEventArgs e)
+ {
+ RunInitScript(e);
+ }
+
+ void PackageReferenceRemoved(object sender, PackageOperationEventArgs e)
+ {
+ RunUninstallScript(e);
+ }
+
+ void PackageReferenceAdded(object sender, PackageOperationEventArgs e)
+ {
+ RunInstallScript(e);
+ }
+
+ void RunInitScript(PackageOperationEventArgs e)
+ {
+ IPackageScript script = scriptFactory.CreatePackageInitializeScript(e.InstallPath);
+ script.Execute();
+ }
+
+ void RunUninstallScript(PackageOperationEventArgs e)
+ {
+ IPackageScript script = scriptFactory.CreatePackageUninstallScript(e.InstallPath);
+ script.Project = project;
+ script.Execute();
+ }
+
+ void RunInstallScript(PackageOperationEventArgs e)
+ {
+ IPackageScript script = scriptFactory.CreatePackageInstallScript(e.InstallPath);
+ script.Project = project;
+ script.Execute();
+ }
+
+ public void Dispose()
+ {
+ IsDisposed = true;
+ UnregisterEvents();
+ }
+
+ public bool IsDisposed { get; private set; }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
index 167a4ca8a0..56a57b9168 100644
--- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
+++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
@@ -77,7 +77,10 @@
+
+
+
@@ -154,6 +157,12 @@
+
+
+
+
+
+
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs
new file mode 100644
index 0000000000..9429ffd3f7
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScript.cs
@@ -0,0 +1,21 @@
+// 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;
+using ICSharpCode.PackageManagement.Scripting;
+
+namespace PackageManagement.Tests.Helpers
+{
+ public class FakePackageScript : IPackageScript
+ {
+ public bool IsExecuted;
+
+ public void Execute()
+ {
+ IsExecuted = true;
+ }
+
+ public IPackageManagementProject Project { get; set; }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs
new file mode 100644
index 0000000000..efc88f25a3
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageScriptFactory.cs
@@ -0,0 +1,35 @@
+// 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 NuGet;
+
+namespace PackageManagement.Tests.Helpers
+{
+ public class FakePackageScriptFactory : IPackageScriptFactory
+ {
+ public string PackageInstallDirectoryPassed;
+ public FakePackageScript FakePackageInitializeScript = new FakePackageScript();
+ public FakePackageScript FakePackageInstallScript = new FakePackageScript();
+ public FakePackageScript FakePackageUninstallScript = new FakePackageScript();
+
+ public IPackageScript CreatePackageInitializeScript(string packageInstallDirectory)
+ {
+ PackageInstallDirectoryPassed = packageInstallDirectory;
+ return FakePackageInitializeScript;
+ }
+
+ public IPackageScript CreatePackageUninstallScript(string packageInstallDirectory)
+ {
+ PackageInstallDirectoryPassed = packageInstallDirectory;
+ return FakePackageUninstallScript;
+ }
+
+ public IPackageScript CreatePackageInstallScript(string packageInstallDirectory)
+ {
+ PackageInstallDirectoryPassed = packageInstallDirectory;
+ return FakePackageInstallScript;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellSession.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellSession.cs
new file mode 100644
index 0000000000..5ccf061808
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellSession.cs
@@ -0,0 +1,45 @@
+// 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 FakePackageScriptSession : IPackageScriptSession
+ {
+ public string EnvironmentPath = String.Empty;
+
+ public void SetEnvironmentPath(string path)
+ {
+ EnvironmentPath = path;
+ }
+
+ public string GetEnvironmentPath()
+ {
+ return EnvironmentPath;
+ }
+
+ public Dictionary VariablesAdded = new Dictionary();
+
+ public void AddVariable(string name, object value)
+ {
+ VariablesAdded.Add(name, value);
+ }
+
+ public List VariablesRemoved = new List();
+
+ public void RemoveVariable(string name)
+ {
+ VariablesRemoved.Add(name);
+ }
+
+ public string ScriptPassedToInvokeScript;
+
+ public void InvokeScript(string script)
+ {
+ ScriptPassedToInvokeScript = script;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProcessPackageAction.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProcessPackageAction.cs
index b53142cbf1..0d4dda79e3 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProcessPackageAction.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProcessPackageAction.cs
@@ -4,6 +4,7 @@
using System;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
+using ICSharpCode.PackageManagement.Scripting;
namespace PackageManagement.Tests.Helpers
{
@@ -32,5 +33,25 @@ namespace PackageManagement.Tests.Helpers
{
base.BeforeExecute();
}
+
+ public bool IsRunPackageScriptsActionCreated;
+ public IPackageScriptSession SessionPassedToCreateRunPackageScriptsAction;
+ public IPackageManagementProject ProjectPassedToCreateRunPackageScriptsAction;
+ public RunPackageScriptsAction RunPackageScriptsAction;
+
+ protected override RunPackageScriptsAction CreateRunPackageScriptsAction(
+ IPackageScriptSession session,
+ IPackageManagementProject project)
+ {
+ IsRunPackageScriptsActionCreated = true;
+ SessionPassedToCreateRunPackageScriptsAction = session;
+ ProjectPassedToCreateRunPackageScriptsAction = project;
+ RunPackageScriptsAction = base.CreateRunPackageScriptsAction(session, project);
+ return RunPackageScriptsAction;
+ }
+
+ public bool IsRunPackageScriptsActionDisposed {
+ get { return RunPackageScriptsAction.IsDisposed; }
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
index 0c54174530..f8a1e9fe9b 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
@@ -368,5 +368,57 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedLogger, actualLogger);
}
+
+ [Test]
+ public void PackageInstalled_PackagerManagerPackageInstalledEventFired_EventFiresWithPackage()
+ {
+ CreateProject();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageInstalled += (sender, e) => eventArgs = e;
+
+ var expectedEventArgs = new PackageOperationEventArgs(new FakePackage(), String.Empty);
+ fakePackageManager.FirePackageInstalled(expectedEventArgs);
+
+ Assert.AreEqual(expectedEventArgs, eventArgs);
+ }
+
+ [Test]
+ public void PackageUninstalled_PackagerManagerPackageUninstalledEventFired_EventFiresWithPackage()
+ {
+ CreateProject();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageUninstalled += (sender, e) => eventArgs = e;
+
+ var expectedEventArgs = new PackageOperationEventArgs(new FakePackage(), String.Empty);
+ fakePackageManager.FirePackageUninstalled(expectedEventArgs);
+
+ Assert.AreEqual(expectedEventArgs, eventArgs);
+ }
+
+ [Test]
+ public void PackageReferenceAdded_ProjectManagerPackageReferenceAddedEventFired_EventFiresWithPackage()
+ {
+ CreateProject();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageReferenceAdded += (sender, e) => eventArgs = e;
+
+ var expectedPackage = new FakePackage();
+ fakeProjectManager.FirePackageReferenceAdded(expectedPackage);
+
+ Assert.AreEqual(expectedPackage, eventArgs.Package);
+ }
+
+ [Test]
+ public void PackageReferenceRemoved_ProjectManagerPackageReferenceRemovedEventFired_EventFiresWithPackage()
+ {
+ CreateProject();
+ PackageOperationEventArgs eventArgs = null;
+ project.PackageReferenceRemoved += (sender, e) => eventArgs = e;
+
+ var expectedPackage = new FakePackage();
+ fakeProjectManager.FirePackageReferenceRemoved(expectedPackage);
+
+ Assert.AreEqual(expectedPackage, eventArgs.Package);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/ProcessPackageActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/ProcessPackageActionTests.cs
index 662b56a0d9..8e71ae7bd6 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/ProcessPackageActionTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/ProcessPackageActionTests.cs
@@ -63,6 +63,41 @@ namespace PackageManagement.Tests
ILogger actualLogger = fakeProject.Logger;
Assert.AreEqual(expectedLogger, actualLogger);
- }
+ }
+
+ [Test]
+ public void Execute_MethodCalled_RunPackageScriptsActionCreatedUsingPackageScriptSession()
+ {
+ CreateAction();
+ var expectedSession = new FakePackageScriptSession();
+ action.PackageScriptSession = expectedSession;
+ action.Execute();
+
+ var actualSession = action.SessionPassedToCreateRunPackageScriptsAction;
+
+ Assert.AreEqual(expectedSession, actualSession);
+ }
+
+ [Test]
+ public void Execute_MethodCalled_RunPackageScriptsActionCreatedUsingProject()
+ {
+ CreateAction();
+ var expectedProject = new FakePackageManagementProject();
+ action.Project = expectedProject;
+ action.Execute();
+
+ var actualProject = action.ProjectPassedToCreateRunPackageScriptsAction;
+
+ Assert.AreEqual(expectedProject, actualProject);
+ }
+
+ [Test]
+ public void Execute_MethodCalled_RunPackageScriptsActionIsDisposed()
+ {
+ CreateAction();
+ action.Execute();
+
+ Assert.IsTrue(action.IsRunPackageScriptsActionDisposed);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializeScriptFileNameTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializeScriptFileNameTests.cs
new file mode 100644
index 0000000000..723733184c
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializeScriptFileNameTests.cs
@@ -0,0 +1,142 @@
+// 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 NUnit.Framework;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class PackageInitializeScriptFileNameTests
+ {
+ PackageInitializeScriptFileName scriptFileName;
+ FakeFileSystem fakeFileSystem;
+
+ void CreateFileSystem()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ }
+
+ void CreateFileName(string installPath)
+ {
+ scriptFileName = new PackageInitializeScriptFileName(installPath);
+ }
+
+ void CreateFakeFileSystem()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ }
+
+ void CreateFileNameWithFakeFileSystem()
+ {
+ scriptFileName = new PackageInitializeScriptFileName(fakeFileSystem);
+ }
+
+ [Test]
+ public void ToString_InstallDirectoryPassed_ReturnsFullPathToInitScript()
+ {
+ CreateFileName(@"d:\projects\MyProject\packages\Test");
+
+ string actualFileName = scriptFileName.ToString();
+ string expectedFileName = @"d:\projects\MyProject\packages\Test\tools\init.ps1";
+
+ Assert.AreEqual(expectedFileName, actualFileName);
+ }
+
+ [Test]
+ public void PackageInstallDirectory_InstallDirectoryPassed_ReturnsFullPathToInitScript()
+ {
+ CreateFileName(@"d:\projects\MyProject\packages\Test");
+
+ string actualDirectory = scriptFileName.PackageInstallDirectory;
+ string expectedDirectory = @"d:\projects\MyProject\packages\Test";
+
+ Assert.AreEqual(expectedDirectory, actualDirectory);
+ }
+
+ [Test]
+ public void ScriptDirectoryExists_FileSystemHasScriptDirectory_ReturnsTrue()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.DirectoryExistsReturnValue = true;
+ CreateFileNameWithFakeFileSystem();
+
+ bool exists = scriptFileName.ScriptDirectoryExists();
+
+ Assert.IsTrue(exists);
+ }
+
+ [Test]
+ public void ScriptDirectoryExists_FileSystemDoesNotHaveScriptDirectory_ReturnsFalse()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.DirectoryExistsReturnValue = false;
+ CreateFileNameWithFakeFileSystem();
+
+ bool exists = scriptFileName.ScriptDirectoryExists();
+
+ Assert.IsFalse(exists);
+ }
+
+ [Test]
+ public void ScriptDirectoryExists_FileSystemHasScriptDirectory_ToolsDirectoryCheckedForExistence()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.DirectoryExistsReturnValue = true;
+ CreateFileNameWithFakeFileSystem();
+
+ scriptFileName.ScriptDirectoryExists();
+
+ Assert.AreEqual("tools", fakeFileSystem.PathPassedToDirectoryExists);
+ }
+
+ [Test]
+ public void FileExists_FileSystemHasScriptFile_ReturnsTrue()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.FileExistsReturnValue = true;
+ CreateFileNameWithFakeFileSystem();
+
+ bool exists = scriptFileName.FileExists();
+
+ Assert.IsTrue(exists);
+ }
+
+ [Test]
+ public void FileExists_FileSystemDoesNotHaveScriptFile_ReturnsFalse()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.FileExistsReturnValue = false;
+ CreateFileNameWithFakeFileSystem();
+
+ bool exists = scriptFileName.FileExists();
+
+ Assert.IsFalse(exists);
+ }
+
+ [Test]
+ public void FileExists_FileSystemHasScriptFile_ToolsScriptFileCheckedForExistence()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.FileExistsReturnValue = true;
+ CreateFileNameWithFakeFileSystem();
+
+ scriptFileName.FileExists();
+
+ Assert.AreEqual(@"tools\init.ps1", fakeFileSystem.PathPassedToFileExists);
+ }
+
+ [Test]
+ public void GetScriptDirectory_InstallDirectoryPassed_ReturnsInitScriptDirectory()
+ {
+ CreateFileName(@"d:\projects\MyProject\packages\Test");
+
+ string actualDirectory = scriptFileName.GetScriptDirectory();
+ string expectedDirectory = @"d:\projects\MyProject\packages\Test\tools";
+
+ Assert.AreEqual(expectedDirectory, actualDirectory);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializeScriptTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializeScriptTests.cs
new file mode 100644
index 0000000000..aa71e2801d
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInitializeScriptTests.cs
@@ -0,0 +1,224 @@
+// 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 NUnit.Framework;
+using PackageManagement.Tests.Helpers;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class PackageInitializeScriptTests
+ {
+ PackageInitializeScript script;
+ PackageInitializeScriptFileName scriptFileName;
+ FakeFileSystem fakeFileSystem;
+ FakePackageScriptSession fakeSession;
+
+ void CreateScript()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ fakeFileSystem.FileExistsReturnValue = true;
+ fakeFileSystem.DirectoryExistsReturnValue = true;
+ scriptFileName = new PackageInitializeScriptFileName(fakeFileSystem);
+
+ fakeSession = new FakePackageScriptSession();
+
+ script = new PackageInitializeScript(scriptFileName, fakeSession);
+ }
+
+ void CreateScriptWithPhysicalFileSystem()
+ {
+ CreateScriptWithPhysicalFileSystem(@"d:\projects\myproject\packages\test");
+ }
+
+ void CreateScriptWithPhysicalFileSystem(string packageInstallDirectory)
+ {
+ scriptFileName = new PackageInitializeScriptFileName(packageInstallDirectory);
+ fakeSession = new FakePackageScriptSession();
+ script = new PackageInitializeScript(scriptFileName, fakeSession);
+ }
+
+ void AssertSessionVariableIsRemoved(string variableName)
+ {
+ bool removed = fakeSession.VariablesRemoved.Contains(variableName);
+ Assert.IsTrue(removed);
+ }
+
+ [Test]
+ public void Execute_ExistingEnvironmentPathIsEmptyString_PathToScriptAddedToEnvironmentPath()
+ {
+ CreateScript();
+ fakeFileSystem.PathToReturnFromGetFullPath = @"d:\projects\myproject\packages\test";
+ fakeSession.SetEnvironmentPath(String.Empty);
+
+ script.Execute();
+
+ string actualEnvironmentPath = fakeSession.GetEnvironmentPath();
+ string expectedEnvironmentPath = @"d:\projects\myproject\packages\test";
+
+ Assert.AreEqual(expectedEnvironmentPath, actualEnvironmentPath);
+ }
+
+ [Test]
+ public void Execute_OneItemInOriginalEnvironmentPath_PathToScriptAppendedToEnvironmentPath()
+ {
+ CreateScript();
+ fakeFileSystem.PathToReturnFromGetFullPath = @"d:\projects\myproject\packages\test";
+ fakeSession.SetEnvironmentPath(@"c:\users\sharpdevelop\ps;");
+
+ script.Execute();
+
+ string actualEnvironmentPath = fakeSession.GetEnvironmentPath();
+ string expectedEnvironmentPath = @"c:\users\sharpdevelop\ps;d:\projects\myproject\packages\test";
+
+ Assert.AreEqual(expectedEnvironmentPath, actualEnvironmentPath);
+ }
+
+ [Test]
+ public void Execute_OneItemInOriginalEnvironmentPathMissingSemiColonAtEnd_PathToScriptAppendedToEnvironmentPathWithSemiColonAtStart()
+ {
+ CreateScript();
+ fakeFileSystem.PathToReturnFromGetFullPath = @"d:\projects\myproject\packages\test";
+ fakeSession.SetEnvironmentPath(@"c:\users\sharpdevelop\ps");
+
+ script.Execute();
+
+ string actualEnvironmentPath = fakeSession.GetEnvironmentPath();
+ string expectedEnvironmentPath = @"c:\users\sharpdevelop\ps;d:\projects\myproject\packages\test";
+
+ Assert.AreEqual(expectedEnvironmentPath, actualEnvironmentPath);
+ }
+
+ [Test]
+ public void Execute_OriginalEnvironmentPathIsNull_PathToScriptAppendedToEnvironmentPath()
+ {
+ CreateScript();
+ fakeFileSystem.PathToReturnFromGetFullPath = @"d:\projects\myproject\packages\test";
+ fakeSession.SetEnvironmentPath(null);
+
+ script.Execute();
+
+ string actualEnvironmentPath = fakeSession.GetEnvironmentPath();
+ string expectedEnvironmentPath = @"d:\projects\myproject\packages\test";
+
+ Assert.AreEqual(expectedEnvironmentPath, actualEnvironmentPath);
+ }
+
+ [Test]
+ public void Execute_ScriptDirectoryDoesNotExist_PathIsNotUpdated()
+ {
+ CreateScript();
+ fakeFileSystem.PathToReturnFromGetFullPath = @"d:\projects\myproject\packages\test";
+ fakeFileSystem.DirectoryExistsReturnValue = false;
+ fakeSession.SetEnvironmentPath(String.Empty);
+
+ script.Execute();
+
+ string actualEnvironmentPath = fakeSession.GetEnvironmentPath();
+ string expectedEnvironmentPath = String.Empty;
+
+ Assert.AreEqual(expectedEnvironmentPath, actualEnvironmentPath);
+ }
+
+ [Test]
+ public void Execute_PackageIsSet_PackageSessionVariableIsSet()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ var expectedPackage = new FakePackage("Test");
+ script.Package = expectedPackage;
+ script.Execute();
+
+ var actualPackage = fakeSession.VariablesAdded["__package"];
+
+ Assert.AreEqual(expectedPackage, actualPackage);
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_RootPathSessionVariableIsSet()
+ {
+ string expectedRootPath = @"d:\projects\myproject\packages\test";
+ CreateScriptWithPhysicalFileSystem(expectedRootPath);
+ script.Execute();
+
+ var rootPath = fakeSession.VariablesAdded["__rootPath"];
+
+ Assert.AreEqual(expectedRootPath, rootPath);
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_ToolsPathSessionVariableIsSet()
+ {
+ CreateScriptWithPhysicalFileSystem(@"d:\projects\myproject\packages\test");
+ script.Execute();
+
+ var toolsPath = fakeSession.VariablesAdded["__toolsPath"];
+ string expectedToolsPath = @"d:\projects\myproject\packages\test\tools";
+
+ Assert.AreEqual(expectedToolsPath, toolsPath);
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_ProjectSessionVariableIsSet()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ script.Execute();
+
+ var project = fakeSession.VariablesAdded["__project"];
+
+ Assert.IsNull(project);
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_ScriptIsInvoked()
+ {
+ CreateScriptWithPhysicalFileSystem(@"d:\projects\myproject\packages\test");
+ script.Execute();
+
+ string actualScript = fakeSession.ScriptPassedToInvokeScript;
+
+ string expectedScript =
+ "& 'd:\\projects\\myproject\\packages\\test\\tools\\init.ps1' $__rootPath $__toolsPath $__package $__project";
+
+ Assert.AreEqual(expectedScript, actualScript);
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_PackageSessionVariableIsRemoved()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ script.Execute();
+
+ AssertSessionVariableIsRemoved("__package");
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_RootPathSessionVariableIsRemoved()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ script.Execute();
+
+ AssertSessionVariableIsRemoved("__rootPath");
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_ToolsPathSessionVariableIsRemoved()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ script.Execute();
+
+ AssertSessionVariableIsRemoved("__toolsPath");
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_ProjectSessionVariableIsRemoved()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ script.Execute();
+
+ AssertSessionVariableIsRemoved("__project");
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptFileNameTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptFileNameTests.cs
new file mode 100644
index 0000000000..a113bcce1e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptFileNameTests.cs
@@ -0,0 +1,60 @@
+// 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 NUnit.Framework;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class PackageInstallScriptFileNameTests
+ {
+ PackageInstallScriptFileName scriptFileName;
+ FakeFileSystem fakeFileSystem;
+
+ void CreateFileSystem()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ }
+
+ void CreateFileName(string installPath)
+ {
+ scriptFileName = new PackageInstallScriptFileName(installPath);
+ }
+
+ void CreateFakeFileSystem()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ }
+
+ void CreateFileNameWithFakeFileSystem()
+ {
+ scriptFileName = new PackageInstallScriptFileName(fakeFileSystem);
+ }
+
+ [Test]
+ public void ToString_InstallDirectoryPassed_ReturnsFullPathToInstallScript()
+ {
+ CreateFileName(@"d:\projects\MyProject\packages\Test");
+
+ string actualFileName = scriptFileName.ToString();
+ string expectedFileName = @"d:\projects\MyProject\packages\Test\tools\install.ps1";
+
+ Assert.AreEqual(expectedFileName, actualFileName);
+ }
+
+ [Test]
+ public void FileExists_FileSystemHasScriptFile_ToolsScriptFileCheckedForExistence()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.FileExistsReturnValue = true;
+ CreateFileNameWithFakeFileSystem();
+
+ scriptFileName.FileExists();
+
+ Assert.AreEqual(@"tools\install.ps1", fakeFileSystem.PathPassedToFileExists);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs
new file mode 100644
index 0000000000..02af693dc0
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageInstallScriptTests.cs
@@ -0,0 +1,47 @@
+// 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.EnvDTE;
+using ICSharpCode.PackageManagement.Scripting;
+using NUnit.Framework;
+using PackageManagement.Tests.Helpers;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class PackageInstallScriptTests
+ {
+ PackageInstallScriptFileName scriptFileName;
+ FakePackageScriptSession fakeSession;
+ PackageInstallScript script;
+
+ void CreateScriptWithPhysicalFileSystem()
+ {
+ CreateScriptWithPhysicalFileSystem(@"d:\projects\myproject\packages\test");
+ }
+
+ void CreateScriptWithPhysicalFileSystem(string packageInstallDirectory)
+ {
+ scriptFileName = new PackageInstallScriptFileName(packageInstallDirectory);
+ fakeSession = new FakePackageScriptSession();
+ script = new PackageInstallScript(scriptFileName, fakeSession);
+ }
+
+ [Test]
+ public void Execute_PackageInstallDirectoryIsSet_ProjectSessionVariableIsSet()
+ {
+ CreateScriptWithPhysicalFileSystem();
+ var expectedProject = new Project();
+ var project = new FakePackageManagementProject();
+ project.DTEProject = expectedProject;
+ script.Project = project;
+ script.Execute();
+
+ var projectVariable = fakeSession.VariablesAdded["__project"];
+
+ Assert.AreEqual(expectedProject, projectVariable);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageUninstallScriptFileNameTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageUninstallScriptFileNameTests.cs
new file mode 100644
index 0000000000..029d5c7cbb
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageUninstallScriptFileNameTests.cs
@@ -0,0 +1,60 @@
+// 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 NUnit.Framework;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class PackageUninstallScriptFileNameTests
+ {
+ PackageUninstallScriptFileName scriptFileName;
+ FakeFileSystem fakeFileSystem;
+
+ void CreateFileSystem()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ }
+
+ void CreateFileName(string installPath)
+ {
+ scriptFileName = new PackageUninstallScriptFileName(installPath);
+ }
+
+ void CreateFakeFileSystem()
+ {
+ fakeFileSystem = new FakeFileSystem();
+ }
+
+ void CreateFileNameWithFakeFileSystem()
+ {
+ scriptFileName = new PackageUninstallScriptFileName(fakeFileSystem);
+ }
+
+ [Test]
+ public void ToString_InstallDirectoryPassed_ReturnsFullPathToInstallScript()
+ {
+ CreateFileName(@"d:\projects\MyProject\packages\Test");
+
+ string actualFileName = scriptFileName.ToString();
+ string expectedFileName = @"d:\projects\MyProject\packages\Test\tools\uninstall.ps1";
+
+ Assert.AreEqual(expectedFileName, actualFileName);
+ }
+
+ [Test]
+ public void FileExists_FileSystemHasScriptFile_ToolsScriptFileCheckedForExistence()
+ {
+ CreateFakeFileSystem();
+ fakeFileSystem.FileExistsReturnValue = true;
+ CreateFileNameWithFakeFileSystem();
+
+ scriptFileName.FileExists();
+
+ Assert.AreEqual(@"tools\uninstall.ps1", fakeFileSystem.PathPassedToFileExists);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/RunPackageScriptsActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/RunPackageScriptsActionTests.cs
new file mode 100644
index 0000000000..3df129779e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/RunPackageScriptsActionTests.cs
@@ -0,0 +1,178 @@
+// 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 NuGet;
+using NUnit.Framework;
+using PackageManagement.Tests.Helpers;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class RunPackageScriptsActionTests
+ {
+ RunPackageScriptsAction action;
+ FakePackageManagementProject fakeProject;
+ FakePackageScriptFactory fakeScriptFactory;
+
+ void CreateAction()
+ {
+ fakeProject = new FakePackageManagementProject();
+ fakeScriptFactory = new FakePackageScriptFactory();
+ action = new RunPackageScriptsAction(fakeProject, fakeScriptFactory);
+ }
+
+ PackageOperationEventArgs CreatePackageOperationEventArgs()
+ {
+ return CreatePackageOperationEventArgs(@"d:\projects\myproject\packages\test");
+ }
+
+ PackageOperationEventArgs CreatePackageOperationEventArgs(string installPath)
+ {
+ var package = new FakePackage("Test");
+ string targetPath = @"d:\projects\myproject\packages\target";
+ return new PackageOperationEventArgs(package, targetPath, installPath);
+ }
+
+ [Test]
+ public void Constructor_PackageIsInstalled_PackageInitScriptIsRun()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageInstalledEvent(eventArgs);
+
+ bool executed = fakeScriptFactory.FakePackageInitializeScript.IsExecuted;
+
+ Assert.IsTrue(executed);
+ }
+
+ [Test]
+ public void Constructor_PackageIsInstalled_PackageInitScriptIsCreated()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs(@"d:\projects\myproject\packages\test");
+
+ fakeProject.FirePackageInstalledEvent(eventArgs);
+
+ string path = fakeScriptFactory.PackageInstallDirectoryPassed;
+
+ Assert.AreEqual(@"d:\projects\myproject\packages\test", path);
+ }
+
+ [Test]
+ public void Dispose_PackageIsInstalled_PackageInitScriptIsNotRun()
+ {
+ CreateAction();
+ action.Dispose();
+
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageInstalledEvent(eventArgs);
+
+ bool executed = fakeScriptFactory.FakePackageInitializeScript.IsExecuted;
+
+ Assert.IsFalse(executed);
+ }
+
+ [Test]
+ public void Constructor_PackageReferenceIsAdded_PackageInstallScriptIsRun()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageReferenceAddedEvent(eventArgs);
+
+ bool executed = fakeScriptFactory.FakePackageInstallScript.IsExecuted;
+
+ Assert.IsTrue(executed);
+ }
+
+ [Test]
+ public void Constructor_PackageReferenceIsAdded_PackageInstallScriptIsCreated()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs(@"d:\projects\myproject\packages\test");
+ fakeProject.FirePackageReferenceAddedEvent(eventArgs);
+
+ string path = fakeScriptFactory.PackageInstallDirectoryPassed;
+
+ Assert.AreEqual(@"d:\projects\myproject\packages\test", path);
+ }
+
+ [Test]
+ public void Dispose_PackageReferenceIsAdded_PackageInstallScriptIsNotRun()
+ {
+ CreateAction();
+ action.Dispose();
+
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageReferenceAddedEvent(eventArgs);
+
+ bool executed = fakeScriptFactory.FakePackageInstallScript.IsExecuted;
+
+ Assert.IsFalse(executed);
+ }
+
+ [Test]
+ public void Constructor_PackageReferenceIsAdded_InstallScriptIsPassedProject()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageReferenceAddedEvent(eventArgs);
+
+ var project = fakeScriptFactory.FakePackageInstallScript.Project;
+
+ Assert.AreEqual(fakeProject, project);
+ }
+
+ [Test]
+ public void Constructor_PackageReferenceIsRemoved_PackageUninstallScriptIsRun()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageReferenceRemovedEvent(eventArgs);
+
+ bool executed = fakeScriptFactory.FakePackageUninstallScript.IsExecuted;
+
+ Assert.IsTrue(executed);
+ }
+
+ [Test]
+ public void Constructor_PackageReferenceIsRemoved_PackageUninstallScriptIsCreated()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs(@"d:\projects\myproject\packages\test");
+ fakeProject.FirePackageReferenceRemovedEvent(eventArgs);
+
+ string path = fakeScriptFactory.PackageInstallDirectoryPassed;
+
+ Assert.AreEqual(@"d:\projects\myproject\packages\test", path);
+ }
+
+ [Test]
+ public void Dispose_PackageReferenceIsRemoved_PackageUninstallScriptIsNotRun()
+ {
+ CreateAction();
+ action.Dispose();
+
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageReferenceRemovedEvent(eventArgs);
+
+ bool executed = fakeScriptFactory.FakePackageUninstallScript.IsExecuted;
+
+ Assert.IsFalse(executed);
+ }
+
+ [Test]
+ public void Constructor_PackageReferenceIsRemoved_UninstallScriptIsPassedProject()
+ {
+ CreateAction();
+ var eventArgs = CreatePackageOperationEventArgs();
+ fakeProject.FirePackageReferenceRemovedEvent(eventArgs);
+
+ var project = fakeScriptFactory.FakePackageUninstallScript.Project;
+
+ Assert.AreEqual(fakeProject, project);
+ }
+ }
+}