mirror of https://github.com/ErsatzTV/ErsatzTV.git
Browse Source
* refactor classic and block schedules to use same alternate schedule selector * handle start year and end year * add migrations for classic and block schedules * allow editing block template start and end year * add tests that include years * add date range editing to classic (alternate) schedules * fix running tests locally * restore media files load; needed for local folder scanners * update changelog * feedbackpull/2758/head
40 changed files with 15366 additions and 736 deletions
@ -0,0 +1,867 @@ |
|||||||
|
using ErsatzTV.Core.Domain.Scheduling; |
||||||
|
using ErsatzTV.Core.Scheduling; |
||||||
|
using NUnit.Framework; |
||||||
|
using Shouldly; |
||||||
|
|
||||||
|
namespace ErsatzTV.Core.Tests.Scheduling; |
||||||
|
|
||||||
|
public static class AlternateScheduleSelectorTests |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class GetScheduleForDate |
||||||
|
{ |
||||||
|
private static readonly TimeSpan Offset = TimeSpan.FromHours(-5); |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Before_Start_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 3, 31, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Before_Start_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2024, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 3, 31, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_On_Start_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_On_Start_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2024, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_In_Range_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 20, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_In_Range_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2024, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 20, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_On_End_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 15, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_On_End_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 15, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_After_End_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 16, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_After_End_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 4, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2024, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 16, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Before_Invalid_Start_Date_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Before_Invalid_Start_Date_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_After_Invalid_Start_Date_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_After_Invalid_Start_Date_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 6, |
||||||
|
EndDay = 15, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Before_Invalid_End_Date_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 1, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Before_Invalid_End_Date_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 1, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_After_Invalid_End_Date_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 1, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_After_Invalid_End_Date_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 1, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_Before_Start_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 14, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_Before_Start_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 14, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_On_Start_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 15, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_On_Start_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
StartYear = 2024, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2025 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 6, 15, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_In_Range_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 7, 20, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_In_Range_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
StartYear = 2024, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2025 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 7, 20, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_On_End_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_On_End_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_After_End_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 2, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_After_End_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 6, |
||||||
|
StartDay = 15, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 4, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2024, 4, 2, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_Before_Invalid_Start_Date_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
EndMonth = 1, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_Before_Invalid_Start_Date_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 1, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_After_Invalid_Start_Date_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
EndMonth = 1, |
||||||
|
EndDay = 1 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_After_Invalid_Start_Date_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 2, |
||||||
|
StartDay = 29, |
||||||
|
StartYear = 2023, |
||||||
|
EndMonth = 1, |
||||||
|
EndDay = 1, |
||||||
|
EndYear = 2024 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_Before_Invalid_End_Date_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 5, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_Before_Invalid_End_Date_With_Year_Should_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 5, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2022, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsSome.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_After_Invalid_End_Date_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 5, |
||||||
|
StartDay = 1, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_Wrap_Around_After_Invalid_End_Date_With_Year_Should_Not_Return_Template() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 5, |
||||||
|
StartDay = 1, |
||||||
|
StartYear = 2022, |
||||||
|
EndMonth = 2, |
||||||
|
EndDay = 29, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeTrue(); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void LimitToDateRange_December_32nd_Should_Not_Crash() |
||||||
|
{ |
||||||
|
var template = new PlayoutTemplate |
||||||
|
{ |
||||||
|
DaysOfWeek = AlternateScheduleSelector.AllDaysOfWeek(), |
||||||
|
DaysOfMonth = AlternateScheduleSelector.AllDaysOfMonth(), |
||||||
|
MonthsOfYear = AlternateScheduleSelector.AllMonthsOfYear(), |
||||||
|
LimitToDateRange = true, |
||||||
|
StartMonth = 12, |
||||||
|
StartDay = 32, |
||||||
|
StartYear = 2022, |
||||||
|
EndMonth = 12, |
||||||
|
EndDay = 32, |
||||||
|
EndYear = 2023 |
||||||
|
}; |
||||||
|
|
||||||
|
Option<PlayoutTemplate> result = AlternateScheduleSelector.GetScheduleForDate( |
||||||
|
new List<PlayoutTemplate> { template }, |
||||||
|
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
||||||
|
|
||||||
|
result.IsNone.ShouldBeFalse(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -1,411 +0,0 @@ |
|||||||
using ErsatzTV.Core.Domain.Scheduling; |
|
||||||
using ErsatzTV.Core.Scheduling; |
|
||||||
using NUnit.Framework; |
|
||||||
using Shouldly; |
|
||||||
|
|
||||||
namespace ErsatzTV.Core.Tests.Scheduling; |
|
||||||
|
|
||||||
public static class PlayoutTemplateSelectorTests |
|
||||||
{ |
|
||||||
[TestFixture] |
|
||||||
public class GetPlayoutTemplateFor |
|
||||||
{ |
|
||||||
private static readonly TimeSpan Offset = TimeSpan.FromHours(-5); |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Before_Start_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 4, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 3, 31, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_On_Start_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 4, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 4, 1, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_In_Range_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 4, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 4, 20, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_On_End_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 4, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 6, 15, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_After_End_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 4, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 6, 16, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Before_Invalid_Start_Date_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 2, |
|
||||||
StartDay = 29, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_After_Invalid_Start_Date_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 2, |
|
||||||
StartDay = 29, |
|
||||||
EndMonth = 6, |
|
||||||
EndDay = 15 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Before_Invalid_End_Date_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 1, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 2, |
|
||||||
EndDay = 29 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_After_Invalid_End_Date_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 1, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 2, |
|
||||||
EndDay = 29 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_Before_Start_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 6, |
|
||||||
StartDay = 15, |
|
||||||
EndMonth = 4, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 6, 14, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_On_Start_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 6, |
|
||||||
StartDay = 15, |
|
||||||
EndMonth = 4, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 6, 15, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_In_Range_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 6, |
|
||||||
StartDay = 15, |
|
||||||
EndMonth = 4, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 7, 20, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_On_End_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 6, |
|
||||||
StartDay = 15, |
|
||||||
EndMonth = 4, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 4, 1, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_After_End_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 6, |
|
||||||
StartDay = 15, |
|
||||||
EndMonth = 4, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2024, 4, 2, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_Before_Invalid_Start_Date_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 2, |
|
||||||
StartDay = 29, |
|
||||||
EndMonth = 1, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_After_Invalid_Start_Date_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 2, |
|
||||||
StartDay = 29, |
|
||||||
EndMonth = 1, |
|
||||||
EndDay = 1 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_Before_Invalid_End_Date_Should_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 5, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 2, |
|
||||||
EndDay = 29 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 2, 28, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsSome.ShouldBeTrue(); |
|
||||||
} |
|
||||||
|
|
||||||
[Test] |
|
||||||
public void LimitToDateRange_Wrap_Around_After_Invalid_End_Date_Should_Not_Return_Template() |
|
||||||
{ |
|
||||||
var template = new PlayoutTemplate |
|
||||||
{ |
|
||||||
DaysOfWeek = PlayoutTemplate.AllDaysOfWeek(), |
|
||||||
DaysOfMonth = PlayoutTemplate.AllDaysOfMonth(), |
|
||||||
MonthsOfYear = PlayoutTemplate.AllMonthsOfYear(), |
|
||||||
LimitToDateRange = true, |
|
||||||
StartMonth = 5, |
|
||||||
StartDay = 1, |
|
||||||
EndMonth = 2, |
|
||||||
EndDay = 29 |
|
||||||
}; |
|
||||||
|
|
||||||
Option<PlayoutTemplate> result = PlayoutTemplateSelector.GetPlayoutTemplateFor( |
|
||||||
new List<PlayoutTemplate> { template }, |
|
||||||
new DateTimeOffset(2023, 3, 1, 0, 0, 0, Offset)); |
|
||||||
|
|
||||||
result.IsNone.ShouldBeTrue(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -0,0 +1,16 @@ |
|||||||
|
namespace ErsatzTV.Core.Domain.Scheduling; |
||||||
|
|
||||||
|
public interface IAlternateScheduleItem |
||||||
|
{ |
||||||
|
int Index { get; } |
||||||
|
ICollection<DayOfWeek> DaysOfWeek { get; } |
||||||
|
ICollection<int> DaysOfMonth { get; } |
||||||
|
ICollection<int> MonthsOfYear { get; } |
||||||
|
bool LimitToDateRange { get; } |
||||||
|
int StartMonth { get; } |
||||||
|
int StartDay { get; } |
||||||
|
int? StartYear { get; } |
||||||
|
int EndMonth { get; } |
||||||
|
int EndDay { get; } |
||||||
|
int? EndYear { get; } |
||||||
|
} |
||||||
@ -0,0 +1,109 @@ |
|||||||
|
using ErsatzTV.Core.Domain.Scheduling; |
||||||
|
|
||||||
|
namespace ErsatzTV.Core.Scheduling; |
||||||
|
|
||||||
|
public static class AlternateScheduleSelector |
||||||
|
{ |
||||||
|
public static List<DayOfWeek> AllDaysOfWeek() => |
||||||
|
[ |
||||||
|
DayOfWeek.Monday, |
||||||
|
DayOfWeek.Tuesday, |
||||||
|
DayOfWeek.Wednesday, |
||||||
|
DayOfWeek.Thursday, |
||||||
|
DayOfWeek.Friday, |
||||||
|
DayOfWeek.Saturday, |
||||||
|
DayOfWeek.Sunday |
||||||
|
]; |
||||||
|
|
||||||
|
public static List<int> AllDaysOfMonth() => Enumerable.Range(1, 31).ToList(); |
||||||
|
|
||||||
|
public static List<int> AllMonthsOfYear() => Enumerable.Range(1, 12).ToList(); |
||||||
|
|
||||||
|
public static Option<T> GetScheduleForDate<T>(IEnumerable<T> items, DateTimeOffset date) |
||||||
|
where T : IAlternateScheduleItem |
||||||
|
{ |
||||||
|
foreach (T item in items.OrderBy(x => x.Index)) |
||||||
|
{ |
||||||
|
if (item.LimitToDateRange) |
||||||
|
{ |
||||||
|
bool reverse = item.StartMonth * 100 + item.StartDay > |
||||||
|
item.EndMonth * 100 + item.EndDay; |
||||||
|
|
||||||
|
int startYear = date.LocalDateTime.Year; |
||||||
|
int endYear = date.LocalDateTime.Year; |
||||||
|
|
||||||
|
if (item.StartYear.HasValue && item.EndYear.HasValue) |
||||||
|
{ |
||||||
|
startYear = item.StartYear.Value; |
||||||
|
endYear = item.EndYear.Value; |
||||||
|
reverse = false; |
||||||
|
} |
||||||
|
|
||||||
|
DateTime start; |
||||||
|
DateTime end; |
||||||
|
|
||||||
|
try |
||||||
|
{ |
||||||
|
start = new DateTime(startYear, item.StartMonth, item.StartDay, 0, 0, 0, DateTimeKind.Local); |
||||||
|
} |
||||||
|
catch (ArgumentOutOfRangeException) |
||||||
|
{ |
||||||
|
// this should only happen with days that are greater than the actual days in the month,
|
||||||
|
// so roll over to the 1st of the next month
|
||||||
|
start = new DateTime(startYear, item.StartMonth, 1, 0, 0, 0, DateTimeKind.Local).AddMonths(1); |
||||||
|
} |
||||||
|
|
||||||
|
try |
||||||
|
{ |
||||||
|
end = new DateTime(endYear, item.EndMonth, item.EndDay, 0, 0, 0, DateTimeKind.Local); |
||||||
|
} |
||||||
|
catch (ArgumentOutOfRangeException) |
||||||
|
{ |
||||||
|
// this should only happen with days that are greater than the actual days in the month,
|
||||||
|
// so reduce to the max days in the month
|
||||||
|
end = new DateTime( |
||||||
|
endYear, |
||||||
|
item.EndMonth, |
||||||
|
DateTime.DaysInMonth(endYear, item.EndMonth), |
||||||
|
0, |
||||||
|
0, |
||||||
|
0, |
||||||
|
DateTimeKind.Local); |
||||||
|
} |
||||||
|
|
||||||
|
if (reverse) |
||||||
|
{ |
||||||
|
(start, end) = (end, start); |
||||||
|
if (date.Date > start.Date && date.Date < end.Date) |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
else if (date.Date < start.Date || date.Date > end.Date) |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
bool daysOfWeek = item.DaysOfWeek.Contains(date.DayOfWeek); |
||||||
|
if (!daysOfWeek) |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
bool daysOfMonth = item.DaysOfMonth.Contains(date.Day); |
||||||
|
if (!daysOfMonth) |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
bool monthOfYear = item.MonthsOfYear.Contains(date.Month); |
||||||
|
if (monthOfYear) |
||||||
|
{ |
||||||
|
return item; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return Option<T>.None; |
||||||
|
} |
||||||
|
} |
||||||
@ -1,40 +0,0 @@ |
|||||||
using ErsatzTV.Core.Domain; |
|
||||||
|
|
||||||
namespace ErsatzTV.Core.Scheduling; |
|
||||||
|
|
||||||
public static class PlayoutScheduleSelector |
|
||||||
{ |
|
||||||
public static ProgramSchedule GetProgramScheduleFor( |
|
||||||
ProgramSchedule defaultSchedule, |
|
||||||
IEnumerable<ProgramScheduleAlternate> alternates, |
|
||||||
DateTimeOffset date) |
|
||||||
{ |
|
||||||
foreach (ProgramScheduleAlternate alternate in alternates.OrderBy(x => x.Index)) |
|
||||||
{ |
|
||||||
bool daysOfWeek = alternate.DaysOfWeek.Count is 0 or 7 || |
|
||||||
alternate.DaysOfWeek.Contains(date.DayOfWeek); |
|
||||||
|
|
||||||
if (!daysOfWeek) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
|
|
||||||
bool daysOfMonth = alternate.DaysOfMonth.Count is 0 or 31 || |
|
||||||
alternate.DaysOfMonth.Contains(date.Day); |
|
||||||
if (!daysOfMonth) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
|
|
||||||
bool monthOfYear = alternate.MonthsOfYear.Count is 0 or 12 || |
|
||||||
alternate.MonthsOfYear.Contains(date.Month); |
|
||||||
|
|
||||||
if (monthOfYear) |
|
||||||
{ |
|
||||||
return alternate.ProgramSchedule; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return defaultSchedule; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,86 +0,0 @@ |
|||||||
using ErsatzTV.Core.Domain.Scheduling; |
|
||||||
|
|
||||||
namespace ErsatzTV.Core.Scheduling; |
|
||||||
|
|
||||||
public static class PlayoutTemplateSelector |
|
||||||
{ |
|
||||||
public static Option<PlayoutTemplate> GetPlayoutTemplateFor( |
|
||||||
IEnumerable<PlayoutTemplate> templates, |
|
||||||
DateTimeOffset date) |
|
||||||
{ |
|
||||||
foreach (PlayoutTemplate template in templates.OrderBy(x => x.Index)) |
|
||||||
{ |
|
||||||
if (template.LimitToDateRange) |
|
||||||
{ |
|
||||||
bool reverse = template.StartMonth * 100 + template.StartDay > |
|
||||||
template.EndMonth * 100 + template.EndDay; |
|
||||||
|
|
||||||
int year = date.LocalDateTime.Year; |
|
||||||
DateTime start; |
|
||||||
DateTime end; |
|
||||||
|
|
||||||
try |
|
||||||
{ |
|
||||||
start = new DateTime(year, template.StartMonth, template.StartDay, 0, 0, 0, DateTimeKind.Local); |
|
||||||
} |
|
||||||
catch (ArgumentOutOfRangeException) |
|
||||||
{ |
|
||||||
// this should only happen with days that are greater than the actual days in the month,
|
|
||||||
// so roll over to the 1st of the next month
|
|
||||||
start = new DateTime(year, template.StartMonth + 1, 1, 0, 0, 0, DateTimeKind.Local); |
|
||||||
} |
|
||||||
|
|
||||||
try |
|
||||||
{ |
|
||||||
end = new DateTime(year, template.EndMonth, template.EndDay, 0, 0, 0, DateTimeKind.Local); |
|
||||||
} |
|
||||||
catch (ArgumentOutOfRangeException) |
|
||||||
{ |
|
||||||
// this should only happen with days that are greater than the actual days in the month,
|
|
||||||
// so reduce to the max days in the month
|
|
||||||
end = new DateTime( |
|
||||||
year, |
|
||||||
template.EndMonth, |
|
||||||
DateTime.DaysInMonth(year, template.EndMonth), |
|
||||||
0, |
|
||||||
0, |
|
||||||
0, |
|
||||||
DateTimeKind.Local); |
|
||||||
} |
|
||||||
|
|
||||||
if (reverse) |
|
||||||
{ |
|
||||||
(start, end) = (end, start); |
|
||||||
if (date.Date > start.Date && date.Date < end.Date) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
} |
|
||||||
else if (date.Date < start.Date || date.Date > end.Date) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
bool daysOfWeek = template.DaysOfWeek.Contains(date.DayOfWeek); |
|
||||||
if (!daysOfWeek) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
|
|
||||||
bool daysOfMonth = template.DaysOfMonth.Contains(date.Day); |
|
||||||
if (!daysOfMonth) |
|
||||||
{ |
|
||||||
continue; |
|
||||||
} |
|
||||||
|
|
||||||
bool monthOfYear = template.MonthsOfYear.Contains(date.Month); |
|
||||||
if (monthOfYear) |
|
||||||
{ |
|
||||||
return template; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return Option<PlayoutTemplate>.None; |
|
||||||
} |
|
||||||
} |
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,113 @@ |
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||||
|
|
||||||
|
#nullable disable |
||||||
|
|
||||||
|
namespace ErsatzTV.Infrastructure.MySql.Migrations |
||||||
|
{ |
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class Align_ClassicBlockAlternateScheduleFields : Migration |
||||||
|
{ |
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||||
|
{ |
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndDay", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "int", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndMonth", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "int", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndYear", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "int", |
||||||
|
nullable: true); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<bool>( |
||||||
|
name: "LimitToDateRange", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "tinyint(1)", |
||||||
|
nullable: false, |
||||||
|
defaultValue: false); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartDay", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "int", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartMonth", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "int", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartYear", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "int", |
||||||
|
nullable: true); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndYear", |
||||||
|
table: "PlayoutTemplate", |
||||||
|
type: "int", |
||||||
|
nullable: true); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartYear", |
||||||
|
table: "PlayoutTemplate", |
||||||
|
type: "int", |
||||||
|
nullable: true); |
||||||
|
} |
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||||
|
{ |
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndDay", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndMonth", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndYear", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "LimitToDateRange", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartDay", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartMonth", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartYear", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndYear", |
||||||
|
table: "PlayoutTemplate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartYear", |
||||||
|
table: "PlayoutTemplate"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,113 @@ |
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||||
|
|
||||||
|
#nullable disable |
||||||
|
|
||||||
|
namespace ErsatzTV.Infrastructure.Sqlite.Migrations |
||||||
|
{ |
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class Align_ClassicBlockAlternateScheduleFields : Migration |
||||||
|
{ |
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||||
|
{ |
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndDay", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndMonth", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndYear", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: true); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<bool>( |
||||||
|
name: "LimitToDateRange", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: false, |
||||||
|
defaultValue: false); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartDay", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartMonth", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: false, |
||||||
|
defaultValue: 0); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartYear", |
||||||
|
table: "ProgramScheduleAlternate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: true); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "EndYear", |
||||||
|
table: "PlayoutTemplate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: true); |
||||||
|
|
||||||
|
migrationBuilder.AddColumn<int>( |
||||||
|
name: "StartYear", |
||||||
|
table: "PlayoutTemplate", |
||||||
|
type: "INTEGER", |
||||||
|
nullable: true); |
||||||
|
} |
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||||
|
{ |
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndDay", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndMonth", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndYear", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "LimitToDateRange", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartDay", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartMonth", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartYear", |
||||||
|
table: "ProgramScheduleAlternate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "EndYear", |
||||||
|
table: "PlayoutTemplate"); |
||||||
|
|
||||||
|
migrationBuilder.DropColumn( |
||||||
|
name: "StartYear", |
||||||
|
table: "PlayoutTemplate"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue