diff --git a/LANCommander.Launcher.Tests/Tests/ViewLayoutTests.cs b/LANCommander.Launcher.Tests/Tests/ViewLayoutTests.cs
index 1270daa6..79bc702d 100644
--- a/LANCommander.Launcher.Tests/Tests/ViewLayoutTests.cs
+++ b/LANCommander.Launcher.Tests/Tests/ViewLayoutTests.cs
@@ -31,6 +31,15 @@ public class ViewLayoutTests
private const int WindowWidth = 1200;
private const int WindowHeight = 800;
+ static ViewLayoutTests()
+ {
+ // The Login, Splash and ServerSelection views pick a random full-screen
+ // background on load. Disable that here so the captured screenshots — and the
+ // committed baselines — are deterministic; otherwise every run compares against
+ // a different photo and reports a spurious regression.
+ ViewBackground.Enabled = false;
+ }
+
// ---------------------------------------------------------------------------
// Service provider shared by all tests that need ViewModels with DI dependencies.
// Minimal: just logging — no real SDK services needed for layout-only rendering.
diff --git a/LANCommander.Launcher/LANCommander.Launcher.csproj b/LANCommander.Launcher/LANCommander.Launcher.csproj
index 2a44afa9..9a52d8ab 100644
--- a/LANCommander.Launcher/LANCommander.Launcher.csproj
+++ b/LANCommander.Launcher/LANCommander.Launcher.csproj
@@ -36,6 +36,10 @@
+
+
+
+
diff --git a/LANCommander.Launcher/Views/LoginView.axaml.cs b/LANCommander.Launcher/Views/LoginView.axaml.cs
index 0ce24243..b620c0a4 100644
--- a/LANCommander.Launcher/Views/LoginView.axaml.cs
+++ b/LANCommander.Launcher/Views/LoginView.axaml.cs
@@ -1,23 +1,10 @@
-using System;
using Avalonia.Controls;
using Avalonia.Interactivity;
-using Avalonia.Media.Imaging;
-using Avalonia.Platform;
namespace LANCommander.Launcher.Views;
public partial class LoginView : UserControl
{
- private static readonly string[] Backgrounds =
- {
- "avares://LANCommander.Launcher/Assets/backgrounds/aoe2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/ns2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/css.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/bfme2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/soldat2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/ut2004.jpg",
- };
-
public LoginView()
{
InitializeComponent();
@@ -26,12 +13,7 @@ public partial class LoginView : UserControl
private void OnLoaded(object? sender, RoutedEventArgs e)
{
- try
- {
- var uri = new Uri(Backgrounds[Random.Shared.Next(Backgrounds.Length)]);
- BackgroundImage.Source = new Bitmap(AssetLoader.Open(uri));
- }
- catch { /* silently ignore missing assets */ }
+ ViewBackground.Apply(BackgroundImage);
UsernameTextBox.Focus();
}
diff --git a/LANCommander.Launcher/Views/ServerSelectionView.axaml.cs b/LANCommander.Launcher/Views/ServerSelectionView.axaml.cs
index 02d89ceb..5d34053d 100644
--- a/LANCommander.Launcher/Views/ServerSelectionView.axaml.cs
+++ b/LANCommander.Launcher/Views/ServerSelectionView.axaml.cs
@@ -1,23 +1,10 @@
-using System;
using Avalonia.Controls;
using Avalonia.Interactivity;
-using Avalonia.Media.Imaging;
-using Avalonia.Platform;
namespace LANCommander.Launcher.Views;
public partial class ServerSelectionView : UserControl
{
- private static readonly string[] Backgrounds =
- {
- "avares://LANCommander.Launcher/Assets/backgrounds/aoe2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/ns2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/css.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/bfme2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/soldat2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/ut2004.jpg",
- };
-
public ServerSelectionView()
{
InitializeComponent();
@@ -26,13 +13,8 @@ public partial class ServerSelectionView : UserControl
private void OnLoaded(object? sender, RoutedEventArgs e)
{
- try
- {
- var uri = new Uri(Backgrounds[Random.Shared.Next(Backgrounds.Length)]);
- BackgroundImage.Source = new Bitmap(AssetLoader.Open(uri));
- }
- catch { /* silently ignore missing assets */ }
-
+ ViewBackground.Apply(BackgroundImage);
+
ServerAddressTextBox.Focus();
}
}
diff --git a/LANCommander.Launcher/Views/SplashView.axaml.cs b/LANCommander.Launcher/Views/SplashView.axaml.cs
index 1654c2d7..fc3e4f78 100644
--- a/LANCommander.Launcher/Views/SplashView.axaml.cs
+++ b/LANCommander.Launcher/Views/SplashView.axaml.cs
@@ -1,23 +1,10 @@
-using System;
using Avalonia.Controls;
using Avalonia.Interactivity;
-using Avalonia.Media.Imaging;
-using Avalonia.Platform;
namespace LANCommander.Launcher.Views;
public partial class SplashView : UserControl
{
- private static readonly string[] Backgrounds =
- {
- "avares://LANCommander.Launcher/Assets/backgrounds/aoe2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/ns2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/css.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/bfme2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/soldat2.jpg",
- "avares://LANCommander.Launcher/Assets/backgrounds/ut2004.jpg",
- };
-
public SplashView()
{
InitializeComponent();
@@ -26,11 +13,6 @@ public partial class SplashView : UserControl
private void OnLoaded(object? sender, RoutedEventArgs e)
{
- try
- {
- var uri = new Uri(Backgrounds[Random.Shared.Next(Backgrounds.Length)]);
- BackgroundImage.Source = new Bitmap(AssetLoader.Open(uri));
- }
- catch { /* silently ignore missing assets */ }
+ ViewBackground.Apply(BackgroundImage);
}
}
diff --git a/LANCommander.Launcher/Views/ViewBackground.cs b/LANCommander.Launcher/Views/ViewBackground.cs
new file mode 100644
index 00000000..3fb958cd
--- /dev/null
+++ b/LANCommander.Launcher/Views/ViewBackground.cs
@@ -0,0 +1,43 @@
+using System;
+using Avalonia.Controls;
+using Avalonia.Media.Imaging;
+using Avalonia.Platform;
+
+namespace LANCommander.Launcher.Views;
+
+///
+/// Picks a random full-screen background for the Login, Splash and ServerSelection
+/// views. Visual-regression tests disable the random pick via
+/// so the rendered output (and therefore the committed baseline) stays deterministic.
+///
+internal static class ViewBackground
+{
+ private static readonly string[] Backgrounds =
+ {
+ "avares://LANCommander.Launcher/Assets/backgrounds/aoe2.jpg",
+ "avares://LANCommander.Launcher/Assets/backgrounds/ns2.jpg",
+ "avares://LANCommander.Launcher/Assets/backgrounds/css.jpg",
+ "avares://LANCommander.Launcher/Assets/backgrounds/bfme2.jpg",
+ "avares://LANCommander.Launcher/Assets/backgrounds/soldat2.jpg",
+ "avares://LANCommander.Launcher/Assets/backgrounds/ut2004.jpg",
+ };
+
+ ///
+ /// When false, no random background is loaded. Set by visual-regression tests so
+ /// the rendered output is deterministic across runs.
+ ///
+ public static bool Enabled { get; set; } = true;
+
+ public static void Apply(Image target)
+ {
+ if (!Enabled)
+ return;
+
+ try
+ {
+ var uri = new Uri(Backgrounds[Random.Shared.Next(Backgrounds.Length)]);
+ target.Source = new Bitmap(AssetLoader.Open(uri));
+ }
+ catch { /* silently ignore missing assets */ }
+ }
+}