// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using autoShell.Handlers;
using autoShell.Handlers.Settings;
using autoShell.Logging;
using autoShell.Services;
using Moq;
namespace autoShell.Tests;
///
/// Verifies structural invariants across all registered handlers (e.g., no duplicate commands).
///
public class HandlerRegistrationTests
{
private readonly List _handlers;
public HandlerRegistrationTests()
{
var audioMock = new Mock();
var registryMock = new Mock();
var systemParamsMock = new Mock();
var processMock = new Mock();
var appRegistryMock = new Mock();
var debuggerMock = new Mock();
var brightnessMock = new Mock();
var displayMock = new Mock();
var windowMock = new Mock();
var networkMock = new Mock();
var virtualDesktopMock = new Mock();
var loggerMock = new Mock();
_handlers =
[
new AudioActionHandler(audioMock.Object),
new AppActionHandler(appRegistryMock.Object, processMock.Object, windowMock.Object, loggerMock.Object),
new WindowActionHandler(appRegistryMock.Object, windowMock.Object),
new ThemeActionHandler(registryMock.Object, processMock.Object, systemParamsMock.Object),
new VirtualDesktopActionHandler(appRegistryMock.Object, windowMock.Object, virtualDesktopMock.Object, loggerMock.Object),
new NetworkActionHandler(networkMock.Object, processMock.Object, loggerMock.Object),
new DisplayActionHandler(displayMock.Object, loggerMock.Object),
new TaskbarSettingsHandler(registryMock.Object, processMock.Object),
new DisplaySettingsHandler(registryMock.Object, processMock.Object, brightnessMock.Object, loggerMock.Object),
new PersonalizationSettingsHandler(registryMock.Object, processMock.Object),
new MouseSettingsHandler(registryMock.Object, processMock.Object, systemParamsMock.Object, loggerMock.Object),
new AccessibilitySettingsHandler(registryMock.Object, processMock.Object, systemParamsMock.Object),
new PowerSettingsHandler(registryMock.Object, processMock.Object),
new FileExplorerSettingsHandler(registryMock.Object),
new PrivacySettingsHandler(registryMock.Object),
new SystemSettingsHandler(registryMock.Object, processMock.Object),
new SystemActionHandler(processMock.Object, debuggerMock.Object),
];
}
///
/// Verifies that no handler declares the same command key more than once.
///
[Fact]
public void AllHandlers_HaveNoDuplicateCommandsWithinHandler()
{
foreach (var handler in _handlers)
{
var commands = handler.SupportedActions.ToList();
var duplicates = commands.GroupBy(c => c).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
Assert.Empty(duplicates);
}
}
///
/// Verifies that no command key is claimed by more than one handler.
///
[Fact]
public void AllHandlers_HaveNoDuplicateCommandsAcrossHandlers()
{
var seen = new Dictionary();
var duplicates = new List();
foreach (var handler in _handlers)
{
string handlerName = handler.GetType().Name;
foreach (string cmd in handler.SupportedActions)
{
if (seen.TryGetValue(cmd, out string? existingHandler))
{
duplicates.Add($"'{cmd}' in both {existingHandler} and {handlerName}");
}
else
{
seen[cmd] = handlerName;
}
}
}
Assert.Empty(duplicates);
}
}