[CmdPal][UnitTest] Refactor system command unit test (#40874)

<!-- Enter a brief description/summary of your PR here. What does it
fix/what does it change/how was it tested (even manually, if necessary)?
-->
## Summary of the Pull Request
Ok... The AI generated and migrated ut's quality is very poor. We need
to refactor it.

<!-- Please review the items on the PR checklist before submitting-->
## PR Checklist

- [x] Closes: #40875
- [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

<!-- Provide a more detailed description of the PR, other things fixed,
or any additional comments/features here -->
## Detailed Description of the Pull Request / Additional comments

<!-- Describe how you validated the behavior. Add automated tests
wherever possible, but list manual validation steps taken as well -->
## Validation Steps Performed

---------

Co-authored-by: Yu Leng (from Dev Box) <yuleng@microsoft.com>
This commit is contained in:
Yu Leng
2025-07-30 17:19:40 +08:00
committed by GitHub
parent decb947283
commit 46d380c2b6
13 changed files with 262 additions and 133 deletions

View File

@@ -784,6 +784,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.TimeDa
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.WindowWalker.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.WindowWalker.UnitTests\Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj", "{E816D7B0-4688-4ECB-97CC-3D8E798F3829}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.WindowWalker.UnitTests", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.WindowWalker.UnitTests\Microsoft.CmdPal.Ext.WindowWalker.UnitTests.csproj", "{E816D7B0-4688-4ECB-97CC-3D8E798F3829}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.UnitTestBase", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.UnitTestsBase\Microsoft.CmdPal.Ext.UnitTestBase.csproj", "{00D8659C-2068-40B6-8B86-759CD6284BBB}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64 Debug|ARM64 = Debug|ARM64
@@ -2830,6 +2832,14 @@ Global
{E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|ARM64.Build.0 = Release|ARM64 {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|ARM64.Build.0 = Release|ARM64
{E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|x64.ActiveCfg = Release|x64 {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|x64.ActiveCfg = Release|x64
{E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|x64.Build.0 = Release|x64 {E816D7B0-4688-4ECB-97CC-3D8E798F3829}.Release|x64.Build.0 = Release|x64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Debug|ARM64.ActiveCfg = Debug|ARM64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Debug|ARM64.Build.0 = Debug|ARM64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Debug|x64.ActiveCfg = Debug|x64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Debug|x64.Build.0 = Debug|x64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|ARM64.ActiveCfg = Release|ARM64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|ARM64.Build.0 = Release|ARM64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|x64.ActiveCfg = Release|x64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@@ -3117,11 +3127,6 @@ Global
{D9BD324E-1D80-44AA-8E7B-73EB00944434} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} {D9BD324E-1D80-44AA-8E7B-73EB00944434} = {38BDB927-829B-4C65-9CD9-93FB05D66D65}
{8EF25507-2575-4ADE-BF7E-D23376903AB8} = {3846508C-77EB-4034-A702-F8BB263C4F79} {8EF25507-2575-4ADE-BF7E-D23376903AB8} = {3846508C-77EB-4034-A702-F8BB263C4F79}
{070AC093-C9F2-20AD-0BCD-F318FC2761EA} = {B1234567-1234-1234-1234-123456789ABC} {070AC093-C9F2-20AD-0BCD-F318FC2761EA} = {B1234567-1234-1234-1234-123456789ABC}
{E816D7AC-4688-4ECB-97CC-3D8E798F3825} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7AD-4688-4ECB-97CC-3D8E798F3826} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7AE-4688-4ECB-97CC-3D8E798F3827} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7AF-4688-4ECB-97CC-3D8E798F3828} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7B0-4688-4ECB-97CC-3D8E798F3829} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{2C318EC3-BA86-4372-B1BC-DB0F33C208B2} = {322566EF-20DC-43A6-B9F8-616AF942579A} {2C318EC3-BA86-4372-B1BC-DB0F33C208B2} = {322566EF-20DC-43A6-B9F8-616AF942579A}
{BFFB607F-7C78-434B-86B9-DA4C8196A1B5} = {B6C42F16-73EB-477E-8B0D-4E6CF6C20AAC} {BFFB607F-7C78-434B-86B9-DA4C8196A1B5} = {B6C42F16-73EB-477E-8B0D-4E6CF6C20AAC}
{66E1534A-1587-42B2-912F-45C994D32904} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3} {66E1534A-1587-42B2-912F-45C994D32904} = {89E20BCE-EB9C-46C8-8B50-E01A82E6FDC3}
@@ -3139,6 +3144,12 @@ Global
{806BF185-8B89-5BE1-9AA1-DA5BC9487DB9} = {264B412F-DB8B-4CF8-A74B-96998B183045} {806BF185-8B89-5BE1-9AA1-DA5BC9487DB9} = {264B412F-DB8B-4CF8-A74B-96998B183045}
{F93C2817-C846-4259-84D8-B39A6B57C8DE} = {3527BF37-DFC5-4309-A032-29278CA21328} {F93C2817-C846-4259-84D8-B39A6B57C8DE} = {3527BF37-DFC5-4309-A032-29278CA21328}
{8131151D-B0E9-4E18-84A5-E5F946C4480A} = {929C1324-22E8-4412-A9A8-80E85F3985A5} {8131151D-B0E9-4E18-84A5-E5F946C4480A} = {929C1324-22E8-4412-A9A8-80E85F3985A5}
{E816D7AC-4688-4ECB-97CC-3D8E798F3825} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7AD-4688-4ECB-97CC-3D8E798F3826} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7AE-4688-4ECB-97CC-3D8E798F3827} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7AF-4688-4ECB-97CC-3D8E798F3828} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7B0-4688-4ECB-97CC-3D8E798F3829} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{00D8659C-2068-40B6-8B86-759CD6284BBB} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0}

