Merge pull request #6546 from ianjazz246/theorydata

This commit is contained in:
Bond-009 2021-09-28 10:59:25 +02:00 committed by GitHub
commit 2def7043ce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 357 additions and 436 deletions

View file

@ -19,33 +19,28 @@ namespace Jellyfin.Api.Tests.Controllers
} }
} }
public static IEnumerable<object[]> GetSegmentLengths_Success_TestData() public static TheoryData<long, int, double[]> GetSegmentLengths_Success_TestData()
{ {
yield return new object[] { 0, 6, Array.Empty<double>() }; var data = new TheoryData<long, int, double[]>();
yield return new object[] data.Add(0, 6, Array.Empty<double>());
{ data.Add(
TimeSpan.FromSeconds(3).Ticks, TimeSpan.FromSeconds(3).Ticks,
6, 6,
new double[] { 3 } new double[] { 3 });
}; data.Add(
yield return new object[]
{
TimeSpan.FromSeconds(6).Ticks, TimeSpan.FromSeconds(6).Ticks,
6, 6,
new double[] { 6 } new double[] { 6 });
}; data.Add(
yield return new object[]
{
TimeSpan.FromSeconds(3.3333333).Ticks, TimeSpan.FromSeconds(3.3333333).Ticks,
6, 6,
new double[] { 3.3333333 } new double[] { 3.3333333 });
}; data.Add(
yield return new object[]
{
TimeSpan.FromSeconds(9.3333333).Ticks, TimeSpan.FromSeconds(9.3333333).Ticks,
6, 6,
new double[] { 6, 3.3333333 } new double[] { 6, 3.3333333 });
};
return data;
} }
} }
} }

View file

@ -15,16 +15,16 @@ namespace Jellyfin.Api.Tests.Helpers
Assert.Equal(expected, RequestHelpers.GetOrderBy(sortBy, requestedSortOrder)); Assert.Equal(expected, RequestHelpers.GetOrderBy(sortBy, requestedSortOrder));
} }
public static IEnumerable<object[]> GetOrderBy_Success_TestData() public static TheoryData<IReadOnlyList<string>, IReadOnlyList<SortOrder>, (string, SortOrder)[]> GetOrderBy_Success_TestData()
{ {
yield return new object[] var data = new TheoryData<IReadOnlyList<string>, IReadOnlyList<SortOrder>, (string, SortOrder)[]>();
{
data.Add(
Array.Empty<string>(), Array.Empty<string>(),
Array.Empty<SortOrder>(), Array.Empty<SortOrder>(),
Array.Empty<(string, SortOrder)>() Array.Empty<(string, SortOrder)>());
};
yield return new object[] data.Add(
{
new string[] new string[]
{ {
"IsFavoriteOrLiked", "IsFavoriteOrLiked",
@ -35,10 +35,9 @@ namespace Jellyfin.Api.Tests.Helpers
{ {
("IsFavoriteOrLiked", SortOrder.Ascending), ("IsFavoriteOrLiked", SortOrder.Ascending),
("Random", SortOrder.Ascending), ("Random", SortOrder.Ascending),
} });
};
yield return new object[] data.Add(
{
new string[] new string[]
{ {
"SortName", "SortName",
@ -52,8 +51,9 @@ namespace Jellyfin.Api.Tests.Helpers
{ {
("SortName", SortOrder.Descending), ("SortName", SortOrder.Descending),
("ProductionYear", SortOrder.Descending), ("ProductionYear", SortOrder.Descending),
} });
};
return data;
} }
[Fact] [Fact]

View file

@ -19,18 +19,16 @@ namespace Jellyfin.Common.Tests.Cryptography
Assert.Throws<ArgumentException>(() => new PasswordHash(string.Empty, Array.Empty<byte>())); Assert.Throws<ArgumentException>(() => new PasswordHash(string.Empty, Array.Empty<byte>()));
} }
public static IEnumerable<object[]> Parse_Valid_TestData() public static TheoryData<string, PasswordHash> Parse_Valid_TestData()
{ {
var data = new TheoryData<string, PasswordHash>();
// Id // Id
yield return new object[] data.Add(
{
"$PBKDF2", "$PBKDF2",
new PasswordHash("PBKDF2", Array.Empty<byte>()) new PasswordHash("PBKDF2", Array.Empty<byte>()));
};
// Id + parameter // Id + parameter
yield return new object[] data.Add(
{
"$PBKDF2$iterations=1000", "$PBKDF2$iterations=1000",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
@ -39,12 +37,10 @@ namespace Jellyfin.Common.Tests.Cryptography
new Dictionary<string, string>() new Dictionary<string, string>()
{ {
{ "iterations", "1000" }, { "iterations", "1000" },
}) }));
};
// Id + parameters // Id + parameters
yield return new object[] data.Add(
{
"$PBKDF2$iterations=1000,m=120", "$PBKDF2$iterations=1000,m=120",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
@ -54,34 +50,28 @@ namespace Jellyfin.Common.Tests.Cryptography
{ {
{ "iterations", "1000" }, { "iterations", "1000" },
{ "m", "120" } { "m", "120" }
}) }));
};
// Id + hash // Id + hash
yield return new object[] data.Add(
{
"$PBKDF2$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D", "$PBKDF2$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
Convert.FromHexString("62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D"), Convert.FromHexString("62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D"),
Array.Empty<byte>(), Array.Empty<byte>(),
new Dictionary<string, string>()) new Dictionary<string, string>()));
};
// Id + salt + hash // Id + salt + hash
yield return new object[] data.Add(
{
"$PBKDF2$69F420$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D", "$PBKDF2$69F420$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
Convert.FromHexString("62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D"), Convert.FromHexString("62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D"),
Convert.FromHexString("69F420"), Convert.FromHexString("69F420"),
new Dictionary<string, string>()) new Dictionary<string, string>()));
};
// Id + parameter + hash // Id + parameter + hash
yield return new object[] data.Add(
{
"$PBKDF2$iterations=1000$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D", "$PBKDF2$iterations=1000$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
@ -90,12 +80,9 @@ namespace Jellyfin.Common.Tests.Cryptography
new Dictionary<string, string>() new Dictionary<string, string>()
{ {
{ "iterations", "1000" } { "iterations", "1000" }
}) }));
};
// Id + parameters + hash // Id + parameters + hash
yield return new object[] data.Add(
{
"$PBKDF2$iterations=1000,m=120$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D", "$PBKDF2$iterations=1000,m=120$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
@ -105,12 +92,9 @@ namespace Jellyfin.Common.Tests.Cryptography
{ {
{ "iterations", "1000" }, { "iterations", "1000" },
{ "m", "120" } { "m", "120" }
}) }));
};
// Id + parameters + salt + hash // Id + parameters + salt + hash
yield return new object[] data.Add(
{
"$PBKDF2$iterations=1000,m=120$69F420$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D", "$PBKDF2$iterations=1000,m=120$69F420$62FBA410AFCA5B4475F35137AB2E8596B127E4D927BA23F6CC05C067E897042D",
new PasswordHash( new PasswordHash(
"PBKDF2", "PBKDF2",
@ -120,8 +104,8 @@ namespace Jellyfin.Common.Tests.Cryptography
{ {
{ "iterations", "1000" }, { "iterations", "1000" },
{ "m", "120" } { "m", "120" }
}) }));
}; return data;
} }
[Theory] [Theory]

