2026-05-04 11:22:21 +08:00
|
|
|
using LanMountainDesktop.Launcher.Services;
|
2026-05-12 16:46:49 +08:00
|
|
|
using LanMountainDesktop.Shared.Contracts.Launcher;
|
2026-05-04 11:22:21 +08:00
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
|
|
namespace LanMountainDesktop.Tests;
|
|
|
|
|
|
|
|
|
|
public sealed class HostAppSettingsOobeMergerTests
|
|
|
|
|
{
|
|
|
|
|
[Fact]
|
|
|
|
|
public void MergeStartupPresentation_PreservesUnrelatedJsonKeys()
|
|
|
|
|
{
|
|
|
|
|
var dir = Path.Combine(Path.GetTempPath(), "LMD.OobeMerge", Guid.NewGuid().ToString("N"));
|
|
|
|
|
Directory.CreateDirectory(dir);
|
|
|
|
|
var path = Path.Combine(dir, "settings.json");
|
|
|
|
|
File.WriteAllText(path, """
|
|
|
|
|
{
|
|
|
|
|
"LanguageCode": "ja-JP",
|
|
|
|
|
"ShowInTaskbar": false,
|
|
|
|
|
"EnableFadeTransition": true,
|
|
|
|
|
"EnableSlideTransition": false
|
|
|
|
|
}
|
|
|
|
|
""");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
HostAppSettingsOobeMerger.MergeStartupPresentation(
|
|
|
|
|
path,
|
|
|
|
|
new HostAppSettingsStartupChoices(
|
|
|
|
|
ShowInTaskbar: true,
|
|
|
|
|
EnableFadeTransition: false,
|
|
|
|
|
EnableSlideTransition: true,
|
|
|
|
|
FusedPopupExperience: true,
|
|
|
|
|
AutoStartWithWindows: true));
|
|
|
|
|
|
|
|
|
|
var json = File.ReadAllText(path);
|
|
|
|
|
using var doc = System.Text.Json.JsonDocument.Parse(json);
|
|
|
|
|
var root = doc.RootElement;
|
|
|
|
|
|
|
|
|
|
Assert.Equal("ja-JP", root.GetProperty("LanguageCode").GetString());
|
|
|
|
|
Assert.True(root.GetProperty("ShowInTaskbar").GetBoolean());
|
|
|
|
|
Assert.False(root.GetProperty("EnableFadeTransition").GetBoolean());
|
|
|
|
|
Assert.True(root.GetProperty("EnableSlideTransition").GetBoolean());
|
|
|
|
|
Assert.True(root.GetProperty("EnableFusedDesktop").GetBoolean());
|
|
|
|
|
Assert.True(root.GetProperty("EnableThreeFingerSwipe").GetBoolean());
|
|
|
|
|
Assert.True(root.GetProperty("AutoStartWithWindows").GetBoolean());
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(dir, recursive: true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void GetSettingsFilePath_NormalizesDataRoot()
|
|
|
|
|
{
|
|
|
|
|
var root = Path.Combine(Path.GetTempPath(), "LMD.OobePath", Guid.NewGuid().ToString("N"));
|
|
|
|
|
Directory.CreateDirectory(root);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var path = HostAppSettingsOobeMerger.GetSettingsFilePath(root + Path.DirectorySeparatorChar);
|
|
|
|
|
Assert.Equal(Path.Combine(Path.GetFullPath(root), "settings.json"), path);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(root);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void LoadStartupDefaults_WhenFusedAndSwipeDiffer_TreatsPopupExperienceAsBothTrue()
|
|
|
|
|
{
|
|
|
|
|
var dir = Path.Combine(Path.GetTempPath(), "LMD.OobeDefaults", Guid.NewGuid().ToString("N"));
|
|
|
|
|
Directory.CreateDirectory(dir);
|
|
|
|
|
var path = Path.Combine(dir, "settings.json");
|
|
|
|
|
File.WriteAllText(path, """
|
|
|
|
|
{
|
|
|
|
|
"EnableFusedDesktop": true,
|
|
|
|
|
"EnableThreeFingerSwipe": false
|
|
|
|
|
}
|
|
|
|
|
""");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var d = HostAppSettingsOobeMerger.LoadStartupDefaults(path);
|
|
|
|
|
Assert.False(d.FusedPopupExperience);
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(dir, recursive: true);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-05-12 16:46:49 +08:00
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("RestartApp", MultiInstanceLaunchBehavior.RestartApp)]
|
|
|
|
|
[InlineData("OpenDesktopSilently", MultiInstanceLaunchBehavior.OpenDesktopSilently)]
|
|
|
|
|
[InlineData("PromptOnly", MultiInstanceLaunchBehavior.PromptOnly)]
|
|
|
|
|
[InlineData("NotifyAndOpenDesktop", MultiInstanceLaunchBehavior.NotifyAndOpenDesktop)]
|
|
|
|
|
public void LoadMultiInstanceLaunchBehavior_ReadsStringValues(
|
|
|
|
|
string value,
|
|
|
|
|
MultiInstanceLaunchBehavior expected)
|
|
|
|
|
{
|
|
|
|
|
var dir = Path.Combine(Path.GetTempPath(), "LMD.MultiInstanceSettings", Guid.NewGuid().ToString("N"));
|
|
|
|
|
Directory.CreateDirectory(dir);
|
|
|
|
|
var path = Path.Combine(dir, "settings.json");
|
|
|
|
|
File.WriteAllText(path, $$"""
|
|
|
|
|
{
|
|
|
|
|
"MultiInstanceLaunchBehavior": "{{value}}"
|
|
|
|
|
}
|
|
|
|
|
""");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Assert.Equal(expected, HostAppSettingsOobeMerger.LoadMultiInstanceLaunchBehavior(path));
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(dir, recursive: true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("{}")]
|
|
|
|
|
[InlineData("{ \"MultiInstanceLaunchBehavior\": \"Unknown\" }")]
|
|
|
|
|
public void LoadMultiInstanceLaunchBehavior_FallsBackToNotifyAndOpenDesktop(string json)
|
|
|
|
|
{
|
|
|
|
|
var dir = Path.Combine(Path.GetTempPath(), "LMD.MultiInstanceSettings", Guid.NewGuid().ToString("N"));
|
|
|
|
|
Directory.CreateDirectory(dir);
|
|
|
|
|
var path = Path.Combine(dir, "settings.json");
|
|
|
|
|
File.WriteAllText(path, json);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
Assert.Equal(
|
|
|
|
|
MultiInstanceLaunchBehavior.NotifyAndOpenDesktop,
|
|
|
|
|
HostAppSettingsOobeMerger.LoadMultiInstanceLaunchBehavior(path));
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(dir, recursive: true);
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-05-04 11:22:21 +08:00
|
|
|
}
|