1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 16:07:24 +08:00

Seal the ruleset creation methods and let abstract method take their place

Also makes `CreatePlayerRuleset()` and `CreateRulesetForSkinProvider()` not-null to avoid unwanted behaviour with their derivers
This commit is contained in:
Salman Ahmed 2020-04-23 13:25:06 +03:00
parent 0a0ea39431
commit 2fa47992dc
No known key found for this signature in database
GPG Key ID: ED81FD33FD9B58BC
18 changed files with 58 additions and 39 deletions

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Catch.Tests
typeof(CatchLegacySkinTransformer), typeof(CatchLegacySkinTransformer),
}; };
protected override Ruleset CreateRuleset() => new CatchRuleset(); protected override Ruleset CreateRulesetForSkinProvider() => new CatchRuleset();
} }
} }

View File

@ -13,6 +13,8 @@ namespace osu.Game.Rulesets.Catch.Tests.Mods
{ {
public class TestSceneCatchModPerfect : ModPerfectTestScene public class TestSceneCatchModPerfect : ModPerfectTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new CatchRuleset();
public TestSceneCatchModPerfect() public TestSceneCatchModPerfect()
: base(new CatchModPerfect()) : base(new CatchModPerfect())
{ {
@ -50,7 +52,5 @@ namespace osu.Game.Rulesets.Catch.Tests.Mods
// We only care about testing misses, hits are tested via JuiceStream // We only care about testing misses, hits are tested via JuiceStream
[TestCase(true)] [TestCase(true)]
public void TestTinyDroplet(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new TinyDroplet { StartTime = 1000 }), shouldMiss); public void TestTinyDroplet(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new TinyDroplet { StartTime = 1000 }), shouldMiss);
protected override Ruleset CreateRuleset() => new CatchRuleset();
} }
} }

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Catch.Tests
typeof(CatchRuleset), typeof(CatchRuleset),
}; };
protected override Ruleset CreateRuleset() => new CatchRuleset(); protected override Ruleset CreatePlayerRuleset() => new CatchRuleset();
} }
} }

View File

@ -10,6 +10,8 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods
{ {
public class TestSceneManiaModPerfect : ModPerfectTestScene public class TestSceneManiaModPerfect : ModPerfectTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset();
public TestSceneManiaModPerfect() public TestSceneManiaModPerfect()
: base(new ManiaModPerfect()) : base(new ManiaModPerfect())
{ {
@ -22,7 +24,5 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods
[TestCase(false)] [TestCase(false)]
[TestCase(true)] [TestCase(true)]
public void TestHoldNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HoldNote { StartTime = 1000, EndTime = 3000 }), shouldMiss); public void TestHoldNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HoldNote { StartTime = 1000, EndTime = 3000 }), shouldMiss);
protected override Ruleset CreateRuleset() => new ManiaRuleset();
} }
} }

View File

@ -34,6 +34,8 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning
typeof(ManiaSettingsSubsection) typeof(ManiaSettingsSubsection)
}; };
protected override Ruleset CreateRulesetForSkinProvider() => new ManiaRuleset();
protected ManiaSkinnableTestScene() protected ManiaSkinnableTestScene()
{ {
scrollingInfo.Direction.Value = ScrollingDirection.Down; scrollingInfo.Direction.Value = ScrollingDirection.Down;
@ -58,8 +60,6 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning
AddStep("change direction to up", () => scrollingInfo.Direction.Value = ScrollingDirection.Up); AddStep("change direction to up", () => scrollingInfo.Direction.Value = ScrollingDirection.Up);
} }
protected override Ruleset CreateRuleset() => new ManiaRuleset();
private class TestScrollingInfo : IScrollingInfo private class TestScrollingInfo : IScrollingInfo
{ {
public readonly Bindable<ScrollingDirection> Direction = new Bindable<ScrollingDirection>(); public readonly Bindable<ScrollingDirection> Direction = new Bindable<ScrollingDirection>();

View File

@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Mania.Tests
typeof(ManiaRuleset), typeof(ManiaRuleset),
}; };
protected override Ruleset CreateRuleset() => new ManiaRuleset(); protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset();
} }
} }

View File

