using TeleWave.Domain.Broadcast; using Xunit; namespace TeleWave.Domain.Tests.Broadcast; public class ProgrammingOverrideTests { private static readonly DateTimeOffset Epoch = new(2026, 1, 1, 0, 0, 0, TimeSpan.Zero); private static Channel NewChannel() => Channel.Create("c", "c", Epoch); [Fact] public void OneTime_Covers_OnlyInsideWindow() { var ovr = NewChannel() .AddOverride(OverrideMode.Exclusive, Epoch.AddHours(1), Epoch.AddHours(3)); Assert.False(ovr.Covers(Epoch.AddMinutes(59))); Assert.True(ovr.Covers(Epoch.AddHours(1))); Assert.True(ovr.Covers(Epoch.AddHours(2))); Assert.False(ovr.Covers(Epoch.AddHours(3))); // конец исключается } [Fact] public void AddShow_AttachesWithWeight() { var ovr = NewChannel().AddOverride(OverrideMode.Boost, Epoch, Epoch.AddHours(1)); var showId = Guid.NewGuid(); var os = ovr.AddShow(showId, 4); Assert.Equal(showId, os.ShowId); Assert.Equal(4, os.Weight); Assert.Single(ovr.Shows); } [Fact] public void Weekly_Covers_MatchingDayAndMinuteWindow() { // Epoch = 2026-01-01 — четверг (DayOfWeek=4). var day = (int)Epoch.UtcDateTime.DayOfWeek; var ovr = NewChannel().AddWeeklyOverride(OverrideMode.Exclusive, day, 600, 720); // 10:00–12:00 Assert.True(ovr.Covers(Epoch.AddMinutes(600))); // 10:00 того же дня Assert.True(ovr.Covers(Epoch.AddMinutes(719))); // 11:59 Assert.False(ovr.Covers(Epoch.AddMinutes(720))); // 12:00 — конец исключается Assert.False(ovr.Covers(Epoch.AddMinutes(599))); // 09:59 } [Fact] public void Weekly_Covers_NextWeekSameDay() { var day = (int)Epoch.UtcDateTime.DayOfWeek; var ovr = NewChannel().AddWeeklyOverride(OverrideMode.Exclusive, day, 0, 1440); Assert.True(ovr.Covers(Epoch.AddDays(7).AddHours(5))); Assert.False(ovr.Covers(Epoch.AddDays(1).AddHours(5))); // другой день недели } }