View file

@ -6,10 +6,17 @@ namespace Jellyfin.Extensions.Tests
{ {
public static class CopyToExtensionsTests public static class CopyToExtensionsTests
{ {
public static IEnumerable<object[]> CopyTo_Valid_Correct_TestData() public static TheoryData<IReadOnlyList<int>, IList<int>, int, IList<int>> CopyTo_Valid_Correct_TestData()
{ {
yield return new object[] { new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0, 0, 0, 0, 0, 0 }, 0, new[] { 0, 1, 2, 3, 4, 5 } }; var data = new TheoryData<IReadOnlyList<int>, IList<int>, int, IList<int>>();
yield return new object[] { new[] { 0, 1, 2 }, new[] { 5, 4, 3, 2, 1, 0 }, 2, new[] { 5, 4, 0, 1, 2, 0 } };
data.Add(
new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0, 0, 0, 0, 0, 0 }, 0, new[] { 0, 1, 2, 3, 4, 5 });
data.Add(
new[] { 0, 1, 2 }, new[] { 5, 4, 3, 2, 1, 0 }, 2, new[] { 5, 4, 0, 1, 2, 0 } );
return data;
} }
[Theory] [Theory]
@ -20,13 +27,26 @@ namespace Jellyfin.Extensions.Tests
Assert.Equal(expected, destination); Assert.Equal(expected, destination);
} }
public static IEnumerable<object[]> CopyTo_Invalid_ThrowsArgumentOutOfRangeException_TestData() public static TheoryData<IReadOnlyList<int>, IList<int>, int> CopyTo_Invalid_ThrowsArgumentOutOfRangeException_TestData()
{ {
yield return new object[] { new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0, 0, 0, 0, 0, 0 }, -1 }; var data = new TheoryData<IReadOnlyList<int>, IList<int>, int>();
yield return new object[] { new[] { 0, 1, 2 }, new[] { 5, 4, 3, 2, 1, 0 }, 6 };
yield return new object[] { new[] { 0, 1, 2 }, Array.Empty<int>(), 0 }; data.Add(
yield return new object[] { new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0 }, 0 }; new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0, 0, 0, 0, 0, 0 }, -1 );
yield return new object[] { new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0, 0, 0, 0, 0, 0 }, 1 };
data.Add(
new[] { 0, 1, 2 }, new[] { 5, 4, 3, 2, 1, 0 }, 6 );
data.Add(
new[] { 0, 1, 2 }, Array.Empty<int>(), 0 );
data.Add(
new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0 }, 0 );
data.Add(
new[] { 0, 1, 2, 3, 4, 5 }, new[] { 0, 0, 0, 0, 0, 0 }, 1 );
return data;
} }
[Theory] [Theory]

View file

