From 2daf89194b58e4e97e1a7861c7f96b282d2d0762 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:31:14 -0500 Subject: [PATCH] add more safety and a couple tests --- .../AlternateScheduleSelectorTests.cs | 48 +++++++++++++++++++ .../Scheduling/AlternateScheduleSelector.cs | 6 +++ .../Models/YamlPlayoutScheduleItem.cs | 6 +-- 3 files changed, 57 insertions(+), 3 deletions(-) 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;