code cleanup (#743)

* update tools

* run code cleanup

* update dependencies
This commit is contained in:
Jason Dove
2022-04-19 17:47:18 -05:00
committed by GitHub
parent e250e93a8e
commit c02b83d0d6
1223 changed files with 5487 additions and 5547 deletions
@@ -1,8 +1,8 @@
using System.Runtime.InteropServices;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Emby;
using ErsatzTV.Core.Interfaces.Repositories;
using ErsatzTV.Core.Interfaces.Runtime;
using ErsatzTV.Core.Emby;
using FluentAssertions;
using Microsoft.Extensions.Logging;
using Moq;
@@ -204,7 +204,7 @@ public class EmbyPathReplacementServiceTests
result.Should().Be(@"/mnt/something else/Some Shared Folder/Some Movie/Some Movie.mkv");
}
[Test]
public async Task Should_Not_Throw_For_Null_EmbyPath()
{
@@ -236,7 +236,7 @@ public class EmbyPathReplacementServiceTests
result.Should().Be(@"/mnt/something/Some Shared Folder/Some Movie/Some Movie.mkv");
}
[Test]
public async Task Should_Not_Throw_For_Null_LocalPath()
{
@@ -268,4 +268,4 @@ public class EmbyPathReplacementServiceTests
result.Should().Be(@"/Some Movie/Some Movie.mkv");
}
}
}
@@ -8,7 +8,7 @@
<ItemGroup>
<PackageReference Include="Bugsnag" Version="3.0.1" />
<PackageReference Include="CliWrap" Version="3.4.2" />
<PackageReference Include="CliWrap" Version="3.4.3" />
<PackageReference Include="FluentAssertions" Version="6.6.0" />
<PackageReference Include="LanguageExt.Core" Version="4.0.4" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
@@ -40,10 +40,10 @@ public class FFmpegComplexFilterBuilderTests
filter.VideoLabel.Should().Be("0:0");
});
}
[Test]
// this needs to be a culture where '.' is a group separator
[SetCulture("it-IT")]
[SetCulture("it-IT")]
public void Should_Return_Audio_Filter_With_AudioDuration_Decimal()
{
var duration = TimeSpan.FromMilliseconds(1000.1);
@@ -280,7 +280,7 @@ public class FFmpegComplexFilterBuilderTests
watermark.FrequencyMinutes,
watermark.DurationSeconds))
: None;
FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder()
.WithWatermark(
Some(watermark),
@@ -301,7 +301,7 @@ public class FFmpegComplexFilterBuilderTests
filter.VideoLabel.Should().Be(expectedVideoLabel);
});
}
[Test]
[TestCase(
false,
@@ -390,7 +390,7 @@ public class FFmpegComplexFilterBuilderTests
"[0:0]scale_cuda=1920:1080,setsar=1,hwdownload,format=nv12,format=yuv420p,hwupload_cuda[vt];[1:v]format=yuva420p,colorchannelmixer=aa=0.90,hwupload_cuda[wmp];[vt][wmp]overlay_cuda=x=134:y=54,hwupload[v]",
"0:1",
"[v]",
true)]
true)]
// TODO: do we need these anymore? interlaced content that isn't handled by mpeg2_cuvid?
// [TestCase(
// false,
@@ -481,7 +481,7 @@ public class FFmpegComplexFilterBuilderTests
watermark.FrequencyMinutes,
watermark.DurationSeconds))
: None;
FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder()
.WithHardwareAcceleration(HardwareAccelerationKind.Nvenc)
.WithWatermark(
@@ -774,4 +774,4 @@ public class FFmpegComplexFilterBuilderTests
});
}
}
}
}
@@ -43,7 +43,7 @@ public class FFmpegPlaybackSettingsCalculatorTests
public void Should_Not_UseSpecifiedThreadCount_ForTransportStream()
{
// MPEG-TS requires realtime output which is hardcoded to a single thread
FFmpegProfile ffmpegProfile = TestProfile() with { ThreadCount = 7 };
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
@@ -862,7 +862,10 @@ public class FFmpegPlaybackSettingsCalculatorTests
AudioFormat = FFmpegProfileAudioFormat.Ac3
};
var version = new MediaVersion { SampleAspectRatio = "1:1", Width = 1920, Height = 1080, Duration = TimeSpan.FromMinutes(5) }; // not pulled from here
var version = new MediaVersion
{
SampleAspectRatio = "1:1", Width = 1920, Height = 1080, Duration = TimeSpan.FromMinutes(5)
}; // not pulled from here
FFmpegPlaybackSettings actual = _calculator.CalculateSettings(
StreamingMode.TransportStream,
@@ -937,4 +940,4 @@ public class FFmpegPlaybackSettingsCalculatorTests
private static FFmpegProfile TestProfile() =>
new() { Resolution = new Resolution { Width = 1920, Height = 1080 } };
}
}
@@ -10,22 +10,21 @@ namespace ErsatzTV.Core.Tests.FFmpeg;
[TestFixture]
public class HlsPlaylistFilterTests
{
private HlsPlaylistFilter _hlsPlaylistFilter;
[SetUp]
public void SetUp()
{
public void SetUp() =>
_hlsPlaylistFilter = new HlsPlaylistFilter(
new Mock<ITempFilePool>().Object,
new Mock<ILogger<HlsPlaylistFilter>>().Object
);
}
private HlsPlaylistFilter _hlsPlaylistFilter;
[Test]
public void _hlsPlaylistFilter_ShouldRewriteProgramDateTime()
{
var start = new DateTimeOffset(2021, 10, 9, 8, 0, 0, TimeSpan.FromHours(-5));
string[] input = NormalizeLineEndings(@"#EXTM3U
string[] input = NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -45,8 +44,9 @@ live001139.ts").Split(Environment.NewLine);
result.PlaylistStart.Should().Be(start);
result.Sequence.Should().Be(1137);
result.Playlist.Should().Be(NormalizeLineEndings(
@"#EXTM3U
result.Playlist.Should().Be(
NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -64,12 +64,13 @@ live001138.ts
live001139.ts
"));
}
[Test]
public void _hlsPlaylistFilter_ShouldLimitSegments()
{
var start = new DateTimeOffset(2021, 10, 9, 8, 0, 0, TimeSpan.FromHours(-5));
string[] input = NormalizeLineEndings(@"#EXTM3U
string[] input = NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -89,8 +90,9 @@ live001139.ts").Split(Environment.NewLine);
result.PlaylistStart.Should().Be(start);
result.Sequence.Should().Be(1137);
result.Playlist.Should().Be(NormalizeLineEndings(
@"#EXTM3U
result.Playlist.Should().Be(
NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -105,12 +107,13 @@ live001137.ts
live001138.ts
"));
}
[Test]
public void _hlsPlaylistFilter_ShouldAddDiscontinuity()
{
var start = new DateTimeOffset(2021, 10, 9, 8, 0, 0, TimeSpan.FromHours(-5));
string[] input = NormalizeLineEndings(@"#EXTM3U
string[] input = NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -135,8 +138,9 @@ live001139.ts").Split(Environment.NewLine);
result.PlaylistStart.Should().Be(start);
result.Sequence.Should().Be(1137);
result.Playlist.Should().Be(NormalizeLineEndings(
@"#EXTM3U
result.Playlist.Should().Be(
NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -160,7 +164,8 @@ live001139.ts
public void _hlsPlaylistFilter_ShouldFilterOldSegments()
{
var start = new DateTimeOffset(2021, 10, 9, 8, 0, 0, TimeSpan.FromHours(-5));
string[] input = NormalizeLineEndings(@"#EXTM3U
string[] input = NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -180,8 +185,9 @@ live001139.ts").Split(Environment.NewLine);
result.PlaylistStart.Should().Be(start.AddSeconds(8));
result.Sequence.Should().Be(1139);
result.Playlist.Should().Be(NormalizeLineEndings(
@"#EXTM3U
result.Playlist.Should().Be(
NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1139
@@ -193,12 +199,13 @@ live001139.ts").Split(Environment.NewLine);
live001139.ts
"));
}
[Test]
public void _hlsPlaylistFilter_ShouldFilterOldDiscontinuity()
{
var start = new DateTimeOffset(2021, 10, 9, 8, 0, 0, TimeSpan.FromHours(-5));
string[] input = NormalizeLineEndings(@"#EXTM3U
string[] input = NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1137
@@ -219,8 +226,9 @@ live001139.ts").Split(Environment.NewLine);
result.PlaylistStart.Should().Be(start.AddSeconds(8));
result.Sequence.Should().Be(1139);
result.Playlist.Should().Be(NormalizeLineEndings(
@"#EXTM3U
result.Playlist.Should().Be(
NormalizeLineEndings(
@"#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1139
@@ -233,11 +241,9 @@ live001139.ts
"));
}
private static string NormalizeLineEndings(string str)
{
return str
private static string NormalizeLineEndings(string str) =>
str
.Replace("\r\n", "\n")
.Replace("\r", "\n")
.Replace("\n", Environment.NewLine);
}
}
}
+38 -28
View File
@@ -24,7 +24,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg;
public class TranscodingTests
{
private static readonly ILoggerFactory LoggerFactory;
static TranscodingTests()
{
Log.Logger = new LoggerConfiguration()
@@ -61,6 +61,7 @@ public class TranscodingTests
PermanentOpaque,
PermanentTransparent,
IntermittentOpaque,
IntermittentTransparent
// TODO: animated vs static
}
@@ -87,7 +88,7 @@ public class TranscodingTests
Subtitle.Picture,
Subtitle.Text
};
public static Padding[] Paddings =
{
Padding.NoPadding,
@@ -106,27 +107,27 @@ public class TranscodingTests
new("libx264", "yuvj420p"),
new("libx264", "yuv420p10le"),
// new("libx264", "yuv444p10le"),
new("mpeg1video", "yuv420p"),
new("mpeg2video", "yuv420p"),
new("libx265", "yuv420p"),
new("libx265", "yuv420p10le"),
new("mpeg4", "yuv420p"),
new("libvpx-vp9", "yuv420p"),
// new("libaom-av1", "yuv420p")
// av1 yuv420p10le 51
new("msmpeg4v2", "yuv420p"),
new("msmpeg4v3", "yuv420p")
// wmv3 yuv420p 1
};
public static Resolution[] Resolutions =
{
new() { Width = 1920, Height = 1080 },
@@ -165,17 +166,26 @@ public class TranscodingTests
};
}
[Test, Combinatorial]
[Test]
[Combinatorial]
public async Task Transcode(
[ValueSource(typeof(TestData), nameof(TestData.InputFormats))] InputFormat inputFormat,
[ValueSource(typeof(TestData), nameof(TestData.Resolutions))] Resolution profileResolution,
[ValueSource(typeof(TestData), nameof(TestData.Paddings))] Padding padding,
[ValueSource(typeof(TestData), nameof(TestData.VideoScanKinds))] VideoScanKind videoScanKind,
[ValueSource(typeof(TestData), nameof(TestData.Watermarks))] Watermark watermark,
[ValueSource(typeof(TestData), nameof(TestData.Subtitles))] Subtitle subtitle,
[ValueSource(typeof(TestData), nameof(TestData.VideoFormats))] FFmpegProfileVideoFormat profileVideoFormat,
// [ValueSource(typeof(TestData), nameof(TestData.NoAcceleration))] HardwareAccelerationKind profileAcceleration)
[ValueSource(typeof(TestData), nameof(TestData.NvidiaAcceleration))] HardwareAccelerationKind profileAcceleration)
[ValueSource(typeof(TestData), nameof(TestData.InputFormats))]
InputFormat inputFormat,
[ValueSource(typeof(TestData), nameof(TestData.Resolutions))]
Resolution profileResolution,
[ValueSource(typeof(TestData), nameof(TestData.Paddings))]
Padding padding,
[ValueSource(typeof(TestData), nameof(TestData.VideoScanKinds))]
VideoScanKind videoScanKind,
[ValueSource(typeof(TestData), nameof(TestData.Watermarks))]
Watermark watermark,
[ValueSource(typeof(TestData), nameof(TestData.Subtitles))]
Subtitle subtitle,
[ValueSource(typeof(TestData), nameof(TestData.VideoFormats))]
FFmpegProfileVideoFormat profileVideoFormat,
// [ValueSource(typeof(TestData), nameof(TestData.NoAcceleration))] HardwareAccelerationKind profileAcceleration)
[ValueSource(typeof(TestData), nameof(TestData.NvidiaAcceleration))]
HardwareAccelerationKind profileAcceleration)
// [ValueSource(typeof(TestData), nameof(TestData.VaapiAcceleration))] HardwareAccelerationKind profileAcceleration)
// [ValueSource(typeof(TestData), nameof(TestData.QsvAcceleration))] HardwareAccelerationKind profileAcceleration)
// [ValueSource(typeof(TestData), nameof(TestData.VideoToolboxAcceleration))] HardwareAccelerationKind profileAcceleration)
@@ -224,7 +234,7 @@ public class TranscodingTests
case Subtitle.Text or Subtitle.Picture:
string sourceFile = Path.GetTempFileName() + ".mkv";
File.Move(file, sourceFile, true);
string tempFileName = Path.GetTempFileName() + ".mkv";
string subPath = Path.Combine(
TestContext.CurrentContext.TestDirectory,
@@ -334,11 +344,11 @@ public class TranscodingTests
.Filter(s => s.MediaStreamKind == MediaStreamKind.Subtitle)
.ToList();
var subtitles = new List<Core.Domain.Subtitle>();
var subtitles = new List<Domain.Subtitle>();
foreach (MediaStream stream in subtitleStreams)
{
var s = new Core.Domain.Subtitle
var s = new Domain.Subtitle
{
Codec = stream.Codec,
Default = stream.Default,
@@ -405,7 +415,7 @@ public class TranscodingTests
ChannelSubtitleMode subtitleMode = subtitle switch
{
Subtitle.Picture or Subtitle.Text => ChannelSubtitleMode.Any,
_ => ChannelSubtitleMode.None
_ => ChannelSubtitleMode.None
};
string srtFile = Path.Combine(FileSystemLayout.SubtitleCacheFolder, "test.srt");
@@ -478,7 +488,7 @@ public class TranscodingTests
return;
}
string error = sb.ToString();
var error = sb.ToString();
bool isUnsupported = unsupportedMessages.Any(error.Contains);
if (profileAcceleration != HardwareAccelerationKind.None && isUnsupported)
@@ -527,4 +537,4 @@ public class TranscodingTests
private static string ExecutableName(string baseName) =>
OperatingSystem.IsWindows() ? $"{baseName}.exe" : baseName;
}
}
+1 -1
View File
@@ -3,4 +3,4 @@
public record FakeFileEntry(string Path)
{
public DateTime LastWriteTime { get; set; } = SystemTime.MinValueUtc;
}
}
+1 -1
View File
@@ -1,3 +1,3 @@
namespace ErsatzTV.Core.Tests.Fakes;
public record FakeFolderEntry(string Path);
public record FakeFolderEntry(string Path);
@@ -48,13 +48,13 @@ public class FakeLocalFileSystem : ILocalFileSystem
public bool FileExists(string path) => _files.Any(f => f.Path == path);
public bool FolderExists(string folder) => false;
public Task<byte[]> ReadAllBytes(string path) => TestBytes.AsTask();
public Task<Either<BaseError, Unit>> CopyFile(string source, string destination) =>
Task.FromResult(Right<BaseError, Unit>(Unit.Default));
public Unit EmptyFolder(string folder) => Unit.Default;
public Task<byte[]> ReadAllBytes(string path) => TestBytes.AsTask();
private static List<DirectoryInfo> Split(DirectoryInfo path)
{
var result = new List<DirectoryInfo>();
@@ -72,4 +72,4 @@ public class FakeLocalFileSystem : ILocalFileSystem
return result;
}
}
}
@@ -20,7 +20,8 @@ public class FakeMediaCollectionRepository : IMediaCollectionRepository
public Task<List<CollectionWithItems>> GetMultiCollectionCollections(int id) =>
throw new NotSupportedException();
public Task<List<CollectionWithItems>> GetFakeMultiCollectionCollections(int? collectionId, int? smartCollectionId) =>
public Task<List<CollectionWithItems>>
GetFakeMultiCollectionCollections(int? collectionId, int? smartCollectionId) =>
throw new NotSupportedException();
public Task<List<int>> PlayoutIdsUsingCollection(int collectionId) => throw new NotSupportedException();
@@ -33,4 +34,4 @@ public class FakeMediaCollectionRepository : IMediaCollectionRepository
public Task<bool> IsCustomPlaybackOrder(int collectionId) => false.AsTask();
public Task<Option<string>> GetNameFromKey(CollectionKey emptyCollection) => Option<string>.None.AsTask();
}
}
@@ -21,4 +21,4 @@ public class FakeMovieWithPath : MediaItemScanResult<Movie>
}
}) =>
IsAdded = true;
}
}
@@ -94,4 +94,4 @@ public class FakeTelevisionRepository : ITelevisionRepository
public Task<bool> AddWriter(EpisodeMetadata metadata, Writer writer) => throw new NotSupportedException();
public Task<Unit> UpdatePath(int mediaFileId, string path) => throw new NotSupportedException();
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
global using LanguageExt;
global using static LanguageExt.Prelude;
global using Unit = LanguageExt.Unit;
global using Array = System.Array;
global using Array = System.Array;
@@ -204,7 +204,7 @@ public class JellyfinPathReplacementServiceTests
result.Should().Be(@"/mnt/something else/Some Shared Folder/Some Movie/Some Movie.mkv");
}
[Test]
public async Task Should_Not_Throw_For_Null_JellyfinPath()
{
@@ -236,7 +236,7 @@ public class JellyfinPathReplacementServiceTests
result.Should().Be(@"/mnt/something/Some Shared Folder/Some Movie/Some Movie.mkv");
}
[Test]
public async Task Should_Not_Throw_For_Null_LocalPath()
{
@@ -268,4 +268,4 @@ public class JellyfinPathReplacementServiceTests
result.Should().Be(@"/Some Movie/Some Movie.mkv");
}
}
}
@@ -115,4 +115,4 @@ public class JellyfinUrlTests
url.ToString().Should().Be("https://some.jellyfin.server/jellyfin/Items/2/Images/3?tag=4");
}
}
}
@@ -119,4 +119,4 @@ public class FallbackMetadataProviderTests
metadata.Should().NotBeNull();
metadata.Title.Should().Be(expectedTitle);
}
}
}
@@ -15,7 +15,7 @@ public class LocalStatisticsProviderTests
{
[Test]
// this needs to be a culture where '.' is a group separator
[SetCulture("it-IT")]
[SetCulture("it-IT")]
public void Test()
{
var provider = new LocalStatisticsProvider(
@@ -33,4 +33,4 @@ public class LocalStatisticsProviderTests
result.Duration.Should().Be(TimeSpan.FromSeconds(123.45));
}
}
}
@@ -65,7 +65,7 @@ public class MovieFolderScannerTests
.Returns(
(MediaItem mediaItem) =>
{
((Movie) mediaItem).MovieMetadata = new List<MovieMetadata> { new() };
((Movie)mediaItem).MovieMetadata = new List<MovieMetadata> { new() };
return Task.FromResult(true);
});
@@ -411,7 +411,7 @@ public class MovieFolderScannerTests
It.Is<Movie>(i => i.MediaVersions.Head().MediaFiles.Head().Path == moviePath)),
Times.Once);
}
[Test]
public async Task Should_Ignore_Dot_Underscore_Files(
[ValueSource(typeof(LocalFolderScanner), nameof(LocalFolderScanner.VideoFileExtensions))]
@@ -630,7 +630,7 @@ public class MovieFolderScannerTests
new Mock<IClient>().Object,
new Mock<ILogger<MovieFolderScanner>>().Object
);
private MovieFolderScanner GetService(params FakeFolderEntry[] folders) =>
new(
new FakeLocalFileSystem(new List<FakeFileEntry>(), new List<FakeFolderEntry>(folders)),
@@ -650,4 +650,4 @@ public class MovieFolderScannerTests
new Mock<ILogger<MovieFolderScanner>>().Object
);
}
}
}
@@ -231,4 +231,4 @@ public class EpisodeNfoReaderTests
nfo.Directors[1] == "Director 3")
.Should().Be(1);
}
}
}
@@ -204,7 +204,7 @@ public class PlexPathReplacementServiceTests
result.Should().Be(@"/mnt/something else/Some Shared Folder/Some Movie/Some Movie.mkv");
}
[Test]
public async Task Should_Not_Throw_For_Null_PlexPath()
{
@@ -236,7 +236,7 @@ public class PlexPathReplacementServiceTests
result.Should().Be(@"/mnt/something/Some Shared Folder/Some Movie/Some Movie.mkv");
}
[Test]
public async Task Should_Not_Throw_For_Null_LocalPath()
{
@@ -268,4 +268,4 @@ public class PlexPathReplacementServiceTests
result.Should().Be(@"/Some Movie/Some Movie.mkv");
}
}
}
@@ -71,7 +71,7 @@ public class ChronologicalContentTests
private static List<MediaItem> Episodes(int count) =>
Range(1, count).Map(
i => (MediaItem) new Episode
i => (MediaItem)new Episode
{
Id = i,
EpisodeMetadata = new List<EpisodeMetadata>
@@ -84,4 +84,4 @@ public class ChronologicalContentTests
})
.Reverse()
.ToList();
}
}
@@ -79,7 +79,7 @@ public class CustomOrderContentTests
private static List<MediaItem> Episodes(int count) =>
Range(1, count).Map(
i => (MediaItem) new Episode
i => (MediaItem)new Episode
{
Id = i,
EpisodeMetadata = new List<EpisodeMetadata>
@@ -92,4 +92,4 @@ public class CustomOrderContentTests
})
.Reverse()
.ToList();
}
}
@@ -330,4 +330,4 @@ public class MultiPartEpisodeGrouperTests
g => g.First == first && g.Additional != null && g.Additional.Count == additional.Count &&
additional.ForAll(g.Additional.Contains))
.Should().HaveCount(1);
}
}
File diff suppressed because it is too large Load Diff
@@ -271,7 +271,7 @@ public class PlayoutModeSchedulerBaseTests : SchedulerTestBase
Dictionary<CollectionKey, IMediaCollectionEnumerator> enumerators = CollectionEnumerators(
scheduleItem,
enumerator);
// too lazy to make another enumerator for the filler that we don't want
enumerators.Add(CollectionKey.ForFillerPreset(scheduleItem.MidRollFiller), enumerator);
@@ -328,7 +328,7 @@ public class PlayoutModeSchedulerBaseTests : SchedulerTestBase
Dictionary<CollectionKey, IMediaCollectionEnumerator> enumerators = CollectionEnumerators(
scheduleItem,
enumerator);
enumerators.Add(CollectionKey.ForFillerPreset(scheduleItem.MidRollFiller), fillerEnumerator);
List<PlayoutItem> playoutItems = Scheduler()
@@ -343,10 +343,10 @@ public class PlayoutModeSchedulerBaseTests : SchedulerTestBase
Finish = startState.CurrentTime.AddHours(1).UtcDateTime
},
new List<MediaChapter>
{
new() { StartTime = TimeSpan.Zero, EndTime = TimeSpan.FromMinutes(6) },
new() { StartTime = TimeSpan.FromMinutes(6), EndTime = TimeSpan.FromMinutes(60) }
});
{
new() { StartTime = TimeSpan.Zero, EndTime = TimeSpan.FromMinutes(6) },
new() { StartTime = TimeSpan.FromMinutes(6), EndTime = TimeSpan.FromMinutes(60) }
});
playoutItems.Count.Should().Be(3);
playoutItems[0].MediaItemId.Should().Be(1);
@@ -427,4 +427,4 @@ public class PlayoutModeSchedulerBaseTests : SchedulerTestBase
DateTimeOffset hardStop) =>
throw new NotSupportedException();
}
}
}
@@ -37,7 +37,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
@@ -78,7 +78,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
}
[Test]
public void Should_Fill_Exact_Duration_CustomTitle()
{
@@ -96,7 +96,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
PlaybackOrder = PlaybackOrder.Chronological,
CustomTitle = "Custom Title"
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -104,7 +104,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator = new ChronologicalMediaCollectionEnumerator(
collectionOne.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -150,7 +150,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
playoutItems[2].CustomTitle.Should().Be("Custom Title");
}
[Test]
public void Should_Not_Have_Gap_Duration_Tail_Mode_None()
{
@@ -167,7 +167,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
TailMode = TailMode.None,
PlaybackOrder = PlaybackOrder.Chronological
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -175,7 +175,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator = new ChronologicalMediaCollectionEnumerator(
collectionOne.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -195,7 +195,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
playoutBuilderState.InDurationFiller.Should().BeFalse();
playoutBuilderState.ScheduleItemsEnumerator.State.Index.Should().Be(0);
enumerator.State.Index.Should().Be(1);
playoutItems.Count.Should().Be(3);
@@ -218,7 +218,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
}
[Test]
public void Should_Have_Gap_Duration_Tail_Mode_Offline_No_Fallback()
{
@@ -235,7 +235,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
TailMode = TailMode.Offline,
PlaybackOrder = PlaybackOrder.Chronological
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -243,7 +243,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator = new ChronologicalMediaCollectionEnumerator(
collectionOne.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -264,7 +264,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
playoutBuilderState.InDurationFiller.Should().BeFalse();
playoutBuilderState.ScheduleItemsEnumerator.State.Index.Should().Be(0);
enumerator.State.Index.Should().Be(1);
playoutItems.Count.Should().Be(3);
@@ -287,7 +287,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
}
[Test]
public void Should_Not_Have_Gap_Duration_Tail_Mode_Offline_With_Fallback()
{
@@ -311,7 +311,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
CollectionId = collectionTwo.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -319,11 +319,11 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator1 = new ChronologicalMediaCollectionEnumerator(
collectionOne.MediaItems,
new CollectionEnumeratorState());
var enumerator2 = new ChronologicalMediaCollectionEnumerator(
collectionTwo.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -343,7 +343,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
playoutBuilderState.InDurationFiller.Should().BeFalse();
playoutBuilderState.ScheduleItemsEnumerator.State.Index.Should().Be(0);
enumerator1.State.Index.Should().Be(1);
enumerator2.State.Index.Should().Be(1);
@@ -366,7 +366,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[2].GuideGroup.Should().Be(3);
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 45, 0)));
playoutItems[3].GuideGroup.Should().Be(3);
@@ -397,7 +397,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
CollectionId = collectionTwo.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -409,7 +409,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator2 = new ChronologicalMediaCollectionEnumerator(
collectionTwo.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -429,7 +429,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
playoutBuilderState.InDurationFiller.Should().BeFalse();
playoutBuilderState.ScheduleItemsEnumerator.State.Index.Should().Be(0);
enumerator1.State.Index.Should().Be(1);
enumerator2.State.Index.Should().Be(1);
@@ -471,7 +471,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[5].FillerKind.Should().Be(FillerKind.Tail);
playoutItems[3].GuideFinish.HasValue.Should().BeFalse();
}
[Test]
public void Should_Have_Gap_Duration_Tail_Mode_Filler_No_Fallback()
{
@@ -495,7 +495,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
CollectionId = collectionTwo.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -507,7 +507,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator2 = new ChronologicalMediaCollectionEnumerator(
collectionTwo.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -527,7 +527,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
playoutBuilderState.InDurationFiller.Should().BeFalse();
playoutBuilderState.ScheduleItemsEnumerator.State.Index.Should().Be(0);
enumerator1.State.Index.Should().Be(1);
enumerator2.State.Index.Should().Be(1);
@@ -600,7 +600,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
CollectionId = collectionThree.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -616,7 +616,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
var enumerator3 = new ChronologicalMediaCollectionEnumerator(
collectionThree.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerDuration(new Mock<ILogger>().Object);
@@ -642,7 +642,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
playoutBuilderState.InDurationFiller.Should().BeFalse();
playoutBuilderState.ScheduleItemsEnumerator.State.Index.Should().Be(0);
enumerator1.State.Index.Should().Be(1);
enumerator2.State.Index.Should().Be(1);
enumerator3.State.Index.Should().Be(1);
@@ -691,4 +691,4 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
playoutItems[6].FillerKind.Should().Be(FillerKind.Fallback);
playoutItems[6].GuideFinish.HasValue.Should().BeFalse();
}
}
}
@@ -37,11 +37,11 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -81,7 +81,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
playoutItems[2].GuideGroup.Should().Be(3);
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
}
[Test]
public void Should_Fill_Exactly_To_Next_Schedule_Item_Flood()
{
@@ -109,14 +109,14 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
// this caused trouble with the peek logic and the IsFlood flag
new ProgramScheduleItemFlood
{
StartTime = TimeSpan.FromHours(3),
StartTime = TimeSpan.FromHours(3)
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -156,7 +156,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
playoutItems[2].GuideGroup.Should().Be(3);
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
}
[Test]
public void Should_Fill_Exactly_To_Next_Schedule_Item_With_Post_Roll_Multiple_One()
{
@@ -200,7 +200,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -283,11 +283,11 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -364,11 +364,11 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -461,11 +461,11 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -511,7 +511,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
playoutItems[3].GuideGroup.Should().Be(3);
playoutItems[3].FillerKind.Should().Be(FillerKind.Fallback);
}
[Test]
public void Should_Have_Gap_With_Tail_No_Fallback()
{
@@ -548,11 +548,11 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerFlood(new Mock<ILogger>().Object);
@@ -655,7 +655,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
@@ -774,7 +774,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
scheduleItem,
NextScheduleItem
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
sortedScheduleItems,
new CollectionEnumeratorState());
@@ -829,6 +829,6 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
protected override ProgramScheduleItem NextScheduleItem => new ProgramScheduleItemOne
{
StartTime = TimeSpan.FromHours(3),
StartTime = TimeSpan.FromHours(3)
};
}
}
@@ -29,7 +29,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
FallbackFiller = null,
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -42,7 +42,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object);
@@ -100,7 +100,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
FallbackFiller = null,
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -113,7 +113,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object);
@@ -177,7 +177,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
FallbackFiller = null,
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -195,7 +195,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object);
@@ -275,7 +275,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
},
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -293,7 +293,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionTwo.MediaItems }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object);
@@ -339,7 +339,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
playoutItems[3].GuideGroup.Should().Be(3);
playoutItems[3].FillerKind.Should().Be(FillerKind.Fallback);
}
[Test]
public void Should_Have_Gap_With_Tail_No_Fallback()
{
@@ -363,7 +363,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
FallbackFiller = null,
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -381,7 +381,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object);
@@ -416,7 +416,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddMinutes(55));
playoutItems[1].GuideGroup.Should().Be(2);
playoutItems[1].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].MediaItemId.Should().Be(1);
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(1, 50, 0)));
playoutItems[2].GuideGroup.Should().Be(3);
@@ -431,7 +431,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
playoutItems[4].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 49, 0)));
playoutItems[4].GuideGroup.Should().Be(3);
playoutItems[4].FillerKind.Should().Be(FillerKind.Tail);
playoutItems[5].MediaItemId.Should().Be(3);
playoutItems[5].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 53, 0)));
playoutItems[5].GuideGroup.Should().Be(3);
@@ -467,7 +467,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
},
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -532,12 +532,12 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddMinutes(55));
playoutItems[1].GuideGroup.Should().Be(2);
playoutItems[1].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].MediaItemId.Should().Be(1);
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(1, 50, 0)));
playoutItems[2].GuideGroup.Should().Be(3);
playoutItems[2].FillerKind.Should().Be(FillerKind.None);
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 45, 0)));
playoutItems[3].GuideGroup.Should().Be(3);
@@ -547,7 +547,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
playoutItems[4].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 49, 0)));
playoutItems[4].GuideGroup.Should().Be(3);
playoutItems[4].FillerKind.Should().Be(FillerKind.Tail);
playoutItems[5].MediaItemId.Should().Be(3);
playoutItems[5].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 53, 0)));
playoutItems[5].GuideGroup.Should().Be(3);
@@ -588,7 +588,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
},
Count = 3
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -611,7 +611,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionThree.MediaItems }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, new Mock<ILogger>().Object);
@@ -653,7 +653,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1));
playoutItems[1].GuideGroup.Should().Be(2);
playoutItems[1].FillerKind.Should().Be(FillerKind.None);
playoutItems[2].MediaItemId.Should().Be(1);
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2));
playoutItems[2].GuideGroup.Should().Be(3);
@@ -664,4 +664,4 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
{
StartTime = TimeSpan.FromHours(3)
};
}
}
@@ -27,7 +27,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
TailFiller = null,
FallbackFiller = null
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -35,7 +35,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator = new ChronologicalMediaCollectionEnumerator(
collectionOne.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
@@ -94,7 +94,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
Collection = collectionThree
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -110,13 +110,19 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator3 = new ChronologicalMediaCollectionEnumerator(
collectionThree.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2, scheduleItem.FallbackFiller, enumerator3),
CollectionEnumerators(
scheduleItem,
enumerator1,
scheduleItem.TailFiller,
enumerator2,
scheduleItem.FallbackFiller,
enumerator3),
scheduleItem,
NextScheduleItem,
HardStop(scheduleItemsEnumerator));
@@ -165,7 +171,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
},
FallbackFiller = null
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -177,7 +183,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator2 = new ChronologicalMediaCollectionEnumerator(
collectionTwo.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
@@ -217,7 +223,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 50, 0)));
playoutItems[2].GuideGroup.Should().Be(1);
playoutItems[2].FillerKind.Should().Be(FillerKind.Tail);
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 55, 0)));
playoutItems[3].GuideGroup.Should().Be(1);
@@ -246,7 +252,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
CollectionId = collectionTwo.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -258,7 +264,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator2 = new ChronologicalMediaCollectionEnumerator(
collectionTwo.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
@@ -294,7 +300,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
playoutItems[1].GuideGroup.Should().Be(1);
playoutItems[1].FillerKind.Should().Be(FillerKind.Fallback);
}
[Test]
public void Should_Have_Gap_With_Tail_No_Fallback()
{
@@ -317,7 +323,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
},
FallbackFiller = null
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -329,7 +335,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator2 = new ChronologicalMediaCollectionEnumerator(
collectionTwo.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
@@ -369,7 +375,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 49, 0)));
playoutItems[2].GuideGroup.Should().Be(1);
playoutItems[2].FillerKind.Should().Be(FillerKind.Tail);
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 53, 0)));
playoutItems[3].GuideGroup.Should().Be(1);
@@ -404,7 +410,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
CollectionId = collectionThree.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -420,7 +426,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator3 = new ChronologicalMediaCollectionEnumerator(
collectionThree.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
@@ -467,7 +473,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 49, 0)));
playoutItems[2].GuideGroup.Should().Be(1);
playoutItems[2].FillerKind.Should().Be(FillerKind.Tail);
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 53, 0)));
playoutItems[3].GuideGroup.Should().Be(1);
@@ -507,7 +513,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
CollectionId = collectionThree.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -523,7 +529,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var enumerator3 = new ChronologicalMediaCollectionEnumerator(
collectionThree.MediaItems,
new CollectionEnumeratorState());
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
@@ -592,7 +598,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
CollectionId = collectionThree.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -614,7 +620,13 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.PostRollFiller, enumerator2, scheduleItem.FallbackFiller, enumerator3),
CollectionEnumerators(
scheduleItem,
enumerator1,
scheduleItem.PostRollFiller,
enumerator2,
scheduleItem.FallbackFiller,
enumerator3),
scheduleItem,
NextScheduleItem,
HardStop(scheduleItemsEnumerator));
@@ -648,7 +660,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 50, 0)));
playoutItems[2].GuideGroup.Should().Be(1);
playoutItems[2].FillerKind.Should().Be(FillerKind.PostRoll);
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 55, 0)));
playoutItems[3].GuideGroup.Should().Be(1);
@@ -685,7 +697,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
CollectionId = collectionThree.Id
}
};
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
new List<ProgramScheduleItem> { scheduleItem },
new CollectionEnumeratorState());
@@ -707,7 +719,13 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
var scheduler = new PlayoutModeSchedulerOne(new Mock<ILogger>().Object);
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.PostRollFiller, enumerator2, scheduleItem.FallbackFiller, enumerator3),
CollectionEnumerators(
scheduleItem,
enumerator1,
scheduleItem.PostRollFiller,
enumerator2,
scheduleItem.FallbackFiller,
enumerator3),
scheduleItem,
NextScheduleItem,
HardStop(scheduleItemsEnumerator));
@@ -742,7 +760,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 50, 0)));
playoutItems[2].GuideGroup.Should().Be(1);
playoutItems[2].FillerKind.Should().Be(FillerKind.PostRoll);
playoutItems[3].MediaItemId.Should().Be(3);
playoutItems[3].StartOffset.Should().Be(startState.CurrentTime.Add(new TimeSpan(2, 55, 0)));
playoutItems[3].GuideGroup.Should().Be(1);
@@ -753,4 +771,4 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
{
StartTime = TimeSpan.FromHours(3)
};
}
}
@@ -86,7 +86,7 @@ public class RandomizedContentTests
private static List<MediaItem> Episodes(int count) =>
Range(1, count).Map(
i => (MediaItem) new Episode
i => (MediaItem)new Episode
{
Id = i,
EpisodeMetadata = new List<EpisodeMetadata>
@@ -99,4 +99,4 @@ public class RandomizedContentTests
})
.Reverse()
.ToList();
}
}
@@ -7,34 +7,38 @@ namespace ErsatzTV.Core.Tests.Scheduling;
public abstract class SchedulerTestBase
{
protected static PlayoutBuilderState StartState(IScheduleItemsEnumerator scheduleItemsEnumerator) => new(
scheduleItemsEnumerator,
Prelude.None,
Prelude.None,
false,
false,
1,
new DateTimeOffset(new DateTime(2020, 10, 18, 0, 0, 0, DateTimeKind.Local)));
protected virtual ProgramScheduleItem NextScheduleItem => new ProgramScheduleItemOne
{
StartTime = null
};
protected static PlayoutBuilderState StartState(IScheduleItemsEnumerator scheduleItemsEnumerator) => new(
scheduleItemsEnumerator,
None,
None,
false,
false,
1,
new DateTimeOffset(new DateTime(2020, 10, 18, 0, 0, 0, DateTimeKind.Local)));
protected static DateTimeOffset HardStop(IScheduleItemsEnumerator scheduleItemsEnumerator) =>
StartState(scheduleItemsEnumerator).CurrentTime.AddHours(6);
protected static Dictionary<CollectionKey, IMediaCollectionEnumerator> CollectionEnumerators(
ProgramScheduleItem scheduleItem, IMediaCollectionEnumerator enumerator) =>
ProgramScheduleItem scheduleItem,
IMediaCollectionEnumerator enumerator) =>
new()
{
{ CollectionKey.ForScheduleItem(scheduleItem), enumerator }
};
protected static Dictionary<CollectionKey, IMediaCollectionEnumerator> CollectionEnumerators(
ProgramScheduleItem scheduleItem, IMediaCollectionEnumerator enumerator1,
FillerPreset fillerPreset, IMediaCollectionEnumerator enumerator2,
FillerPreset fillerPreset2, IMediaCollectionEnumerator enumerator3) =>
ProgramScheduleItem scheduleItem,
IMediaCollectionEnumerator enumerator1,
FillerPreset fillerPreset,
IMediaCollectionEnumerator enumerator2,
FillerPreset fillerPreset2,
IMediaCollectionEnumerator enumerator3) =>
new()
{
{ CollectionKey.ForScheduleItem(scheduleItem), enumerator1 },
@@ -44,7 +48,7 @@ public abstract class SchedulerTestBase
private static Movie TestMovie(int id, TimeSpan duration, DateTime aired, int chapterCount = 0)
{
var result = new Movie()
var result = new Movie
{
Id = id,
MovieMetadata = new List<MovieMetadata> { new() { ReleaseDate = aired } },
@@ -79,11 +83,13 @@ public abstract class SchedulerTestBase
};
protected static Dictionary<CollectionKey, IMediaCollectionEnumerator> CollectionEnumerators(
ProgramScheduleItem scheduleItem, IMediaCollectionEnumerator enumerator1,
FillerPreset fillerPreset, IMediaCollectionEnumerator enumerator2) =>
ProgramScheduleItem scheduleItem,
IMediaCollectionEnumerator enumerator1,
FillerPreset fillerPreset,
IMediaCollectionEnumerator enumerator2) =>
new()
{
{ CollectionKey.ForScheduleItem(scheduleItem), enumerator1 },
{ CollectionKey.ForFillerPreset(fillerPreset), enumerator2 }
};
}
}
@@ -133,7 +133,7 @@ public class ShuffledContentTests
private static List<MediaItem> Episodes(int count) =>
Range(1, count).Map(
i => (MediaItem) new Episode
i => (MediaItem)new Episode
{
Id = i,
EpisodeMetadata = new List<EpisodeMetadata>
@@ -146,4 +146,4 @@ public class ShuffledContentTests
})
.Reverse()
.ToList();
}
}
@@ -15,7 +15,7 @@ public class ShuffledMediaCollectionEnumeratorTests
new GroupedMediaItem(new MediaItem { Id = 2 }, new List<MediaItem>()),
new GroupedMediaItem(new MediaItem { Id = 3 }, new List<MediaItem>())
};
[Test]
public void Peek_Zero_Should_Match_Current()
{
@@ -30,7 +30,7 @@ public class ShuffledMediaCollectionEnumeratorTests
peek.ValueUnsafe().Id.Should().Be(1);
current.ValueUnsafe().Id.Should().Be(1);
}
[Test]
public void Peek_One_Should_Match_Next()
{
@@ -47,7 +47,7 @@ public class ShuffledMediaCollectionEnumeratorTests
peek.ValueUnsafe().Id.Should().Be(2);
next.ValueUnsafe().Id.Should().Be(2);
}
[Test]
public void Peek_Two_Should_Match_NextNext()
{
@@ -65,7 +65,7 @@ public class ShuffledMediaCollectionEnumeratorTests
peek.ValueUnsafe().Id.Should().Be(3);
next.ValueUnsafe().Id.Should().Be(3);
}
[Test]
public void Peek_Three_Should_Match_NextNextNext()
{
@@ -84,4 +84,4 @@ public class ShuffledMediaCollectionEnumeratorTests
peek.ValueUnsafe().Id.Should().Be(2);
next.ValueUnsafe().Id.Should().Be(2);
}
}
}