mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-20 15:44:25 +08:00
179 lines
7.3 KiB
C#
179 lines
7.3 KiB
C#
using Xunit;
|
|
|
|
namespace LanMountainDesktop.Tests;
|
|
|
|
public sealed class WindowLayerIsolationTests
|
|
{
|
|
[Fact]
|
|
public void AirAppWindow_DoesNotUseDesktopBottomMostOrTopmostPromotion()
|
|
{
|
|
var source = ReadRepositoryFile("LanMountainDesktop.AirAppHost", "AirAppWindow.axaml.cs");
|
|
|
|
Assert.DoesNotContain("WindowBottomMostServiceFactory", source);
|
|
Assert.DoesNotContain("IWindowBottomMostService", source);
|
|
Assert.DoesNotContain("SendToBottom", source);
|
|
Assert.DoesNotContain("Topmost = true", source);
|
|
Assert.DoesNotContain("Topmost=true", source);
|
|
}
|
|
|
|
[Fact]
|
|
public void AirAppWindowDescriptor_DefinesSupportedChromeModes()
|
|
{
|
|
var source = ReadRepositoryFile("LanMountainDesktop.AirAppHost", "AirAppWindowDescriptor.cs");
|
|
|
|
Assert.Contains("AirAppWindowChromeMode", source);
|
|
Assert.Contains("Standard", source);
|
|
Assert.Contains("Borderless", source);
|
|
Assert.Contains("FullScreen", source);
|
|
Assert.Contains("Tool", source);
|
|
Assert.Contains("BackgroundOnly", source);
|
|
}
|
|
|
|
[Fact]
|
|
public void AirAppWindowDescriptor_MapsBuiltInAppsToExpectedChromeModes()
|
|
{
|
|
var source = ReadRepositoryFile("LanMountainDesktop.AirAppHost", "AirAppWindowDescriptor.cs");
|
|
|
|
Assert.Contains("AirAppLaunchOptions.WorldClockAppId", source);
|
|
Assert.Contains("AirAppWindowChromeMode.Standard", source);
|
|
Assert.Contains("AirAppLaunchOptions.WhiteboardAppId", source);
|
|
Assert.Contains("AirAppWindowChromeMode.FullScreen", source);
|
|
}
|
|
|
|
[Fact]
|
|
public void FusedDesktopWindows_KeepDesktopBottomMostBoundary()
|
|
{
|
|
var desktopWidgetWindow = ReadRepositoryFile("LanMountainDesktop", "Views", "DesktopWidgetWindow.axaml.cs");
|
|
var transparentOverlayWindow = ReadRepositoryFile("LanMountainDesktop", "Views", "TransparentOverlayWindow.axaml.cs");
|
|
|
|
Assert.Contains("WindowBottomMostServiceFactory.GetOrCreate()", desktopWidgetWindow);
|
|
Assert.Contains("RefreshDesktopLayer", desktopWidgetWindow);
|
|
Assert.Contains("SendToBottom", desktopWidgetWindow);
|
|
|
|
Assert.Contains("WindowBottomMostServiceFactory.GetOrCreate()", transparentOverlayWindow);
|
|
Assert.Contains("RefreshDesktopLayer", transparentOverlayWindow);
|
|
Assert.Contains("SendToBottom", transparentOverlayWindow);
|
|
}
|
|
|
|
[Fact]
|
|
public void FusedDesktopManager_RefreshesDesktopLayerAfterShowingWidgets()
|
|
{
|
|
var source = ReadRepositoryFile("LanMountainDesktop", "Services", "FusedDesktopManagerService.cs");
|
|
|
|
Assert.Contains("existingWindow.RefreshDesktopLayer()", source);
|
|
Assert.Contains("window.RefreshDesktopLayer()", source);
|
|
}
|
|
|
|
[Fact]
|
|
public void MainWindowDesktopLayerService_DoesNotUseFusedDesktopPassthroughBoundary()
|
|
{
|
|
var source = ReadRepositoryFile("LanMountainDesktop", "Services", "MainWindowDesktopLayerService.cs");
|
|
|
|
Assert.Contains("IMainWindowDesktopLayerService", source);
|
|
Assert.Contains("SetParent", source);
|
|
Assert.Contains("HWND_BOTTOM", source);
|
|
Assert.DoesNotContain("WindowBottomMostServiceFactory", source);
|
|
Assert.DoesNotContain("IRegionPassthroughService", source);
|
|
Assert.DoesNotContain("SetInteractiveRegions", source);
|
|
Assert.DoesNotContain("HTTRANSPARENT", source);
|
|
Assert.DoesNotContain("WS_EX_NOACTIVATE", source);
|
|
}
|
|
|
|
[Fact]
|
|
public void MainWindowRestorePaths_UseDesktopLayerAwareActivation()
|
|
{
|
|
var source = ReadRepositoryFile("LanMountainDesktop", "App.axaml.cs");
|
|
var restoreSource = ExtractMethodSource(source, "RestoreOrCreateMainWindowCore");
|
|
var trayFallbackSource = ExtractMethodSource(source, "RecoverFromTrayUnavailable");
|
|
var applyLayerSource = ExtractMethodSource(source, "ApplyMainWindowDesktopLayerRuntimeState");
|
|
|
|
Assert.Contains("ActivateOrRefreshMainWindowLayer(mainWindow", restoreSource);
|
|
Assert.DoesNotContain("Topmost = true", restoreSource);
|
|
|
|
Assert.Contains("ActivateOrRefreshMainWindowLayer(mainWindow", trayFallbackSource);
|
|
Assert.DoesNotContain("Topmost = true", trayFallbackSource);
|
|
|
|
Assert.Contains("FusedDesktopManagerServiceFactory.GetOrCreate().Shutdown()", applyLayerSource);
|
|
}
|
|
|
|
[Fact]
|
|
public void AppSettingsSnapshot_MainWindowDesktopLayerDefaultsToDisabled()
|
|
{
|
|
Assert.False(new LanMountainDesktop.Models.AppSettingsSnapshot().EnableMainWindowDesktopLayer);
|
|
}
|
|
|
|
[Fact]
|
|
public void DeveloperSettings_DefinesMutuallyExclusiveDesktopLayerToggles()
|
|
{
|
|
var viewModelSource = ReadRepositoryFile("LanMountainDesktop", "ViewModels", "SettingsViewModels.cs");
|
|
var pageSource = ReadRepositoryFile("LanMountainDesktop", "Views", "SettingsPages", "DevSettingsPage.axaml.cs");
|
|
var xamlSource = ReadRepositoryFile("LanMountainDesktop", "Views", "SettingsPages", "DevSettingsPage.axaml");
|
|
|
|
Assert.Contains("EnableMainWindowDesktopLayer", viewModelSource);
|
|
Assert.Contains("ApplyFusedDesktopPreference", viewModelSource);
|
|
Assert.Contains("ApplyMainWindowDesktopLayerPreference", viewModelSource);
|
|
Assert.Contains("nameof(AppSettingsSnapshot.EnableFusedDesktop)", viewModelSource);
|
|
Assert.Contains("nameof(AppSettingsSnapshot.EnableMainWindowDesktopLayer)", viewModelSource);
|
|
|
|
Assert.Contains("ConfirmDesktopLayerSwitchAsync", pageSource);
|
|
Assert.Contains("OnFusedDesktopToggleChanged", xamlSource);
|
|
Assert.Contains("OnMainWindowDesktopLayerToggleChanged", xamlSource);
|
|
Assert.Contains("Mode=OneWay", xamlSource);
|
|
}
|
|
|
|
private static string ReadRepositoryFile(params string[] segments)
|
|
{
|
|
var directory = new DirectoryInfo(AppContext.BaseDirectory);
|
|
while (directory is not null)
|
|
{
|
|
var candidate = Path.Combine(new[] { directory.FullName }.Concat(segments).ToArray());
|
|
if (File.Exists(candidate))
|
|
{
|
|
return File.ReadAllText(candidate);
|
|
}
|
|
|
|
if (File.Exists(Path.Combine(directory.FullName, "LanMountainDesktop.slnx")))
|
|
{
|
|
break;
|
|
}
|
|
|
|
directory = directory.Parent;
|
|
}
|
|
|
|
throw new FileNotFoundException($"Could not locate repository file '{Path.Combine(segments)}'.");
|
|
}
|
|
|
|
private static string ExtractMethodSource(string source, string methodName)
|
|
{
|
|
var methodIndex = source.IndexOf($"private bool {methodName}(", StringComparison.Ordinal);
|
|
if (methodIndex < 0)
|
|
{
|
|
methodIndex = source.IndexOf($"private void {methodName}(", StringComparison.Ordinal);
|
|
}
|
|
|
|
Assert.True(methodIndex >= 0, $"Could not locate method '{methodName}'.");
|
|
|
|
var braceIndex = source.IndexOf('{', methodIndex);
|
|
Assert.True(braceIndex >= 0, $"Could not locate method body for '{methodName}'.");
|
|
|
|
var depth = 0;
|
|
for (var i = braceIndex; i < source.Length; i++)
|
|
{
|
|
if (source[i] == '{')
|
|
{
|
|
depth++;
|
|
}
|
|
else if (source[i] == '}')
|
|
{
|
|
depth--;
|
|
if (depth == 0)
|
|
{
|
|
return source.Substring(methodIndex, i - methodIndex + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
throw new InvalidOperationException($"Could not extract method '{methodName}'.");
|
|
}
|
|
}
|