1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-30 22:22:55 +08:00
osu-lazer/osu.Game.Tests/Editing/TestSceneHitObjectComposerDistanceSnapping.cs

234 lines
8.5 KiB
C#
Raw Normal View History

2019-10-25 17:19:26 +08:00
// 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.
using NUnit.Framework;
2020-01-01 23:41:06 +08:00
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
2019-10-25 17:19:26 +08:00
using osu.Framework.Testing;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Objects;
2019-10-25 17:19:26 +08:00
using osu.Game.Rulesets.Osu;
2020-01-01 23:41:06 +08:00
using osu.Game.Rulesets.Osu.Beatmaps;
2019-10-25 17:19:26 +08:00
using osu.Game.Rulesets.Osu.Edit;
using osu.Game.Screens.Edit;
using osu.Game.Tests.Visual;
namespace osu.Game.Tests.Editing
2019-10-25 17:19:26 +08:00
{
[HeadlessTest]
public class TestSceneHitObjectComposerDistanceSnapping : EditorClockTestScene
{
private TestHitObjectComposer composer;
2020-01-01 23:41:06 +08:00
[Cached(typeof(EditorBeatmap))]
[Cached(typeof(IBeatSnapProvider))]
private readonly EditorBeatmap editorBeatmap;
protected override Container<Drawable> Content { get; }
public TestSceneHitObjectComposerDistanceSnapping()
{
base.Content.Add(new Container
{
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
editorBeatmap = new EditorBeatmap(new OsuBeatmap
{
BeatmapInfo =
{
Ruleset = new OsuRuleset().RulesetInfo,
},
}),
Content = new Container
{
RelativeSizeAxes = Axes.Both,
}
},
});
}
2020-01-01 23:41:06 +08:00
2019-10-25 17:19:26 +08:00
[SetUp]
public void Setup() => Schedule(() =>
{
Children = new Drawable[]
{
composer = new TestHitObjectComposer()
};
2019-10-25 17:19:26 +08:00
BeatDivisor.Value = 1;
composer.EditorBeatmap.Difficulty.SliderMultiplier = 1;
composer.EditorBeatmap.ControlPointInfo.Clear();
composer.EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 1000 });
2019-10-25 17:19:26 +08:00
});
[TestCase(1)]
[TestCase(2)]
public void TestSliderMultiplier(float multiplier)
{
AddStep($"set slider multiplier = {multiplier}", () => composer.EditorBeatmap.Difficulty.SliderMultiplier = multiplier);
2019-10-25 17:19:26 +08:00
assertSnapDistance(100 * multiplier);
}
[TestCase(1)]
[TestCase(2)]
public void TestSpeedMultiplier(float multiplier)
{
2021-09-02 18:42:41 +08:00
assertSnapDistance(100 * multiplier, new HitObject
2019-10-25 17:19:26 +08:00
{
2021-09-02 18:42:41 +08:00
DifficultyControlPoint = new DifficultyControlPoint
{
SliderVelocity = multiplier
}
2019-10-25 17:19:26 +08:00
});
}
[TestCase(1)]
[TestCase(2)]
public void TestBeatDivisor(int divisor)
{
AddStep($"set divisor = {divisor}", () => BeatDivisor.Value = divisor);
assertSnapDistance(100f / divisor);
}
[Test]
public void TestConvertDurationToDistance()
{
assertDurationToDistance(500, 50);
assertDurationToDistance(1000, 100);
AddStep("set slider multiplier = 2", () => composer.EditorBeatmap.Difficulty.SliderMultiplier = 2);
2019-10-25 17:19:26 +08:00
assertDurationToDistance(500, 100);
assertDurationToDistance(1000, 200);
AddStep("set beat length = 500", () =>
{
composer.EditorBeatmap.ControlPointInfo.Clear();
composer.EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 500 });
2019-10-25 17:19:26 +08:00
});
assertDurationToDistance(500, 200);
assertDurationToDistance(1000, 400);
}
[Test]
public void TestConvertDistanceToDuration()
{
assertDistanceToDuration(50, 500);
assertDistanceToDuration(100, 1000);
AddStep("set slider multiplier = 2", () => composer.EditorBeatmap.Difficulty.SliderMultiplier = 2);
2019-10-25 17:19:26 +08:00
assertDistanceToDuration(100, 500);
assertDistanceToDuration(200, 1000);
AddStep("set beat length = 500", () =>
{
composer.EditorBeatmap.ControlPointInfo.Clear();
composer.EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 500 });
2019-10-25 17:19:26 +08:00
});
assertDistanceToDuration(200, 500);
assertDistanceToDuration(400, 1000);
}
[Test]
public void TestGetSnappedDurationFromDistance()
{
2020-01-28 12:42:22 +08:00
assertSnappedDuration(0, 0);
assertSnappedDuration(50, 1000);
2019-10-25 17:19:26 +08:00
assertSnappedDuration(100, 1000);
2020-01-28 12:42:22 +08:00
assertSnappedDuration(150, 2000);
2019-10-25 17:19:26 +08:00
assertSnappedDuration(200, 2000);
2020-01-28 12:42:22 +08:00
assertSnappedDuration(250, 3000);
2019-10-25 17:19:26 +08:00
AddStep("set slider multiplier = 2", () => composer.EditorBeatmap.Difficulty.SliderMultiplier = 2);
2019-10-25 17:19:26 +08:00
2020-01-28 12:42:22 +08:00
assertSnappedDuration(0, 0);
2019-10-25 17:19:26 +08:00
assertSnappedDuration(50, 0);
2020-01-28 12:42:22 +08:00
assertSnappedDuration(100, 1000);
assertSnappedDuration(150, 1000);
2019-10-25 17:19:26 +08:00
assertSnappedDuration(200, 1000);
assertSnappedDuration(250, 1000);
AddStep("set beat length = 500", () =>
{
composer.EditorBeatmap.ControlPointInfo.Clear();
composer.EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 500 });
2019-10-25 17:19:26 +08:00
});
assertSnappedDuration(50, 0);
2020-01-28 12:42:22 +08:00
assertSnappedDuration(100, 500);
assertSnappedDuration(150, 500);
2019-10-25 17:19:26 +08:00
assertSnappedDuration(200, 500);
assertSnappedDuration(250, 500);
assertSnappedDuration(400, 1000);
}
[Test]
public void GetSnappedDistanceFromDistance()
{
assertSnappedDistance(50, 0);
2019-10-25 17:19:26 +08:00
assertSnappedDistance(100, 100);
assertSnappedDistance(150, 100);
2019-10-25 17:19:26 +08:00
assertSnappedDistance(200, 200);
assertSnappedDistance(250, 200);
2019-10-25 17:19:26 +08:00
AddStep("set slider multiplier = 2", () => composer.EditorBeatmap.Difficulty.SliderMultiplier = 2);
2019-10-25 17:19:26 +08:00
assertSnappedDistance(50, 0);
assertSnappedDistance(100, 0);
assertSnappedDistance(150, 0);
2019-10-25 17:19:26 +08:00
assertSnappedDistance(200, 200);
assertSnappedDistance(250, 200);
AddStep("set beat length = 500", () =>
{
composer.EditorBeatmap.ControlPointInfo.Clear();
composer.EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 500 });
2019-10-25 17:19:26 +08:00
});
assertSnappedDistance(50, 0);
assertSnappedDistance(100, 0);
assertSnappedDistance(150, 0);
2019-10-25 17:19:26 +08:00
assertSnappedDistance(200, 200);
assertSnappedDistance(250, 200);
assertSnappedDistance(400, 400);
}
2021-09-02 18:42:41 +08:00
private void assertSnapDistance(float expectedDistance, HitObject hitObject = null)
=> AddAssert($"distance is {expectedDistance}", () => composer.GetBeatSnapDistanceAt(hitObject ?? new HitObject()) == expectedDistance);
2019-10-25 17:19:26 +08:00
private void assertDurationToDistance(double duration, float expectedDistance)
=> AddAssert($"duration = {duration} -> distance = {expectedDistance}", () => composer.DurationToDistance(new HitObject(), duration) == expectedDistance);
2019-10-25 17:19:26 +08:00
private void assertDistanceToDuration(float distance, double expectedDuration)
=> AddAssert($"distance = {distance} -> duration = {expectedDuration}", () => composer.DistanceToDuration(new HitObject(), distance) == expectedDuration);
2019-10-25 17:19:26 +08:00
private void assertSnappedDuration(float distance, double expectedDuration)
=> AddAssert($"distance = {distance} -> duration = {expectedDuration} (snapped)", () => composer.FindSnappedDuration(new HitObject(), distance) == expectedDuration);
2019-10-25 17:19:26 +08:00
private void assertSnappedDistance(float distance, float expectedDistance)
=> AddAssert($"distance = {distance} -> distance = {expectedDistance} (snapped)", () => composer.FindSnappedDistance(new HitObject(), distance) == expectedDistance);
2019-10-25 17:19:26 +08:00
private class TestHitObjectComposer : OsuHitObjectComposer
{
2019-12-27 18:39:30 +08:00
public new EditorBeatmap EditorBeatmap => base.EditorBeatmap;
2019-10-25 17:19:26 +08:00
public new Bindable<double> DistanceSpacingMultiplier => base.DistanceSpacingMultiplier;
2019-10-25 17:19:26 +08:00
public TestHitObjectComposer()
: base(new OsuRuleset())
{
}
}
}
}