Files
Ez2Lazer/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapCarouselRandom.cs
Dean Herbert c28c64940a Move v2 files to final location
This contains only renames and namespace updates.
2026-03-03 16:45:15 +09:00

360 lines
11 KiB
C#

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System.Linq;
using NUnit.Framework;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Screens.Select;
using osu.Game.Screens.Select.Filter;
namespace osu.Game.Tests.Visual.SongSelect
{
[TestFixture]
public partial class TestSceneBeatmapCarouselRandom : BeatmapCarouselTestScene
{
[SetUpSteps]
public void SetUpSteps()
{
RemoveAllBeatmaps();
CreateCarousel();
}
[Test]
public void TestRandomObeysFiltering()
{
AddBeatmaps(2, 10, true);
ApplyToFilterAndWaitForFilter("filter", c => c.SearchText = BeatmapSets[0].Beatmaps.Last().DifficultyName);
CheckDisplayedBeatmapSetsCount(1);
CheckDisplayedBeatmapsCount(1);
for (int i = 0; i < 10; i++)
{
nextRandom();
WaitForSetSelection(0, 9);
}
}
[Test]
public void TestGroupingModeChangeStillWorks()
{
BeatmapInfo originalSelected = null!;
GroupDefinition? expanded = null;
SortAndGroupBy(SortMode.Artist, GroupMode.Artist);
AddBeatmaps(10, 3, true);
WaitForDrawablePanels();
nextRandom();
ensureRandomDidNotRepeat();
AddStep("store selection", () => originalSelected = Carousel.CurrentBeatmap!);
SortAndGroupBy(SortMode.Artist, GroupMode.Difficulty);
WaitForFiltering();
AddAssert("selection not changed", () => Carousel.CurrentBeatmap, () => Is.EqualTo(originalSelected));
storeExpandedGroup();
for (int i = 0; i < 5; i++)
{
nextRandom();
ensureRandomDidNotRepeat();
checkExpandedGroupUnchanged();
}
SortAndGroupBy(SortMode.Artist, GroupMode.None);
WaitForFiltering();
for (int i = 0; i < 5; i++)
{
nextRandom();
ensureRandomDidNotRepeat();
}
void storeExpandedGroup() => AddStep("store open group", () => expanded = Carousel.ExpandedGroup);
void checkExpandedGroupUnchanged() => AddAssert("expanded did not change", () => Carousel.ExpandedGroup, () => Is.EqualTo(expanded));
}
/// <summary>
/// Test random non-repeating algorithm
/// </summary>
[Test]
public void TestRandomArtistGrouping()
{
SortAndGroupBy(SortMode.Artist, GroupMode.Artist);
AddBeatmaps(10, 3, true);
WaitForDrawablePanels();
GroupDefinition? expanded = null;
for (int i = 0; i < 2; i++)
{
nextRandom();
expanded ??= storeExpandedGroup();
ensureSetRandomDidNotRepeat();
checkExpandedGroupUnchanged();
}
nextRandom();
ensureSetRandomDidRepeat();
checkExpandedGroupUnchanged();
prevRandomSet();
checkRewindCorrectSet();
checkExpandedGroupUnchanged();
prevRandomSet();
checkRewindCorrectSet();
checkExpandedGroupUnchanged();
nextRandom();
ensureSetRandomDidNotRepeat();
checkExpandedGroupUnchanged();
nextRandom();
ensureSetRandomDidRepeat();
checkExpandedGroupUnchanged();
GroupDefinition? storeExpandedGroup()
{
AddStep("store open group", () => expanded = Carousel.ExpandedGroup);
return null;
}
void checkExpandedGroupUnchanged() => AddAssert("expanded did not change", () => Carousel.ExpandedGroup, () => Is.EqualTo(expanded));
}
/// <summary>
/// Test random non-repeating algorithm
/// </summary>
[Test]
public void TestRandomDifficultyGroupingRewindsCorrectly()
{
SortAndGroupBy(SortMode.Difficulty, GroupMode.Difficulty);
AddBeatmaps(3, 3, true);
WaitForDrawablePanels();
GroupDefinition? expanded = null;
for (int i = 0; i < 3; i++)
{
nextRandom();
expanded ??= storeExpandedGroup();
ensureRandomDidNotRepeat();
checkExpandedGroupUnchanged();
}
for (int i = 0; i < 2; i++)
{
prevRandom();
checkRewindCorrect();
checkExpandedGroupUnchanged();
}
for (int i = 0; i < 2; i++)
{
nextRandom();
ensureRandomDidNotRepeat();
checkExpandedGroupUnchanged();
}
nextRandom();
ensureRandomDidRepeat();
checkExpandedGroupUnchanged();
GroupDefinition? storeExpandedGroup()
{
AddStep("store open group", () => expanded = Carousel.ExpandedGroup);
return null;
}
void checkExpandedGroupUnchanged() => AddAssert("expanded did not change", () => Carousel.ExpandedGroup, () => Is.EqualTo(expanded));
}
/// <summary>
/// Test random non-repeating algorithm
/// </summary>
[Test]
public void TestRandomDifficultyGroupingRepeatsWhenExhausted()
{
SortAndGroupBy(SortMode.Difficulty, GroupMode.Difficulty);
AddBeatmaps(3, 3, true);
WaitForDrawablePanels();
GroupDefinition? expanded = null;
for (int i = 0; i < 3; i++)
{
nextRandom();
expanded ??= storeExpandedGroup();
ensureRandomDidNotRepeat();
checkExpandedGroupUnchanged();
}
for (int i = 0; i < 3; i++)
{
nextRandom();
ensureRandomDidRepeat();
}
for (int i = 0; i < 5; i++)
{
prevRandom();
checkRewindCorrect();
checkExpandedGroupUnchanged();
}
nextRandom();
checkExpandedGroupUnchanged();
// can't assert repeat or otherwise as we went through multiple permutations.
GroupDefinition? storeExpandedGroup()
{
AddStep("store open group", () => expanded = Carousel.ExpandedGroup);
return null;
}
void checkExpandedGroupUnchanged() => AddAssert("expanded did not change", () => Carousel.ExpandedGroup, () => Is.EqualTo(expanded));
}
[Test]
public void TestRewindOverMultipleIterations()
{
const int local_set_count = 3;
const int random_select_count = local_set_count * 3;
AddBeatmaps(local_set_count, 3, true);
WaitForDrawablePanels();
SelectNextSet();
for (int i = 0; i < random_select_count; i++)
nextRandom();
for (int i = 0; i < random_select_count; i++)
{
prevRandomSet();
checkRewindCorrectSet();
}
}
[Test]
public void TestRewindOverGroupingModeChange()
{
const int local_set_count = 3;
SortAndGroupBy(SortMode.Artist, GroupMode.Artist);
AddBeatmaps(local_set_count, 3);
WaitForDrawablePanels();
SelectNextSet();
for (int i = 0; i < local_set_count; i++)
nextRandom();
SortAndGroupBy(SortMode.Title, GroupMode.LastPlayed);
WaitForDrawablePanels();
for (int i = 0; i < local_set_count; i++)
{
prevRandomSet();
checkRewindCorrectSet();
}
}
[Test]
public void TestRandomThenRewindSameFrame()
{
AddBeatmaps(10, 3, true);
WaitForDrawablePanels();
GroupedBeatmap? originalSelected = null;
nextRandom();
CheckHasSelection();
AddStep("store selection", () => originalSelected = Carousel.CurrentGroupedBeatmap!);
AddStep("random then rewind", () =>
{
Carousel.NextRandom();
Carousel.PreviousRandom();
});
AddAssert("selection not changed", () => Carousel.CurrentGroupedBeatmap, () => Is.EqualTo(originalSelected));
}
[Test]
public void TestRewindToDeletedBeatmap()
{
AddBeatmaps(10, 3, true);
WaitForDrawablePanels();
GroupedBeatmap? originalSelected = null;
GroupedBeatmap? postRandomSelection = null;
nextRandom();
CheckHasSelection();
AddStep("store selection", () => originalSelected = Carousel.CurrentGroupedBeatmap!);
nextRandom();
AddStep("store selection", () => postRandomSelection = Carousel.CurrentGroupedBeatmap!);
AddAssert("selection changed", () => originalSelected, () => Is.Not.SameAs(postRandomSelection));
AddStep("delete previous selection beatmaps", () => BeatmapSets.Remove(originalSelected!.Beatmap.BeatmapSet!));
WaitForFiltering();
AddAssert("selection not changed", () => Carousel.CurrentGroupedBeatmap, () => Is.EqualTo(postRandomSelection));
prevRandomSet();
AddAssert("selection not changed", () => Carousel.CurrentGroupedBeatmap, () => Is.EqualTo(postRandomSelection));
}
private void nextRandom() =>
AddStep("select random next", () => Carousel.NextRandom());
private void ensureRandomDidRepeat() =>
AddAssert("did repeat", () => BeatmapRequestedSelections.Distinct().Count(), () => Is.LessThan(BeatmapRequestedSelections.Count));
private void ensureRandomDidNotRepeat() =>
AddAssert("no repeats", () => BeatmapRequestedSelections.Distinct().Count(), () => Is.EqualTo(BeatmapRequestedSelections.Count));
private void ensureSetRandomDidRepeat() =>
AddAssert("did repeat", () => BeatmapSetRequestedSelections.Distinct().Count(), () => Is.LessThan(BeatmapSetRequestedSelections.Count));
private void ensureSetRandomDidNotRepeat() =>
AddAssert("no repeats", () => BeatmapSetRequestedSelections.Distinct().Count(), () => Is.EqualTo(BeatmapSetRequestedSelections.Count));
private void checkRewindCorrect() =>
AddAssert("rewind matched expected beatmap", () => BeatmapRequestedSelections.Peek(), () => Is.EqualTo(Carousel.SelectedBeatmapInfo));
private void checkRewindCorrectSet() =>
AddAssert("rewind matched expected set", () => BeatmapSetRequestedSelections.Peek(), () => Is.EqualTo(Carousel.SelectedBeatmapSet));
private void prevRandom() => AddStep("select last random", () =>
{
Carousel.PreviousRandom();
BeatmapRequestedSelections.Pop();
// Pop twice because the PreviousRandom call also requests selection.
BeatmapRequestedSelections.Pop();
});
private void prevRandomSet() => AddStep("select last random set", () =>
{
Carousel.PreviousRandom();
BeatmapSetRequestedSelections.Pop();
});
}
}