// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; using osu.Framework.Screens; using osu.Game.Beatmaps; using osu.Game.Rulesets; using osu.Game.Rulesets.Mania; using osu.Game.Rulesets.Osu; using osu.Game.Screens.Menu; namespace osu.Game.Tests.Visual.Navigation { public class TestScenePresentBeatmap : OsuGameTestScene { [Test] public void TestFromMainMenu() { var firstImport = importBeatmap(1); var secondimport = importBeatmap(3); presentAndConfirm(firstImport); returnToMenu(); presentAndConfirm(secondimport); returnToMenu(); presentSecondDifficultyAndConfirm(firstImport, 1); returnToMenu(); presentSecondDifficultyAndConfirm(secondimport, 3); } [Test] public void TestFromMainMenuDifferentRuleset() { var firstImport = importBeatmap(1); var secondimport = importBeatmap(3, new ManiaRuleset().RulesetInfo); presentAndConfirm(firstImport); returnToMenu(); presentAndConfirm(secondimport); returnToMenu(); presentSecondDifficultyAndConfirm(firstImport, 1); returnToMenu(); presentSecondDifficultyAndConfirm(secondimport, 3); } [Test] public void TestFromSongSelect() { var firstImport = importBeatmap(1); presentAndConfirm(firstImport); var secondimport = importBeatmap(3); presentAndConfirm(secondimport); presentSecondDifficultyAndConfirm(firstImport, 1); presentSecondDifficultyAndConfirm(secondimport, 3); } [Test] public void TestFromSongSelectDifferentRuleset() { var firstImport = importBeatmap(1); presentAndConfirm(firstImport); var secondimport = importBeatmap(3, new ManiaRuleset().RulesetInfo); presentAndConfirm(secondimport); presentSecondDifficultyAndConfirm(firstImport, 1); presentSecondDifficultyAndConfirm(secondimport, 3); } private void returnToMenu() { AddStep("return to menu", () => Game.ScreenStack.CurrentScreen.Exit()); AddUntilStep("wait for menu", () => Game.ScreenStack.CurrentScreen is MainMenu); } private Func importBeatmap(int i, RulesetInfo ruleset = null) { BeatmapSetInfo imported = null; AddStep($"import beatmap {i}", () => { var difficulty = new BeatmapDifficulty(); var metadata = new BeatmapMetadata { Artist = "SomeArtist", AuthorString = "SomeAuthor", Title = $"import {i}" }; imported = Game.BeatmapManager.Import(new BeatmapSetInfo { Hash = Guid.NewGuid().ToString(), OnlineBeatmapSetID = i, Metadata = metadata, Beatmaps = new List { new BeatmapInfo { OnlineBeatmapID = i * 1024, Metadata = metadata, BaseDifficulty = difficulty, Ruleset = ruleset ?? new OsuRuleset().RulesetInfo }, new BeatmapInfo { OnlineBeatmapID = i * 2048, Metadata = metadata, BaseDifficulty = difficulty, Ruleset = ruleset ?? new OsuRuleset().RulesetInfo }, } }).Result; }); AddAssert($"import {i} succeeded", () => imported != null); return () => imported; } private void presentAndConfirm(Func getImport) { AddStep("present beatmap", () => Game.PresentBeatmap(getImport())); AddUntilStep("wait for song select", () => Game.ScreenStack.CurrentScreen is Screens.Select.SongSelect); AddUntilStep("correct beatmap displayed", () => Game.Beatmap.Value.BeatmapSetInfo.ID == getImport().ID); AddAssert("correct ruleset selected", () => Game.Ruleset.Value.ID == getImport().Beatmaps.First().Ruleset.ID); } private void presentSecondDifficultyAndConfirm(Func getImport, int importedID) { Predicate pred = b => b.OnlineBeatmapID == importedID * 2048; AddStep("present difficulty", () => Game.PresentBeatmap(getImport(), pred)); AddUntilStep("wait for song select", () => Game.ScreenStack.CurrentScreen is Screens.Select.SongSelect); AddUntilStep("correct beatmap displayed", () => Game.Beatmap.Value.BeatmapInfo.OnlineBeatmapID == importedID * 2048); AddAssert("correct ruleset selected", () => Game.Ruleset.Value.ID == getImport().Beatmaps.First().Ruleset.ID); } } }