From 1d67746d32e43eae2e5cd1946ed116415e260da7 Mon Sep 17 00:00:00 2001 From: Aergwyn Date: Sat, 23 Dec 2017 12:53:11 +0100 Subject: [PATCH] fix crash in SongSelect when traversing while zero beatmaps are loaded --- .../Visual/TestCaseBeatmapCarousel.cs | 19 ++++++++++++++++++- osu.Game/Screens/Select/BeatmapCarousel.cs | 3 +++ 2 files changed, 21 insertions(+), 1 deletion(-) 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;