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