@ -34,23 +34,21 @@ namespace Jellyfin.MediaEncoding.Tests
Assert.Equal(valid, _encoderValidator.ValidateVersionInternal(versionOutput)); Assert.Equal(valid, _encoderValidator.ValidateVersionInternal(versionOutput));
} }
private class GetFFmpegVersionTestData : IEnumerable<object?[]> private class GetFFmpegVersionTestData : TheoryData<string, Version?>
{ {
public IEnumerator<object?[]> GetEnumerator() public GetFFmpegVersionTestData()
{ {
yield return new object?[] { EncoderValidatorTestsData.FFmpegV44Output, new Version(4, 4) }; Add(EncoderValidatorTestsData.FFmpegV44Output, new Version(4, 4));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV432Output, new Version(4, 3, 2) }; Add(EncoderValidatorTestsData.FFmpegV432Output, new Version(4, 3, 2));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV431Output, new Version(4, 3, 1) }; Add(EncoderValidatorTestsData.FFmpegV431Output, new Version(4, 3, 1));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV43Output, new Version(4, 3) }; Add(EncoderValidatorTestsData.FFmpegV43Output, new Version(4, 3));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV421Output, new Version(4, 2, 1) }; Add(EncoderValidatorTestsData.FFmpegV421Output, new Version(4, 2, 1));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV42Output, new Version(4, 2) }; Add(EncoderValidatorTestsData.FFmpegV42Output, new Version(4, 2));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV414Output, new Version(4, 1, 4) }; Add(EncoderValidatorTestsData.FFmpegV414Output, new Version(4, 1, 4));
yield return new object?[] { EncoderValidatorTestsData.FFmpegV404Output, new Version(4, 0, 4) }; Add(EncoderValidatorTestsData.FFmpegV404Output, new Version(4, 0, 4));
yield return new object?[] { EncoderValidatorTestsData.FFmpegGitUnknownOutput2, new Version(4, 0) }; Add(EncoderValidatorTestsData.FFmpegGitUnknownOutput2, new Version(4, 0));
yield return new object?[] { EncoderValidatorTestsData.FFmpegGitUnknownOutput, null }; Add(EncoderValidatorTestsData.FFmpegGitUnknownOutput, null);
} }
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
} }
} }
} }

View file

@ -38,10 +38,11 @@ namespace Jellyfin.MediaEncoding.Subtitles.Tests
} }
} }
public static IEnumerable<object[]> Parse_MultipleDialogues_TestData() public static TheoryData<string, IReadOnlyList<SubtitleTrackEvent>> Parse_MultipleDialogues_TestData()
{ {
yield return new object[] var data = new TheoryData<string, IReadOnlyList<SubtitleTrackEvent>>();
{
data.Add(
@"[Events] @"[Events]
Format: Layer, Start, End, Text Format: Layer, Start, End, Text
Dialogue: ,0:00:01.18,0:00:01.85,dialogue1 Dialogue: ,0:00:01.18,0:00:01.85,dialogue1
@ -65,8 +66,9 @@ namespace Jellyfin.MediaEncoding.Subtitles.Tests
StartPositionTicks = 31800000, StartPositionTicks = 31800000,
EndPositionTicks = 38500000 EndPositionTicks = 38500000
} }
} });
};
return data;
} }
[Fact] [Fact]

View file

