osu/osu.Game/Tests/Visual/OsuGameTestScene.cs

162 lines
5.2 KiB
C#
Raw Normal View History

// 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.
2020-01-30 14:45:15 +00:00
using System;
using System.Collections.Generic;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
2021-08-06 19:36:40 +00:00
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Platform;
using osu.Framework.Screens;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Configuration;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.API;
using osu.Game.Overlays;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
2020-06-15 11:32:27 +00:00
using osu.Game.Scoring;
using osu.Game.Screens;
using osu.Game.Screens.Menu;
using osuTK.Graphics;
namespace osu.Game.Tests.Visual
{
/// <summary>
/// A scene which tests full game flow.
/// </summary>
public abstract class OsuGameTestScene : OsuManualInputManagerTestScene
{
protected TestOsuGame Game;
protected override bool UseFreshStoragePerRun => true;
protected override bool CreateNestedActionContainer => false;
[BackgroundDependencyLoader]
private void load()
{
Child = new Box
{
RelativeSizeAxes = Axes.Both,
Colour = Color4.Black,
};
}
[SetUpSteps]
2020-11-11 06:58:43 +00:00
public virtual void SetUpSteps()
{
AddStep("Create new game instance", () =>
{
if (Game?.Parent != null)
{
Remove(Game);
Game.Dispose();
}
RecycleLocalStorage(false);
2020-03-05 05:46:07 +00:00
CreateGame();
});
AddUntilStep("Wait for load", () => Game.IsLoaded);
AddUntilStep("Wait for intro", () => Game.ScreenStack.CurrentScreen is IntroScreen);
ConfirmAtMainMenu();
}
[TearDownSteps]
public void TearDownSteps()
{
AddStep("exit game", () => Game.Exit());
AddUntilStep("wait for game exit", () => Game.Parent == null);
}
2020-03-05 05:46:07 +00:00
protected void CreateGame()
{
AddGame(Game = new TestOsuGame(LocalStorage, API));
2020-03-05 05:46:07 +00:00
}
2020-01-30 14:45:15 +00:00
protected void PushAndConfirm(Func<Screen> newScreen)
{
Screen screen = null;
IScreen previousScreen = null;
AddStep("Push new screen", () =>
{
previousScreen = Game.ScreenStack.CurrentScreen;
Game.ScreenStack.Push(screen = newScreen());
});
AddUntilStep("Wait for new screen", () => screen.IsLoaded
&& Game.ScreenStack.CurrentScreen != previousScreen
&& previousScreen.GetChildScreen() == screen);
2020-01-30 14:45:15 +00:00
}
protected void ConfirmAtMainMenu() => AddUntilStep("Wait for main menu", () => Game.ScreenStack.CurrentScreen is MainMenu menu && menu.IsLoaded);
public class TestOsuGame : OsuGame
{
public new const float SIDE_OVERLAY_OFFSET_RATIO = OsuGame.SIDE_OVERLAY_OFFSET_RATIO;
public new ScreenStack ScreenStack => base.ScreenStack;
public new BackButton BackButton => base.BackButton;
public new BeatmapManager BeatmapManager => base.BeatmapManager;
2020-06-15 11:32:27 +00:00
public new ScoreManager ScoreManager => base.ScoreManager;
2021-08-06 19:36:40 +00:00
public new Container ScreenOffsetContainer => base.ScreenOffsetContainer;
public new SettingsOverlay Settings => base.Settings;
public new NotificationOverlay Notifications => base.Notifications;
2020-03-05 08:12:14 +00:00
public new MusicController MusicController => base.MusicController;
public new OsuConfigManager LocalConfig => base.LocalConfig;
public new Bindable<WorkingBeatmap> Beatmap => base.Beatmap;
public new Bindable<RulesetInfo> Ruleset => base.Ruleset;
public new Bindable<IReadOnlyList<Mod>> SelectedMods => base.SelectedMods;
2020-03-05 06:40:48 +00:00
// if we don't do this, when running under nUnit the version that gets populated is that of nUnit.
2020-03-05 05:46:07 +00:00
public override string Version => "test game";
protected override Loader CreateLoader() => new TestLoader();
2020-01-30 14:45:15 +00:00
public new void PerformFromScreen(Action<IScreen> action, IEnumerable<Type> validScreens = null) => base.PerformFromScreen(action, validScreens);
public TestOsuGame(Storage storage, IAPIProvider api)
{
Storage = storage;
API = api;
}
protected override void LoadComplete()
{
base.LoadComplete();
API.Login("Rhythm Champion", "osu!");
Dependencies.Get<SessionStatics>().SetValue(Static.MutedAudioNotificationShownOnce, true);
}
}
public class TestLoader : Loader
{
protected override ShaderPrecompiler CreateShaderPrecompiler() => new TestShaderPrecompiler();
private class TestShaderPrecompiler : ShaderPrecompiler
{
protected override bool AllLoaded => true;
}
}
}
}