86 lines
3.4 KiB
C#
86 lines
3.4 KiB
C#
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))); // другой день недели
|
||
}
|
||
|
||
[Fact]
|
||
public void Weekly_Covers_WindowCrossingMidnight()
|
||
{
|
||
// Epoch = 2026-01-01 — четверг (DayOfWeek=4). Окно 23:00–01:00 пересекает полночь на пятницу.
|
||
var day = (int)Epoch.UtcDateTime.DayOfWeek;
|
||
var ovr = NewChannel().AddWeeklyOverride(OverrideMode.Exclusive, day, 1380, 60); // 23:00–01:00
|
||
|
||
Assert.True(ovr.Covers(Epoch.AddMinutes(1380))); // чт 23:00 — начало
|
||
Assert.True(ovr.Covers(Epoch.AddMinutes(1439))); // чт 23:59
|
||
Assert.True(ovr.Covers(Epoch.AddDays(1).AddMinutes(0))); // пт 00:00 (следующий день)
|
||
Assert.True(ovr.Covers(Epoch.AddDays(1).AddMinutes(59))); // пт 00:59
|
||
Assert.False(ovr.Covers(Epoch.AddDays(1).AddMinutes(60))); // пт 01:00 — конец исключается
|
||
Assert.False(ovr.Covers(Epoch.AddMinutes(1379))); // чт 22:59 — до начала
|
||
Assert.False(ovr.Covers(Epoch.AddHours(12))); // чт полдень — вне окна
|
||
}
|
||
|
||
[Fact]
|
||
public void Weekly_EmptyWindow_WhenStartEqualsEnd_CoversNothing()
|
||
{
|
||
var day = (int)Epoch.UtcDateTime.DayOfWeek;
|
||
var ovr = NewChannel().AddWeeklyOverride(OverrideMode.Exclusive, day, 600, 600);
|
||
|
||
Assert.False(ovr.Covers(Epoch.AddMinutes(600)));
|
||
Assert.False(ovr.Covers(Epoch.AddMinutes(700)));
|
||
}
|
||
}
|