@ -6,12 +6,11 @@ namespace Jellyfin.Model.Tests.Entities
{ {
public class MediaStreamTests public class MediaStreamTests
{ {
public static IEnumerable<object[]> Get_DisplayTitle_TestData() public static TheoryData<MediaStream, string> Get_DisplayTitle_TestData()
{ {
return new List<object[]> var data = new TheoryData<MediaStream, string>();
{
new object[] data.Add(
{
new MediaStream new MediaStream
{ {
Type = MediaStreamType.Subtitle, Type = MediaStreamType.Subtitle,
@ -21,61 +20,57 @@ namespace Jellyfin.Model.Tests.Entities
IsDefault = false, IsDefault = false,
Codec = "ASS" Codec = "ASS"
}, },
"English - Und - ASS" "English - Und - ASS");
},
new object[] data.Add(
new MediaStream
{ {
new MediaStream Type = MediaStreamType.Subtitle,
{ Title = "English",
Type = MediaStreamType.Subtitle, Language = string.Empty,
Title = "English", IsForced = false,
Language = string.Empty, IsDefault = false,
IsForced = false, Codec = string.Empty
IsDefault = false,
Codec = string.Empty
},
"English - Und"
}, },
new object[] "English - Und");
data.Add(
new MediaStream
{ {
new MediaStream Type = MediaStreamType.Subtitle,
{ Title = "English",
Type = MediaStreamType.Subtitle, Language = "EN",
Title = "English", IsForced = false,
Language = "EN", IsDefault = false,
IsForced = false, Codec = string.Empty
IsDefault = false,
Codec = string.Empty
},
"English"
}, },
new object[] "English");
data.Add(
new MediaStream
{ {
new MediaStream Type = MediaStreamType.Subtitle,
{ Title = "English",
Type = MediaStreamType.Subtitle, Language = "EN",
Title = "English", IsForced = true,
Language = "EN", IsDefault = true,
IsForced = true, Codec = "SRT"
IsDefault = true,
Codec = "SRT"
},
"English - Default - Forced - SRT"
}, },
new object[] "English - Default - Forced - SRT");
data.Add(
new MediaStream
{ {
new MediaStream Type = MediaStreamType.Subtitle,
{ Title = null,
Type = MediaStreamType.Subtitle, Language = null,
Title = null, IsForced = false,
Language = null, IsDefault = false,
IsForced = false, Codec = null
IsDefault = false, },
Codec = null "Und");
},
"Und" return data;
}
};
} }
[Theory] [Theory]

View file

@ -9,29 +9,29 @@ namespace Jellyfin.Naming.Tests.AudioBook
{ {
private readonly NamingOptions _namingOptions = new NamingOptions(); private readonly NamingOptions _namingOptions = new NamingOptions();
public static IEnumerable<object[]> Resolve_ValidFileNameTestData() public static TheoryData<AudioBookFileInfo> Resolve_ValidFileNameTestData()
{ {
yield return new object[] var data = new TheoryData<AudioBookFileInfo>();
{
data.Add(
new AudioBookFileInfo( new AudioBookFileInfo(
@"/server/AudioBooks/Larry Potter/Larry Potter.mp3", @"/server/AudioBooks/Larry Potter/Larry Potter.mp3",
"mp3") "mp3"));
};
yield return new object[] data.Add(
{
new AudioBookFileInfo( new AudioBookFileInfo(
@"/server/AudioBooks/Berry Potter/Chapter 1 .ogg", @"/server/AudioBooks/Berry Potter/Chapter 1 .ogg",
"ogg", "ogg",
chapterNumber: 1) chapterNumber: 1));
};
yield return new object[] data.Add(
{
new AudioBookFileInfo( new AudioBookFileInfo(
@"/server/AudioBooks/Nerry Potter/Part 3 - Chapter 2.mp3", @"/server/AudioBooks/Nerry Potter/Part 3 - Chapter 2.mp3",
"mp3", "mp3",
chapterNumber: 2, chapterNumber: 2,
partNumber: 3) partNumber: 3));
};
return data;
} }
[Theory] [Theory]

View file

@ -11,148 +11,134 @@ namespace Jellyfin.Naming.Tests.Video
{ {
private static NamingOptions _namingOptions = new NamingOptions(); private static NamingOptions _namingOptions = new NamingOptions();
public static IEnumerable<object[]> ResolveFile_ValidFileNameTestData() public static TheoryData<VideoFileInfo> ResolveFile_ValidFileNameTestData()
{ {
yield return new object[] var data = new TheoryData<VideoFileInfo>();
{ data.Add(
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/7 Psychos.mkv/7 Psychos.mkv", path: @"/server/Movies/7 Psychos.mkv/7 Psychos.mkv",
container: "mkv", container: "mkv",
name: "7 Psychos") name: "7 Psychos"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/3 days to kill (2005)/3 days to kill (2005).mkv", path: @"/server/Movies/3 days to kill (2005)/3 days to kill (2005).mkv",
container: "mkv", container: "mkv",
name: "3 days to kill", name: "3 days to kill",
year: 2005) year: 2005));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/American Psycho/American.Psycho.mkv", path: @"/server/Movies/American Psycho/American.Psycho.mkv",
container: "mkv", container: "mkv",
name: "American.Psycho") name: "American.Psycho"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/brave (2007)/brave (2006).3d.sbs.mkv", path: @"/server/Movies/brave (2007)/brave (2006).3d.sbs.mkv",
container: "mkv", container: "mkv",
name: "brave", name: "brave",
year: 2006, year: 2006,
is3D: true, is3D: true,
format3D: "sbs") format3D: "sbs"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/300 (2007)/300 (2006).3d1.sbas.mkv", path: @"/server/Movies/300 (2007)/300 (2006).3d1.sbas.mkv",
container: "mkv", container: "mkv",
name: "300", name: "300",
year: 2006) year: 2006));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/300 (2007)/300 (2006).3d.sbs.mkv", path: @"/server/Movies/300 (2007)/300 (2006).3d.sbs.mkv",
container: "mkv", container: "mkv",
name: "300", name: "300",
year: 2006, year: 2006,
is3D: true, is3D: true,
format3D: "sbs") format3D: "sbs"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/brave (2007)/brave (2006)-trailer.bluray.disc", path: @"/server/Movies/brave (2007)/brave (2006)-trailer.bluray.disc",
container: "disc", container: "disc",
name: "brave", name: "brave",
year: 2006, year: 2006,
isStub: true, isStub: true,
stubType: "bluray") stubType: "bluray"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/300 (2007)/300 (2006)-trailer.bluray.disc", path: @"/server/Movies/300 (2007)/300 (2006)-trailer.bluray.disc",
container: "disc", container: "disc",
name: "300", name: "300",
year: 2006, year: 2006,
isStub: true, isStub: true,
stubType: "bluray") stubType: "bluray"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/Brave (2007)/Brave (2006).bluray.disc", path: @"/server/Movies/Brave (2007)/Brave (2006).bluray.disc",
container: "disc", container: "disc",
name: "Brave", name: "Brave",
year: 2006, year: 2006,
isStub: true, isStub: true,
stubType: "bluray") stubType: "bluray"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/300 (2007)/300 (2006).bluray.disc", path: @"/server/Movies/300 (2007)/300 (2006).bluray.disc",
container: "disc", container: "disc",
name: "300", name: "300",
year: 2006, year: 2006,
isStub: true, isStub: true,
stubType: "bluray") stubType: "bluray"));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/300 (2007)/300 (2006)-trailer.mkv", path: @"/server/Movies/300 (2007)/300 (2006)-trailer.mkv",
container: "mkv", container: "mkv",
name: "300", name: "300",
year: 2006, year: 2006,
extraType: ExtraType.Trailer) extraType: ExtraType.Trailer));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/Brave (2007)/Brave (2006)-trailer.mkv", path: @"/server/Movies/Brave (2007)/Brave (2006)-trailer.mkv",
container: "mkv", container: "mkv",
name: "Brave", name: "Brave",
year: 2006, year: 2006,
extraType: ExtraType.Trailer) extraType: ExtraType.Trailer));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/300 (2007)/300 (2006).mkv", path: @"/server/Movies/300 (2007)/300 (2006).mkv",
container: "mkv", container: "mkv",
name: "300", name: "300",
year: 2006) year: 2006));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/Bad Boys (1995)/Bad Boys (1995).mkv", path: @"/server/Movies/Bad Boys (1995)/Bad Boys (1995).mkv",
container: "mkv", container: "mkv",
name: "Bad Boys", name: "Bad Boys",
year: 1995) year: 1995));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/Brave (2007)/Brave (2006).mkv", path: @"/server/Movies/Brave (2007)/Brave (2006).mkv",
container: "mkv", container: "mkv",
name: "Brave", name: "Brave",
year: 2006) year: 2006));
};
yield return new object[] data.Add(
{
new VideoFileInfo( new VideoFileInfo(
path: @"/server/Movies/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - JEFF/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - JEFF.mp4", path: @"/server/Movies/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - JEFF/Rain Man 1988 REMASTERED 1080p BluRay x264 AAC - JEFF.mp4",
container: "mp4", container: "mp4",
name: "Rain Man", name: "Rain Man",
year: 1988) year: 1988));
};
return data;
} }
[Theory] [Theory]

