using Avalonia; using Avalonia.Headless; using Xunit; [assembly: AvaloniaTestApplication(typeof(AcDream.Launcher.Tests.TestAppBuilder))] [assembly: AvaloniaTestIsolation(AvaloniaTestIsolationLevel.PerAssembly)] // Compiled INTO the assembly on purpose. A xunit.runner.json expresses the same // intent but only works if the file is copied beside the test DLL; under CI's // `dotnet build` + `dotnet test --no-build` split it did not arrive, so the // suite ran with parallel collections and MainWindowViewTests failed in Test // Case Cleanup ("The calling thread cannot access this object") while passing // locally. An assembly attribute cannot fail to deploy. [assembly: CollectionBehavior(DisableTestParallelization = true)] namespace AcDream.Launcher.Tests; /// /// Headless Avalonia application entry point for [AvaloniaFact]/ /// [AvaloniaTheory] tests (see #399). Reuses the launcher's real /// so the FluentTheme styles declared in App.axaml are /// live for every test — 's controls (TreeView, /// Button, TextBox, ...) need a real control theme to template and focus /// correctly, not just an unstyled visual tree. /// The assembly contains one Avalonia test that owns the complete window /// matrix. Keep one application/dispatcher for that process: Avalonia 12's /// per-test teardown can recreate the compositor after its render loop has /// become owned by a different worker, producing a thread-affinity cleanup /// failure after an otherwise passing test. /// public static class TestAppBuilder { public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure() .UseHeadless(new AvaloniaHeadlessPlatformOptions()); }