@ -15,6 +15,8 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
{ {
public class TestSceneOsuModDifficultyAdjust : ModTestScene public class TestSceneOsuModDifficultyAdjust : ModTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
[Test] [Test]
public void TestNoAdjustment() => CreateModTest(new ModTestData public void TestNoAdjustment() => CreateModTest(new ModTestData
{ {
@ -77,7 +79,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
{ {
return Player.ScoreProcessor.JudgedHits >= 2; return Player.ScoreProcessor.JudgedHits >= 2;
} }
protected override Ruleset CreateRuleset() => new OsuRuleset();
} }
} }

View File

@ -10,6 +10,8 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
{ {
public class TestSceneOsuModDoubleTime : ModTestScene public class TestSceneOsuModDoubleTime : ModTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
[TestCase(0.5)] [TestCase(0.5)]
[TestCase(1.01)] [TestCase(1.01)]
[TestCase(1.5)] [TestCase(1.5)]
@ -26,7 +28,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
Precision.AlmostEquals(Player.GameplayClockContainer.GameplayClock.Rate, mod.SpeedChange.Value) Precision.AlmostEquals(Player.GameplayClockContainer.GameplayClock.Rate, mod.SpeedChange.Value)
}); });
} }
protected override Ruleset CreateRuleset() => new OsuRuleset();
} }
} }

View File

@ -13,6 +13,8 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
{ {
public class TestSceneOsuModPerfect : ModPerfectTestScene public class TestSceneOsuModPerfect : ModPerfectTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
public TestSceneOsuModPerfect() public TestSceneOsuModPerfect()
: base(new OsuModPerfect()) : base(new OsuModPerfect())
{ {
@ -48,7 +50,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
CreateHitObjectTest(new HitObjectTestData(spinner), shouldMiss); CreateHitObjectTest(new HitObjectTestData(spinner), shouldMiss);
} }
protected override Ruleset CreateRuleset() => new OsuRuleset();
} }
} }

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Osu.Tests
typeof(OsuLegacySkinTransformer), typeof(OsuLegacySkinTransformer),
}; };
protected override Ruleset CreateRuleset() => new OsuRuleset(); protected override Ruleset CreateRulesetForSkinProvider() => new OsuRuleset();
} }
} }

View File

@ -19,6 +19,8 @@ namespace osu.Game.Rulesets.Osu.Tests
{ {
public class TestSceneMissHitWindowJudgements : ModTestScene public class TestSceneMissHitWindowJudgements : ModTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
[Test] [Test]
public void TestMissViaEarlyHit() public void TestMissViaEarlyHit()
{ {
@ -61,8 +63,6 @@ namespace osu.Game.Rulesets.Osu.Tests
}); });
} }
protected override Ruleset CreateRuleset() => new OsuRuleset();
private class TestAutoMod : OsuModAutoplay private class TestAutoMod : OsuModAutoplay
{ {
public override Score CreateReplayScore(IBeatmap beatmap) => new Score public override Score CreateReplayScore(IBeatmap beatmap) => new Score

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Osu.Tests
typeof(OsuRuleset), typeof(OsuRuleset),
}; };
protected override Ruleset CreateRuleset() => new OsuRuleset(); protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
} }
} }

View File

@ -12,6 +12,8 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods
{ {
public class TestSceneTaikoModPerfect : ModPerfectTestScene public class TestSceneTaikoModPerfect : ModPerfectTestScene
{ {
protected override Ruleset CreatePlayerRuleset() => new TestTaikoRuleset();
public TestSceneTaikoModPerfect() public TestSceneTaikoModPerfect()
: base(new TaikoModPerfect()) : base(new TaikoModPerfect())
{ {
@ -29,8 +31,6 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods
[TestCase(true)] [TestCase(true)]
public void TestSwell(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Swell { StartTime = 1000, EndTime = 3000 }), shouldMiss); public void TestSwell(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Swell { StartTime = 1000, EndTime = 3000 }), shouldMiss);
protected override Ruleset CreateRuleset() => new TestTaikoRuleset();
private class TestTaikoRuleset : TaikoRuleset private class TestTaikoRuleset : TaikoRuleset
{ {
public override HealthProcessor CreateHealthProcessor(double drainStartTime) => new TestTaikoHealthProcessor(); public override HealthProcessor CreateHealthProcessor(double drainStartTime) => new TestTaikoHealthProcessor();

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Taiko.Tests
typeof(TaikoLegacySkinTransformer), typeof(TaikoLegacySkinTransformer),
}; };
protected override Ruleset CreateRuleset() => new TaikoRuleset(); protected override Ruleset CreateRulesetForSkinProvider() => new TaikoRuleset();
} }
} }

View File

@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Taiko.Tests
typeof(TaikoRuleset) typeof(TaikoRuleset)
}; };
protected override Ruleset CreateRuleset() => new TaikoRuleset(); protected override Ruleset CreatePlayerRuleset() => new TaikoRuleset();
} }
} }

View File