View file

@ -1,4 +1,4 @@
#pragma warning disable CA1002 // Do not expose generic lists #pragma warning disable CA1002 // Do not expose generic lists
using System.Collections.Generic; using System.Collections.Generic;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
@ -11,11 +11,12 @@ namespace Jellyfin.Providers.Tests.MediaInfo
{ {
public class SubtitleResolverTests public class SubtitleResolverTests
{ {
public static IEnumerable<object[]> AddExternalSubtitleStreams_GivenMixedFilenames_ReturnsValidSubtitles_TestData() public static TheoryData<List<MediaStream>, string, int, string[], MediaStream[]> AddExternalSubtitleStreams_GivenMixedFilenames_ReturnsValidSubtitles_TestData()
{ {
var data = new TheoryData<List<MediaStream>, string, int, string[], MediaStream[]>();
var index = 0; var index = 0;
yield return new object[] data.Add(
{
new List<MediaStream>(), new List<MediaStream>(),
"/video/My.Video.mkv", "/video/My.Video.mkv",
index, index,
@ -52,8 +53,9 @@ namespace Jellyfin.Providers.Tests.MediaInfo
CreateMediaStream("/video/My.Video.default.forced.en.srt", "srt", "en", index++, isForced: true, isDefault: true), CreateMediaStream("/video/My.Video.default.forced.en.srt", "srt", "en", index++, isForced: true, isDefault: true),
CreateMediaStream("/video/My.Video.en.default.forced.srt", "srt", "en", index++, isForced: true, isDefault: true), CreateMediaStream("/video/My.Video.en.default.forced.srt", "srt", "en", index++, isForced: true, isDefault: true),
CreateMediaStream("/video/My.Video.With.Additional.Garbage.en.srt", "srt", "en", index), CreateMediaStream("/video/My.Video.With.Additional.Garbage.en.srt", "srt", "en", index),
} });
};
return data;
} }
[Theory] [Theory]

View file

@ -32,10 +32,11 @@ namespace Jellyfin.Server.Implementations.Tests.Data
_sqliteItemRepository = _fixture.Create<SqliteItemRepository>(); _sqliteItemRepository = _fixture.Create<SqliteItemRepository>();
} }
public static IEnumerable<object[]> ItemImageInfoFromValueString_Valid_TestData() public static TheoryData<string, ItemImageInfo> ItemImageInfoFromValueString_Valid_TestData()
{ {
yield return new object[] var data = new TheoryData<string, ItemImageInfo>();
{
data.Add(
"/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN", "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN",
new ItemImageInfo new ItemImageInfo
{ {
@ -45,41 +46,33 @@ namespace Jellyfin.Server.Implementations.Tests.Data
Width = 1920, Width = 1920,
Height = 1080, Height = 1080,
BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN" BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN"
} });
};
yield return new object[] data.Add(
{
"https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary*0*0", "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary*0*0",
new ItemImageInfo new ItemImageInfo
{ {
Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg", Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg",
Type = ImageType.Primary, Type = ImageType.Primary,
} });
};
yield return new object[] data.Add(
{
"https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary", "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary",
new ItemImageInfo new ItemImageInfo
{ {
Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg", Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg",
Type = ImageType.Primary, Type = ImageType.Primary,
} });
};
yield return new object[] data.Add(
{
"https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary*600", "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg*0*Primary*600",
new ItemImageInfo new ItemImageInfo
{ {
Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg", Path = "https://image.tmdb.org/t/p/original/zhB5CHEgqqh4wnEqDNJLfWXJlcL.jpg",
Type = ImageType.Primary, Type = ImageType.Primary,
} });
};
yield return new object[] data.Add(
{
"%MetadataPath%/library/68/68578562b96c80a7ebd530848801f645/poster.jpg*637264380567586027*Primary*600*336", "%MetadataPath%/library/68/68578562b96c80a7ebd530848801f645/poster.jpg*637264380567586027*Primary*600*336",
new ItemImageInfo new ItemImageInfo
{ {
@ -88,8 +81,9 @@ namespace Jellyfin.Server.Implementations.Tests.Data
DateModified = new DateTime(637264380567586027, DateTimeKind.Utc), DateModified = new DateTime(637264380567586027, DateTimeKind.Utc),
Width = 600, Width = 600,
Height = 336 Height = 336
} });
};
return data;
} }
[Theory] [Theory]
@ -117,10 +111,10 @@ namespace Jellyfin.Server.Implementations.Tests.Data
Assert.Null(_sqliteItemRepository.ItemImageInfoFromValueString(value)); Assert.Null(_sqliteItemRepository.ItemImageInfoFromValueString(value));
} }
public static IEnumerable<object[]> DeserializeImages_Valid_TestData() public static TheoryData<string, ItemImageInfo[]> DeserializeImages_Valid_TestData()
{ {
yield return new object[] var data = new TheoryData<string, ItemImageInfo[]>();
{ data.Add(
"/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN", "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN",
new ItemImageInfo[] new ItemImageInfo[]
{ {
@ -133,11 +127,9 @@ namespace Jellyfin.Server.Implementations.Tests.Data
Height = 1080, Height = 1080,
BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN" BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN"
} }
} });
};
yield return new object[] data.Add(
{
"%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/poster.jpg*637261226720645297*Primary*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/logo.png*637261226720805297*Logo*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/landscape.jpg*637261226721285297*Thumb*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/backdrop.jpg*637261226721685297*Backdrop*0*0", "%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/poster.jpg*637261226720645297*Primary*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/logo.png*637261226720805297*Logo*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/landscape.jpg*637261226721285297*Thumb*0*0|%MetadataPath%/library/2a/2a27372f1e9bc757b1db99721bbeae1e/backdrop.jpg*637261226721685297*Backdrop*0*0",
new ItemImageInfo[] new ItemImageInfo[]
{ {
@ -165,20 +157,19 @@ namespace Jellyfin.Server.Implementations.Tests.Data
Type = ImageType.Backdrop, Type = ImageType.Backdrop,
DateModified = new DateTime(637261226721685297, DateTimeKind.Utc), DateModified = new DateTime(637261226721685297, DateTimeKind.Utc),
} }
} });
};
return data;
} }
public static IEnumerable<object[]> DeserializeImages_ValidAndInvalid_TestData() public static TheoryData<string, ItemImageInfo[]> DeserializeImages_ValidAndInvalid_TestData()
{ {
yield return new object[] var data = new TheoryData<string, ItemImageInfo[]>();
{ data.Add(
string.Empty, string.Empty,
Array.Empty<ItemImageInfo>() Array.Empty<ItemImageInfo>());
};
yield return new object[] data.Add(
{
"/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN|test|1234||ss", "/mnt/series/Family Guy/Season 1/Family Guy - S01E01-thumb.jpg*637452096478512963*Primary*1920*1080*WjQbtJtSO8nhNZ%L_Io#R/oaS6o}-;adXAoIn7j[%hW9s:WGw[nN|test|1234||ss",
new ItemImageInfo[] new ItemImageInfo[]
{ {
@ -191,14 +182,13 @@ namespace Jellyfin.Server.Implementations.Tests.Data
Height = 1080, Height = 1080,
BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN" BlurHash = "WjQbtJtSO8nhNZ%L_Io#R*oaS6o}-;adXAoIn7j[%hW9s:WGw[nN"
} }
} });
};
yield return new object[] data.Add(
{
"|", "|",
Array.Empty<ItemImageInfo>() Array.Empty<ItemImageInfo>());
};
return data;
} }
[Theory] [Theory]
@ -242,30 +232,27 @@ namespace Jellyfin.Server.Implementations.Tests.Data
Assert.Equal(expected, _sqliteItemRepository.SerializeImages(value)); Assert.Equal(expected, _sqliteItemRepository.SerializeImages(value));
} }
public static IEnumerable<object[]> DeserializeProviderIds_Valid_TestData() public static TheoryData<string, Dictionary<string, string>> DeserializeProviderIds_Valid_TestData()
{ {
yield return new object[] var data = new TheoryData<string, Dictionary<string, string>>();
{
data.Add(
"Imdb=tt0119567", "Imdb=tt0119567",
new Dictionary<string, string>() new Dictionary<string, string>()
{ {
{ "Imdb", "tt0119567" }, { "Imdb", "tt0119567" },
} });
};
yield return new object[] data.Add(
{
"Imdb=tt0119567|Tmdb=330|TmdbCollection=328", "Imdb=tt0119567|Tmdb=330|TmdbCollection=328",
new Dictionary<string, string>() new Dictionary<string, string>()
{ {
{ "Imdb", "tt0119567" }, { "Imdb", "tt0119567" },
{ "Tmdb", "330" }, { "Tmdb", "330" },
{ "TmdbCollection", "328" }, { "TmdbCollection", "328" },
} });
};
yield return new object[] data.Add(
{
"MusicBrainzAlbum=9d363e43-f24f-4b39-bc5a-7ef305c677c7|MusicBrainzReleaseGroup=63eba062-847c-3b73-8b0f-6baf27bba6fa|AudioDbArtist=111352|AudioDbAlbum=2116560|MusicBrainzAlbumArtist=20244d07-534f-4eff-b4d4-930878889970", "MusicBrainzAlbum=9d363e43-f24f-4b39-bc5a-7ef305c677c7|MusicBrainzReleaseGroup=63eba062-847c-3b73-8b0f-6baf27bba6fa|AudioDbArtist=111352|AudioDbAlbum=2116560|MusicBrainzAlbumArtist=20244d07-534f-4eff-b4d4-930878889970",
new Dictionary<string, string>() new Dictionary<string, string>()
{ {
@ -274,8 +261,9 @@ namespace Jellyfin.Server.Implementations.Tests.Data
{ "AudioDbArtist", "111352" }, { "AudioDbArtist", "111352" },
{ "AudioDbAlbum", "2116560" }, { "AudioDbAlbum", "2116560" },
{ "MusicBrainzAlbumArtist", "20244d07-534f-4eff-b4d4-930878889970" }, { "MusicBrainzAlbumArtist", "20244d07-534f-4eff-b4d4-930878889970" },
} });
};
return data;
} }
[Theory] [Theory]

