using Bunit; using Marathon.UI.Components; using Marathon.UI.Tests.Support; using Microsoft.AspNetCore.Components; using MudBlazor; namespace Marathon.UI.Tests; public sealed class ThemeToggleTests : MarathonTestContext { [Fact] public void Toggle_flips_theme_state() { var cut = RenderComponent(p => p.AddChildContent()); Theme.IsDark.Should().BeFalse(); cut.Find("button").Click(); Theme.IsDark.Should().BeTrue(); cut.Find("button").Click(); Theme.IsDark.Should().BeFalse(); } [Fact] public void Theme_state_notifies_subscribers_only_on_change() { var notifications = 0; Theme.OnChange += () => notifications++; Theme.Set(true); Theme.Set(true); // no-op — already dark Theme.Set(false); notifications.Should().Be(2); } /// Wraps the component-under-test with MudBlazor providers /// so MudTooltip/MudPopover initialize correctly. private sealed class TestHost : ComponentBase { [Parameter] public RenderFragment? ChildContent { get; set; } protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder) { builder.OpenComponent(0); builder.CloseComponent(); builder.AddContent(1, ChildContent); } } }