diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs b/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs index 66af72dad9..639befef74 100644 --- a/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs +++ b/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs @@ -69,6 +69,7 @@ namespace osu.Game.Tests.Visual testSorting(); testRemoveAll(); + testEmptyTraversal(); } private void ensureRandomFetchSuccess() => @@ -103,6 +104,8 @@ namespace osu.Game.Tests.Visual AddAssert($"{count} {(diff ? "diffs" : "sets")} visible", () => carousel.Items.Count(s => (diff ? s.Item is CarouselBeatmap : s.Item is CarouselBeatmapSet) && s.Item.Visible) == count); + private void checkNoSelection() => AddAssert("Selection is null", () => currentSelection == null); + private void nextRandom() => AddStep("select random next", () => { @@ -274,9 +277,23 @@ namespace osu.Game.Tests.Visual return false; }, "Remove all"); - AddAssert("Selection is null", () => currentSelection == null); + checkNoSelection(); } + private void testEmptyTraversal() + { + advanceSelection(direction: 1, diff: false); + checkNoSelection(); + + advanceSelection(direction: 1, diff: true); + checkNoSelection(); + + advanceSelection(direction: -1, diff: false); + checkNoSelection(); + + advanceSelection(direction: -1, diff: true); + checkNoSelection(); + } private BeatmapSetInfo createTestBeatmapSet(int i) { diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index ff1dd95eac..be176c1459 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -181,6 +181,9 @@ namespace osu.Game.Screens.Select /// Whether to skip individual difficulties and only increment over full groups. public void SelectNext(int direction = 1, bool skipDifficulties = true) { + if (!Items.Any()) + return; + int originalIndex = Items.IndexOf(selectedBeatmap?.Drawables.First()); int currentIndex = originalIndex;