View file

@ -8,43 +8,36 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
{ {
public static class RecordingHelperTests public static class RecordingHelperTests
{ {
public static IEnumerable<object[]> GetRecordingName_Success_TestData() public static TheoryData<string, TimerInfo> GetRecordingName_Success_TestData()
{ {
yield return new object[] var data = new TheoryData<string, TimerInfo>();
{
data.Add(
"The Incredibles 2020_04_20_21_06_00", "The Incredibles 2020_04_20_21_06_00",
new TimerInfo new TimerInfo
{ {
Name = "The Incredibles", Name = "The Incredibles",
StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local), StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local),
IsMovie = true IsMovie = true
} });
};
yield return new object[] data.Add(
{
"The Incredibles (2004)", "The Incredibles (2004)",
new TimerInfo new TimerInfo
{ {
Name = "The Incredibles", Name = "The Incredibles",
IsMovie = true, IsMovie = true,
ProductionYear = 2004 ProductionYear = 2004
} });
}; data.Add(
yield return new object[]
{
"The Big Bang Theory 2020_04_20_21_06_00", "The Big Bang Theory 2020_04_20_21_06_00",
new TimerInfo new TimerInfo
{ {
Name = "The Big Bang Theory", Name = "The Big Bang Theory",
StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local), StartDate = new DateTime(2020, 4, 20, 21, 6, 0, DateTimeKind.Local),
IsProgramSeries = true, IsProgramSeries = true,
} });
}; data.Add(
yield return new object[]
{
"The Big Bang Theory S12E10", "The Big Bang Theory S12E10",
new TimerInfo new TimerInfo
{ {
@ -52,11 +45,8 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
IsProgramSeries = true, IsProgramSeries = true,
SeasonNumber = 12, SeasonNumber = 12,
EpisodeNumber = 10 EpisodeNumber = 10
} });
}; data.Add(
yield return new object[]
{
"The Big Bang Theory S12E10 The VCR Illumination", "The Big Bang Theory S12E10 The VCR Illumination",
new TimerInfo new TimerInfo
{ {
@ -65,22 +55,17 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
SeasonNumber = 12, SeasonNumber = 12,
EpisodeNumber = 10, EpisodeNumber = 10,
EpisodeTitle = "The VCR Illumination" EpisodeTitle = "The VCR Illumination"
} });
}; data.Add(
yield return new object[]
{
"The Big Bang Theory 2018-12-06", "The Big Bang Theory 2018-12-06",
new TimerInfo new TimerInfo
{ {
Name = "The Big Bang Theory", Name = "The Big Bang Theory",
IsProgramSeries = true, IsProgramSeries = true,
OriginalAirDate = new DateTime(2018, 12, 6) OriginalAirDate = new DateTime(2018, 12, 6)
} });
};
yield return new object[] data.Add(
{
"The Big Bang Theory 2018-12-06 - The VCR Illumination", "The Big Bang Theory 2018-12-06 - The VCR Illumination",
new TimerInfo new TimerInfo
{ {
@ -88,11 +73,9 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
IsProgramSeries = true, IsProgramSeries = true,
OriginalAirDate = new DateTime(2018, 12, 6), OriginalAirDate = new DateTime(2018, 12, 6),
EpisodeTitle = "The VCR Illumination" EpisodeTitle = "The VCR Illumination"
} });
};
yield return new object[] data.Add(
{
"The Big Bang Theory 2018_12_06_21_06_00 - The VCR Illumination", "The Big Bang Theory 2018_12_06_21_06_00 - The VCR Illumination",
new TimerInfo new TimerInfo
{ {
@ -101,8 +84,9 @@ namespace Jellyfin.Server.Implementations.Tests.LiveTv
IsProgramSeries = true, IsProgramSeries = true,
OriginalAirDate = new DateTime(2018, 12, 6), OriginalAirDate = new DateTime(2018, 12, 6),
EpisodeTitle = "The VCR Illumination" EpisodeTitle = "The VCR Illumination"
} });
};
return data;
} }
[Theory] [Theory]

View file

@ -13,7 +13,7 @@ namespace Jellyfin.Server.Implementations.Tests.Sorting
{ {
[Theory] [Theory]
[ClassData(typeof(EpisodeBadData))] [ClassData(typeof(EpisodeBadData))]
public void Compare_GivenNull_ThrowsArgumentNullException(BaseItem x, BaseItem y) public void Compare_GivenNull_ThrowsArgumentNullException(BaseItem? x, BaseItem? y)
{ {
var cmp = new AiredEpisodeOrderComparer(); var cmp = new AiredEpisodeOrderComparer();
Assert.Throws<ArgumentNullException>(() => cmp.Compare(x, y)); Assert.Throws<ArgumentNullException>(() => cmp.Compare(x, y));
@ -29,171 +29,138 @@ namespace Jellyfin.Server.Implementations.Tests.Sorting
Assert.Equal(-expected, cmp.Compare(y, x)); Assert.Equal(-expected, cmp.Compare(y, x));
} }
private class EpisodeBadData : IEnumerable<object?[]> private class EpisodeBadData : TheoryData<BaseItem?, BaseItem?>
{ {
public IEnumerator<object?[]> GetEnumerator() public EpisodeBadData()
{ {
yield return new object?[] { null, new Episode() }; Add(null, new Episode());
yield return new object?[] { new Episode(), null }; Add(new Episode(), null);
} }
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
} }
private class EpisodeTestData : IEnumerable<object?[]> private class EpisodeTestData : TheoryData<BaseItem, BaseItem, int>
{ {
public IEnumerator<object?[]> GetEnumerator() public EpisodeTestData()
{ {
yield return new object?[] Add(
{
new Movie(), new Movie(),
new Movie(), new Movie(),
0 0);
};
yield return new object?[] Add(
{
new Movie(), new Movie(),
new Episode(), new Episode(),
1 1);
};
// Good cases // Good cases
yield return new object?[] Add(
{
new Episode(), new Episode(),
new Episode(), new Episode(),
0 0);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
0 0);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 2 }, new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 2, IndexNumber = 1 }, new Episode { ParentIndexNumber = 2, IndexNumber = 1 },
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
1 1);
};
// Good Specials // Good Specials
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 0, IndexNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
0 0);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 0, IndexNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 2 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
1 1);
};
// Specials to Episodes // Specials to Episodes
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 2 },
1 1);
};
yield return new object?[]
{
new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
1
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 2 }, new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
1 1);
};
yield return new object?[] Add(
{ new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
1);
Add(
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 2 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1 },
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 3, IndexNumber = 1 }, new Episode { ParentIndexNumber = 3, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 3, IndexNumber = 1 }, new Episode { ParentIndexNumber = 3, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1 }, new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 2 }, new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
1 1);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1 }, new Episode { ParentIndexNumber = 1 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
0 0);
};
yield return new object?[] Add(
{
new Episode { ParentIndexNumber = 1, IndexNumber = 3 }, new Episode { ParentIndexNumber = 1, IndexNumber = 3 },
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 }, new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
1 1);
};
// Premiere Date
yield return new object?[]
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
0
};
yield return new object?[]
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 11, 0, 0, 0) },
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
-1
};
yield return new object?[]
{
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 11, 0, 0, 0) },
1
};
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); // Premiere Date
Add(
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
0);
Add(
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 11, 0, 0, 0) },
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
-1);
Add(
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 12, 0, 0, 0) },
new Episode { ParentIndexNumber = 1, IndexNumber = 1, PremiereDate = new DateTime(2021, 09, 11, 0, 0, 0) },
1);
}
} }
} }
} }