mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 13:22:55 +08:00
Merge pull request #14723 from bdach/editor-test-scenes-through-loader
Integrate `EditorLoader` into `EditorTestScene`
This commit is contained in:
commit
901a632494
@ -7,28 +7,19 @@ using NUnit.Framework;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Graphics.UserInterface;
|
|
||||||
using osu.Game.Overlays.Dialog;
|
using osu.Game.Overlays.Dialog;
|
||||||
|
using osu.Game.Rulesets;
|
||||||
|
using osu.Game.Rulesets.Osu;
|
||||||
using osu.Game.Screens.Edit;
|
using osu.Game.Screens.Edit;
|
||||||
using osu.Game.Screens.Edit.Components.Menus;
|
|
||||||
using osu.Game.Screens.Menu;
|
|
||||||
using osu.Game.Tests.Beatmaps.IO;
|
using osu.Game.Tests.Beatmaps.IO;
|
||||||
using osuTK.Input;
|
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual.Editing
|
namespace osu.Game.Tests.Visual.Editing
|
||||||
{
|
{
|
||||||
public class TestSceneDifficultySwitching : ScreenTestScene
|
public class TestSceneDifficultySwitching : EditorTestScene
|
||||||
{
|
{
|
||||||
private BeatmapSetInfo importedBeatmapSet;
|
protected override Ruleset CreateEditorRuleset() => new OsuRuleset();
|
||||||
private Editor editor;
|
|
||||||
|
|
||||||
// required for screen transitions to work properly
|
protected override bool IsolateSavingFromDatabase => false;
|
||||||
// (see comment in EditorLoader.LogoArriving).
|
|
||||||
[Cached]
|
|
||||||
private OsuLogo logo = new OsuLogo
|
|
||||||
{
|
|
||||||
Alpha = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private OsuGameBase game { get; set; }
|
private OsuGameBase game { get; set; }
|
||||||
@ -36,20 +27,18 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private BeatmapManager beatmaps { get; set; }
|
private BeatmapManager beatmaps { get; set; }
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
private BeatmapSetInfo importedBeatmapSet;
|
||||||
private void load() => Add(logo);
|
|
||||||
|
|
||||||
[SetUpSteps]
|
public override void SetUpSteps()
|
||||||
public void SetUp()
|
|
||||||
{
|
{
|
||||||
AddStep("import test beatmap", () => importedBeatmapSet = ImportBeatmapTest.LoadOszIntoOsu(game, virtualTrack: true).Result);
|
AddStep("import test beatmap", () => importedBeatmapSet = ImportBeatmapTest.LoadOszIntoOsu(game, virtualTrack: true).Result);
|
||||||
|
base.SetUpSteps();
|
||||||
|
}
|
||||||
|
|
||||||
AddStep("set current beatmap", () => Beatmap.Value = beatmaps.GetWorkingBeatmap(importedBeatmapSet.Beatmaps.First()));
|
protected override void LoadEditor()
|
||||||
AddStep("push loader", () => Stack.Push(new EditorLoader()));
|
{
|
||||||
|
Beatmap.Value = beatmaps.GetWorkingBeatmap(importedBeatmapSet.Beatmaps.First());
|
||||||
AddUntilStep("wait for editor push", () => Stack.CurrentScreen is Editor);
|
base.LoadEditor();
|
||||||
AddStep("store editor", () => editor = (Editor)Stack.CurrentScreen);
|
|
||||||
AddUntilStep("wait for editor to load", () => editor.IsLoaded);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@ -72,11 +61,7 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
BeatmapInfo targetDifficulty = null;
|
BeatmapInfo targetDifficulty = null;
|
||||||
PromptForSaveDialog saveDialog = null;
|
PromptForSaveDialog saveDialog = null;
|
||||||
|
|
||||||
AddStep("remove first hitobject", () =>
|
AddStep("remove first hitobject", () => EditorBeatmap.RemoveAt(0));
|
||||||
{
|
|
||||||
var editorBeatmap = editor.ChildrenOfType<EditorBeatmap>().Single();
|
|
||||||
editorBeatmap.RemoveAt(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
AddStep("set target difficulty", () => targetDifficulty = importedBeatmapSet.Beatmaps.Last(beatmap => !beatmap.Equals(Beatmap.Value.BeatmapInfo)));
|
AddStep("set target difficulty", () => targetDifficulty = importedBeatmapSet.Beatmaps.Last(beatmap => !beatmap.Equals(Beatmap.Value.BeatmapInfo)));
|
||||||
switchToDifficulty(() => targetDifficulty);
|
switchToDifficulty(() => targetDifficulty);
|
||||||
@ -105,11 +90,7 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
BeatmapInfo targetDifficulty = null;
|
BeatmapInfo targetDifficulty = null;
|
||||||
PromptForSaveDialog saveDialog = null;
|
PromptForSaveDialog saveDialog = null;
|
||||||
|
|
||||||
AddStep("remove first hitobject", () =>
|
AddStep("remove first hitobject", () => EditorBeatmap.RemoveAt(0));
|
||||||
{
|
|
||||||
var editorBeatmap = editor.ChildrenOfType<EditorBeatmap>().Single();
|
|
||||||
editorBeatmap.RemoveAt(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
AddStep("set target difficulty", () => targetDifficulty = importedBeatmapSet.Beatmaps.Last(beatmap => !beatmap.Equals(Beatmap.Value.BeatmapInfo)));
|
AddStep("set target difficulty", () => targetDifficulty = importedBeatmapSet.Beatmaps.Last(beatmap => !beatmap.Equals(Beatmap.Value.BeatmapInfo)));
|
||||||
switchToDifficulty(() => targetDifficulty);
|
switchToDifficulty(() => targetDifficulty);
|
||||||
@ -132,34 +113,7 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
AddAssert("stack empty", () => Stack.CurrentScreen == null);
|
AddAssert("stack empty", () => Stack.CurrentScreen == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchToDifficulty(Func<BeatmapInfo> difficulty)
|
private void switchToDifficulty(Func<BeatmapInfo> difficulty) => AddStep("switch to difficulty", () => Editor.SwitchToDifficulty(difficulty.Invoke()));
|
||||||
{
|
|
||||||
AddUntilStep("wait for menubar to load", () => editor.ChildrenOfType<EditorMenuBar>().Any());
|
|
||||||
AddStep("open file menu", () =>
|
|
||||||
{
|
|
||||||
var menuBar = editor.ChildrenOfType<EditorMenuBar>().Single();
|
|
||||||
var fileMenu = menuBar.ChildrenOfType<DrawableOsuMenuItem>().First();
|
|
||||||
InputManager.MoveMouseTo(fileMenu);
|
|
||||||
InputManager.Click(MouseButton.Left);
|
|
||||||
});
|
|
||||||
|
|
||||||
AddStep("open difficulty menu", () =>
|
|
||||||
{
|
|
||||||
var difficultySelector =
|
|
||||||
editor.ChildrenOfType<DrawableOsuMenuItem>().Single(item => item.Item.Text.Value.ToString().Contains("Change difficulty"));
|
|
||||||
InputManager.MoveMouseTo(difficultySelector);
|
|
||||||
});
|
|
||||||
AddWaitStep("wait for open", 3);
|
|
||||||
|
|
||||||
AddStep("switch to target difficulty", () =>
|
|
||||||
{
|
|
||||||
var difficultyMenuItem =
|
|
||||||
editor.ChildrenOfType<DrawableOsuMenuItem>()
|
|
||||||
.Last(item => item.Item is DifficultyMenuItem difficultyItem && difficultyItem.Beatmap.Equals(difficulty.Invoke()));
|
|
||||||
InputManager.MoveMouseTo(difficultyMenuItem);
|
|
||||||
InputManager.Click(MouseButton.Left);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void confirmEditingBeatmap(Func<BeatmapInfo> targetDifficulty)
|
private void confirmEditingBeatmap(Func<BeatmapInfo> targetDifficulty)
|
||||||
{
|
{
|
||||||
|
@ -11,6 +11,7 @@ using osu.Framework.Testing;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
|
using osu.Game.Screens.Edit;
|
||||||
using osu.Game.Screens.Edit.Setup;
|
using osu.Game.Screens.Edit.Setup;
|
||||||
using osu.Game.Tests.Resources;
|
using osu.Game.Tests.Resources;
|
||||||
using SharpCompress.Archives;
|
using SharpCompress.Archives;
|
||||||
@ -55,6 +56,9 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
[Test]
|
[Test]
|
||||||
public void TestExitWithoutSave()
|
public void TestExitWithoutSave()
|
||||||
{
|
{
|
||||||
|
EditorBeatmap editorBeatmap = null;
|
||||||
|
|
||||||
|
AddStep("store editor beatmap", () => editorBeatmap = EditorBeatmap);
|
||||||
AddStep("exit without save", () =>
|
AddStep("exit without save", () =>
|
||||||
{
|
{
|
||||||
Editor.Exit();
|
Editor.Exit();
|
||||||
@ -62,7 +66,7 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
});
|
});
|
||||||
|
|
||||||
AddUntilStep("wait for exit", () => !Editor.IsCurrentScreen());
|
AddUntilStep("wait for exit", () => !Editor.IsCurrentScreen());
|
||||||
AddAssert("new beatmap not persisted", () => beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID)?.DeletePending == true);
|
AddAssert("new beatmap not persisted", () => beatmapManager.QueryBeatmapSet(s => s.ID == editorBeatmap.BeatmapInfo.BeatmapSet.ID)?.DeletePending == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -737,10 +737,10 @@ namespace osu.Game.Screens.Edit
|
|||||||
private DifficultyMenuItem createDifficultyMenuItem(BeatmapInfo beatmapInfo)
|
private DifficultyMenuItem createDifficultyMenuItem(BeatmapInfo beatmapInfo)
|
||||||
{
|
{
|
||||||
bool isCurrentDifficulty = playableBeatmap.BeatmapInfo.Equals(beatmapInfo);
|
bool isCurrentDifficulty = playableBeatmap.BeatmapInfo.Equals(beatmapInfo);
|
||||||
return new DifficultyMenuItem(beatmapInfo, isCurrentDifficulty, switchToDifficulty);
|
return new DifficultyMenuItem(beatmapInfo, isCurrentDifficulty, SwitchToDifficulty);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchToDifficulty(BeatmapInfo beatmapInfo) => loader?.ScheduleDifficultySwitch(beatmapInfo);
|
protected void SwitchToDifficulty(BeatmapInfo beatmapInfo) => loader?.ScheduleDifficultySwitch(beatmapInfo);
|
||||||
|
|
||||||
private void cancelExit() => loader?.CancelPendingDifficultySwitch();
|
private void cancelExit() => loader?.CancelPendingDifficultySwitch();
|
||||||
|
|
||||||
|
@ -34,6 +34,20 @@ namespace osu.Game.Screens.Edit
|
|||||||
[CanBeNull]
|
[CanBeNull]
|
||||||
private ScheduledDelegate scheduledDifficultySwitch;
|
private ScheduledDelegate scheduledDifficultySwitch;
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
AddRangeInternal(new Drawable[]
|
||||||
|
{
|
||||||
|
new LoadingSpinner(true)
|
||||||
|
{
|
||||||
|
State = { Value = Visibility.Visible },
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual Editor CreateEditor() => new Editor(this);
|
||||||
|
|
||||||
protected override void LogoArriving(OsuLogo logo, bool resuming)
|
protected override void LogoArriving(OsuLogo logo, bool resuming)
|
||||||
{
|
{
|
||||||
base.LogoArriving(logo, resuming);
|
base.LogoArriving(logo, resuming);
|
||||||
@ -47,18 +61,6 @@ namespace osu.Game.Screens.Edit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
|
||||||
private void load()
|
|
||||||
{
|
|
||||||
AddRangeInternal(new Drawable[]
|
|
||||||
{
|
|
||||||
new LoadingSpinner(true)
|
|
||||||
{
|
|
||||||
State = { Value = Visibility.Visible },
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ScheduleDifficultySwitch(BeatmapInfo beatmapInfo)
|
public void ScheduleDifficultySwitch(BeatmapInfo beatmapInfo)
|
||||||
{
|
{
|
||||||
scheduledDifficultySwitch?.Cancel();
|
scheduledDifficultySwitch?.Cancel();
|
||||||
@ -81,7 +83,7 @@ namespace osu.Game.Screens.Edit
|
|||||||
|
|
||||||
private void pushEditor()
|
private void pushEditor()
|
||||||
{
|
{
|
||||||
this.Push(new Editor(this));
|
this.Push(CreateEditor());
|
||||||
ValidForResume = false;
|
ValidForResume = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,26 +16,38 @@ using osu.Game.Rulesets;
|
|||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osu.Game.Screens.Edit;
|
using osu.Game.Screens.Edit;
|
||||||
using osu.Game.Screens.Edit.Compose.Components.Timeline;
|
using osu.Game.Screens.Edit.Compose.Components.Timeline;
|
||||||
|
using osu.Game.Screens.Menu;
|
||||||
using osu.Game.Skinning;
|
using osu.Game.Skinning;
|
||||||
|
|
||||||
namespace osu.Game.Tests.Visual
|
namespace osu.Game.Tests.Visual
|
||||||
{
|
{
|
||||||
public abstract class EditorTestScene : ScreenTestScene
|
public abstract class EditorTestScene : ScreenTestScene
|
||||||
{
|
{
|
||||||
protected EditorBeatmap EditorBeatmap;
|
private TestEditorLoader editorLoader;
|
||||||
|
|
||||||
protected TestEditor Editor { get; private set; }
|
protected TestEditor Editor => editorLoader.Editor;
|
||||||
|
|
||||||
protected EditorClock EditorClock { get; private set; }
|
protected EditorBeatmap EditorBeatmap => Editor.ChildrenOfType<EditorBeatmap>().Single();
|
||||||
|
protected EditorClock EditorClock => Editor.ChildrenOfType<EditorClock>().Single();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether any saves performed by the editor should be isolate (and not persist) to the underlying <see cref="BeatmapManager"/>.
|
/// Whether any saves performed by the editor should be isolate (and not persist) to the underlying <see cref="BeatmapManager"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual bool IsolateSavingFromDatabase => true;
|
protected virtual bool IsolateSavingFromDatabase => true;
|
||||||
|
|
||||||
|
// required for screen transitions to work properly
|
||||||
|
// (see comment in EditorLoader.LogoArriving).
|
||||||
|
[Cached]
|
||||||
|
private OsuLogo logo = new OsuLogo
|
||||||
|
{
|
||||||
|
Alpha = 0
|
||||||
|
};
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(GameHost host, AudioManager audio, RulesetStore rulesets)
|
private void load(GameHost host, AudioManager audio, RulesetStore rulesets)
|
||||||
{
|
{
|
||||||
|
Add(logo);
|
||||||
|
|
||||||
var working = CreateWorkingBeatmap(Ruleset.Value);
|
var working = CreateWorkingBeatmap(Ruleset.Value);
|
||||||
|
|
||||||
Beatmap.Value = working;
|
Beatmap.Value = working;
|
||||||
@ -53,13 +65,11 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
AddStep("load editor", LoadEditor);
|
AddStep("load editor", LoadEditor);
|
||||||
AddUntilStep("wait for editor to load", () => EditorComponentsReady);
|
AddUntilStep("wait for editor to load", () => EditorComponentsReady);
|
||||||
AddStep("get beatmap", () => EditorBeatmap = Editor.ChildrenOfType<EditorBeatmap>().Single());
|
|
||||||
AddStep("get clock", () => EditorClock = Editor.ChildrenOfType<EditorClock>().Single());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void LoadEditor()
|
protected virtual void LoadEditor()
|
||||||
{
|
{
|
||||||
LoadScreen(Editor = CreateEditor());
|
LoadScreen(editorLoader = new TestEditorLoader());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -70,7 +80,14 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
protected sealed override Ruleset CreateRuleset() => CreateEditorRuleset();
|
protected sealed override Ruleset CreateRuleset() => CreateEditorRuleset();
|
||||||
|
|
||||||
protected virtual TestEditor CreateEditor() => new TestEditor();
|
protected class TestEditorLoader : EditorLoader
|
||||||
|
{
|
||||||
|
public TestEditor Editor { get; private set; }
|
||||||
|
|
||||||
|
protected sealed override Editor CreateEditor() => Editor = CreateTestEditor(this);
|
||||||
|
|
||||||
|
protected virtual TestEditor CreateTestEditor(EditorLoader loader) => new TestEditor(loader);
|
||||||
|
}
|
||||||
|
|
||||||
protected class TestEditor : Editor
|
protected class TestEditor : Editor
|
||||||
{
|
{
|
||||||
@ -86,7 +103,14 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
public new void Paste() => base.Paste();
|
public new void Paste() => base.Paste();
|
||||||
|
|
||||||
|
public new void SwitchToDifficulty(BeatmapInfo beatmapInfo) => base.SwitchToDifficulty(beatmapInfo);
|
||||||
|
|
||||||
public new bool HasUnsavedChanges => base.HasUnsavedChanges;
|
public new bool HasUnsavedChanges => base.HasUnsavedChanges;
|
||||||
|
|
||||||
|
public TestEditor(EditorLoader loader = null)
|
||||||
|
: base(loader)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class TestBeatmapManager : BeatmapManager
|
private class TestBeatmapManager : BeatmapManager
|
||||||
|
Loading…
Reference in New Issue
Block a user