|
|
|
@ -13,7 +13,7 @@ namespace Jellyfin.Server.Implementations.Tests.Sorting
|
|
|
|
|
{
|
|
|
|
|
[Theory]
|
|
|
|
|
[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();
|
|
|
|
|
Assert.Throws<ArgumentNullException>(() => cmp.Compare(x, y));
|
|
|
|
@ -29,171 +29,138 @@ namespace Jellyfin.Server.Implementations.Tests.Sorting
|
|
|
|
|
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() };
|
|
|
|
|
yield return new object?[] { new Episode(), null };
|
|
|
|
|
Add(null, new Episode());
|
|
|
|
|
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(),
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Movie(),
|
|
|
|
|
new Episode(),
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
// Good cases
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
Add(
|
|
|
|
|
new Episode(),
|
|
|
|
|
new Episode(),
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 2, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
// Good Specials
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 2 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
// Specials to Episodes
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 2 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
|
|
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 2 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 3, IndexNumber = 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 = 0, IndexNumber = 1, AirsAfterSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 2 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
|
|
|
|
|
0
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
|
Add(
|
|
|
|
|
new Episode { ParentIndexNumber = 1, IndexNumber = 3 },
|
|
|
|
|
new Episode { ParentIndexNumber = 0, IndexNumber = 1, AirsBeforeSeasonNumber = 1, AirsBeforeEpisodeNumber = 2 },
|
|
|
|
|
1
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
|
|
|
|
|
// Premiere Date
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
yield return new object?[]
|
|
|
|
|
{
|
|
|
|
|
-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
|
|
|
|
|
};
|
|
|
|
|
1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|