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 */ } + } +}