diff --git a/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj b/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj
index ee973e854488..88aa137797a6 100644
--- a/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj
+++ b/osu.Game.Rulesets.Taiko.Tests.Android/osu.Game.Rulesets.Taiko.Tests.Android.csproj
@@ -19,6 +19,7 @@
+
diff --git a/osu.Game.Rulesets.Taiko.Tests/Editor/TestSceneTaikoEditorTestGameplay.cs b/osu.Game.Rulesets.Taiko.Tests/Editor/TestSceneTaikoEditorTestGameplay.cs
new file mode 100644
index 000000000000..2422e62571a1
--- /dev/null
+++ b/osu.Game.Rulesets.Taiko.Tests/Editor/TestSceneTaikoEditorTestGameplay.cs
@@ -0,0 +1,70 @@
+// Copyright (c) ppy Pty Ltd . 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.Allocation;
+using osu.Framework.Extensions;
+using osu.Framework.Testing;
+using osu.Game.Beatmaps;
+using osu.Game.Rulesets.Taiko.Objects;
+using osu.Game.Screens.Edit;
+using osu.Game.Screens.Edit.Components.Timelines.Summary;
+using osu.Game.Screens.Edit.GameplayTest;
+using osu.Game.Storyboards;
+using osu.Game.Tests.Beatmaps.IO;
+using osu.Game.Tests.Visual;
+using osuTK.Input;
+
+namespace osu.Game.Rulesets.Taiko.Tests.Editor
+{
+ public partial class TestSceneTaikoEditorTestGameplay : EditorTestScene
+ {
+ protected override bool IsolateSavingFromDatabase => false;
+
+ protected override Ruleset CreateEditorRuleset() => new TaikoRuleset();
+
+ [Resolved]
+ private OsuGameBase game { get; set; } = null!;
+
+ [Resolved]
+ private BeatmapManager beatmaps { get; set; } = null!;
+
+ private BeatmapSetInfo importedBeatmapSet = null!;
+
+ public override void SetUpSteps()
+ {
+ AddStep("import test beatmap", () => importedBeatmapSet = BeatmapImportHelper.LoadOszIntoOsu(game).GetResultSafely());
+ base.SetUpSteps();
+ }
+
+ protected override WorkingBeatmap CreateWorkingBeatmap(IBeatmap beatmap, Storyboard? storyboard = null)
+ => beatmaps.GetWorkingBeatmap(importedBeatmapSet.Beatmaps.First(b => b.Ruleset.OnlineID == 1));
+
+ [Test]
+ public void TestBasicGameplayTest()
+ {
+ AddStep("add objects", () =>
+ {
+ EditorBeatmap.Clear();
+ EditorBeatmap.Add(new Swell { StartTime = 500, EndTime = 1500 });
+ EditorBeatmap.Add(new Hit { StartTime = 3000 });
+ });
+ AddStep("seek to 250", () => EditorClock.Seek(250));
+ AddUntilStep("wait for seek", () => EditorClock.CurrentTime, () => Is.EqualTo(250));
+
+ AddStep("click test gameplay button", () =>
+ {
+ var button = Editor.ChildrenOfType().Single();
+
+ InputManager.MoveMouseTo(button);
+ InputManager.Click(MouseButton.Left);
+ });
+ AddUntilStep("save prompt shown", () => DialogOverlay.CurrentDialog is SaveRequiredPopupDialog);
+
+ AddStep("save changes", () => DialogOverlay.CurrentDialog!.PerformOkAction());
+ AddUntilStep("player pushed", () => Stack.CurrentScreen is EditorPlayer);
+ AddUntilStep("wait for return to editor", () => Stack.CurrentScreen is Screens.Edit.Editor);
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneDrumSampleTriggerSource.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneDrumSampleTriggerSource.cs
index 6c925f566bf2..b47f02afa30a 100644
--- a/osu.Game.Rulesets.Taiko.Tests/TestSceneDrumSampleTriggerSource.cs
+++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneDrumSampleTriggerSource.cs
@@ -315,10 +315,7 @@ public void TestNormalSwell()
hitObjectContainer.Add(drawableSwell);
});
- // You might think that this should be a SwellTick since we're before the swell, but SwellTicks get no StartTime (ie. they are zero).
- // This works fine in gameplay because they are judged whenever the user pressed, rather than being timed hits.
- // But for sample playback purposes they can be ignored as noise.
- AddAssert("most valid object is swell", () => triggerSource.GetMostValidObject(), Is.InstanceOf);
+ AddAssert("most valid object is swell tick", () => triggerSource.GetMostValidObject(), Is.InstanceOf);
checkSamples(HitType.Centre, false, HitSampleInfo.HIT_NORMAL, SampleControlPoint.DEFAULT_BANK);
checkSamples(HitType.Rim, false, HitSampleInfo.HIT_CLAP, SampleControlPoint.DEFAULT_BANK);
@@ -352,10 +349,7 @@ public void TestDrumSwell()
hitObjectContainer.Add(drawableSwell);
});
- // You might think that this should be a SwellTick since we're before the swell, but SwellTicks get no StartTime (ie. they are zero).
- // This works fine in gameplay because they are judged whenever the user pressed, rather than being timed hits.
- // But for sample playback purposes they can be ignored as noise.
- AddAssert("most valid object is swell", () => triggerSource.GetMostValidObject(), Is.InstanceOf);
+ AddAssert("most valid object is swell tick", () => triggerSource.GetMostValidObject(), Is.InstanceOf);
checkSamples(HitType.Centre, false, HitSampleInfo.HIT_NORMAL, HitSampleInfo.BANK_DRUM);
checkSamples(HitType.Rim, false, HitSampleInfo.HIT_CLAP, HitSampleInfo.BANK_DRUM);
diff --git a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
index 26afd4244584..a2420fc679ab 100644
--- a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
+++ b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
@@ -11,5 +11,6 @@
+
diff --git a/osu.Game.Rulesets.Taiko/Objects/Swell.cs b/osu.Game.Rulesets.Taiko/Objects/Swell.cs
index a8db8df021d5..d9e8c77ea78a 100644
--- a/osu.Game.Rulesets.Taiko/Objects/Swell.cs
+++ b/osu.Game.Rulesets.Taiko/Objects/Swell.cs
@@ -33,6 +33,7 @@ protected override void CreateNestedHitObjects(CancellationToken cancellationTok
cancellationToken.ThrowIfCancellationRequested();
AddNested(new SwellTick
{
+ StartTime = StartTime,
Samples = Samples
});
}