diff --git a/Emby.Server.Implementations/Sorting/IndexNumberComparer.cs b/Emby.Server.Implementations/Sorting/IndexNumberComparer.cs index e39280a10d..c5b00afb15 100644 --- a/Emby.Server.Implementations/Sorting/IndexNumberComparer.cs +++ b/Emby.Server.Implementations/Sorting/IndexNumberComparer.cs @@ -34,6 +34,11 @@ namespace Emby.Server.Implementations.Sorting throw new ArgumentNullException(nameof(y)); } + if (!x.IndexNumber.HasValue && !y.IndexNumber.HasValue) + { + return 0; + } + if (!x.IndexNumber.HasValue) { return -1; diff --git a/Emby.Server.Implementations/Sorting/ParentIndexNumberComparer.cs b/Emby.Server.Implementations/Sorting/ParentIndexNumberComparer.cs index ffc4e0cad8..8c408bb4d2 100644 --- a/Emby.Server.Implementations/Sorting/ParentIndexNumberComparer.cs +++ b/Emby.Server.Implementations/Sorting/ParentIndexNumberComparer.cs @@ -34,6 +34,11 @@ namespace Emby.Server.Implementations.Sorting throw new ArgumentNullException(nameof(y)); } + if (!x.ParentIndexNumber.HasValue && !y.ParentIndexNumber.HasValue) + { + return 0; + } + if (!x.ParentIndexNumber.HasValue) { return -1; diff --git a/tests/Jellyfin.Server.Implementations.Tests/Sorting/IndexNumberComparerTests.cs b/tests/Jellyfin.Server.Implementations.Tests/Sorting/IndexNumberComparerTests.cs new file mode 100644 index 0000000000..1641618008 --- /dev/null +++ b/tests/Jellyfin.Server.Implementations.Tests/Sorting/IndexNumberComparerTests.cs @@ -0,0 +1,49 @@ +using System; +using Emby.Server.Implementations.Sorting; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Sorting; +using Xunit; + +namespace Jellyfin.Server.Implementations.Tests.Sorting; + +public class IndexNumberComparerTests +{ + private readonly IBaseItemComparer _cmp = new IndexNumberComparer(); + + private static TheoryData Compare_GivenNull_ThrowsArgumentNullException_TestData() + => new() + { + { null, new Audio() }, + { new Audio(), null } + }; + + [Theory] + [MemberData(nameof(Compare_GivenNull_ThrowsArgumentNullException_TestData))] + public void Compare_GivenNull_ThrowsArgumentNullException(BaseItem? x, BaseItem? y) + { + Assert.Throws(() => _cmp.Compare(x, y)); + } + + [Theory] + [InlineData(null, null, 0)] + [InlineData(0, null, 1)] + [InlineData(null, 0, -1)] + [InlineData(1, 1, 0)] + [InlineData(0, 1, -1)] + [InlineData(1, 0, 1)] + public void Compare_ValidIndices_SortsExpected(int? index1, int? index2, int expected) + { + BaseItem x = new Audio + { + IndexNumber = index1 + }; + BaseItem y = new Audio + { + IndexNumber = index2 + }; + + Assert.Equal(expected, _cmp.Compare(x, y)); + Assert.Equal(-expected, _cmp.Compare(y, x)); + } +} diff --git a/tests/Jellyfin.Server.Implementations.Tests/Sorting/ParentIndexNumberComparerTests.cs b/tests/Jellyfin.Server.Implementations.Tests/Sorting/ParentIndexNumberComparerTests.cs new file mode 100644 index 0000000000..7649e4df46 --- /dev/null +++ b/tests/Jellyfin.Server.Implementations.Tests/Sorting/ParentIndexNumberComparerTests.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using Emby.Server.Implementations.Sorting; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Sorting; +using Xunit; + +namespace Jellyfin.Server.Implementations.Tests.Sorting; + +public class ParentIndexNumberComparerTests +{ + private readonly IBaseItemComparer _cmp = new ParentIndexNumberComparer(); + + private static TheoryData Compare_GivenNull_ThrowsArgumentNullException_TestData() + => new() + { + { null, new Audio() }, + { new Audio(), null } + }; + + [Theory] + [MemberData(nameof(Compare_GivenNull_ThrowsArgumentNullException_TestData))] + public void Compare_GivenNull_ThrowsArgumentNullException(BaseItem? x, BaseItem? y) + { + Assert.Throws(() => _cmp.Compare(x, y)); + } + + [Theory] + [InlineData(null, null, 0)] + [InlineData(0, null, 1)] + [InlineData(null, 0, -1)] + [InlineData(1, 1, 0)] + [InlineData(0, 1, -1)] + [InlineData(1, 0, 1)] + public void Compare_ValidIndices_SortsExpected(int? parentIndex1, int? parentIndex2, int expected) + { + BaseItem x = new Audio + { + ParentIndexNumber = parentIndex1 + }; + BaseItem y = new Audio + { + ParentIndexNumber = parentIndex2 + }; + + Assert.Equal(expected, _cmp.Compare(x, y)); + Assert.Equal(-expected, _cmp.Compare(y, x)); + } +}