mirror of
https://github.com/osukey/osukey.git
synced 2025-05-09 15:47:38 +09:00
Merge pull request #18864 from peppy/fix-realm-audio-track-test-fail
Centralise and harden editor-ready-for-use check
This commit is contained in:
commit
f355c3a3c9
@ -10,7 +10,6 @@ using osu.Framework.Input;
|
|||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Edit;
|
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
using osu.Game.Screens.Edit;
|
using osu.Game.Screens.Edit;
|
||||||
@ -41,10 +40,6 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
|
|
||||||
protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) => new TestBeatmap(ruleset, false);
|
protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) => new TestBeatmap(ruleset, false);
|
||||||
|
|
||||||
private bool editorComponentsReady => editor.ChildrenOfType<HitObjectComposer>().FirstOrDefault()?.IsLoaded == true
|
|
||||||
&& editor.ChildrenOfType<TimelineArea>().FirstOrDefault()?.IsLoaded == true
|
|
||||||
&& editor?.ChildrenOfType<Playfield>().FirstOrDefault()?.IsLoaded == true;
|
|
||||||
|
|
||||||
[TestCase(true)]
|
[TestCase(true)]
|
||||||
[TestCase(false)]
|
[TestCase(false)]
|
||||||
public void TestVelocityChangeSavesCorrectly(bool adjustVelocity)
|
public void TestVelocityChangeSavesCorrectly(bool adjustVelocity)
|
||||||
@ -52,7 +47,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
double? velocity = null;
|
double? velocity = null;
|
||||||
|
|
||||||
AddStep("enter editor", () => Game.ScreenStack.Push(new EditorLoader()));
|
AddStep("enter editor", () => Game.ScreenStack.Push(new EditorLoader()));
|
||||||
AddUntilStep("wait for editor load", () => editorComponentsReady);
|
AddUntilStep("wait for editor load", () => editor?.ReadyForUse == true);
|
||||||
|
|
||||||
AddStep("seek to first control point", () => editorClock.Seek(editorBeatmap.ControlPointInfo.TimingPoints.First().Time));
|
AddStep("seek to first control point", () => editorClock.Seek(editorBeatmap.ControlPointInfo.TimingPoints.First().Time));
|
||||||
AddStep("enter slider placement mode", () => InputManager.Key(Key.Number3));
|
AddStep("enter slider placement mode", () => InputManager.Key(Key.Number3));
|
||||||
@ -91,7 +86,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
AddStep("exit", () => InputManager.Key(Key.Escape));
|
AddStep("exit", () => InputManager.Key(Key.Escape));
|
||||||
|
|
||||||
AddStep("enter editor (again)", () => Game.ScreenStack.Push(new EditorLoader()));
|
AddStep("enter editor (again)", () => Game.ScreenStack.Push(new EditorLoader()));
|
||||||
AddUntilStep("wait for editor load", () => editorComponentsReady);
|
AddUntilStep("wait for editor load", () => editor?.ReadyForUse == true);
|
||||||
|
|
||||||
AddStep("seek to slider", () => editorClock.Seek(slider.StartTime));
|
AddStep("seek to slider", () => editorClock.Seek(slider.StartTime));
|
||||||
AddAssert("slider has correct velocity", () => slider.Velocity == velocity);
|
AddAssert("slider has correct velocity", () => slider.Velocity == velocity);
|
||||||
|
@ -36,8 +36,6 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
{
|
{
|
||||||
protected override Ruleset CreateEditorRuleset() => new OsuRuleset();
|
protected override Ruleset CreateEditorRuleset() => new OsuRuleset();
|
||||||
|
|
||||||
protected override bool EditorComponentsReady => Editor.ChildrenOfType<SetupScreen>().SingleOrDefault()?.IsLoaded == true;
|
|
||||||
|
|
||||||
protected override bool IsolateSavingFromDatabase => false;
|
protected override bool IsolateSavingFromDatabase => false;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
@ -95,18 +93,23 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
string extractedFolder = $"{temp}_extracted";
|
string extractedFolder = $"{temp}_extracted";
|
||||||
Directory.CreateDirectory(extractedFolder);
|
Directory.CreateDirectory(extractedFolder);
|
||||||
|
|
||||||
using (var zip = ZipArchive.Open(temp))
|
try
|
||||||
zip.WriteToDirectory(extractedFolder);
|
{
|
||||||
|
using (var zip = ZipArchive.Open(temp))
|
||||||
|
zip.WriteToDirectory(extractedFolder);
|
||||||
|
|
||||||
bool success = setup.ChildrenOfType<ResourcesSection>().First().ChangeAudioTrack(new FileInfo(Path.Combine(extractedFolder, "03. Renatus - Soleily 192kbps.mp3")));
|
bool success = setup.ChildrenOfType<ResourcesSection>().First().ChangeAudioTrack(new FileInfo(Path.Combine(extractedFolder, "03. Renatus - Soleily 192kbps.mp3")));
|
||||||
|
|
||||||
File.Delete(temp);
|
// ensure audio file is copied to beatmap as "audio.mp3" rather than original filename.
|
||||||
Directory.Delete(extractedFolder, true);
|
Assert.That(Beatmap.Value.Metadata.AudioFile == "audio.mp3");
|
||||||
|
|
||||||
// ensure audio file is copied to beatmap as "audio.mp3" rather than original filename.
|
return success;
|
||||||
Assert.That(Beatmap.Value.Metadata.AudioFile == "audio.mp3");
|
}
|
||||||
|
finally
|
||||||
return success;
|
{
|
||||||
|
File.Delete(temp);
|
||||||
|
Directory.Delete(extractedFolder, true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AddAssert("track length changed", () => Beatmap.Value.Track.Length > 60000);
|
AddAssert("track length changed", () => Beatmap.Value.Track.Length > 60000);
|
||||||
|
@ -9,12 +9,10 @@ using osu.Framework.Extensions.ObjectExtensions;
|
|||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Rulesets.Edit;
|
|
||||||
using osu.Game.Rulesets.Mania;
|
using osu.Game.Rulesets.Mania;
|
||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
using osu.Game.Screens.Edit;
|
using osu.Game.Screens.Edit;
|
||||||
using osu.Game.Screens.Edit.Components.Timelines.Summary;
|
using osu.Game.Screens.Edit.Components.Timelines.Summary;
|
||||||
using osu.Game.Screens.Edit.Compose.Components.Timeline;
|
|
||||||
using osu.Game.Screens.Edit.GameplayTest;
|
using osu.Game.Screens.Edit.GameplayTest;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osu.Game.Tests.Resources;
|
using osu.Game.Tests.Resources;
|
||||||
@ -40,10 +38,7 @@ namespace osu.Game.Tests.Visual.Editing
|
|||||||
AddStep("switch ruleset", () => Game.Ruleset.Value = new ManiaRuleset().RulesetInfo);
|
AddStep("switch ruleset", () => Game.Ruleset.Value = new ManiaRuleset().RulesetInfo);
|
||||||
|
|
||||||
AddStep("open editor", () => ((PlaySongSelect)Game.ScreenStack.CurrentScreen).Edit(beatmapSet.Beatmaps.First(beatmap => beatmap.Ruleset.OnlineID == 0)));
|
AddStep("open editor", () => ((PlaySongSelect)Game.ScreenStack.CurrentScreen).Edit(beatmapSet.Beatmaps.First(beatmap => beatmap.Ruleset.OnlineID == 0)));
|
||||||
AddUntilStep("wait for editor open", () => Game.ScreenStack.CurrentScreen is Editor editor
|
AddUntilStep("wait for editor open", () => Game.ScreenStack.CurrentScreen is Editor editor && editor.ReadyForUse);
|
||||||
&& editor.IsLoaded
|
|
||||||
&& editor.ChildrenOfType<HitObjectComposer>().FirstOrDefault()?.IsLoaded == true
|
|
||||||
&& editor.ChildrenOfType<TimelineArea>().FirstOrDefault()?.IsLoaded == true);
|
|
||||||
AddStep("test gameplay", () =>
|
AddStep("test gameplay", () =>
|
||||||
{
|
{
|
||||||
var testGameplayButton = this.ChildrenOfType<TestGameplayButton>().Single();
|
var testGameplayButton = this.ChildrenOfType<TestGameplayButton>().Single();
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
@ -46,6 +47,7 @@ namespace osu.Game.Database
|
|||||||
Realm.Realm.Write(realm =>
|
Realm.Realm.Write(realm =>
|
||||||
{
|
{
|
||||||
var managed = realm.Find<TModel>(item.ID);
|
var managed = realm.Find<TModel>(item.ID);
|
||||||
|
Debug.Assert(managed != null);
|
||||||
operation(managed);
|
operation(managed);
|
||||||
|
|
||||||
item.Files.Clear();
|
item.Files.Clear();
|
||||||
|
@ -612,7 +612,6 @@ namespace osu.Game
|
|||||||
{
|
{
|
||||||
beatmap.OldValue?.CancelAsyncLoad();
|
beatmap.OldValue?.CancelAsyncLoad();
|
||||||
beatmap.NewValue?.BeginAsyncLoad();
|
beatmap.NewValue?.BeginAsyncLoad();
|
||||||
Logger.Log($"Game-wide working beatmap updated to {beatmap.NewValue}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void modsChanged(ValueChangedEvent<IReadOnlyList<Mod>> mods)
|
private void modsChanged(ValueChangedEvent<IReadOnlyList<Mod>> mods)
|
||||||
|
@ -490,10 +490,12 @@ namespace osu.Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onBeatmapChanged(ValueChangedEvent<WorkingBeatmap> valueChangedEvent)
|
private void onBeatmapChanged(ValueChangedEvent<WorkingBeatmap> beatmap)
|
||||||
{
|
{
|
||||||
if (IsLoaded && !ThreadSafety.IsUpdateThread)
|
if (IsLoaded && !ThreadSafety.IsUpdateThread)
|
||||||
throw new InvalidOperationException("Global beatmap bindable must be changed from update thread.");
|
throw new InvalidOperationException("Global beatmap bindable must be changed from update thread.");
|
||||||
|
|
||||||
|
Logger.Log($"Game-wide working beatmap updated to {beatmap.NewValue}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onRulesetChanged(ValueChangedEvent<RulesetInfo> r)
|
private void onRulesetChanged(ValueChangedEvent<RulesetInfo> r)
|
||||||
|
@ -21,6 +21,7 @@ using osu.Framework.Input.Events;
|
|||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Framework.Screens;
|
using osu.Framework.Screens;
|
||||||
|
using osu.Framework.Testing;
|
||||||
using osu.Framework.Timing;
|
using osu.Framework.Timing;
|
||||||
using osu.Game.Audio;
|
using osu.Game.Audio;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
@ -39,6 +40,7 @@ using osu.Game.Rulesets.Edit;
|
|||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Screens.Edit.Components.Menus;
|
using osu.Game.Screens.Edit.Components.Menus;
|
||||||
using osu.Game.Screens.Edit.Compose;
|
using osu.Game.Screens.Edit.Compose;
|
||||||
|
using osu.Game.Screens.Edit.Compose.Components.Timeline;
|
||||||
using osu.Game.Screens.Edit.Design;
|
using osu.Game.Screens.Edit.Design;
|
||||||
using osu.Game.Screens.Edit.GameplayTest;
|
using osu.Game.Screens.Edit.GameplayTest;
|
||||||
using osu.Game.Screens.Edit.Setup;
|
using osu.Game.Screens.Edit.Setup;
|
||||||
@ -97,6 +99,30 @@ namespace osu.Game.Screens.Edit
|
|||||||
|
|
||||||
public IBindable<bool> SamplePlaybackDisabled => samplePlaybackDisabled;
|
public IBindable<bool> SamplePlaybackDisabled => samplePlaybackDisabled;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ensure all asynchronously loading pieces of the editor are in a good state.
|
||||||
|
/// This exists here for convenience for tests, not for actual use.
|
||||||
|
/// Eventually we'd probably want a better way to signal this.
|
||||||
|
/// </summary>
|
||||||
|
public bool ReadyForUse
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (!workingBeatmapUpdated)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (currentScreen?.IsLoaded != true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (currentScreen is EditorScreenWithTimeline)
|
||||||
|
return currentScreen.ChildrenOfType<TimelineArea>().FirstOrDefault()?.IsLoaded == true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool workingBeatmapUpdated;
|
||||||
|
|
||||||
private readonly Bindable<bool> samplePlaybackDisabled = new Bindable<bool>();
|
private readonly Bindable<bool> samplePlaybackDisabled = new Bindable<bool>();
|
||||||
|
|
||||||
private bool canSave;
|
private bool canSave;
|
||||||
@ -219,6 +245,7 @@ namespace osu.Game.Screens.Edit
|
|||||||
// this assumes that nothing during the rest of this load() method is accessing Beatmap.Value (loadableBeatmap should be preferred).
|
// this assumes that nothing during the rest of this load() method is accessing Beatmap.Value (loadableBeatmap should be preferred).
|
||||||
// generally this is quite safe, as the actual load of editor content comes after menuBar.Mode.ValueChanged is fired in its own LoadComplete.
|
// generally this is quite safe, as the actual load of editor content comes after menuBar.Mode.ValueChanged is fired in its own LoadComplete.
|
||||||
Beatmap.Value = loadableBeatmap;
|
Beatmap.Value = loadableBeatmap;
|
||||||
|
workingBeatmapUpdated = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
OsuMenuItem undoMenuItem;
|
OsuMenuItem undoMenuItem;
|
||||||
|
@ -17,9 +17,7 @@ using osu.Game.Online.API;
|
|||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Overlays.Dialog;
|
using osu.Game.Overlays.Dialog;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
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.Menu;
|
using osu.Game.Screens.Menu;
|
||||||
using osu.Game.Skinning;
|
using osu.Game.Skinning;
|
||||||
|
|
||||||
@ -58,15 +56,13 @@ namespace osu.Game.Tests.Visual
|
|||||||
Dependencies.CacheAs<BeatmapManager>(testBeatmapManager = new TestBeatmapManager(LocalStorage, Realm, rulesets, null, audio, Resources, host, Beatmap.Default));
|
Dependencies.CacheAs<BeatmapManager>(testBeatmapManager = new TestBeatmapManager(LocalStorage, Realm, rulesets, null, audio, Resources, host, Beatmap.Default));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual bool EditorComponentsReady => Editor.ChildrenOfType<HitObjectComposer>().FirstOrDefault()?.IsLoaded == true
|
|
||||||
&& Editor.ChildrenOfType<TimelineArea>().FirstOrDefault()?.IsLoaded == true;
|
|
||||||
|
|
||||||
public override void SetUpSteps()
|
public override void SetUpSteps()
|
||||||
{
|
{
|
||||||
base.SetUpSteps();
|
base.SetUpSteps();
|
||||||
|
|
||||||
AddStep("load editor", LoadEditor);
|
AddStep("load editor", LoadEditor);
|
||||||
AddUntilStep("wait for editor to load", () => EditorComponentsReady);
|
AddUntilStep("wait for editor to load", () => Editor?.ReadyForUse == true);
|
||||||
|
AddUntilStep("wait for beatmap updated", () => !Beatmap.IsDefault);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void LoadEditor()
|
protected virtual void LoadEditor()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user