osu/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModSpunOut.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

147 lines
5.1 KiB
C#
Raw Normal View History

2020-08-11 19:28:00 +00: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.
2020-08-11 19:55:50 +00:00
using System;
2020-08-11 19:28:00 +00:00
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using osu.Framework.Testing;
2020-08-11 19:55:50 +00:00
using osu.Framework.Utils;
2020-08-11 19:28:00 +00:00
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Judgements;
2020-08-11 19:55:50 +00:00
using osu.Game.Rulesets.Mods;
2020-08-11 19:28:00 +00:00
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Osu.Judgements;
2020-08-11 19:28:00 +00:00
using osu.Game.Rulesets.Osu.Mods;
using osu.Game.Rulesets.Osu.Objects;
using osu.Game.Rulesets.Osu.Objects.Drawables;
2020-12-04 11:21:53 +00:00
using osu.Game.Rulesets.Osu.Skinning.Default;
using osu.Game.Rulesets.Scoring;
2020-08-11 19:28:00 +00:00
using osuTK;
namespace osu.Game.Rulesets.Osu.Tests.Mods
{
public partial class TestSceneOsuModSpunOut : OsuModTestScene
{
2020-08-11 19:55:50 +00:00
protected override bool AllowFail => true;
2020-08-11 19:28:00 +00:00
[Test]
public void TestSpinnerAutoCompleted()
2020-08-11 19:28:00 +00:00
{
DrawableSpinner? spinner = null;
JudgementResult? lastResult = null;
CreateModTest(new ModTestData
{
Mod = new OsuModSpunOut(),
Autoplay = false,
Beatmap = singleSpinnerBeatmap,
PassCondition = () =>
{
// Bind to the first spinner's results for further tracking.
if (spinner == null)
{
// We only care about the first spinner we encounter for this test.
var nextSpinner = Player.ChildrenOfType<DrawableSpinner>().SingleOrDefault();
if (nextSpinner == null)
return false;
lastResult = null;
spinner = nextSpinner;
2022-06-24 12:25:23 +00:00
spinner.OnNewResult += (_, result) => lastResult = result;
}
return lastResult?.Type == HitResult.Great;
}
});
}
2020-08-11 19:55:50 +00:00
[TestCase(null)]
[TestCase(typeof(OsuModDoubleTime))]
[TestCase(typeof(OsuModHalfTime))]
public void TestSpinRateUnaffectedByMods(Type? additionalModType)
2020-08-11 19:55:50 +00:00
{
var mods = new List<Mod> { new OsuModSpunOut() };
if (additionalModType != null)
mods.Add((Mod)Activator.CreateInstance(additionalModType)!);
2020-08-11 19:55:50 +00:00
CreateModTest(new ModTestData
2020-08-11 19:28:00 +00:00
{
2020-08-11 19:55:50 +00:00
Mods = mods,
Autoplay = false,
Beatmap = singleSpinnerBeatmap,
2020-11-13 14:03:44 +00:00
PassCondition = () =>
{
var counter = Player.ChildrenOfType<SpinnerSpmCalculator>().SingleOrDefault();
var spinner = Player.ChildrenOfType<DrawableSpinner>().FirstOrDefault();
if (counter == null || spinner == null)
return false;
// ignore cases where the spinner hasn't started as these lead to false-positives
if (Precision.AlmostEquals(counter.Result.Value, 0, 1))
return false;
float rotationSpeed = (float)(1.01 * spinner.HitObject.SpinsRequired / spinner.HitObject.Duration);
return Precision.AlmostEquals(counter.Result.Value, rotationSpeed * 1000 * 60, 1);
2020-11-13 14:03:44 +00:00
}
2020-08-11 19:55:50 +00:00
});
}
[Test]
public void TestSpinnerGetsNoBonusScore()
{
DrawableSpinner? spinner = null;
List<JudgementResult> results = new List<JudgementResult>();
CreateModTest(new ModTestData
{
Mod = new OsuModSpunOut(),
Autoplay = false,
Beatmap = singleSpinnerBeatmap,
PassCondition = () =>
{
// Bind to the first spinner's results for further tracking.
if (spinner == null)
{
// We only care about the first spinner we encounter for this test.
var nextSpinner = Player.ChildrenOfType<DrawableSpinner>().SingleOrDefault();
if (nextSpinner == null)
return false;
spinner = nextSpinner;
2022-06-24 12:25:23 +00:00
spinner.OnNewResult += (_, result) => results.Add(result);
results.Clear();
}
// we should only be checking the bonus/progress after the spinner has fully completed.
if (results.OfType<OsuSpinnerJudgementResult>().All(r => r.TimeCompleted == null))
return false;
return
results.Any(r => r.Type == HitResult.SmallBonus)
&& results.All(r => r.Type != HitResult.LargeBonus);
}
});
}
2020-08-11 19:55:50 +00:00
private Beatmap singleSpinnerBeatmap => new Beatmap
{
HitObjects = new List<HitObject>
{
new Spinner
2020-08-11 19:28:00 +00:00
{
2020-08-11 19:55:50 +00:00
Position = new Vector2(256, 192),
StartTime = 500,
Duration = 2000
2020-08-11 19:28:00 +00:00
}
2020-08-11 19:55:50 +00:00
}
};
2020-08-11 19:28:00 +00:00
}
}