using TeleWave.Domain.Broadcast; using Xunit; namespace TeleWave.Domain.Tests.Broadcast; public class ChannelShowTests { private static ChannelShow NewShow() => Channel .Create("c", "c", DateTimeOffset.UnixEpoch) .AddShow(Guid.NewGuid(), 1, BlockMode.Count, 1); [Fact] public void Create_HasDefaultPreferredMultiplier_AndNoWindows() { var cs = NewShow(); Assert.Equal(ChannelShow.DefaultPreferredWeightMultiplier, cs.PreferredWeightMultiplier); Assert.Empty(cs.PreferredHours); Assert.True(cs.IsEnabled); Assert.Equal(0, cs.NextEpisodeIndex); } [Fact] public void Update_ChangesCoreFields() { var cs = NewShow(); cs.Update(9, BlockMode.Duration, 45, false); Assert.Equal(9, cs.Weight); Assert.Equal(BlockMode.Duration, cs.BlockMode); Assert.Equal(45, cs.BlockValue); Assert.False(cs.IsEnabled); } [Fact] public void SetPreferredHours_ClampsMultiplier_AndNormalizesWindows() { var cs = NewShow(); cs.SetPreferredHours( 0, // < 1 → должно стать 1 [ (18, 23), // валидное (10, 10), // start == end → отбрасывается (5, 25), // end > 24 → отбрасывается (-1, 3), // start < 0 → отбрасывается (18, 23), // дубликат → схлопывается ] ); Assert.Equal(1, cs.PreferredWeightMultiplier); var window = Assert.Single(cs.PreferredHours); Assert.Equal(18, window.StartHour); Assert.Equal(23, window.EndHour); } [Fact] public void SetPreferredHours_ReplacesPreviousSet() { var cs = NewShow(); cs.SetPreferredHours(3, [(1, 2)]); cs.SetPreferredHours(2, [(8, 9), (20, 22)]); Assert.Equal(2, cs.PreferredWeightMultiplier); Assert.Equal(2, cs.PreferredHours.Count); } [Fact] public void IsPreferredAt_ChecksWindows() { var cs = NewShow(); cs.SetPreferredHours(3, [(18, 23)]); Assert.True(cs.IsPreferredAt(18)); Assert.True(cs.IsPreferredAt(22)); Assert.False(cs.IsPreferredAt(23)); // конец исключается Assert.False(cs.IsPreferredAt(9)); } [Fact] public void SetNextEpisodeIndex_MovesCursor() { var cs = NewShow(); cs.SetNextEpisodeIndex(5); Assert.Equal(5, cs.NextEpisodeIndex); } }