diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index de28c53451..51ec21bc95 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -232,6 +232,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs index 3842f826a2..1eb7771747 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs @@ -223,7 +223,7 @@ namespace ICSharpCode.PackageManagement.Design public UpdatePackagesAction CreateUpdatePackagesAction() { - var action = new UpdatePackagesAction(this); + var action = new UpdatePackagesAction(this, null); UpdatePackagesActionsCreated.Add(action); return action; } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementEvents.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementEvents.cs index 85124b15d7..c91d44cd44 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementEvents.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementEvents.cs @@ -16,13 +16,15 @@ namespace ICSharpCode.PackageManagement event EventHandler PackageOperationError; event EventHandler ParentPackageInstalled; event EventHandler ParentPackageUninstalled; + event EventHandler ParentPackagesUpdated; event EventHandler PackageOperationMessageLogged; - + void OnPackageOperationsStarting(); void OnPackageOperationError(Exception ex); bool OnAcceptLicenses(IEnumerable packages); void OnParentPackageInstalled(IPackage package); void OnParentPackageUninstalled(IPackage package); + void OnParentPackagesUpdated(IEnumerable packages); void OnPackageOperationMessageLogged(MessageLevel level, string message, params object[] args); bool OnSelectProjects(IEnumerable selectedProjects); FileConflictResolution OnResolveFileConflict(string message); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementEvents.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementEvents.cs index 5e048a962e..05197bc829 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementEvents.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementEvents.cs @@ -90,5 +90,14 @@ namespace ICSharpCode.PackageManagement } return FileConflictResolution.IgnoreAll; } + + public event EventHandler ParentPackagesUpdated; + + public void OnParentPackagesUpdated(IEnumerable packages) + { + if (ParentPackagesUpdated != null) { + ParentPackagesUpdated(this, new ParentPackagesOperationEventArgs(packages)); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs index 95e5ebc92b..01fa702369 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs @@ -139,7 +139,7 @@ namespace ICSharpCode.PackageManagement public UpdatePackagesAction CreateUpdatePackagesAction() { - return new UpdatePackagesAction(this); + return new UpdatePackagesAction(this, packageManagementEvents); } public IEnumerable GetUpdatePackagesOperations( diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ParentPackagesOperationEventArgs.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ParentPackagesOperationEventArgs.cs new file mode 100644 index 0000000000..c2a046554e --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ParentPackagesOperationEventArgs.cs @@ -0,0 +1,19 @@ +// 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 NuGet; + +namespace ICSharpCode.PackageManagement +{ + public class ParentPackagesOperationEventArgs : EventArgs + { + public ParentPackagesOperationEventArgs(IEnumerable packages) + { + this.Packages = packages; + } + + public IEnumerable Packages { get; private set; } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ProjectBrowserRefresher.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ProjectBrowserRefresher.cs index 081bc557e4..824c6fb9da 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ProjectBrowserRefresher.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ProjectBrowserRefresher.cs @@ -19,9 +19,10 @@ namespace ICSharpCode.PackageManagement packageManagementEvents.ParentPackageInstalled += ProjectChanged; packageManagementEvents.ParentPackageUninstalled += ProjectChanged; + packageManagementEvents.ParentPackagesUpdated += ProjectChanged; } - void ProjectChanged(object sender, ParentPackageOperationEventArgs e) + void ProjectChanged(object sender, EventArgs e) { projectService.RefreshProjectBrowser(); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs index a6287f4d31..36db0c32ea 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs @@ -33,6 +33,7 @@ namespace ICSharpCode.PackageManagement unsafeEvents.PackageOperationError += RaisePackageOperationErrorEventIfHasSubscribers; unsafeEvents.ParentPackageInstalled += RaiseParentPackageInstalledEventIfHasSubscribers; unsafeEvents.ParentPackageUninstalled += RaiseParentPackageUninstalledEventIfHasSubscribers; + unsafeEvents.ParentPackagesUpdated += RaiseParentPackagesUpdatedEventIfHasSubscribers; } public void Dispose() @@ -46,6 +47,7 @@ namespace ICSharpCode.PackageManagement unsafeEvents.PackageOperationError -= RaisePackageOperationErrorEventIfHasSubscribers; unsafeEvents.ParentPackageInstalled -= RaiseParentPackageInstalledEventIfHasSubscribers; unsafeEvents.ParentPackageUninstalled -= RaiseParentPackageUninstalledEventIfHasSubscribers; + unsafeEvents.ParentPackagesUpdated -= RaiseParentPackagesUpdatedEventIfHasSubscribers; } void RaisePackageOperationStartingEventIfHasSubscribers(object sender, EventArgs e) @@ -199,5 +201,29 @@ namespace ICSharpCode.PackageManagement { return unsafeEvents.OnResolveFileConflict(message); } + + public event EventHandler ParentPackagesUpdated; + + public void OnParentPackagesUpdated(IEnumerable packages) + { + unsafeEvents.OnParentPackagesUpdated(packages); + } + + void RaiseParentPackagesUpdatedEventIfHasSubscribers(object sender, ParentPackagesOperationEventArgs e) + { + if (ParentPackagesUpdated != null) { + RaiseParentPackagesUpdatedEvent(sender, e); + } + } + + void RaiseParentPackagesUpdatedEvent(object sender, ParentPackagesOperationEventArgs e) + { + if (InvokeRequired) { + Action action = RaiseParentPackagesUpdatedEvent; + SafeThreadAsyncCall(action, sender, e); + } else { + ParentPackagesUpdated(sender, e); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesAction.cs index 9cff412eac..af43c105f0 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesAction.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesAction.cs @@ -12,10 +12,14 @@ namespace ICSharpCode.PackageManagement { List packages = new List(); List operations = new List(); + IPackageManagementEvents packageManagementEvents; - public UpdatePackagesAction(IPackageManagementProject project) + public UpdatePackagesAction( + IPackageManagementProject project, + IPackageManagementEvents packageManagementEvents) { Project = project; + this.packageManagementEvents = packageManagementEvents; UpdateDependencies = true; } @@ -62,6 +66,7 @@ namespace ICSharpCode.PackageManagement protected virtual void ExecuteCore() { Project.UpdatePackages(this); + packageManagementEvents.OnParentPackagesUpdated(Packages); } void ExecuteWithScriptRunner() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesActionFactory.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesActionFactory.cs index 6fcda3466b..a0da618773 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesActionFactory.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatePackagesActionFactory.cs @@ -12,14 +12,16 @@ namespace ICSharpCode.PackageManagement public class UpdatePackagesActionFactory { ILogger logger; + IPackageManagementEvents packageManagementEvents; bool singleProjectSelected; IPackageManagementProject project; PackageManagementSelectedProjects selectedProjects; IEnumerable packages; - public UpdatePackagesActionFactory(ILogger logger) + public UpdatePackagesActionFactory(ILogger logger, IPackageManagementEvents packageManagementEvents) { this.logger = logger; + this.packageManagementEvents = packageManagementEvents; } public IUpdatePackagesAction CreateAction( @@ -52,7 +54,7 @@ namespace ICSharpCode.PackageManagement if (singleProjectSelected) { return project.CreateUpdatePackagesAction(); } else { - return new UpdateSolutionPackagesAction(selectedProjects.Solution); + return new UpdateSolutionPackagesAction(selectedProjects.Solution, packageManagementEvents); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdateSolutionPackagesAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdateSolutionPackagesAction.cs index 5703f842e7..3dfed93297 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdateSolutionPackagesAction.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdateSolutionPackagesAction.cs @@ -14,11 +14,15 @@ namespace ICSharpCode.PackageManagement List packages = new List(); List operations = new List(); List projects; + IPackageManagementEvents packageManagementEvents; - public UpdateSolutionPackagesAction(IPackageManagementSolution solution) + public UpdateSolutionPackagesAction( + IPackageManagementSolution solution, + IPackageManagementEvents packageManagementEvents) { this.Solution = solution; this.UpdateDependencies = true; + this.packageManagementEvents = packageManagementEvents; } public IPackageManagementSolution Solution { get; private set; } @@ -76,6 +80,7 @@ namespace ICSharpCode.PackageManagement { RunPackageOperations(); UpdatePackageReferences(); + packageManagementEvents.OnParentPackagesUpdated(Packages); } void RunPackageOperations() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs index c931fae4d1..443988a118 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs @@ -15,6 +15,7 @@ namespace ICSharpCode.PackageManagement UpdatedPackages updatedPackages; string errorMessage = String.Empty; ILogger logger; + IPackageManagementEvents packageManagementEvents; public UpdatedPackagesViewModel( IPackageManagementSolution solution, @@ -28,6 +29,7 @@ namespace ICSharpCode.PackageManagement { this.selectedProjects = new PackageManagementSelectedProjects(solution); this.logger = packageViewModelFactory.Logger; + this.packageManagementEvents = packageViewModelFactory.PackageManagementEvents; ShowPackageSources = true; ShowUpdateAllPackages = true; } @@ -68,7 +70,7 @@ namespace ICSharpCode.PackageManagement protected override void TryUpdatingAllPackages() { - var factory = new UpdatePackagesActionFactory(logger); + var factory = new UpdatePackagesActionFactory(logger, packageManagementEvents); IUpdatePackagesAction action = factory.CreateAction(selectedProjects, GetPackagesFromViewModels()); ActionRunner.Run(action); } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementEvents.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementEvents.cs index e75874e924..0a22079601 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementEvents.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementEvents.cs @@ -18,6 +18,7 @@ namespace PackageManagement.Tests.Helpers public event EventHandler PackageOperationError; public event EventHandler ParentPackageInstalled; public event EventHandler ParentPackageUninstalled; + public event EventHandler ParentPackagesUpdated; public event EventHandler PackageOperationMessageLogged; public event EventHandler ResolveFileConflict; #pragma warning restore 0067 @@ -118,5 +119,12 @@ namespace PackageManagement.Tests.Helpers MessagePassedToOnResolveFileConflict = message; return FileConflictResolutionToReturn; } + + public IEnumerable PackagesPassedToOnParentPackageUpdated; + + public void OnParentPackagesUpdated(IEnumerable packages) + { + PackagesPassedToOnParentPackageUpdated = packages; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdatePackagesAction.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdatePackagesAction.cs index eb75e96edc..7465cd9522 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdatePackagesAction.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdatePackagesAction.cs @@ -14,8 +14,10 @@ namespace PackageManagement.Tests.Helpers public IPackageManagementProject ProjectPassedToCreateRunPackageScriptsAction; public RunPackageScriptsAction RunPackageScriptsAction; - public TestableUpdatePackagesAction(IPackageManagementProject project) - : base(project) + public TestableUpdatePackagesAction( + IPackageManagementProject project, + IPackageManagementEvents packageManagementEvents) + : base(project, packageManagementEvents) { } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdateSolutionPackagesAction.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdateSolutionPackagesAction.cs index 4ac853007f..cec2b60371 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdateSolutionPackagesAction.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableUpdateSolutionPackagesAction.cs @@ -16,8 +16,10 @@ namespace PackageManagement.Tests.Helpers public List ProjectsPassedToCreateRunPackageScriptsAction; public RunAllProjectPackageScriptsAction RunPackageScriptsAction; - public TestableUpdateSolutionPackagesAction(IPackageManagementSolution solution) - : base(solution) + public TestableUpdateSolutionPackagesAction( + IPackageManagementSolution solution, + IPackageManagementEvents packageManagementEvents) + : base(solution, packageManagementEvents) { } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementEventsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementEventsTests.cs index 9e3e4342dd..666310a303 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementEventsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementEventsTests.cs @@ -387,5 +387,40 @@ namespace PackageManagement.Tests Assert.AreEqual(FileConflictResolution.IgnoreAll, resolution); } + + [Test] + public void OnParentPackagesUpdated_OneEventSubscriber_PackagesUpdatedEventFired() + { + CreateEvents(); + ParentPackagesOperationEventArgs eventArgs = null; + events.ParentPackagesUpdated += (sender, e) => eventArgs = e; + var packages = new FakePackage[] { new FakePackage("Test") }; + + events.OnParentPackagesUpdated(packages); + + Assert.AreEqual(packages, eventArgs.Packages); + } + + [Test] + public void OnParentPackagesUpdated_OneEventSubscriber_SenderIsPackageManagementEvents() + { + CreateEvents(); + object eventSender = null; + events.ParentPackagesUpdated += (sender, e) => eventSender = sender; + var packages = new FakePackage[] { new FakePackage("Test") }; + + events.OnParentPackagesUpdated(packages); + + Assert.AreEqual(events, eventSender); + } + + [Test] + public void OnParentPackagesUpdated_NoEventSubscribers_NullReferenceExceptionNotThrown() + { + CreateEvents(); + var packages = new FakePackage[] { new FakePackage("Test") }; + + Assert.DoesNotThrow(() => events.OnParentPackagesUpdated(packages)); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs index 73dec20e05..8a71281566 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs @@ -66,7 +66,7 @@ namespace PackageManagement.Tests void CreateUpdatePackagesAction() { - updatePackagesAction = new UpdatePackagesAction(project); + updatePackagesAction = new UpdatePackagesAction(project, null); } [Test] diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/ProjectBrowserRefresherTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/ProjectBrowserRefresherTests.cs index 72abd5807e..63e49d79c6 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/ProjectBrowserRefresherTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/ProjectBrowserRefresherTests.cs @@ -31,7 +31,12 @@ namespace PackageManagement.Tests { packageManagementEvents.OnParentPackageUninstalled(new FakePackage("Test")); } - + + void RaiseOnParentPackagesUpdatedEvent() + { + packageManagementEvents.OnParentPackagesUpdated(new FakePackage[0]); + } + [Test] public void OnParentPackageInstalled_EventFires_ProjectBrowserIsRefreshed() { @@ -49,5 +54,15 @@ namespace PackageManagement.Tests Assert.IsTrue(fakeProjectService.IsRefreshProjectBrowserCalled); } + + [Test] + public void OnParentPackagesUpdated_EventFires_ProjectBrowserIsRefreshed() + { + CreateProjectBrowserRefresher(); + + RaiseOnParentPackagesUpdatedEvent(); + + Assert.IsTrue(fakeProjectService.IsRefreshProjectBrowserCalled); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs index 4cce8e330c..bfcbdb4d91 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs @@ -273,7 +273,7 @@ namespace PackageManagement.Tests UpdatePackagesAction CreateUpdatePackagesAction() { - return new UpdatePackagesAction(new FakePackageManagementProject()); + return new UpdatePackagesAction(new FakePackageManagementProject(), null); } UpdatePackagesAction CreateUpdatePackagesActionWithPackages(params IPackageFromRepository[] packages) diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/ThreadSafePackageManagementEventsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/ThreadSafePackageManagementEventsTests.cs index 6e4a412293..6ab09d8f7e 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/ThreadSafePackageManagementEventsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/ThreadSafePackageManagementEventsTests.cs @@ -506,5 +506,66 @@ namespace PackageManagement.Tests Assert.IsFalse(eventHandlerFired); } + + [Test] + public void OnParentPackagesUpdated_NoInvokeRequired_NonThreadSafeOnParentPackagesUpdatedMethodCalled() + { + CreateEvents(); + var expectedPackages = new FakePackage[] { new FakePackage() }; + + threadSafeEvents.OnParentPackagesUpdated(expectedPackages); + + IEnumerable packages = fakeEvents.PackagesPassedToOnParentPackageUpdated; + Assert.AreEqual(expectedPackages, packages); + } + + [Test] + public void ParentPackagesUpdated_UnsafeEventFired_ThreadSafeEventFired() + { + CreateEventsWithRealPackageManagementEvents(); + bool fired = false; + threadSafeEvents.ParentPackagesUpdated += (sender, e) => fired = true; + unsafeEvents.OnParentPackagesUpdated(null); + + Assert.IsTrue(fired); + } + + [Test] + public void ParentPackagesUpdated_UnsafeEventFiredAndInvokeRequired_ThreadSafeEventIsSafelyInvoked() + { + CreateEventsWithRealPackageManagementEvents(); + fakeWorkbench.InvokeRequiredReturnValue = true; + threadSafeEvents.ParentPackagesUpdated += OnEventHandlerFired; + var expectedPackages = new FakePackage[] { new FakePackage() }; + + unsafeEvents.OnParentPackagesUpdated(expectedPackages); + + var eventArgs = fakeWorkbench.Arg2PassedToSafeThreadAsyncCall as ParentPackagesOperationEventArgs; + Assert.AreEqual(expectedPackages, eventArgs.Packages); + } + + [Test] + public void ParentPackagesUpdated_UnsafeEventFiredAndInvokeRequiredButNoEventHandlerRegistered_ThreadSafeEventIsNotInvoked() + { + CreateEventsWithRealPackageManagementEvents(); + fakeWorkbench.InvokeRequiredReturnValue = true; + var packages = new FakePackage[] { new FakePackage() }; + unsafeEvents.OnParentPackagesUpdated(packages); + + Assert.IsFalse(fakeWorkbench.IsSafeThreadAsyncCallMade); + } + + [Test] + public void Dispose_ParentPackagesUpdatedHandlerExistsAndThreadUnsafeEventFiredAfterDispose_ThreadSafeEventIsNotFired() + { + CreateEventsWithRealPackageManagementEvents(); + eventHandlerFired = false; + threadSafeEvents.ParentPackagesUpdated += OnEventHandlerFired; + threadSafeEvents.Dispose(); + + unsafeEvents.OnParentPackagesUpdated(new FakePackage[0]); + + Assert.IsFalse(eventHandlerFired); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackagesActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackagesActionTests.cs index 8566b617da..0d5f17f563 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackagesActionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackagesActionTests.cs @@ -3,6 +3,7 @@ using System; using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Scripting; using NuGet; using NUnit.Framework; @@ -16,11 +17,13 @@ namespace PackageManagement.Tests { TestableUpdatePackagesAction action; IPackageManagementProject project; + IPackageManagementEvents packageEvents; void CreateAction() { CreateSolution(); - action = new TestableUpdatePackagesAction(project); + packageEvents = MockRepository.GenerateStub(); + action = new TestableUpdatePackagesAction(project, packageEvents); } void CreateActionWithOperations(params PackageOperation[] operations) @@ -49,6 +52,13 @@ namespace PackageManagement.Tests return MockRepository.GenerateStub(); } + FakePackage AddPackageToAction(string id, string version) + { + var package = new FakePackage(id, version); + action.AddPackages(new FakePackage[] { package }); + return package; + } + [Test] public void UpdateDependencies_DefaultValue_IsTrue() { @@ -161,5 +171,16 @@ namespace PackageManagement.Tests project.AssertWasCalled(p => p.UpdatePackages(action)); } + + [Test] + public void Execute_ActionHasOnePackage_ParentPackagesUpdatedEventIsFired() + { + CreateAction(); + AddPackageToAction("Test", "1.0"); + + action.Execute(); + + packageEvents.AssertWasCalled(events => events.OnParentPackagesUpdated(action.Packages)); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdateSolutionPackagesActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdateSolutionPackagesActionTests.cs index 52a3e79838..bd196f9fed 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdateSolutionPackagesActionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdateSolutionPackagesActionTests.cs @@ -19,11 +19,13 @@ namespace PackageManagement.Tests IPackageManagementSolution solution; List projects; IPackageRepository sourceRepository; + IPackageManagementEvents packageEvents; void CreateAction() { CreateSolution(); - action = new TestableUpdateSolutionPackagesAction(solution); + packageEvents = MockRepository.GenerateStub(); + action = new TestableUpdateSolutionPackagesAction(solution, packageEvents); } void CreateActionWithOperations(params PackageOperation[] operations) @@ -307,5 +309,19 @@ namespace PackageManagement.Tests Assert.AreEqual(logger, project1.Logger); Assert.AreEqual(logger, project2.Logger); } + + [Test] + public void Execute_OneProjectThatHasOlderVersionOfPackageBeingUpdated_PackagesUpdatedEventIsFired() + { + PackageOperation operation = CreateInstallOperationWithFile(@"tools\readme.txt"); + CreateActionWithOperations(operation); + IPackageFromRepository package = AddPackageToAction("Test", "1.0"); + IPackageManagementProject project = AddProjectToSolution(); + var expectedOperations = new PackageOperation[] { operation }; + + action.Execute(); + + packageEvents.AssertWasCalled(events => events.OnParentPackagesUpdated(action.Packages)); + } } }