diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs index 3fa6523a7d..0c870f67bd 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs @@ -76,7 +76,7 @@ namespace ICSharpCode.PackageManagement.Design public override string ToString() { - return "Package.Id: " + Id; + return String.Format("{0} {1}", Id, Version); } public override bool Equals(object obj) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementOutputMessagesView.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementOutputMessagesView.cs index 710653156a..c1301667c1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementOutputMessagesView.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementOutputMessagesView.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.PackageManagement; using NuGet; @@ -10,6 +11,25 @@ namespace ICSharpCode.PackageManagement.Design public class FakePackageManagementOutputMessagesView : IPackageManagementOutputMessagesView { public bool IsClearCalled; + public List FormattedMessagesLogged = new List(); + + public string FirstFormattedMessageLogged { + get { return FormattedMessagesLogged[0]; } + } + + public string LastFormattedMessageLogged { + get { + int index = FormattedMessagesLogged.Count - 1; + return FormattedMessagesLogged[index]; + } + } + + public string NextToLastFormattedMessageLogged { + get { + int index = FormattedMessagesLogged.Count - 2; + return FormattedMessagesLogged[index]; + } + } public void Clear() { @@ -18,7 +38,8 @@ namespace ICSharpCode.PackageManagement.Design public void Log(MessageLevel level, string message, params object[] args) { - + string formattedMessage = String.Format(message, args); + FormattedMessagesLogged.Add(formattedMessage); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs index 0f9a4f39be..a46a3a89dd 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.PackageManagement public PackageViewModel( IPackage package, - IPackageManagementService packageManagementService, + IPackageManagementService packageManagementService, ILicenseAcceptanceService licenseAcceptanceService) { this.package = package; @@ -59,7 +59,7 @@ namespace ICSharpCode.PackageManagement localPackageRepository = packageManagementService.ActiveProjectManager.LocalRepository; } - public ICommand AddPackageCommand { + public ICommand AddPackageCommand { get { return addPackageCommand; } } @@ -87,7 +87,7 @@ namespace ICSharpCode.PackageManagement public Uri ProjectUrl { get { return package.ProjectUrl; } } - + public bool HasReportAbuseUrl { get { return ReportAbuseUrl != null; } } @@ -166,10 +166,59 @@ namespace ICSharpCode.PackageManagement public void AddPackage() { + LogAddingPackage(); GetPackageOperations(); if (CanInstallPackage()) { InstallPackage(); } + LogAfterPackageOperationCompletes(); + } + + void LogAddingPackage() + { + string message = GetFormattedStartPackageOperationMessage(AddingPackageMessageFormat); + Log(message); + } + + void Log(string message) + { + Logger.Log(MessageLevel.Info, message); + } + + string GetFormattedStartPackageOperationMessage(string format) + { + string message = String.Format(format, package.ToString()); + return GetStartPackageOperationMessage(message); + } + + string GetStartPackageOperationMessage(string message) + { + return String.Format("------- {0} -------", message); + } + + ILogger Logger { + get { return packageManagementService.OutputMessagesView; } + } + + protected virtual string AddingPackageMessageFormat { + get { return "Installing...{0}"; } + } + + void LogAfterPackageOperationCompletes() + { + LogEndMarkerLine(); + LogEmptyLine(); + } + + void LogEndMarkerLine() + { + string message = new String('=', 30); + Log(message); + } + + void LogEmptyLine() + { + Log(String.Empty); } void GetPackageOperations() @@ -183,16 +232,12 @@ namespace ICSharpCode.PackageManagement return CreatePackageOperationResolver(Logger); } - ILogger Logger { - get { return packageManagementService.OutputMessagesView; } - } - protected virtual IPackageOperationResolver CreatePackageOperationResolver(ILogger logger) { return new InstallWalker(LocalPackageRepository, - sourcePackageRepository, - logger, - ignoreDependencies: false); + sourcePackageRepository, + logger, + ignoreDependencies: false); } bool CanInstallPackage() @@ -239,8 +284,21 @@ namespace ICSharpCode.PackageManagement public void RemovePackage() { + LogRemovingPackage(); packageManagementService.UninstallPackage(sourcePackageRepository, package); + LogAfterPackageOperationCompletes(); + OnPropertyChanged(model => model.IsAdded); } + + void LogRemovingPackage() + { + string message = GetFormattedStartPackageOperationMessage(RemovingPackageMessageFormat); + Log(message); + } + + protected virtual string RemovingPackageMessageFormat { + get { return "Uninstalling...{0}"; } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageViewModel.cs index 8fb964fbfc..4f76ce0fa9 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageViewModel.cs @@ -16,6 +16,8 @@ namespace PackageManagement.Tests.Helpers public FakeLicenseAcceptanceService FakeLicenseAcceptanceService; public FakePackage FakePackage; public ILogger LoggerUsedWhenCreatingPackageResolver; + public string PackageViewModelAddingPackageMessageFormat = String.Empty; + public string PackageViewModelRemovingPackageMessageFormat = String.Empty; public TestablePackageViewModel() : this( @@ -48,5 +50,13 @@ namespace PackageManagement.Tests.Helpers } return base.CreatePackageOperationResolver(logger); } + + protected override string AddingPackageMessageFormat { + get { return PackageViewModelAddingPackageMessageFormat; } + } + + protected override string RemovingPackageMessageFormat { + get { return PackageViewModelRemovingPackageMessageFormat; } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs index 3e4c7ded25..db7e595246 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs @@ -449,5 +449,83 @@ namespace PackageManagement.Tests ILogger expectedLogger = packageManagementService.FakeOutputMessagesView; Assert.AreEqual(expectedLogger, viewModel.LoggerUsedWhenCreatingPackageResolver); } + + [Test] + public void AddPackage_PackageAddedSuccessfully_InstallingPackageMessageIsFirstMessageLogged() + { + CreateViewModel(); + package.Id = "Test.Package"; + package.Version = new Version(1, 2, 0, 55); + viewModel.PackageViewModelAddingPackageMessageFormat = "Updating...{0}"; + viewModel.AddPackage(); + + string expectedMessage = "------- Updating...Test.Package 1.2.0.55 -------"; + string actualMessage = packageManagementService.FakeOutputMessagesView.FirstFormattedMessageLogged; + + Assert.AreEqual(expectedMessage, actualMessage); + } + + [Test] + public void AddPackage_PackageAddedSuccessfully_NextToLastMesssageLoggedMarksEndOfInstallation() + { + CreateViewModel(); + viewModel.AddPackage(); + + string expectedMessage = "=============================="; + string actualMessage = packageManagementService.FakeOutputMessagesView.NextToLastFormattedMessageLogged; + + Assert.AreEqual(expectedMessage, actualMessage); + } + + [Test] + public void AddPackage_PackageAddedSuccessfully_LastMesssageLoggedIsEmptyLine() + { + CreateViewModel(); + viewModel.AddPackage(); + + string expectedMessage = String.Empty; + string actualMessage = packageManagementService.FakeOutputMessagesView.LastFormattedMessageLogged; + + Assert.AreEqual(expectedMessage, actualMessage); + } + + [Test] + public void RemovePackage_PackageRemovedSuccessfully_UninstallingPackageMessageIsFirstMessageLogged() + { + CreateViewModel(); + package.Id = "Test.Package"; + package.Version = new Version(1, 2, 0, 55); + viewModel.PackageViewModelRemovingPackageMessageFormat = "Removing...{0}"; + viewModel.RemovePackage(); + + string expectedMessage = "------- Removing...Test.Package 1.2.0.55 -------"; + string actualMessage = packageManagementService.FakeOutputMessagesView.FirstFormattedMessageLogged; + + Assert.AreEqual(expectedMessage, actualMessage); + } + + [Test] + public void RemovePackage_PackageRemovedSuccessfully_NextToLastMesssageLoggedMarksEndOfInstallation() + { + CreateViewModel(); + viewModel.RemovePackage(); + + string expectedMessage = "=============================="; + string actualMessage = packageManagementService.FakeOutputMessagesView.NextToLastFormattedMessageLogged; + + Assert.AreEqual(expectedMessage, actualMessage); + } + + [Test] + public void RemovePackage_PackageRemovedSuccessfully_LastMesssageLoggedIsEmptyLine() + { + CreateViewModel(); + viewModel.RemovePackage(); + + string expectedMessage = String.Empty; + string actualMessage = packageManagementService.FakeOutputMessagesView.LastFormattedMessageLogged; + + Assert.AreEqual(expectedMessage, actualMessage); + } } }