Browse Source

Merge pull request #7548 from 1337joe/comparer-null-fix

(cherry picked from commit 72aca1519132315a69d9dad53e4840f461e58285)
Signed-off-by: crobibero <cody@robibe.ro>
Cody Robibero 3 years ago
parent
commit
04cac23a11

+ 5 - 0
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;

+ 5 - 0
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;

+ 49 - 0
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<BaseItem?, BaseItem?> 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<ArgumentNullException>(() => _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));
+    }
+}

+ 50 - 0
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<BaseItem?, BaseItem?> 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<ArgumentNullException>(() => _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));
+    }
+}