View File

@@ -11,17 +11,6 @@ namespace Microsoft.CmdPal.Ext.System.UnitTests;
[TestClass] [TestClass]
public class BasicTests public class BasicTests
{ {
[TestMethod]
public void CommandsHelperTest()
{
// Setup & Act
var commands = Commands.GetSystemCommands(false, false, false, false);
// Assert
Assert.IsNotNull(commands);
Assert.IsTrue(commands.Count > 0);
}
[TestMethod] [TestMethod]
public void IconsHelperTest() public void IconsHelperTest()
{ {

View File

@@ -16,56 +16,25 @@ namespace Microsoft.CmdPal.Ext.System.UnitTests;
[TestClass] [TestClass]
public class ImageTests public class ImageTests
{ {
[DataTestMethod] [DataRow(true)]
[DataRow("shutdown", "ShutdownIcon")] [DataRow(false)]
[DataRow("restart", "RestartIcon")] [TestMethod]
[DataRow("sign out", "LogoffIcon")] public void IconThemeTest(bool isDarkIcon)
[DataRow("lock", "LockIcon")]
[DataRow("sleep", "SleepIcon")]
[DataRow("hibernate", "SleepIcon")]
[DataRow("recycle bin", "RecycleBinIcon")]
[DataRow("uefi firmware settings", "FirmwareSettingsIcon")]
[DataRow("IPv4 addr", "NetworkAdapterIcon")]
[DataRow("IPV6 addr", "NetworkAdapterIcon")]
[DataRow("MAC addr", "NetworkAdapterIcon")]
public void IconThemeDarkTest(string typedString, string expectedIconPropertyName)
{ {
var systemPage = new SystemCommandPage(new SettingsManager()); var systemPage = new SystemCommandPage(new Settings());
var commands = systemPage.GetItems();
foreach (var item in systemPage.GetItems()) foreach (var item in commands)
{ {
if (item.Title.Contains(typedString, StringComparison.OrdinalIgnoreCase) || item.Subtitle.Contains(typedString, StringComparison.OrdinalIgnoreCase)) var icon = item.Icon;
Assert.IsNotNull(icon, $"Icon for '{item.Title}' should not be null.");
if (isDarkIcon)
{ {
var icon = item.Icon; Assert.IsNotEmpty(icon.Dark.Icon, $"Icon for '{item.Title}' should not be empty.");
Assert.IsNotNull(icon, $"Icon for '{typedString}' should not be null.");
Assert.IsNotEmpty(icon.Dark.Icon, $"Icon for '{typedString}' should not be empty.");
} }
} else
}
[DataTestMethod]
[DataRow("shutdown", "ShutdownIcon")]
[DataRow("restart", "RestartIcon")]
[DataRow("sign out", "LogoffIcon")]
[DataRow("lock", "LockIcon")]
[DataRow("sleep", "SleepIcon")]
[DataRow("hibernate", "SleepIcon")]
[DataRow("recycle bin", "RecycleBinIcon")]
[DataRow("uefi firmware settings", "FirmwareSettingsIcon")]
[DataRow("IPv4 addr", "NetworkAdapterIcon")]
[DataRow("IPV6 addr", "NetworkAdapterIcon")]
[DataRow("MAC addr", "NetworkAdapterIcon")]
public void IconThemeLightTest(string typedString, string expectedIconPropertyName)
{
var systemPage = new SystemCommandPage(new SettingsManager());
foreach (var item in systemPage.GetItems())
{
if (item.Title.Contains(typedString, StringComparison.OrdinalIgnoreCase) || item.Subtitle.Contains(typedString, StringComparison.OrdinalIgnoreCase))
{ {
var icon = item.Icon; Assert.IsNotEmpty(icon.Light.Icon, $"Icon for '{item.Title}' should not be empty.");
Assert.IsNotNull(icon, $"Icon for '{typedString}' should not be null.");
Assert.IsNotEmpty(icon.Light.Icon, $"Icon for '{typedString}' should not be empty.");
} }
} }
} }

View File

@@ -20,5 +20,6 @@
<ProjectReference Include="..\..\..\..\common\ManagedCommon\ManagedCommon.csproj" /> <ProjectReference Include="..\..\..\..\common\ManagedCommon\ManagedCommon.csproj" />
<ProjectReference Include="..\..\ext\Microsoft.CmdPal.Ext.System\Microsoft.CmdPal.Ext.System.csproj" /> <ProjectReference Include="..\..\ext\Microsoft.CmdPal.Ext.System\Microsoft.CmdPal.Ext.System.csproj" />
<ProjectReference Include="..\..\extensionsdk\Microsoft.CommandPalette.Extensions.Toolkit\Microsoft.CommandPalette.Extensions.Toolkit.csproj" /> <ProjectReference Include="..\..\extensionsdk\Microsoft.CommandPalette.Extensions.Toolkit\Microsoft.CommandPalette.Extensions.Toolkit.csproj" />
<ProjectReference Include="..\Microsoft.CmdPal.Ext.UnitTestsBase\Microsoft.CmdPal.Ext.UnitTestBase.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -5,12 +5,16 @@
using System; using System;
using System.Linq; using System.Linq;
using Microsoft.CmdPal.Ext.System.Helpers; using Microsoft.CmdPal.Ext.System.Helpers;
using Microsoft.CmdPal.Ext.System.Pages;
using Microsoft.CmdPal.Ext.UnitTestBase;
using Microsoft.CommandPalette.Extensions;
using Microsoft.CommandPalette.Extensions.Toolkit;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Microsoft.CmdPal.Ext.System.UnitTests; namespace Microsoft.CmdPal.Ext.System.UnitTests;
[TestClass] [TestClass]
public class QueryTests public class QueryTests : CommandPaletteUnitTestBase
{ {
[DataTestMethod] [DataTestMethod]
[DataRow("shutdown", "Shutdown")] [DataRow("shutdown", "Shutdown")]
@@ -19,87 +23,130 @@ public class QueryTests
[DataRow("lock", "Lock")] [DataRow("lock", "Lock")]
[DataRow("sleep", "Sleep")] [DataRow("sleep", "Sleep")]
[DataRow("hibernate", "Hibernate")] [DataRow("hibernate", "Hibernate")]
public void SystemCommandsTest(string typedString, string expectedCommand) [DataRow("open recycle", "Open Recycle Bin")]
[DataRow("empty recycle", "Empty Recycle Bin")]
[DataRow("uefi", "UEFI Firmware Settings")]
public void TopLevelPageQueryTest(string input, string matchedTitle)
{ {
// Setup var settings = new Settings();
var commands = Commands.GetSystemCommands(false, false, false, false); var pages = new SystemCommandPage(settings);
var allCommands = pages.GetItems();
// Act var result = Query(input, allCommands);
var result = commands.Where(c => c.Title.Contains(expectedCommand, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
// Assert // Empty recycle bin command should exist
Assert.IsNotNull(result); Assert.IsNotNull(result);
Assert.IsTrue(result.Title.Contains(expectedCommand, StringComparison.OrdinalIgnoreCase));
var firstItem = result.FirstOrDefault();
Assert.IsNotNull(firstItem, "No items matched the query.");
Assert.AreEqual(matchedTitle, firstItem.Title, $"Expected to match '{input}' but got '{firstItem.Title}'");
} }
[TestMethod] [TestMethod]
public void RecycleBinCommandTest() public void RecycleBinCommandTest()
{ {
// Setup var settings = new Settings(hideEmptyRecycleBin: true);
var commands = Commands.GetSystemCommands(false, false, false, false); var pages = new SystemCommandPage(settings);
var allCommands = pages.GetItems();
// Act var result = Query("recycle", allCommands);
var result = commands.Where(c => c.Title.Contains("Recycle", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
// Assert // Empty recycle bin command should exist
Assert.IsNotNull(result); Assert.IsNotNull(result);
foreach (var item in result)
{
if (item.Title.Contains("Open Recycle Bin") || item.Title.Contains("Empty Recycle Bin"))
{
Assert.Fail("Recycle Bin commands should not be available when hideEmptyRecycleBin is true.");
}
}
var firstItem = result.FirstOrDefault();
Assert.IsNotNull(firstItem, "No items matched the query.");
Assert.IsTrue(
firstItem.Title.Contains("Recycle Bin", StringComparison.OrdinalIgnoreCase),
$"Expected to match 'Recycle Bin' but got '{firstItem.Title}'");
} }
[TestMethod] [TestMethod]
public void NetworkCommandsTest() public void NetworkCommandsTest()
{ {
// Test that network commands can be retrieved var settings = new Settings();
try var pages = new SystemCommandPage(settings);
var allCommands = pages.GetItems();
var ipv4Result = Query("IPv4", allCommands);
Assert.IsNotNull(ipv4Result);
Assert.IsTrue(ipv4Result.Length > 0, "No IPv4 commands matched the query.");
var ipv6Result = Query("IPv6", allCommands);
Assert.IsNotNull(ipv6Result);
Assert.IsTrue(ipv6Result.Length > 0, "No IPv6 commands matched the query.");
var macResult = Query("MAC", allCommands);
Assert.IsNotNull(macResult);
Assert.IsTrue(macResult.Length > 0, "No MAC commands matched the query.");
var findDisconnectedMACResult = false;
foreach (var item in macResult)
{ {
var networkPropertiesList = NetworkConnectionProperties.GetList(); if (item.Details.Body.Contains("Disconnected"))
Assert.IsTrue(networkPropertiesList.Count >= 0); // Should not throw exceptions {
} findDisconnectedMACResult = true;
catch (Exception ex) break;
{ }
Assert.Fail($"Network commands should not throw exceptions: {ex.Message}");
} }
Assert.IsTrue(findDisconnectedMACResult, "No disconnected MAC address found in the results.");
} }
[TestMethod] [TestMethod]
public void UefiCommandIsAvailableTest() public void HideDisconnectedNetworkInfoTest()
{ {
// Setup var settings = new Settings(hideDisconnectedNetworkInfo: true);
var firmwareType = Win32Helpers.GetSystemFirmwareType(); var pages = new SystemCommandPage(settings);
var isUefiMode = firmwareType == FirmwareType.Uefi; var allCommands = pages.GetItems();
// Act var macResult = Query("MAC", allCommands);
var commands = Commands.GetSystemCommands(isUefiMode, false, false, false); Assert.IsNotNull(macResult);
var uefiCommand = commands.Where(c => c.Title.Contains("UEFI", StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); Assert.IsTrue(macResult.Length > 0, "No MAC commands matched the query.");
// Assert var findDisconnectedMACResult = false;
if (isUefiMode) foreach (var item in macResult)
{ {
Assert.IsNotNull(uefiCommand); if (item.Details.Body.Contains("Disconnected"))
} {
else findDisconnectedMACResult = true;
{ break;
// UEFI command may still exist but be disabled on non-UEFI systems }
Assert.IsTrue(true); // Test environment independent
} }
Assert.IsTrue(!findDisconnectedMACResult, "Disconnected MAC address found in the results.");
} }
[TestMethod] [TestMethod]
public void FirmwareTypeTest() [DataRow(FirmwareType.Uefi, true)]
[DataRow(FirmwareType.Bios, false)]
[DataRow(FirmwareType.Max, false)]
[DataRow(FirmwareType.Unknown, false)]
public void FirmwareSettingsTest(FirmwareType firmwareType, bool hasCommand)
{ {
// Test that GetSystemFirmwareType returns a valid enum value var settings = new Settings(firmwareType: firmwareType);
var firmwareType = Win32Helpers.GetSystemFirmwareType(); var pages = new SystemCommandPage(settings);
Assert.IsTrue(Enum.IsDefined(typeof(FirmwareType), firmwareType)); var allCommands = pages.GetItems();
} var result = Query("UEFI", allCommands);
[TestMethod] // UEFI Firmware Settings command should exist
public void EmptyRecycleBinCommandTest()
{
// Test that empty recycle bin command exists
var commands = Commands.GetSystemCommands(false, false, false, false);
var result = commands.Where(c => c.Title.Contains("Empty", StringComparison.OrdinalIgnoreCase) &&
c.Title.Contains("Recycle", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
// Empty recycle bin command should exist
Assert.IsNotNull(result); 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}'");
} }
} }

View File

@@ -0,0 +1,40 @@
// 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;
using Microsoft.CmdPal.Ext.System.Helpers;
namespace Microsoft.CmdPal.Ext.System.UnitTests;
public class Settings : ISettingsInterface
{
private bool hideDisconnectedNetworkInfo;
private bool hideEmptyRecycleBin;
private bool showDialogToConfirmCommand;
private bool showSuccessMessageAfterEmptyingRecycleBin;
private FirmwareType firmwareType;
public Settings(bool hideDisconnectedNetworkInfo = false, bool hideEmptyRecycleBin = false, bool showDialogToConfirmCommand = false, bool showSuccessMessageAfterEmptyingRecycleBin = false, FirmwareType firmwareType = FirmwareType.Uefi)
{
this.hideDisconnectedNetworkInfo = hideDisconnectedNetworkInfo;
this.hideEmptyRecycleBin = hideEmptyRecycleBin;
this.showDialogToConfirmCommand = showDialogToConfirmCommand;
this.showSuccessMessageAfterEmptyingRecycleBin = showSuccessMessageAfterEmptyingRecycleBin;
this.firmwareType = firmwareType;
}
public bool HideDisconnectedNetworkInfo() => hideDisconnectedNetworkInfo;
public bool HideEmptyRecycleBin() => hideEmptyRecycleBin;
public bool ShowDialogToConfirmCommand() => showDialogToConfirmCommand;
public bool ShowSuccessMessageAfterEmptyingRecycleBin() => showSuccessMessageAfterEmptyingRecycleBin;
public FirmwareType GetSystemFirmwareType() => firmwareType;
}

View File

@@ -0,0 +1,27 @@
// 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;
using Microsoft.CommandPalette.Extensions;
using Microsoft.CommandPalette.Extensions.Toolkit;
namespace Microsoft.CmdPal.Ext.UnitTestBase;
public class CommandPaletteUnitTestBase
{
private bool MatchesFilter(string filter, IListItem item) => StringMatcher.FuzzySearch(filter, item.Title).Success || StringMatcher.FuzzySearch(filter, item.Subtitle).Success;
public IListItem[] Query(string query, IListItem[] candidates)
{
IListItem[] listItems = candidates
.Where(item => MatchesFilter(query, item))
.ToArray();
return listItems;
}
}

View File

@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<!-- Look at Directory.Build.props in root for common stuff as well -->
<Import Project="..\..\..\..\Common.Dotnet.CsWinRT.props" />
<PropertyGroup>
<IsPackable>false</IsPackable>
<RootNamespace>Microsoft.CmdPal.Ext.UnitTestsBase</RootNamespace>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Moq" />
<PackageReference Include="MSTest" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\extensionsdk\Microsoft.CommandPalette.Extensions.Toolkit\Microsoft.CommandPalette.Extensions.Toolkit.csproj" />
</ItemGroup>
</Project>

View File

@@ -12,16 +12,16 @@ namespace Microsoft.CmdPal.Ext.System;
internal sealed partial class FallbackSystemCommandItem : FallbackCommandItem internal sealed partial class FallbackSystemCommandItem : FallbackCommandItem
{ {
public FallbackSystemCommandItem(SettingsManager settings) public FallbackSystemCommandItem(ISettingsInterface settings)
: base(new NoOpCommand(), Resources.Microsoft_plugin_ext_fallback_display_title) : base(new NoOpCommand(), Resources.Microsoft_plugin_ext_fallback_display_title)
{ {
Title = string.Empty; Title = string.Empty;
Subtitle = string.Empty; Subtitle = string.Empty;
var isBootedInUefiMode = Win32Helpers.GetSystemFirmwareType() == FirmwareType.Uefi; var isBootedInUefiMode = settings.GetSystemFirmwareType() == FirmwareType.Uefi;
var hideEmptyRB = settings.HideEmptyRecycleBin; var hideEmptyRB = settings.HideEmptyRecycleBin();
var confirmSystemCommands = settings.ShowDialogToConfirmCommand; var confirmSystemCommands = settings.ShowDialogToConfirmCommand();
var showSuccessOnEmptyRB = settings.ShowSuccessMessageAfterEmptyingRecycleBin; var showSuccessOnEmptyRB = settings.ShowSuccessMessageAfterEmptyingRecycleBin();
systemCommands = Commands.GetSystemCommands(isBootedInUefiMode, hideEmptyRB, confirmSystemCommands, showSuccessOnEmptyRB); systemCommands = Commands.GetSystemCommands(isBootedInUefiMode, hideEmptyRB, confirmSystemCommands, showSuccessOnEmptyRB);
} }

View File

@@ -136,7 +136,7 @@ internal static class Commands
/// </summary> /// </summary>
/// <param name="manager">The tSettingsManager instance</param> /// <param name="manager">The tSettingsManager instance</param>
/// <returns>The list of available results</returns> /// <returns>The list of available results</returns>
public static List<IListItem> GetNetworkConnectionResults(SettingsManager manager) public static List<IListItem> GetNetworkConnectionResults(ISettingsInterface manager)
{ {
var results = new List<IListItem>(); var results = new List<IListItem>();
@@ -151,7 +151,7 @@ internal static class Commands
CompositeFormat sysIpv4DescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_ip4_description); CompositeFormat sysIpv4DescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_ip4_description);
CompositeFormat sysIpv6DescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_ip6_description); CompositeFormat sysIpv6DescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_ip6_description);
CompositeFormat sysMacDescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_mac_description); CompositeFormat sysMacDescriptionCompositeFormate = CompositeFormat.Parse(Resources.Microsoft_plugin_sys_mac_description);
var hideDisconnectedNetworkInfo = manager.HideDisconnectedNetworkInfo; var hideDisconnectedNetworkInfo = manager.HideDisconnectedNetworkInfo();
foreach (NetworkConnectionProperties intInfo in networkPropertiesCache) foreach (NetworkConnectionProperties intInfo in networkPropertiesCache)
{ {
@@ -200,7 +200,7 @@ internal static class Commands
return results; return results;
} }
public static List<IListItem> GetAllCommands(SettingsManager manager) public static List<IListItem> GetAllCommands(ISettingsInterface manager)
{ {
var list = new List<IListItem>(); var list = new List<IListItem>();
var listLock = new object(); var listLock = new object();
@@ -209,11 +209,11 @@ internal static class Commands
// On global queries the first word/part has to be 'ip', 'mac' or 'address' for network results // On global queries the first word/part has to be 'ip', 'mac' or 'address' for network results
var networkConnectionResults = Commands.GetNetworkConnectionResults(manager); var networkConnectionResults = Commands.GetNetworkConnectionResults(manager);
var isBootedInUefiMode = Win32Helpers.GetSystemFirmwareType() == FirmwareType.Uefi; var isBootedInUefiMode = manager.GetSystemFirmwareType() == FirmwareType.Uefi;
var hideEmptyRB = manager.HideEmptyRecycleBin; var hideEmptyRB = manager.HideEmptyRecycleBin();
var confirmSystemCommands = manager.ShowDialogToConfirmCommand; var confirmSystemCommands = manager.ShowDialogToConfirmCommand();
var showSuccessOnEmptyRB = manager.ShowSuccessMessageAfterEmptyingRecycleBin; var showSuccessOnEmptyRB = manager.ShowSuccessMessageAfterEmptyingRecycleBin();
// normal system commands are fast and can be returned immediately // normal system commands are fast and can be returned immediately
var systemCommands = Commands.GetSystemCommands(isBootedInUefiMode, hideEmptyRB, confirmSystemCommands, showSuccessOnEmptyRB); var systemCommands = Commands.GetSystemCommands(isBootedInUefiMode, hideEmptyRB, confirmSystemCommands, showSuccessOnEmptyRB);

View File

@@ -0,0 +1,24 @@
// 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.System.Helpers;
public interface ISettingsInterface
{
public bool ShowDialogToConfirmCommand();
public bool ShowSuccessMessageAfterEmptyingRecycleBin();
public bool HideEmptyRecycleBin();
public bool HideDisconnectedNetworkInfo();
public FirmwareType GetSystemFirmwareType();
}

View File

@@ -7,7 +7,7 @@ using Microsoft.CommandPalette.Extensions.Toolkit;
namespace Microsoft.CmdPal.Ext.System.Helpers; namespace Microsoft.CmdPal.Ext.System.Helpers;
public class SettingsManager : JsonSettingsManager public class SettingsManager : JsonSettingsManager, ISettingsInterface
{ {
private static readonly string _namespace = "system"; private static readonly string _namespace = "system";
@@ -37,14 +37,6 @@ public class SettingsManager : JsonSettingsManager
Resources.Microsoft_plugin_ext_settings_hideDisconnectedNetworkInfo, Resources.Microsoft_plugin_ext_settings_hideDisconnectedNetworkInfo,
false); false);
public bool ShowDialogToConfirmCommand => _showDialogToConfirmCommand.Value;
public bool ShowSuccessMessageAfterEmptyingRecycleBin => _showSuccessMessageAfterEmptyingRecycleBin.Value;
public bool HideEmptyRecycleBin => _hideEmptyRecycleBin.Value;
public bool HideDisconnectedNetworkInfo => _hideDisconnectedNetworkInfo.Value;
internal static string SettingsJsonPath() internal static string SettingsJsonPath()
{ {
var directory = Utilities.BaseSettingsPath("Microsoft.CmdPal"); var directory = Utilities.BaseSettingsPath("Microsoft.CmdPal");
@@ -54,6 +46,16 @@ public class SettingsManager : JsonSettingsManager
return Path.Combine(directory, "settings.json"); return Path.Combine(directory, "settings.json");
} }
public bool ShowDialogToConfirmCommand() => _showDialogToConfirmCommand.Value;
public bool ShowSuccessMessageAfterEmptyingRecycleBin() => _showSuccessMessageAfterEmptyingRecycleBin.Value;
public bool HideEmptyRecycleBin() => _hideEmptyRecycleBin.Value;
public bool HideDisconnectedNetworkInfo() => _hideDisconnectedNetworkInfo.Value;
public FirmwareType GetSystemFirmwareType() => Win32Helpers.GetSystemFirmwareType();
public SettingsManager() public SettingsManager()
{ {
FilePath = SettingsJsonPath(); FilePath = SettingsJsonPath();

View File

@@ -10,9 +10,9 @@ namespace Microsoft.CmdPal.Ext.System.Pages;
public sealed partial class SystemCommandPage : ListPage public sealed partial class SystemCommandPage : ListPage
{ {
private readonly SettingsManager _settingsManager; private readonly ISettingsInterface _settingsManager;
public SystemCommandPage(SettingsManager settingsManager) public SystemCommandPage(ISettingsInterface settingsManager)
{ {
Title = Resources.Microsoft_plugin_ext_system_page_title; Title = Resources.Microsoft_plugin_ext_system_page_title;
Name = Resources.Microsoft_plugin_command_name_open; Name = Resources.Microsoft_plugin_command_name_open;