using System; using System.ComponentModel; using Xunit; using ytLive.Helpers; using ytLive.Models; using ytLive.ViewModels; namespace ytLive.Tests; /// /// The ON-AIR sign and menu-bar color follow the real MainViewModel state, /// including the YouTube lifecycle confirmation before the bar turns green. /// [Collection("RealApp")] public sealed class OnAirSignTests { [Fact] public void OnAirBrush_And_TopBarBackground_Follow_YouTube_Live_State() { _app.Run(Run); } private readonly RealAppHost _app; public OnAirSignTests(RealAppHost app) => _app = app; private void Run() { var tempDb = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"ytLlive-onair-{Guid.NewGuid():N}.db"); MainViewModel.LayoutPathOverride = tempDb; try { using (var schema = new ytLive.Services.LayoutStore(tempDb)) { } Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools(); var vm = new MainViewModel(); Assert.Equal(StreamStatus.Offline, vm.StreamStatus); Assert.Equal("#5b6478", vm.OnAirBrush); var idleBackground = vm.TopBarBackground; var raised = 0; vm.PropertyChanged += (_, e) => { if (e.PropertyName == nameof(MainViewModel.OnAirBrush)) raised++; }; vm.StreamVisibility = "Public"; Assert.Equal("#5b6478", vm.OnAirBrush); vm.StreamStatus = StreamStatus.Streaming; Assert.Equal("#ff5451", vm.OnAirBrush); Assert.Equal(ThemeBrush.Hex("Brush.Primary"), vm.TopBarBackground); vm.ApplyBroadcastLifecycleStatus("liveStarting"); Assert.Equal(ThemeBrush.Hex("Brush.Primary"), vm.TopBarBackground); vm.StreamVisibility = "Private"; Assert.Equal("#22c55e", vm.OnAirBrush); Assert.Equal(3, raised); vm.ApplyBroadcastLifecycleStatus("live"); Assert.Equal(ThemeBrush.Hex("Brush.Positive"), vm.TopBarBackground); vm.StreamStatus = StreamStatus.Offline; Assert.Equal(idleBackground, vm.TopBarBackground); vm.IsTestStream = true; vm.StreamStatus = StreamStatus.Streaming; Assert.Equal(ThemeBrush.Hex("Brush.TestContainer"), vm.TopBarBackground); vm.ApplyBroadcastLifecycleStatus("live"); Assert.Equal(ThemeBrush.Hex("Brush.TestContainer"), vm.TopBarBackground); vm.StreamStatus = StreamStatus.Offline; Assert.Equal(idleBackground, vm.TopBarBackground); } finally { MainViewModel.LayoutPathOverride = null; Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools(); try { System.IO.File.Delete(tempDb); } catch { /* best-effort cleanup */ } } } }