diff --git a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Services/WinRTExtensionService.cs b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Services/WinRTExtensionService.cs index bcf004347a..b98edb8eb7 100644 --- a/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Services/WinRTExtensionService.cs +++ b/src/modules/cmdpal/Microsoft.CmdPal.UI.ViewModels/Services/WinRTExtensionService.cs @@ -152,9 +152,15 @@ public partial class WinRTExtensionService : IExtensionService, IDisposable } } + // C#/WinRT projects S_OK as null and every failed HRESULT as a non-null Exception. + internal static bool IsSuccessfulPackageOperation(bool isComplete, Exception? errorCode) + { + return isComplete && errorCode is null; + } + private void Catalog_PackageInstalling(PackageCatalog sender, PackageInstallingEventArgs args) { - if (args.IsComplete) + if (IsSuccessfulPackageOperation(args.IsComplete, args.ErrorCode)) { _ = HandlePackageInstalledAsync(args.Package); } @@ -162,7 +168,7 @@ public partial class WinRTExtensionService : IExtensionService, IDisposable private void Catalog_PackageUninstalling(PackageCatalog sender, PackageUninstallingEventArgs args) { - if (args.IsComplete) + if (IsSuccessfulPackageOperation(args.IsComplete, args.ErrorCode)) { _ = HandlePackageUninstalledAsync(args.Package); } @@ -170,7 +176,7 @@ public partial class WinRTExtensionService : IExtensionService, IDisposable private void Catalog_PackageUpdating(PackageCatalog sender, PackageUpdatingEventArgs args) { - if (args.IsComplete) + if (IsSuccessfulPackageOperation(args.IsComplete, args.ErrorCode)) { _ = HandlePackageUpdatedAsync(args.TargetPackage); } diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.UI.ViewModels.UnitTests/WinRTExtensionServiceTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.UI.ViewModels.UnitTests/WinRTExtensionServiceTests.cs new file mode 100644 index 0000000000..0fdec186e1 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.UI.ViewModels.UnitTests/WinRTExtensionServiceTests.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.CmdPal.UI.ViewModels.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.CmdPal.UI.ViewModels.UnitTests; + +[TestClass] +public class WinRTExtensionServiceTests +{ + [TestMethod] + public void IsSuccessfulCompletion_IncompleteOperation_ReturnsFalse() + { + Assert.IsFalse(WinRTExtensionService.IsSuccessfulPackageOperation(isComplete: false, errorCode: null)); + } + + [TestMethod] + public void IsSuccessfulCompletion_CompletedOperationWithoutError_ReturnsTrue() + { + Assert.IsTrue(WinRTExtensionService.IsSuccessfulPackageOperation(isComplete: true, errorCode: null)); + } + + [TestMethod] + public void IsSuccessfulCompletion_CompletedOperationWithAnyError_ReturnsFalse() + { + var error = new InvalidOperationException("Any projected package operation failure"); + + Assert.IsFalse(WinRTExtensionService.IsSuccessfulPackageOperation(isComplete: true, errorCode: error)); + } +}