diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs
index e658d87497..65ce0429fc 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarousel.cs
@@ -613,50 +613,6 @@ namespace osu.Game.Tests.Visual.SongSelect
AddAssert("Items remain in descending added order", () => carousel.BeatmapSets.Select(s => s.DateAdded), () => Is.Ordered.Descending);
}
- ///
- /// Ensures stability is maintained on different sort modes for items with equal properties.
- ///
- [Test]
- public void TestSortingStabilityOnlineID()
- {
- var sets = new List();
- int idOffset = 0;
-
- AddStep("Populuate beatmap sets", () =>
- {
- sets.Clear();
-
- for (int i = 0; i < 10; i++)
- {
- var set = TestResources.CreateTestBeatmapSetInfo();
-
- // only need to set the first as they are a shared reference.
- var beatmap = set.Beatmaps.First();
-
- beatmap.Metadata.Artist = $"artist {i / 2}";
- beatmap.Metadata.Title = $"title {9 - i}";
-
- // testing the case where DateAdded happens to equal (quite rare).
- set.DateAdded = DateTimeOffset.UnixEpoch;
-
- sets.Add(set);
- }
-
- idOffset = sets.First().OnlineID;
- });
-
- loadBeatmaps(sets);
-
- AddStep("Sort by artist", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Artist }, false));
- AddAssert("Items remain in original order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == idOffset + index).All(b => b));
-
- AddStep("Sort by title", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Title }, false));
- AddAssert("Items are in reverse order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == idOffset + sets.Count - index - 1).All(b => b));
-
- AddStep("Sort by artist", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Artist }, false));
- AddAssert("Items reset to original order", () => carousel.BeatmapSets.Select((set, index) => set.OnlineID == idOffset + index).All(b => b));
- }
-
///
/// Ensures stability is maintained on different sort modes while a new item is added to the carousel.
///
@@ -664,7 +620,6 @@ namespace osu.Game.Tests.Visual.SongSelect
public void TestSortingStabilityWithRemovedAndReaddedItem()
{
List sets = new List();
- int idOffset = 0;
AddStep("Populuate beatmap sets", () =>
{
@@ -685,28 +640,24 @@ namespace osu.Game.Tests.Visual.SongSelect
sets.Add(set);
}
-
- idOffset = sets.First().OnlineID;
});
+ Guid[] originalOrder = null!;
+
loadBeatmaps(sets);
AddStep("Sort by artist", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Artist }, false));
- assertOriginalOrderMaintained();
+
+ AddAssert("Items in descending added order", () => carousel.BeatmapSets.Select(s => s.DateAdded), () => Is.Ordered.Descending);
+ AddStep("Save order", () => originalOrder = carousel.BeatmapSets.Select(s => s.ID).ToArray());
AddStep("Remove item", () => carousel.RemoveBeatmapSet(sets[1]));
AddStep("Re-add item", () => carousel.UpdateBeatmapSet(sets[1]));
- assertOriginalOrderMaintained();
+ AddAssert("Order didn't change", () => carousel.BeatmapSets.Select(s => s.ID), () => Is.EqualTo(originalOrder));
AddStep("Sort by title", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Title }, false));
- assertOriginalOrderMaintained();
-
- void assertOriginalOrderMaintained()
- {
- AddAssert("Items remain in original order",
- () => carousel.BeatmapSets.Select(s => s.OnlineID), () => Is.EqualTo(carousel.BeatmapSets.Select((set, index) => idOffset + index)));
- }
+ AddAssert("Order didn't change", () => carousel.BeatmapSets.Select(s => s.ID), () => Is.EqualTo(originalOrder));
}
///
@@ -716,7 +667,6 @@ namespace osu.Game.Tests.Visual.SongSelect
public void TestSortingStabilityWithNewItems()
{
List sets = new List();
- int idOffset = 0;
AddStep("Populuate beatmap sets", () =>
{
@@ -737,14 +687,16 @@ namespace osu.Game.Tests.Visual.SongSelect
sets.Add(set);
}
-
- idOffset = sets.First().OnlineID;
});
+ Guid[] originalOrder = null!;
+
loadBeatmaps(sets);
AddStep("Sort by artist", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Artist }, false));
- assertOriginalOrderMaintained();
+
+ AddAssert("Items in descending added order", () => carousel.BeatmapSets.Select(s => s.DateAdded), () => Is.Ordered.Descending);
+ AddStep("Save order", () => originalOrder = carousel.BeatmapSets.Select(s => s.ID).ToArray());
AddStep("Add new item", () =>
{
@@ -756,22 +708,18 @@ namespace osu.Game.Tests.Visual.SongSelect
beatmap.Metadata.Artist = "same artist";
beatmap.Metadata.Title = "same title";
- // testing the case where DateAdded happens to equal (quite rare).
- set.DateAdded = DateTimeOffset.UnixEpoch;
+ set.DateAdded = DateTimeOffset.FromUnixTimeSeconds(1);
carousel.UpdateBeatmapSet(set);
+
+ // add set to expected ordering
+ originalOrder = originalOrder.Prepend(set.ID).ToArray();
});
- assertOriginalOrderMaintained();
+ AddAssert("Order didn't change", () => carousel.BeatmapSets.Select(s => s.ID), () => Is.EqualTo(originalOrder));
AddStep("Sort by title", () => carousel.Filter(new FilterCriteria { Sort = SortMode.Title }, false));
- assertOriginalOrderMaintained();
-
- void assertOriginalOrderMaintained()
- {
- AddAssert("Items remain in original order",
- () => carousel.BeatmapSets.Select(s => s.OnlineID), () => Is.EqualTo(carousel.BeatmapSets.Select((set, index) => idOffset + index)));
- }
+ AddAssert("Order didn't change", () => carousel.BeatmapSets.Select(s => s.ID), () => Is.EqualTo(originalOrder));
}
[Test]
diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
index 7c919d3586..6004c1c04e 100644
--- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
+++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
@@ -121,14 +121,10 @@ namespace osu.Game.Screens.Select.Carousel
if (comparison != 0) return comparison;
- // If the initial sort could not differentiate, attempt to use DateAdded and OnlineID to order sets in a stable fashion.
- // This directionality is a touch arbitrary as while DateAdded puts newer beatmaps first, the OnlineID fallback puts lower IDs first.
- // Can potentially be changed in the future if users actually notice / have preference, but keeping it this way matches historical tests.
-
+ // If the initial sort could not differentiate, attempt to use DateAdded to order sets in a stable fashion.
+ // The directionality of this matches the current SortMode.DateAdded, but we may want to reconsider if that becomes a user decision (ie. asc / desc).
comparison = otherSet.BeatmapSet.DateAdded.CompareTo(BeatmapSet.DateAdded);
- if (comparison != 0) return comparison;
- comparison = BeatmapSet.OnlineID.CompareTo(otherSet.BeatmapSet.OnlineID);
if (comparison != 0) return comparison;
// If no online ID is available, fallback to our internal GUID for stability.