@ -11,6 +11,6 @@ namespace osu.Game.Tests.Visual.Gameplay
/// </summary> /// </summary>
public abstract class TestPlayerTestScene : PlayerTestScene public abstract class TestPlayerTestScene : PlayerTestScene
{ {
protected override Ruleset CreateRuleset() => new OsuRuleset(); protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
} }
} }

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Linq; using System.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Testing; using osu.Framework.Testing;
@ -23,6 +24,22 @@ namespace osu.Game.Tests.Visual
protected OsuConfigManager LocalConfig; protected OsuConfigManager LocalConfig;
/// <summary>
/// Creates the ruleset for setting up the <see cref="Player"/> component.
/// </summary>
[NotNull]
protected abstract Ruleset CreatePlayerRuleset();
protected sealed override Ruleset CreateRuleset() => CreatePlayerRuleset();
[NotNull]
private readonly Ruleset ruleset;
protected PlayerTestScene()
{
ruleset = CreatePlayerRuleset();
}
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load() private void load()
{ {
@ -46,7 +63,7 @@ namespace osu.Game.Tests.Visual
action?.Invoke(); action?.Invoke();
AddStep(CreateRuleset().RulesetInfo.Name, LoadPlayer); AddStep(ruleset.Description, LoadPlayer);
AddUntilStep("player loaded", () => Player.IsLoaded && Player.Alpha == 1); AddUntilStep("player loaded", () => Player.IsLoaded && Player.Alpha == 1);
} }
@ -56,28 +73,27 @@ namespace osu.Game.Tests.Visual
protected void LoadPlayer() protected void LoadPlayer()
{ {
var beatmap = CreateBeatmap(Ruleset.Value); var beatmap = CreateBeatmap(ruleset.RulesetInfo);
Beatmap.Value = CreateWorkingBeatmap(beatmap); Beatmap.Value = CreateWorkingBeatmap(beatmap);
Ruleset.Value = ruleset.RulesetInfo;
SelectedMods.Value = Array.Empty<Mod>(); SelectedMods.Value = Array.Empty<Mod>();
var rulesetInstance = Ruleset.Value.CreateInstance();
if (!AllowFail) if (!AllowFail)
{ {
var noFailMod = rulesetInstance.GetAllMods().FirstOrDefault(m => m is ModNoFail); var noFailMod = ruleset.GetAllMods().FirstOrDefault(m => m is ModNoFail);
if (noFailMod != null) if (noFailMod != null)
SelectedMods.Value = new[] { noFailMod }; SelectedMods.Value = new[] { noFailMod };
} }
if (Autoplay) if (Autoplay)
{ {
var mod = rulesetInstance.GetAutoplayMod(); var mod = ruleset.GetAutoplayMod();
if (mod != null) if (mod != null)
SelectedMods.Value = SelectedMods.Value.Concat(mod.Yield()).ToArray(); SelectedMods.Value = SelectedMods.Value.Concat(mod.Yield()).ToArray();
} }
Player = CreatePlayer(rulesetInstance); Player = CreatePlayer(ruleset);
LoadScreen(Player); LoadScreen(Player);
} }

View File

@ -4,6 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using JetBrains.Annotations;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Audio; using osu.Framework.Audio;
using osu.Framework.Graphics; using osu.Framework.Graphics;
@ -13,6 +14,7 @@ using osu.Framework.Graphics.Textures;
using osu.Framework.IO.Stores; using osu.Framework.IO.Stores;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
using osu.Game.Rulesets;
using osu.Game.Skinning; using osu.Game.Skinning;
using osuTK; using osuTK;
using osuTK.Graphics; using osuTK.Graphics;
@ -26,16 +28,17 @@ namespace osu.Game.Tests.Visual
private Skin specialSkin; private Skin specialSkin;
private Skin oldSkin; private Skin oldSkin;
/// <summary>
/// Creates the ruleset for adding the ruleset-specific skin transforming component.
/// </summary>
[NotNull]
protected abstract Ruleset CreateRulesetForSkinProvider();
protected sealed override Ruleset CreateRuleset() => CreateRulesetForSkinProvider();
protected SkinnableTestScene() protected SkinnableTestScene()
: base(2, 3) : base(2, 3)
{ {
// avoid running silently incorrectly.
if (CreateRuleset() == null)
{
throw new InvalidOperationException(
$"No ruleset provided, override {nameof(CreateRuleset)} to the ruleset belonging to the skinnable content."
+ "This is required to add the legacy skin transformer for the content to behave as expected.");
}
} }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
@ -110,7 +113,7 @@ namespace osu.Game.Tests.Visual
{ {
new OutlineBox { Alpha = autoSize ? 1 : 0 }, new OutlineBox { Alpha = autoSize ? 1 : 0 },
mainProvider.WithChild( mainProvider.WithChild(
new SkinProvidingContainer(Ruleset.Value.CreateInstance().CreateLegacySkinProvider(mainProvider, beatmap)) new SkinProvidingContainer(CreateRulesetForSkinProvider().CreateLegacySkinProvider(mainProvider, beatmap))
{ {
Child = created, Child = created,
RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None, RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None,