diff --git a/ErsatzTV.Core.Tests/Scheduling/AlternateScheduleSelectorTests.cs b/ErsatzTV.Core.Tests/Scheduling/AlternateScheduleSelectorTests.cs index 34af2a3f9..129ee07d7 100644 --- a/ErsatzTV.Core.Tests/Scheduling/AlternateScheduleSelectorTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/AlternateScheduleSelectorTests.cs @@ -863,5 +863,53 @@ public static class AlternateScheduleSelectorTests result.IsNone.ShouldBeFalse(); } + + [Test] + public void LimitToDateRange_13th_Month_Should_Not_Crash() + { + var template = new PlayoutTemplate + { + DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), + DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), + MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), + LimitToDateRange = true, + StartMonth = 13, + StartDay = 30, + StartYear = 2022, + EndMonth = 13, + EndDay = 30, + EndYear = 2023 + }; + + Option result = AlternateScheduleSelector.GetScheduleForDate( + new List { template }, + new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); + + result.IsNone.ShouldBeTrue(); + } + + [Test] + public void LimitToDateRange_0th_Day_Should_Not_Crash() + { + var template = new PlayoutTemplate + { + DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), + DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), + MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), + LimitToDateRange = true, + StartMonth = 12, + StartDay = 0, + StartYear = 2022, + EndMonth = 12, + EndDay = 0, + EndYear = 2023 + }; + + Option result = AlternateScheduleSelector.GetScheduleForDate( + new List { template }, + new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); + + result.IsNone.ShouldBeTrue(); + } } } diff --git a/ErsatzTV.Core/Scheduling/AlternateScheduleSelector.cs b/ErsatzTV.Core/Scheduling/AlternateScheduleSelector.cs index c9ca6b162..4818cd9ba 100644 --- a/ErsatzTV.Core/Scheduling/AlternateScheduleSelector.cs +++ b/ErsatzTV.Core/Scheduling/AlternateScheduleSelector.cs @@ -26,6 +26,12 @@ public static class AlternateScheduleSelector { if (item.LimitToDateRange) { + if (item.StartMonth is < 1 or > 12 || item.EndMonth is < 1 or > 12 || item.StartDay < 1 || + item.EndDay < 1) + { + continue; + } + bool reverse = item.StartMonth * 100 + item.StartDay > item.EndMonth * 100 + item.EndDay; diff --git a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutScheduleItem.cs b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutScheduleItem.cs index be1896e39..ea422ba33 100644 --- a/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutScheduleItem.cs +++ b/ErsatzTV.Core/Scheduling/YamlScheduling/Models/YamlPlayoutScheduleItem.cs @@ -23,13 +23,13 @@ public class YamlPlayoutScheduleItem : IAlternateScheduleItem // schedules are purely date-range based, so every day/month is eligible [YamlIgnore] - public ICollection DaysOfWeek => Enum.GetValues(); + public ICollection DaysOfWeek => AlternateScheduleSelector.AllDaysOfWeek(); [YamlIgnore] - public ICollection DaysOfMonth => Enumerable.Range(1, 31).ToList(); + public ICollection DaysOfMonth => AlternateScheduleSelector.AllDaysOfMonth(); [YamlIgnore] - public ICollection MonthsOfYear => Enumerable.Range(1, 12).ToList(); + public ICollection MonthsOfYear => AlternateScheduleSelector.AllMonthsOfYear(); [YamlIgnore] public bool LimitToDateRange => true;