1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 14:07:25 +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),
};
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
{
protected override Ruleset CreatePlayerRuleset() => new CatchRuleset();
public TestSceneCatchModPerfect()
: 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
[TestCase(true)]
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),
};
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
{
protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset();
public TestSceneManiaModPerfect()
: base(new ManiaModPerfect())
{
@ -22,7 +24,5 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods
[TestCase(false)]
[TestCase(true)]
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)
};
protected override Ruleset CreateRulesetForSkinProvider() => new ManiaRuleset();
protected ManiaSkinnableTestScene()
{
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);
}
protected override Ruleset CreateRuleset() => new ManiaRuleset();
private class TestScrollingInfo : IScrollingInfo
{
public readonly Bindable<ScrollingDirection> Direction = new Bindable<ScrollingDirection>();

View File

@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Mania.Tests
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
{
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
[Test]
public void TestNoAdjustment() => CreateModTest(new ModTestData
{
@ -77,7 +79,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
{
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
{
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
[TestCase(0.5)]
[TestCase(1.01)]
[TestCase(1.5)]
@ -26,7 +28,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
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
{
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
public TestSceneOsuModPerfect()
: base(new OsuModPerfect())
{
@ -48,7 +50,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
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),
};
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
{
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
[Test]
public void TestMissViaEarlyHit()
{
@ -61,8 +63,6 @@ namespace osu.Game.Rulesets.Osu.Tests
});
}
protected override Ruleset CreateRuleset() => new OsuRuleset();
private class TestAutoMod : OsuModAutoplay
{
public override Score CreateReplayScore(IBeatmap beatmap) => new Score

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Osu.Tests
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
{
protected override Ruleset CreatePlayerRuleset() => new TestTaikoRuleset();
public TestSceneTaikoModPerfect()
: base(new TaikoModPerfect())
{
@ -29,8 +31,6 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods
[TestCase(true)]
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
{
public override HealthProcessor CreateHealthProcessor(double drainStartTime) => new TestTaikoHealthProcessor();

View File

@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Taiko.Tests
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)
};
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>
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.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Testing;
@ -23,6 +24,22 @@ namespace osu.Game.Tests.Visual
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]
private void load()
{
@ -46,7 +63,7 @@ namespace osu.Game.Tests.Visual
action?.Invoke();
AddStep(CreateRuleset().RulesetInfo.Name, LoadPlayer);
AddStep(ruleset.Description, LoadPlayer);
AddUntilStep("player loaded", () => Player.IsLoaded && Player.Alpha == 1);
}
@ -56,28 +73,27 @@ namespace osu.Game.Tests.Visual
protected void LoadPlayer()
{
var beatmap = CreateBeatmap(Ruleset.Value);
var beatmap = CreateBeatmap(ruleset.RulesetInfo);
Beatmap.Value = CreateWorkingBeatmap(beatmap);
Ruleset.Value = ruleset.RulesetInfo;
SelectedMods.Value = Array.Empty<Mod>();
var rulesetInstance = Ruleset.Value.CreateInstance();
if (!AllowFail)
{
var noFailMod = rulesetInstance.GetAllMods().FirstOrDefault(m => m is ModNoFail);
var noFailMod = ruleset.GetAllMods().FirstOrDefault(m => m is ModNoFail);
if (noFailMod != null)
SelectedMods.Value = new[] { noFailMod };
}
if (Autoplay)
{
var mod = rulesetInstance.GetAutoplayMod();
var mod = ruleset.GetAutoplayMod();
if (mod != null)
SelectedMods.Value = SelectedMods.Value.Concat(mod.Yield()).ToArray();
}
Player = CreatePlayer(rulesetInstance);
Player = CreatePlayer(ruleset);
LoadScreen(Player);
}

View File

@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Graphics;
@ -13,6 +14,7 @@ using osu.Framework.Graphics.Textures;
using osu.Framework.IO.Stores;
using osu.Game.Beatmaps;
using osu.Game.Graphics.Sprites;
using osu.Game.Rulesets;
using osu.Game.Skinning;
using osuTK;
using osuTK.Graphics;
@ -26,16 +28,17 @@ namespace osu.Game.Tests.Visual
private Skin specialSkin;
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()
: 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]
@ -110,7 +113,7 @@ namespace osu.Game.Tests.Visual
{
new OutlineBox { Alpha = autoSize ? 1 : 0 },
mainProvider.WithChild(
new SkinProvidingContainer(Ruleset.Value.CreateInstance().CreateLegacySkinProvider(mainProvider, beatmap))
new SkinProvidingContainer(CreateRulesetForSkinProvider().CreateLegacySkinProvider(mainProvider, beatmap))
{
Child = created,
RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None,