From c23dcb0c5aec2e08d652049187c9fa552d0d73bc Mon Sep 17 00:00:00 2001 From: Yu Leng <42196638+moooyo@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:27:10 +0800 Subject: [PATCH] [CmdPal][UT] Refactor some cmdpal ext's ut and improve the test case (#40896) ## Summary of the Pull Request 1. Remove some AI generated nonsense case 2. Add ISettingsInterface for those ext for testing purpose. 3. Add query test. ## PR Checklist - [x] Closes: #40897 - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx ## Detailed Description of the Pull Request / Additional comments ## Validation Steps Performed --------- Co-authored-by: Yu Leng --- .../ExtendedCalculatorParserTests.cs | 21 +- ...Microsoft.CmdPal.Ext.Calc.UnitTests.csproj | 1 + .../QueryTests.cs | 86 ++++++ .../Settings.cs | 35 +++ .../SettingsManagerTests.cs | 55 ++++ ...osoft.CmdPal.Ext.Registry.UnitTests.csproj | 1 + .../QueryTests.cs | 74 +++++ .../Settings.cs | 15 + .../QueryTests.cs | 8 +- .../AvailableResultsListTests.cs | 10 +- .../BasicTests.cs | 28 -- .../FallbackTimeDateItemTests.cs | 26 +- .../IconTests.cs | 127 --------- ...osoft.CmdPal.Ext.TimeDate.UnitTests.csproj | 1 + .../QueryTests.cs | 268 +++++------------- .../Settings.cs | 46 +++ .../SettingsManagerTests.cs | 85 ------ ...t.CmdPal.Ext.WindowWalker.UnitTests.csproj | 1 + .../PluginSettingsTests.cs | 60 ---- .../Settings.cs | 60 ++++ .../CalculatorCommandProvider.cs | 6 +- .../Helper/CalculateEngine.cs | 2 +- .../Helper/ISettingsInterface.cs | 18 ++ .../Helper/QueryHelper.cs | 2 +- .../Helper/ResultHelper.cs | 2 +- .../Helper/SettingsManager.cs | 2 +- .../Pages/CalculatorListPage.cs | 4 +- .../Pages/FallbackCalculatorItem.cs | 4 +- .../Helpers/ISettingsInterface.cs | 17 ++ .../Helpers/SettingsManager.cs | 37 +++ .../Pages/RegistryListPage.cs | 4 +- .../RegistryCommandsProvider.cs | 5 +- .../FallbackTimeDateItem.cs | 4 +- .../Helpers/AvailableResultsList.cs | 2 +- .../Helpers/ISettingsInterface.cs | 26 ++ .../Helpers/SettingsManager.cs | 2 +- .../Helpers/TimeDateCalculator.cs | 2 +- .../Pages/TimeDateExtensionPage.cs | 4 +- .../TimeDateCommandsProvider.cs | 2 +- .../Helpers/ISettingsInterface.cs | 26 ++ .../Helpers/SettingsManager.cs | 2 +- 41 files changed, 639 insertions(+), 542 deletions(-) create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/QueryTests.cs create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Settings.cs create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/SettingsManagerTests.cs create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/QueryTests.cs create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Settings.cs delete mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/BasicTests.cs delete mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/IconTests.cs create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Settings.cs delete mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/SettingsManagerTests.cs delete mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/PluginSettingsTests.cs create mode 100644 src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Settings.cs create mode 100644 src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ISettingsInterface.cs create mode 100644 src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/ISettingsInterface.cs create mode 100644 src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/SettingsManager.cs create mode 100644 src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/ISettingsInterface.cs create mode 100644 src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/ISettingsInterface.cs diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/ExtendedCalculatorParserTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/ExtendedCalculatorParserTests.cs index e5929de717..b631f59be7 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/ExtendedCalculatorParserTests.cs +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/ExtendedCalculatorParserTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation +// 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. @@ -6,12 +6,15 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.CmdPal.Ext.Calc.Helper; +using Microsoft.CmdPal.Ext.UnitTestBase; +using Microsoft.CommandPalette.Extensions; +using Microsoft.CommandPalette.Extensions.Toolkit; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Microsoft.CmdPal.Ext.Calc.UnitTests; [TestClass] -public class ExtendedCalculatorParserTests +public class ExtendedCalculatorParserTests : CommandPaletteUnitTestBase { [DataTestMethod] [DataRow(null)] @@ -28,7 +31,7 @@ public class ExtendedCalculatorParserTests [DataRow("[10,10]")] // '[10,10]' is interpreted as array by mages engine public void Interpret_NoResult_WhenCalled(string input) { - var settings = new SettingsManager(); + var settings = new Settings(); var result = CalculateEngine.Interpret(settings, input, CultureInfo.CurrentCulture, out _); @@ -68,7 +71,7 @@ public class ExtendedCalculatorParserTests [DynamicData(nameof(Interpret_NoErrors_WhenCalledWithRounding_Data))] public void Interpret_NoErrors_WhenCalledWithRounding(string input, decimal expectedResult) { - var settings = new SettingsManager(); + var settings = new Settings(); // Act // Using InvariantCulture since this is internal @@ -90,7 +93,7 @@ public class ExtendedCalculatorParserTests public void Interpret_GreaterPrecision_WhenCalled(string input, decimal expectedResult) { // Arrange - var settings = new SettingsManager(); + var settings = new Settings(); // Act // Using InvariantCulture since this is internal @@ -114,7 +117,7 @@ public class ExtendedCalculatorParserTests { // Arrange var cultureInfo = CultureInfo.GetCultureInfo(cultureName); - var settings = new SettingsManager(); + var settings = new Settings(); // Act var result = CalculateEngine.Interpret(settings, input, cultureInfo, out _); @@ -175,7 +178,7 @@ public class ExtendedCalculatorParserTests public void Interpret_MustReturnResult_WhenResultIsZero(string input) { // Arrange - var settings = new SettingsManager(); + var settings = new Settings(); // Act // Using InvariantCulture since this is internal @@ -203,7 +206,7 @@ public class ExtendedCalculatorParserTests public void Interpret_MustReturnExpectedResult_WhenCalled(string input, decimal expectedResult) { // Arrange - var settings = new SettingsManager(); + var settings = new Settings(); // Act // Using en-us culture to have a fixed number style @@ -226,7 +229,7 @@ public class ExtendedCalculatorParserTests { // Arrange var translator = NumberTranslator.Create(new CultureInfo(sourceCultureName, false), new CultureInfo("en-US", false)); - var settings = new SettingsManager(); + var settings = new Settings(); // Act // Using en-us culture to have a fixed number style diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Microsoft.CmdPal.Ext.Calc.UnitTests.csproj b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Microsoft.CmdPal.Ext.Calc.UnitTests.csproj index 7144678183..d3f9adeeab 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Microsoft.CmdPal.Ext.Calc.UnitTests.csproj +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Microsoft.CmdPal.Ext.Calc.UnitTests.csproj @@ -14,5 +14,6 @@ + \ No newline at end of file diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/QueryTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/QueryTests.cs new file mode 100644 index 0000000000..73927849a1 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/QueryTests.cs @@ -0,0 +1,86 @@ +// 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.Linq; +using Microsoft.CmdPal.Ext.Calc.Helper; +using Microsoft.CmdPal.Ext.Calc.Pages; +using Microsoft.CmdPal.Ext.UnitTestBase; +using Microsoft.CommandPalette.Extensions.Toolkit; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.CmdPal.Ext.Calc.UnitTests; + +[TestClass] +public class QueryTests : CommandPaletteUnitTestBase +{ + [DataTestMethod] + [DataRow("2+2", "4")] + [DataRow("5*3", "15")] + [DataRow("10/2", "5")] + [DataRow("sqrt(16)", "4")] + [DataRow("2^3", "8")] + public void TopLevelPageQueryTest(string input, string expectedResult) + { + var settings = new Settings(); + var page = new CalculatorListPage(settings); + + // Simulate query execution + page.UpdateSearchText(string.Empty, input); + var result = page.GetItems(); + + Assert.IsTrue(result.Length == 1, "Valid input should always return result"); + + var firstResult = result.FirstOrDefault(); + + Assert.IsNotNull(result); + Assert.IsTrue( + firstResult.Title.Contains(expectedResult), + $"Expected result to contain '{expectedResult}' but got '{firstResult.Title}'"); + } + + [TestMethod] + public void EmptyQueryTest() + { + var settings = new Settings(); + var page = new CalculatorListPage(settings); + page.UpdateSearchText("abc", string.Empty); + var results = page.GetItems(); + Assert.IsNotNull(results); + + var firstItem = results.FirstOrDefault(); + Assert.AreEqual("Type an equation...", firstItem.Title); + } + + [TestMethod] + public void InvalidExpressionTest() + { + var settings = new Settings(); + + var page = new CalculatorListPage(settings); + + // Simulate query execution + page.UpdateSearchText(string.Empty, "invalid expression"); + var result = page.GetItems().FirstOrDefault(); + + Assert.AreEqual("Type an equation...", result.Title); + } + + [DataTestMethod] + [DataRow("sin(60)", "-0.30481", CalculateEngine.TrigMode.Radians)] + [DataRow("sin(60)", "0.866025", CalculateEngine.TrigMode.Degrees)] + [DataRow("sin(60)", "0.809016", CalculateEngine.TrigMode.Gradians)] + public void TrigModeSettingsTest(string input, string expected, CalculateEngine.TrigMode trigMode) + { + var settings = new Settings(trigUnit: trigMode); + + var page = new CalculatorListPage(settings); + + page.UpdateSearchText(string.Empty, input); + var result = page.GetItems().FirstOrDefault(); + + Assert.IsNotNull(result); + + Assert.IsTrue(result.Title.Contains(expected, System.StringComparison.Ordinal), $"Calc trigMode convert result isn't correct. Current result: {result.Title}"); + } +} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Settings.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Settings.cs new file mode 100644 index 0000000000..ccd231767d --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/Settings.cs @@ -0,0 +1,35 @@ +// 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 Microsoft.CmdPal.Ext.Calc.Helper; + +namespace Microsoft.CmdPal.Ext.Calc.UnitTests; + +public class Settings : ISettingsInterface +{ + private readonly CalculateEngine.TrigMode trigUnit; + private readonly bool inputUseEnglishFormat; + private readonly bool outputUseEnglishFormat; + private readonly bool closeOnEnter; + + public Settings( + CalculateEngine.TrigMode trigUnit = CalculateEngine.TrigMode.Radians, + bool inputUseEnglishFormat = false, + bool outputUseEnglishFormat = false, + bool closeOnEnter = true) + { + this.trigUnit = trigUnit; + this.inputUseEnglishFormat = inputUseEnglishFormat; + this.outputUseEnglishFormat = outputUseEnglishFormat; + this.closeOnEnter = closeOnEnter; + } + + public CalculateEngine.TrigMode TrigUnit => trigUnit; + + public bool InputUseEnglishFormat => inputUseEnglishFormat; + + public bool OutputUseEnglishFormat => outputUseEnglishFormat; + + public bool CloseOnEnter => closeOnEnter; +} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/SettingsManagerTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/SettingsManagerTests.cs new file mode 100644 index 0000000000..a59fda15d4 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Calc.UnitTests/SettingsManagerTests.cs @@ -0,0 +1,55 @@ +// 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 Microsoft.CmdPal.Ext.Calc.Helper; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.CmdPal.Ext.Calc.UnitTests; + +[TestClass] +public class SettingsManagerTests +{ + [TestMethod] + public void SettingsManagerInitializationTest() + { + // Act + var settingsManager = new SettingsManager(); + + // Assert + Assert.IsNotNull(settingsManager); + Assert.IsNotNull(settingsManager.Settings); + } + + [TestMethod] + public void SettingsInterfaceTest() + { + // Act + ISettingsInterface settings = new SettingsManager(); + + // Assert + Assert.IsNotNull(settings); + Assert.IsTrue(settings.TrigUnit == CalculateEngine.TrigMode.Radians); + Assert.IsFalse(settings.InputUseEnglishFormat); + Assert.IsFalse(settings.OutputUseEnglishFormat); + Assert.IsTrue(settings.CloseOnEnter); + } + + [TestMethod] + public void MockSettingsTest() + { + // Act + var settings = new Settings( + trigUnit: CalculateEngine.TrigMode.Degrees, + inputUseEnglishFormat: true, + outputUseEnglishFormat: true, + closeOnEnter: false); + + // Assert + Assert.IsNotNull(settings); + Assert.AreEqual(CalculateEngine.TrigMode.Degrees, settings.TrigUnit); + Assert.IsTrue(settings.InputUseEnglishFormat); + Assert.IsTrue(settings.OutputUseEnglishFormat); + Assert.IsFalse(settings.CloseOnEnter); + } +} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Microsoft.CmdPal.Ext.Registry.UnitTests.csproj b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Microsoft.CmdPal.Ext.Registry.UnitTests.csproj index 951ad696a5..6bcc7bd5da 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Microsoft.CmdPal.Ext.Registry.UnitTests.csproj +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Microsoft.CmdPal.Ext.Registry.UnitTests.csproj @@ -18,5 +18,6 @@ + diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/QueryTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/QueryTests.cs new file mode 100644 index 0000000000..796b3b1b32 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/QueryTests.cs @@ -0,0 +1,74 @@ +// 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.Linq; +using Microsoft.CmdPal.Ext.Registry.Helpers; +using Microsoft.CmdPal.Ext.UnitTestBase; +using Microsoft.CommandPalette.Extensions; +using Microsoft.CommandPalette.Extensions.Toolkit; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.CmdPal.Ext.Registry.UnitTests; + +[TestClass] +public class QueryTests : CommandPaletteUnitTestBase +{ + [DataTestMethod] + [DataRow("HKLM", "HKEY_LOCAL_MACHINE")] + [DataRow("HKCU", "HKEY_CURRENT_USER")] + [DataRow("HKCR", "HKEY_CLASSES_ROOT")] + [DataRow("HKU", "HKEY_USERS")] + [DataRow("HKCC", "HKEY_CURRENT_CONFIG")] + public void TopLevelPageQueryTest(string input, string expectedKeyName) + { + var settings = new Settings(); + var page = new RegistryListPage(settings); + var results = page.Query(input); + + Assert.IsNotNull(results); + Assert.IsTrue(results.Count > 0, "No items matched the query."); + + var firstItem = results.FirstOrDefault(); + Assert.IsNotNull(firstItem, "No items matched the query."); + Assert.IsTrue( + firstItem.Title.Contains(expectedKeyName, System.StringComparison.OrdinalIgnoreCase), + $"Expected to match '{expectedKeyName}' but got '{firstItem.Title}'"); + } + + [TestMethod] + public void EmptyQueryTest() + { + var settings = new Settings(); + var page = new RegistryListPage(settings); + var results = page.Query(string.Empty); + + Assert.IsNotNull(results); + + // Empty query should return all base keys + Assert.IsTrue(results.Count >= 5, "Expected at least 5 base registry keys."); + } + + [TestMethod] + public void NullQueryTest() + { + var settings = new Settings(); + var page = new RegistryListPage(settings); + var results = page.Query(null); + + Assert.IsNotNull(results); + Assert.AreEqual(0, results.Count, "Null query should return empty results."); + } + + [TestMethod] + public void InvalidBaseKeyTest() + { + var settings = new Settings(); + var page = new RegistryListPage(settings); + var results = page.Query("INVALID_KEY"); + + Assert.IsNotNull(results); + + Assert.AreEqual(0, results.Count, "Invalid query should return empty results."); + } +} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Settings.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Settings.cs new file mode 100644 index 0000000000..f999dd4c29 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.Registry.UnitTests/Settings.cs @@ -0,0 +1,15 @@ +// 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 Microsoft.CmdPal.Ext.Registry.Helpers; + +namespace Microsoft.CmdPal.Ext.Registry.UnitTests; + +public class Settings : ISettingsInterface +{ + public Settings() + { + // Currently no specific settings for Registry extension + } +} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.System.UnitTests/QueryTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.System.UnitTests/QueryTests.cs index dc455dd0e4..5b11ba6e05 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.System.UnitTests/QueryTests.cs +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.System.UnitTests/QueryTests.cs @@ -142,11 +142,7 @@ public class QueryTests : CommandPaletteUnitTestBase // UEFI Firmware Settings command should exist Assert.IsNotNull(result); var firstItem = result.FirstOrDefault(); - Assert.IsNotNull(firstItem, "No items matched the query."); - var containsFirmwareSettings = firstItem.Title.Contains("UEFI Firmware Settings", StringComparison.OrdinalIgnoreCase); - - Assert.IsTrue( - containsFirmwareSettings == hasCommand, - $"Expected to match 'UEFI Firmware Settings' but got '{firstItem.Title}'"); + var firstItemIsUefiCommand = firstItem?.Title.Contains("UEFI", StringComparison.OrdinalIgnoreCase) ?? false; + Assert.AreEqual(hasCommand, firstItemIsUefiCommand, $"Expected to match (or not match) 'UEFI Firmware Settings' but got '{firstItem?.Title}'"); } } diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/AvailableResultsListTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/AvailableResultsListTests.cs index 54004680b4..1c5b7a981c 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/AvailableResultsListTests.cs +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/AvailableResultsListTests.cs @@ -367,7 +367,7 @@ public class AvailableResultsListTests public void UnixTimestampSecondsFormat() { // Setup - string formatLabel = "Unix epoch time"; + var formatLabel = "Unix epoch time"; DateTime timeValue = DateTime.Now.ToUniversalTime(); var settings = new SettingsManager(); var helperResults = AvailableResultsList.GetList(true, settings, null, null, timeValue); @@ -384,7 +384,7 @@ public class AvailableResultsListTests public void UnixTimestampMillisecondsFormat() { // Setup - string formatLabel = "Unix epoch time in milliseconds"; + var formatLabel = "Unix epoch time in milliseconds"; DateTime timeValue = DateTime.Now.ToUniversalTime(); var settings = new SettingsManager(); var helperResults = AvailableResultsList.GetList(true, settings, null, null, timeValue); @@ -401,7 +401,7 @@ public class AvailableResultsListTests public void WindowsFileTimeFormat() { // Setup - string formatLabel = "Windows file time (Int64 number)"; + var formatLabel = "Windows file time (Int64 number)"; DateTime timeValue = DateTime.Now; var settings = new SettingsManager(); var helperResults = AvailableResultsList.GetList(true, settings, null, null, timeValue); @@ -418,7 +418,7 @@ public class AvailableResultsListTests public void ValidateEraResult() { // Setup - string formatLabel = "Era"; + var formatLabel = "Era"; DateTime timeValue = DateTime.Now; var settings = new SettingsManager(); var helperResults = AvailableResultsList.GetList(true, settings, null, null, timeValue); @@ -435,7 +435,7 @@ public class AvailableResultsListTests public void ValidateEraAbbreviationResult() { // Setup - string formatLabel = "Era abbreviation"; + var formatLabel = "Era abbreviation"; DateTime timeValue = DateTime.Now; var settings = new SettingsManager(); var helperResults = AvailableResultsList.GetList(true, settings, null, null, timeValue); diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/BasicTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/BasicTests.cs deleted file mode 100644 index a6dd74db3f..0000000000 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/BasicTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -// 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.VisualStudio.TestTools.UnitTesting; - -namespace Microsoft.CmdPal.Ext.TimeDate.UnitTests; - -[TestClass] -public class BasicTests -{ - [TestMethod] - public void BasicTest() - { - // This is a basic test to verify the test project can run - Assert.IsTrue(true); - } - - [TestMethod] - public void DateTimeTest() - { - // Test basic DateTime functionality - var now = DateTime.Now; - Assert.IsNotNull(now); - Assert.IsTrue(now > DateTime.MinValue); - } -} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/FallbackTimeDateItemTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/FallbackTimeDateItemTests.cs index 596a0af97c..3f13336b0b 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/FallbackTimeDateItemTests.cs +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/FallbackTimeDateItemTests.cs @@ -40,7 +40,7 @@ public class FallbackTimeDateItemTests public void FallbackQueryTests(string query, string expectedTitle) { // Setup - var settingsManager = new SettingsManager(); + var settingsManager = new Settings(); DateTime now = new DateTime(2025, 7, 1, 12, 0, 0); // Fixed date for testing var fallbackItem = new FallbackTimeDateItem(settingsManager, now); @@ -66,7 +66,7 @@ public class FallbackTimeDateItemTests public void InvalidQueryTests(string query) { // Setup - var settingsManager = new SettingsManager(); + var settingsManager = new Settings(); DateTime now = new DateTime(2025, 7, 1, 12, 0, 0); // Fixed date for testing var fallbackItem = new FallbackTimeDateItem(settingsManager, now); @@ -83,4 +83,26 @@ public class FallbackTimeDateItemTests Assert.Fail($"UpdateQuery should not throw exceptions: {ex.Message}"); } } + + [DataTestMethod] + public void DisableFallbackItemTest() + { + // Setup + var settingsManager = new Settings(enableFallbackItems: false); + DateTime now = new DateTime(2025, 7, 1, 12, 0, 0); // Fixed date for testing + var fallbackItem = new FallbackTimeDateItem(settingsManager, now); + + // Act & Assert - Test that UpdateQuery doesn't throw exceptions + try + { + fallbackItem.UpdateQuery("now"); + + Assert.AreEqual(string.Empty, fallbackItem.Title, "Title should be empty when disable fallback item"); + Assert.AreEqual(string.Empty, fallbackItem.Subtitle, "Subtitle should be empty when disable fallback item"); + } + catch (Exception ex) + { + Assert.Fail($"UpdateQuery should not throw exceptions: {ex.Message}"); + } + } } diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/IconTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/IconTests.cs deleted file mode 100644 index 9dcbfd6f96..0000000000 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/IconTests.cs +++ /dev/null @@ -1,127 +0,0 @@ -// 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 System.Globalization; -using Microsoft.CmdPal.Ext.TimeDate.Helpers; -using Microsoft.CommandPalette.Extensions.Toolkit; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Microsoft.CmdPal.Ext.TimeDate.UnitTests; - -[TestClass] -public class IconTests -{ - private CultureInfo originalCulture; - private CultureInfo originalUiCulture; - - [TestInitialize] - public void Setup() - { - // Set culture to 'en-us' - originalCulture = CultureInfo.CurrentCulture; - CultureInfo.CurrentCulture = new CultureInfo("en-us", false); - originalUiCulture = CultureInfo.CurrentUICulture; - CultureInfo.CurrentUICulture = new CultureInfo("en-us", false); - } - - [TestCleanup] - public void CleanUp() - { - // Set culture to original value - CultureInfo.CurrentCulture = originalCulture; - CultureInfo.CurrentUICulture = originalUiCulture; - } - - [TestMethod] - public void TimeDateCommandsProvider_HasIcon() - { - // Setup - var provider = new TimeDateCommandsProvider(); - - // Act - var icon = provider.Icon; - - // Assert - Assert.IsNotNull(icon, "Provider should have an icon"); - } - - [TestMethod] - public void TimeDateCommandsProvider_TopLevelCommands_HaveIcons() - { - // Setup - var provider = new TimeDateCommandsProvider(); - - // Act - var commands = provider.TopLevelCommands(); - - // Assert - Assert.IsNotNull(commands); - Assert.IsTrue(commands.Length > 0, "Should have at least one top-level command"); - - foreach (var command in commands) - { - Assert.IsNotNull(command.Icon, "Each command should have an icon"); - } - } - - [TestMethod] - public void AvailableResults_HaveIcons() - { - // Setup - var settings = new SettingsManager(); - - // Act - var results = AvailableResultsList.GetList(true, settings); - - // Assert - Assert.IsNotNull(results); - Assert.IsTrue(results.Count > 0, "Should have results"); - - foreach (var result in results) - { - Assert.IsNotNull(result.GetIconInfo(), $"Result '{result.Label}' should have an icon"); - } - } - - [DataTestMethod] - [DataRow(ResultIconType.Time, "\uE823")] - [DataRow(ResultIconType.Date, "\uE787")] - [DataRow(ResultIconType.DateTime, "\uEC92")] - public void ResultHelper_CreateListItem_PreservesIcon(ResultIconType resultIconType, string expectedIcon) - { - // Setup - var availableResult = new AvailableResult - { - Label = "Test Label", - Value = "Test Value", - IconType = resultIconType, - }; - - // Act - var listItem = availableResult.ToListItem(); - - var icon = listItem.Icon; - - // Assert - Assert.IsNotNull(listItem); - Assert.IsNotNull(listItem.Icon, "ListItem should preserve the icon from AvailableResult"); - Assert.AreEqual(expectedIcon, icon.Dark.Icon, $"Icon for {resultIconType} should match expected value"); - } - - [TestMethod] - public void Icons_AreNotEmpty() - { - // Setup - var settings = new SettingsManager(); - var results = AvailableResultsList.GetList(true, settings); - - // Act & Assert - foreach (var result in results) - { - Assert.IsNotNull(result.GetIconInfo(), $"Result '{result.Label}' should have an icon"); - Assert.IsFalse(string.IsNullOrWhiteSpace(result.GetIconInfo().ToString()), $"Icon for '{result.Label}' should not be empty"); - } - } -} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Microsoft.CmdPal.Ext.TimeDate.UnitTests.csproj b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Microsoft.CmdPal.Ext.TimeDate.UnitTests.csproj index c9eb4eb904..b19c5348eb 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Microsoft.CmdPal.Ext.TimeDate.UnitTests.csproj +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Microsoft.CmdPal.Ext.TimeDate.UnitTests.csproj @@ -19,5 +19,6 @@ + diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/QueryTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/QueryTests.cs index b6d2b69050..cba7614044 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/QueryTests.cs +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/QueryTests.cs @@ -6,13 +6,14 @@ using System; using System.Globalization; using System.Linq; using Microsoft.CmdPal.Ext.TimeDate.Helpers; -using Microsoft.CommandPalette.Extensions.Toolkit; +using Microsoft.CmdPal.Ext.TimeDate.Pages; +using Microsoft.CmdPal.Ext.UnitTestBase; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Microsoft.CmdPal.Ext.TimeDate.UnitTests; [TestClass] -public class QueryTests +public class QueryTests : CommandPaletteUnitTestBase { private CultureInfo originalCulture; private CultureInfo originalUiCulture; @@ -46,7 +47,7 @@ public class QueryTests public void CountBasicQueries(string query, int expectedMinResultCount) { // Setup - var settings = new SettingsManager(); + var settings = new Settings(); // Act var results = TimeDateCalculator.ExecuteSearch(settings, query); @@ -58,30 +59,32 @@ public class QueryTests } [DataTestMethod] - [DataRow("time")] - [DataRow("date")] - [DataRow("year")] - [DataRow("now")] - [DataRow("current")] - [DataRow("")] - [DataRow("now::10:10:10")] // Windows file time - public void AllQueriesReturnResults(string query) + [DataRow("time", "time")] + [DataRow("date", "date")] + [DataRow("year", "year")] + [DataRow("now", "now")] + [DataRow("year", "year")] + public void BasicQueryTest(string input, string expectedMatchTerm) { - // Setup - var settings = new SettingsManager(); + var settings = new Settings(); + var page = new TimeDateExtensionPage(settings); + page.UpdateSearchText(string.Empty, input); + var resultLists = page.GetItems(); - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); + var result = Query(input, resultLists); - // Assert - Assert.IsNotNull(results); - Assert.IsTrue(results.Count > 0, $"Query '{query}' should return at least one result"); + Assert.IsNotNull(result); + Assert.IsTrue(result.Length > 0, "No items matched the query."); + + var firstItem = result.FirstOrDefault(); + Assert.IsNotNull(firstItem, "No items matched the query."); + Assert.IsTrue( + firstItem.Title.Contains(expectedMatchTerm, System.StringComparison.OrdinalIgnoreCase) || + firstItem.Subtitle.Contains(expectedMatchTerm, System.StringComparison.OrdinalIgnoreCase), + $"Expected to match '{expectedMatchTerm}' in title or subtitle but got '{firstItem.Title}' - '{firstItem.Subtitle}'"); } [DataTestMethod] - [DataRow("time", "Time")] - [DataRow("date", "Date")] - [DataRow("now", "Now")] [DataRow("unix", "Unix epoch time")] [DataRow("unix epoch time in milli", "Unix epoch time in milliseconds")] [DataRow("file", "Windows file time (Int64 number)")] @@ -98,12 +101,8 @@ public class QueryTests [DataRow("month", "Month")] [DataRow("month of year", "Month of the year")] [DataRow("month and d", "Month and day")] - [DataRow("month and y", "Month and year")] [DataRow("year", "Year")] - [DataRow("era", "Era")] - [DataRow("era a", "Era abbreviation")] [DataRow("universal", "Universal time format: YYYY-MM-DD hh:mm:ss")] - [DataRow("iso", "ISO 8601")] [DataRow("rfc", "RFC1123")] [DataRow("time::12:30", "Time")] [DataRow("date::10.10.2022", "Date")] @@ -114,40 +113,19 @@ public class QueryTests [DataRow("week num", "Week of the year (Calendar week, Week number)")] [DataRow("days in mo", "Days in month")] [DataRow("Leap y", "Leap year")] - public void CanFindFormatResult(string query, string expectedSubtitle) + public void FormatDateQueryTest(string input, string expectedMatchTerm) { - // Setup - var settings = new SettingsManager(); + var settings = new Settings(); + var page = new TimeDateExtensionPage(settings); + page.UpdateSearchText(string.Empty, input); + var resultLists = page.GetItems(); - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); - - // Assert - var matchingResult = results.FirstOrDefault(x => x.Subtitle?.StartsWith(expectedSubtitle, StringComparison.CurrentCulture) == true); - Assert.IsNotNull(matchingResult, $"Could not find result with subtitle starting with '{expectedSubtitle}' for query '{query}'"); - } - - [DataTestMethod] - [DataRow("12:30", "Time")] - [DataRow("10.10.2022", "Date")] - [DataRow("u1646408119", "Date and time")] - [DataRow("u+1646408119", "Date and time")] - [DataRow("u-1646408119", "Date and time")] - [DataRow("ums1646408119", "Date and time")] - [DataRow("ums+1646408119", "Date and time")] - [DataRow("ums-1646408119", "Date and time")] - [DataRow("ft637820085517321977", "Date and time")] - public void DateTimeNumberOnlyInput(string query, string expectedSubtitle) - { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); - - // Assert - var matchingResult = results.FirstOrDefault(x => x.Subtitle?.StartsWith(expectedSubtitle, StringComparison.CurrentCulture) == true); - Assert.IsNotNull(matchingResult, $"Could not find result with subtitle starting with '{expectedSubtitle}' for query '{query}'"); + var firstItem = resultLists.FirstOrDefault(); + Assert.IsNotNull(firstItem, "No items matched the query."); + Assert.IsTrue( + firstItem.Title.Contains(expectedMatchTerm, System.StringComparison.OrdinalIgnoreCase) || + firstItem.Subtitle.Contains(expectedMatchTerm, System.StringComparison.OrdinalIgnoreCase), + $"Expected to match '{expectedMatchTerm}' in title or subtitle but got '{firstItem.Title}' - '{firstItem.Subtitle}'"); } [DataTestMethod] @@ -157,24 +135,6 @@ public class QueryTests [DataRow("time:eeee")] [DataRow("time::eeee")] [DataRow("time//eeee")] - public void InvalidInputShowsErrorResults(string query) - { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); - - // Assert - Assert.IsNotNull(results, $"Results should not be null for query '{query}'"); - Assert.IsTrue(results.Count > 0, $"Query '{query}' should return at least one result"); - - // For invalid input, cmdpal returns an error result - var hasErrorResult = results.Any(r => r.Title?.StartsWith("Error: Invalid input", StringComparison.CurrentCulture) == true); - Assert.IsTrue(hasErrorResult, $"Query '{query}' should return an error result for invalid input"); - } - - [DataTestMethod] [DataRow("ug1646408119")] // Invalid prefix [DataRow("u9999999999999")] // Unix number + prefix is longer than 12 characters [DataRow("ums999999999999999")] // Unix number in milliseconds + prefix is longer than 17 characters @@ -194,116 +154,33 @@ public class QueryTests [DataRow("10.aa.22")] [DataRow("12::55")] [DataRow("12:aa:55")] - public void InvalidNumberInputShowsErrorMessage(string query) + public void InvalidInputShowsErrorResults(string query) { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); + var settings = new Settings(); + var page = new TimeDateExtensionPage(settings); + page.UpdateSearchText(string.Empty, query); + var results = page.GetItems(); // Assert Assert.IsNotNull(results, $"Results should not be null for query '{query}'"); - Assert.IsTrue(results.Count > 0, $"Should return at least one result (error message) for invalid query '{query}'"); + Assert.IsTrue(results.Length > 0, $"Query '{query}' should return at least one result"); - // Check if we get an error result - var errorResult = results.FirstOrDefault(r => r.Title?.StartsWith("Error: Invalid input", StringComparison.CurrentCulture) == true); - Assert.IsNotNull(errorResult, $"Should return an error result for invalid query '{query}'"); + var firstItem = results.FirstOrDefault(); + Assert.IsTrue(firstItem.Title.StartsWith("Error: Invalid input", StringComparison.CurrentCulture), $"Query '{query}' should return an error result for invalid input"); } [DataTestMethod] - [DataRow("10.10aa")] // Input contains . (Can be part of a date.) - [DataRow("10:10aa")] // Input contains : (Can be part of a time.) - [DataRow("10/10aa")] // Input contains / (Can be part of a date.) - public void InvalidInputNotShowsErrorMessage(string query) + [DataRow("")] + [DataRow(null)] + public void EmptyQueryReturnsAllResults(string input) { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); + var settings = new Settings(); + var page = new TimeDateExtensionPage(settings); + page.UpdateSearchText("abc", input); + var results = page.GetItems(); // Assert - Assert.IsNotNull(results, $"Results should not be null for query '{query}'"); - - // These queries are ambiguous and cmdpal returns an error for them - // This test might need to be adjusted based on actual cmdpal behavior - if (results.Count > 0) - { - var hasErrorResult = results.Any(r => r.Title?.StartsWith("Error: Invalid input", StringComparison.CurrentCulture) == true); - - // For these ambiguous inputs, cmdpal may return error results, which is acceptable - // We just verify that the system handles them gracefully (doesn't crash) - Assert.IsTrue(true, $"Query '{query}' handled gracefully"); - } - } - - [DataTestMethod] - [DataRow("time", "time", true)] // Full word match should work - [DataRow("date", "date", true)] // Full word match should work - [DataRow("now", "now", true)] // Full word match should work - [DataRow("year", "year", true)] // Full word match should work - [DataRow("abcdefg", "", false)] // Invalid query should return error - public void ValidateBehaviorOnSearchQueries(string query, string expectedMatchTerm, bool shouldHaveValidResults) - { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); - - // Assert - Assert.IsNotNull(results, $"Results should not be null for query '{query}'"); - Assert.IsTrue(results.Count > 0, $"Query '{query}' should return at least one result"); - - if (shouldHaveValidResults) - { - // Should have non-error results - var hasValidResult = results.Any(r => !r.Title?.StartsWith("Error: Invalid input", StringComparison.CurrentCulture) == true); - Assert.IsTrue(hasValidResult, $"Query '{query}' should return valid (non-error) results"); - - if (!string.IsNullOrEmpty(expectedMatchTerm)) - { - var hasMatchingResult = results.Any(r => - r.Title?.Contains(expectedMatchTerm, StringComparison.CurrentCultureIgnoreCase) == true || - r.Subtitle?.Contains(expectedMatchTerm, StringComparison.CurrentCultureIgnoreCase) == true); - Assert.IsTrue(hasMatchingResult, $"Query '{query}' should return results containing '{expectedMatchTerm}'"); - } - } - else - { - // Should have error results - var hasErrorResult = results.Any(r => r.Title?.StartsWith("Error: Invalid input", StringComparison.CurrentCulture) == true); - Assert.IsTrue(hasErrorResult, $"Query '{query}' should return error results for invalid input"); - } - } - - [TestMethod] - public void EmptyQueryReturnsAllResults() - { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, string.Empty); - - // Assert - Assert.IsNotNull(results); - Assert.IsTrue(results.Count > 0, "Empty query should return all available results"); - } - - [TestMethod] - public void NullQueryReturnsAllResults() - { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, null); - - // Assert - Assert.IsNotNull(results); - Assert.IsTrue(results.Count > 0, "Null query should return all available results"); + Assert.IsTrue(results.Length > 0, $"Empty query should return results"); } [DataTestMethod] @@ -312,39 +189,34 @@ public class QueryTests [DataRow("iso utc", "ISO 8601 UTC")] [DataRow("iso zone", "ISO 8601 with time zone")] [DataRow("iso utc zone", "ISO 8601 UTC with time zone")] - public void UTCRelatedQueries(string query, string expectedSubtitle) + public void TimeZoneQuery(string query, string expectedSubtitle) { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); + var settings = new Settings(); + var page = new TimeDateExtensionPage(settings); + page.UpdateSearchText(string.Empty, query); + var resultsList = page.GetItems(); + var results = Query(query, resultsList); // Assert Assert.IsNotNull(results); - Assert.IsTrue(results.Count > 0, $"Query '{query}' should return results"); - - var matchingResult = results.FirstOrDefault(x => x.Subtitle?.StartsWith(expectedSubtitle, StringComparison.CurrentCulture) == true); - Assert.IsNotNull(matchingResult, $"Could not find result with subtitle starting with '{expectedSubtitle}' for query '{query}'"); + var firstResult = results.FirstOrDefault(); + Assert.IsTrue(firstResult.Subtitle.StartsWith(expectedSubtitle, StringComparison.CurrentCulture), $"Could not find result with subtitle starting with '{expectedSubtitle}' for query '{query}'"); } [DataTestMethod] - [DataRow("time::12:30:45")] - [DataRow("date::2023-12-25")] - [DataRow("now::u1646408119")] - [DataRow("current::ft637820085517321977")] - public void DelimiterQueriesReturnResults(string query) + [DataRow("time::12:30:45", "12:30 PM")] + [DataRow("date::2023-12-25", "12/25/2023")] + [DataRow("now::u1646408119", "132908817190000000")] + public void DelimiterQueriesReturnResults(string query, string expectedResult) { - // Setup - var settings = new SettingsManager(); - - // Act - var results = TimeDateCalculator.ExecuteSearch(settings, query); + var settings = new Settings(); + var page = new TimeDateExtensionPage(settings); + page.UpdateSearchText(string.Empty, query); + var resultsList = page.GetItems(); // Assert - Assert.IsNotNull(results); - - // Delimiter queries should return results even if parsing fails (error results) - Assert.IsTrue(results.Count > 0, $"Delimiter query '{query}' should return at least one result"); + Assert.IsNotNull(resultsList); + var firstResult = resultsList.FirstOrDefault(); + Assert.IsTrue(firstResult.Title.Contains(expectedResult, StringComparison.CurrentCulture), $"Delimiter query '{query}' result not match {expectedResult} current result {firstResult.Title}"); } } diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Settings.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Settings.cs new file mode 100644 index 0000000000..ce412a7377 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/Settings.cs @@ -0,0 +1,46 @@ +// 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.Collections.Generic; +using Microsoft.CmdPal.Ext.TimeDate.Helpers; + +namespace Microsoft.CmdPal.Ext.TimeDate.UnitTests; + +public class Settings : ISettingsInterface +{ + private readonly int firstWeekOfYear; + private readonly int firstDayOfWeek; + private readonly bool enableFallbackItems; + private readonly bool timeWithSecond; + private readonly bool dateWithWeekday; + private readonly List customFormats; + + public Settings( + int firstWeekOfYear = -1, + int firstDayOfWeek = -1, + bool enableFallbackItems = true, + bool timeWithSecond = false, + bool dateWithWeekday = false, + List customFormats = null) + { + this.firstWeekOfYear = firstWeekOfYear; + this.firstDayOfWeek = firstDayOfWeek; + this.enableFallbackItems = enableFallbackItems; + this.timeWithSecond = timeWithSecond; + this.dateWithWeekday = dateWithWeekday; + this.customFormats = customFormats ?? new List(); + } + + public int FirstWeekOfYear => firstWeekOfYear; + + public int FirstDayOfWeek => firstDayOfWeek; + + public bool EnableFallbackItems => enableFallbackItems; + + public bool TimeWithSecond => timeWithSecond; + + public bool DateWithWeekday => dateWithWeekday; + + public List CustomFormats => customFormats; +} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/SettingsManagerTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/SettingsManagerTests.cs deleted file mode 100644 index 70e3c07e0d..0000000000 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.TimeDate.UnitTests/SettingsManagerTests.cs +++ /dev/null @@ -1,85 +0,0 @@ -// 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 System.Globalization; -using Microsoft.CmdPal.Ext.TimeDate.Helpers; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Microsoft.CmdPal.Ext.TimeDate.UnitTests; - -[TestClass] -public class SettingsManagerTests -{ - private CultureInfo originalCulture; - private CultureInfo originalUiCulture; - - [TestInitialize] - public void Setup() - { - // Set culture to 'en-us' - originalCulture = CultureInfo.CurrentCulture; - CultureInfo.CurrentCulture = new CultureInfo("en-us", false); - originalUiCulture = CultureInfo.CurrentUICulture; - CultureInfo.CurrentUICulture = new CultureInfo("en-us", false); - } - - [TestCleanup] - public void Cleanup() - { - // Restore original culture - CultureInfo.CurrentCulture = originalCulture; - CultureInfo.CurrentUICulture = originalUiCulture; - } - - [TestMethod] - public void SettingsManagerInitializationTest() - { - // Act - var settingsManager = new SettingsManager(); - - // Assert - Assert.IsNotNull(settingsManager); - Assert.IsNotNull(settingsManager.Settings); - } - - [TestMethod] - public void DefaultSettingsValidation() - { - // Act - var settingsManager = new SettingsManager(); - - // Assert - Check that properties are accessible - var enableFallback = settingsManager.EnableFallbackItems; - var timeWithSecond = settingsManager.TimeWithSecond; - var dateWithWeekday = settingsManager.DateWithWeekday; - var firstWeekOfYear = settingsManager.FirstWeekOfYear; - var firstDayOfWeek = settingsManager.FirstDayOfWeek; - var customFormats = settingsManager.CustomFormats; - - Assert.IsNotNull(customFormats); - } - - [TestMethod] - public void SettingsPropertiesAccessibilityTest() - { - // Setup - var settingsManager = new SettingsManager(); - - // Act & Assert - Verify all properties are accessible without exception - try - { - _ = settingsManager.EnableFallbackItems; - _ = settingsManager.TimeWithSecond; - _ = settingsManager.DateWithWeekday; - _ = settingsManager.FirstWeekOfYear; - _ = settingsManager.FirstDayOfWeek; - _ = settingsManager.CustomFormats; - } - catch (Exception ex) - { - Assert.Fail($"Settings properties should be accessible: {ex.Message}"); - } - } -} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj index 8019cfff91..8fde8f6f39 100644 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj @@ -20,5 +20,6 @@ + diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/PluginSettingsTests.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/PluginSettingsTests.cs deleted file mode 100644 index fd8e103140..0000000000 --- a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/PluginSettingsTests.cs +++ /dev/null @@ -1,60 +0,0 @@ -// 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 System.Reflection; - -using Microsoft.CmdPal.Ext.WindowWalker.Helpers; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Microsoft.CmdPal.Ext.WindowWalker.UnitTests; - -[TestClass] -public class PluginSettingsTests -{ - [DataTestMethod] - [DataRow("ResultsFromVisibleDesktopOnly")] - [DataRow("SubtitleShowPid")] - [DataRow("SubtitleShowDesktopName")] - [DataRow("ConfirmKillProcess")] - [DataRow("KillProcessTree")] - [DataRow("OpenAfterKillAndClose")] - [DataRow("HideKillProcessOnElevatedProcesses")] - [DataRow("HideExplorerSettingInfo")] - [DataRow("InMruOrder")] - public void DoesSettingExist(string name) - { - // Setup - Type settings = SettingsManager.Instance?.GetType(); - - // Act - var result = settings?.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); - - // Assert - Assert.IsNotNull(result); - } - - [DataTestMethod] - [DataRow("ResultsFromVisibleDesktopOnly", false)] - [DataRow("SubtitleShowPid", false)] - [DataRow("SubtitleShowDesktopName", true)] - [DataRow("ConfirmKillProcess", true)] - [DataRow("KillProcessTree", false)] - [DataRow("OpenAfterKillAndClose", false)] - [DataRow("HideKillProcessOnElevatedProcesses", false)] - [DataRow("HideExplorerSettingInfo", true)] - [DataRow("InMruOrder", true)] - public void DefaultValues(string name, bool valueExpected) - { - // Setup - SettingsManager setting = SettingsManager.Instance; - - // Act - PropertyInfo propertyInfo = setting?.GetType()?.GetProperty(name, BindingFlags.Public | BindingFlags.Instance); - var result = propertyInfo?.GetValue(setting); - - // Assert - Assert.AreEqual(valueExpected, result); - } -} diff --git a/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Settings.cs b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Settings.cs new file mode 100644 index 0000000000..e8271da371 --- /dev/null +++ b/src/modules/cmdpal/Tests/Microsoft.CmdPal.Ext.WindowWalker.UnitTests/Settings.cs @@ -0,0 +1,60 @@ +// 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 Microsoft.CmdPal.Ext.WindowWalker.Helpers; + +namespace Microsoft.CmdPal.Ext.WindowWalker.UnitTests; + +public class Settings : ISettingsInterface +{ + private readonly bool resultsFromVisibleDesktopOnly; + private readonly bool subtitleShowPid; + private readonly bool subtitleShowDesktopName; + private readonly bool confirmKillProcess; + private readonly bool killProcessTree; + private readonly bool openAfterKillAndClose; + private readonly bool hideKillProcessOnElevatedProcesses; + private readonly bool hideExplorerSettingInfo; + private readonly bool inMruOrder; + + public Settings( + bool resultsFromVisibleDesktopOnly = false, + bool subtitleShowPid = false, + bool subtitleShowDesktopName = true, + bool confirmKillProcess = true, + bool killProcessTree = false, + bool openAfterKillAndClose = false, + bool hideKillProcessOnElevatedProcesses = false, + bool hideExplorerSettingInfo = true, + bool inMruOrder = true) + { + this.resultsFromVisibleDesktopOnly = resultsFromVisibleDesktopOnly; + this.subtitleShowPid = subtitleShowPid; + this.subtitleShowDesktopName = subtitleShowDesktopName; + this.confirmKillProcess = confirmKillProcess; + this.killProcessTree = killProcessTree; + this.openAfterKillAndClose = openAfterKillAndClose; + this.hideKillProcessOnElevatedProcesses = hideKillProcessOnElevatedProcesses; + this.hideExplorerSettingInfo = hideExplorerSettingInfo; + this.inMruOrder = inMruOrder; + } + + public bool ResultsFromVisibleDesktopOnly => resultsFromVisibleDesktopOnly; + + public bool SubtitleShowPid => subtitleShowPid; + + public bool SubtitleShowDesktopName => subtitleShowDesktopName; + + public bool ConfirmKillProcess => confirmKillProcess; + + public bool KillProcessTree => killProcessTree; + + public bool OpenAfterKillAndClose => openAfterKillAndClose; + + public bool HideKillProcessOnElevatedProcesses => hideKillProcessOnElevatedProcesses; + + public bool HideExplorerSettingInfo => hideExplorerSettingInfo; + + public bool InMruOrder => inMruOrder; +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/CalculatorCommandProvider.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/CalculatorCommandProvider.cs index 0f4a8b0d9b..cdf0ccfa47 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/CalculatorCommandProvider.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/CalculatorCommandProvider.cs @@ -12,21 +12,21 @@ namespace Microsoft.CmdPal.Ext.Calc; public partial class CalculatorCommandProvider : CommandProvider { + private static ISettingsInterface settings = new SettingsManager(); private readonly ListItem _listItem = new(new CalculatorListPage(settings)) { Subtitle = Resources.calculator_top_level_subtitle, - MoreCommands = [new CommandContextItem(settings.Settings.SettingsPage)], + MoreCommands = [new CommandContextItem(((SettingsManager)settings).Settings.SettingsPage)], }; private readonly FallbackCalculatorItem _fallback = new(settings); - private static SettingsManager settings = new(); public CalculatorCommandProvider() { Id = "Calculator"; DisplayName = Resources.calculator_display_name; Icon = Icons.CalculatorIcon; - Settings = settings.Settings; + Settings = ((SettingsManager)settings).Settings; } public override ICommandItem[] TopLevelCommands() => [_listItem]; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/CalculateEngine.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/CalculateEngine.cs index ca2e1d1ea8..a927e07499 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/CalculateEngine.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/CalculateEngine.cs @@ -34,7 +34,7 @@ public static class CalculateEngine /// Interpret /// /// Use CultureInfo.CurrentCulture if something is user facing - public static CalculateResult Interpret(SettingsManager settings, string input, CultureInfo cultureInfo, out string error) + public static CalculateResult Interpret(ISettingsInterface settings, string input, CultureInfo cultureInfo, out string error) { error = default; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ISettingsInterface.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ISettingsInterface.cs new file mode 100644 index 0000000000..f4b7a50644 --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ISettingsInterface.cs @@ -0,0 +1,18 @@ +// 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 Microsoft.CmdPal.Ext.Calc.Helper; + +namespace Microsoft.CmdPal.Ext.Calc.Helper; + +public interface ISettingsInterface +{ + public CalculateEngine.TrigMode TrigUnit { get; } + + public bool InputUseEnglishFormat { get; } + + public bool OutputUseEnglishFormat { get; } + + public bool CloseOnEnter { get; } +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/QueryHelper.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/QueryHelper.cs index b6c41f3831..99f782d714 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/QueryHelper.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/QueryHelper.cs @@ -12,7 +12,7 @@ namespace Microsoft.CmdPal.Ext.Calc.Helper; public static partial class QueryHelper { - public static ListItem Query(string query, SettingsManager settings, bool isFallbackSearch, TypedEventHandler handleSave = null) + public static ListItem Query(string query, ISettingsInterface settings, bool isFallbackSearch, TypedEventHandler handleSave = null) { ArgumentNullException.ThrowIfNull(query); if (!isFallbackSearch) diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ResultHelper.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ResultHelper.cs index c729086543..f53fadaa52 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ResultHelper.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/ResultHelper.cs @@ -13,7 +13,7 @@ namespace Microsoft.CmdPal.Ext.Calc.Helper; public static class ResultHelper { - public static ListItem CreateResult(decimal? roundedResult, CultureInfo inputCulture, CultureInfo outputCulture, string query, SettingsManager settings, TypedEventHandler handleSave) + public static ListItem CreateResult(decimal? roundedResult, CultureInfo inputCulture, CultureInfo outputCulture, string query, ISettingsInterface settings, TypedEventHandler handleSave) { // Return null when the expression is not a valid calculator query. if (roundedResult == null) diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/SettingsManager.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/SettingsManager.cs index cb5104011e..cea59e170f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/SettingsManager.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Helper/SettingsManager.cs @@ -8,7 +8,7 @@ using Microsoft.CommandPalette.Extensions.Toolkit; namespace Microsoft.CmdPal.Ext.Calc.Helper; -public class SettingsManager : JsonSettingsManager +public class SettingsManager : JsonSettingsManager, ISettingsInterface { private static readonly string _namespace = "calculator"; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/CalculatorListPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/CalculatorListPage.cs index 4b0cf29d64..d4b7f6d135 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/CalculatorListPage.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/CalculatorListPage.cs @@ -23,7 +23,7 @@ namespace Microsoft.CmdPal.Ext.Calc.Pages; public sealed partial class CalculatorListPage : DynamicListPage { private readonly Lock _resultsLock = new(); - private readonly SettingsManager _settingsManager; + private readonly ISettingsInterface _settingsManager; private readonly List _items = []; private readonly List history = []; private readonly ListItem _emptyItem; @@ -32,7 +32,7 @@ public sealed partial class CalculatorListPage : DynamicListPage // We need to avoid the double calculation. This may cause some wierd behaviors. private string skipQuerySearchText = string.Empty; - public CalculatorListPage(SettingsManager settings) + public CalculatorListPage(ISettingsInterface settings) { _settingsManager = settings; Icon = Icons.CalculatorIcon; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/FallbackCalculatorItem.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/FallbackCalculatorItem.cs index 10d305bb7c..5dc85ae51f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/FallbackCalculatorItem.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Calc/Pages/FallbackCalculatorItem.cs @@ -11,9 +11,9 @@ namespace Microsoft.CmdPal.Ext.Calc.Pages; public sealed partial class FallbackCalculatorItem : FallbackCommandItem { private readonly CopyTextCommand _copyCommand = new(string.Empty); - private readonly SettingsManager _settings; + private readonly ISettingsInterface _settings; - public FallbackCalculatorItem(SettingsManager settings) + public FallbackCalculatorItem(ISettingsInterface settings) : base(new NoOpCommand(), Resources.calculator_title) { Command = _copyCommand; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/ISettingsInterface.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/ISettingsInterface.cs new file mode 100644 index 0000000000..bec1fb3271 --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/ISettingsInterface.cs @@ -0,0 +1,17 @@ +// 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 System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.CmdPal.Ext.Registry.Helpers; + +public interface ISettingsInterface +{ + // Add registry-specific settings methods here if needed + // For now, this can be empty if there are no settings for Registry +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/SettingsManager.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/SettingsManager.cs new file mode 100644 index 0000000000..aaf5d2cce0 --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Helpers/SettingsManager.cs @@ -0,0 +1,37 @@ +// 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.IO; +using Microsoft.CommandPalette.Extensions.Toolkit; + +namespace Microsoft.CmdPal.Ext.Registry.Helpers; + +public class SettingsManager : JsonSettingsManager, ISettingsInterface +{ + private static readonly string _namespace = "registry"; + + private static string Namespaced(string propertyName) => $"{_namespace}.{propertyName}"; + + internal static string SettingsJsonPath() + { + var directory = Utilities.BaseSettingsPath("Microsoft.CmdPal"); + Directory.CreateDirectory(directory); + + // now, the state is just next to the exe + return Path.Combine(directory, "settings.json"); + } + + public SettingsManager() + { + FilePath = SettingsJsonPath(); + + // Add settings here when needed + // Settings.Add(setting); + + // Load settings from file upon initialization + LoadSettings(); + + Settings.SettingsChanged += (s, a) => this.SaveSettings(); + } +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Pages/RegistryListPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Pages/RegistryListPage.cs index fbc80d5d1e..b37f0bc313 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Pages/RegistryListPage.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/Pages/RegistryListPage.cs @@ -18,12 +18,14 @@ internal sealed partial class RegistryListPage : DynamicListPage public static IconInfo RegistryIcon { get; } = new("\uE74C"); // OEM private readonly CommandItem _emptyMessage; + private readonly ISettingsInterface _settingsManager; - public RegistryListPage() + public RegistryListPage(ISettingsInterface settingsManager) { Icon = Icons.RegistryIcon; Name = Title = Resources.Registry_Page_Title; Id = "com.microsoft.cmdpal.registry"; + _settingsManager = settingsManager; _emptyMessage = new CommandItem() { Icon = Icons.RegistryIcon, diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs index 3f4218c81b..22eca4cc3f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.Registry/RegistryCommandsProvider.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using Microsoft.CmdPal.Ext.Registry.Helpers; using Microsoft.CmdPal.Ext.Registry.Properties; using Microsoft.CommandPalette.Extensions; using Microsoft.CommandPalette.Extensions.Toolkit; @@ -10,6 +11,8 @@ namespace Microsoft.CmdPal.Ext.Registry; public partial class RegistryCommandsProvider : CommandProvider { + private static readonly ISettingsInterface _settingsManager = new SettingsManager(); + public RegistryCommandsProvider() { Id = "Windows.Registry"; @@ -20,7 +23,7 @@ public partial class RegistryCommandsProvider : CommandProvider public override ICommandItem[] TopLevelCommands() { return [ - new CommandItem(new RegistryListPage()) + new CommandItem(new RegistryListPage(_settingsManager)) { Title = "Registry", Subtitle = "Navigate the Windows registry", diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/FallbackTimeDateItem.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/FallbackTimeDateItem.cs index 3b797e4cfb..cc757bcd88 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/FallbackTimeDateItem.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/FallbackTimeDateItem.cs @@ -16,10 +16,10 @@ namespace Microsoft.CmdPal.Ext.TimeDate; internal sealed partial class FallbackTimeDateItem : FallbackCommandItem { private readonly HashSet _validOptions; - private SettingsManager _settingsManager; + private ISettingsInterface _settingsManager; private DateTime? _timestamp; - public FallbackTimeDateItem(SettingsManager settings, DateTime? timestamp = null) + public FallbackTimeDateItem(ISettingsInterface settings, DateTime? timestamp = null) : base(new NoOpCommand(), Resources.Microsoft_plugin_timedate_fallback_display_title) { Title = string.Empty; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/AvailableResultsList.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/AvailableResultsList.cs index 38366345c4..0966c0d3df 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/AvailableResultsList.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/AvailableResultsList.cs @@ -22,7 +22,7 @@ internal static class AvailableResultsList /// Required for UnitTest: Use custom first week of the year instead of the plugin setting. /// Required for UnitTest: Use custom first day of the week instead the plugin setting. /// List of results - internal static List GetList(bool isKeywordSearch, SettingsManager settings, bool? timeLongFormat = null, bool? dateLongFormat = null, DateTime? timestamp = null, CalendarWeekRule? firstWeekOfYear = null, DayOfWeek? firstDayOfWeek = null) + internal static List GetList(bool isKeywordSearch, ISettingsInterface settings, bool? timeLongFormat = null, bool? dateLongFormat = null, DateTime? timestamp = null, CalendarWeekRule? firstWeekOfYear = null, DayOfWeek? firstDayOfWeek = null) { var results = new List(); var calendar = CultureInfo.CurrentCulture.Calendar; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/ISettingsInterface.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/ISettingsInterface.cs new file mode 100644 index 0000000000..12e53ccf11 --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/ISettingsInterface.cs @@ -0,0 +1,26 @@ +// 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 System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.CmdPal.Ext.TimeDate.Helpers; + +public interface ISettingsInterface +{ + public int FirstWeekOfYear { get; } + + public int FirstDayOfWeek { get; } + + public bool EnableFallbackItems { get; } + + public bool TimeWithSecond { get; } + + public bool DateWithWeekday { get; } + + public List CustomFormats { get; } +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/SettingsManager.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/SettingsManager.cs index 7b351fe3b8..727c5258aa 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/SettingsManager.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/SettingsManager.cs @@ -11,7 +11,7 @@ using Microsoft.CommandPalette.Extensions.Toolkit; namespace Microsoft.CmdPal.Ext.TimeDate.Helpers; -public class SettingsManager : JsonSettingsManager +public class SettingsManager : JsonSettingsManager, ISettingsInterface { // Line break character used in WinUI3 TextBox and TextBlock. private const char TEXTBOXNEWLINE = '\r'; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/TimeDateCalculator.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/TimeDateCalculator.cs index 38f417ad5b..6128ef56ad 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/TimeDateCalculator.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Helpers/TimeDateCalculator.cs @@ -27,7 +27,7 @@ public sealed partial class TimeDateCalculator /// /// Search query object /// List of Wox s. - public static List ExecuteSearch(SettingsManager settings, string query) + public static List ExecuteSearch(ISettingsInterface settings, string query) { var isEmptySearchInput = string.IsNullOrWhiteSpace(query); List availableFormats = new List(); diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Pages/TimeDateExtensionPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Pages/TimeDateExtensionPage.cs index 4eb95034b7..36eb39461f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Pages/TimeDateExtensionPage.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/Pages/TimeDateExtensionPage.cs @@ -19,9 +19,9 @@ internal sealed partial class TimeDateExtensionPage : DynamicListPage private IList _results = new List(); private bool _dataLoaded; - private SettingsManager _settingsManager; + private ISettingsInterface _settingsManager; - public TimeDateExtensionPage(SettingsManager settingsManager) + public TimeDateExtensionPage(ISettingsInterface settingsManager) { Icon = Icons.TimeDateExtIcon; Title = Resources.Microsoft_plugin_timedate_main_page_title; diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/TimeDateCommandsProvider.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/TimeDateCommandsProvider.cs index d29356fa77..26bd4d8453 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/TimeDateCommandsProvider.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.TimeDate/TimeDateCommandsProvider.cs @@ -15,7 +15,7 @@ namespace Microsoft.CmdPal.Ext.TimeDate; public partial class TimeDateCommandsProvider : CommandProvider { private readonly CommandItem _command; - private static readonly SettingsManager _settingsManager = new(); + private static readonly SettingsManager _settingsManager = new SettingsManager(); private static readonly CompositeFormat MicrosoftPluginTimedatePluginDescription = System.Text.CompositeFormat.Parse(Resources.Microsoft_plugin_timedate_plugin_description); private static readonly TimeDateExtensionPage _timeDateExtensionPage = new(_settingsManager); private readonly FallbackTimeDateItem _fallbackTimeDateItem = new(_settingsManager); diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/ISettingsInterface.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/ISettingsInterface.cs new file mode 100644 index 0000000000..e77acb56cf --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/ISettingsInterface.cs @@ -0,0 +1,26 @@ +// 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. + +namespace Microsoft.CmdPal.Ext.WindowWalker.Helpers; + +public interface ISettingsInterface +{ + public bool ResultsFromVisibleDesktopOnly { get; } + + public bool SubtitleShowPid { get; } + + public bool SubtitleShowDesktopName { get; } + + public bool ConfirmKillProcess { get; } + + public bool KillProcessTree { get; } + + public bool OpenAfterKillAndClose { get; } + + public bool HideKillProcessOnElevatedProcesses { get; } + + public bool HideExplorerSettingInfo { get; } + + public bool InMruOrder { get; } +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/SettingsManager.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/SettingsManager.cs index 6f541d28df..b2a248beca 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/SettingsManager.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowWalker/Helpers/SettingsManager.cs @@ -8,7 +8,7 @@ using Microsoft.CommandPalette.Extensions.Toolkit; namespace Microsoft.CmdPal.Ext.WindowWalker.Helpers; -public class SettingsManager : JsonSettingsManager +public class SettingsManager : JsonSettingsManager, ISettingsInterface { private static readonly string _namespace = "windowWalker";