Remove all test skinning changes in favour of the `ISkinSource.AllSources` path

This commit is contained in:
Salman Ahmed 2021-06-22 10:48:03 +03:00
parent 14bdcef26b
commit b12adc6073
8 changed files with 108 additions and 68 deletions

View File

@ -101,10 +101,15 @@ public void TestBeatmapHyperDashColoursOverride(bool useBeatmapSkin)
AddAssert("is custom hyper dash fruit colours", () => ((CatchExposedPlayer)TestPlayer).UsableHyperDashFruitColour == TestSkin.HYPER_DASH_FRUIT_COLOUR);
}
protected override ExposedPlayer CreateTestPlayer() => new CatchExposedPlayer();
protected override ExposedPlayer CreateTestPlayer(bool userHasCustomColours) => new CatchExposedPlayer(userHasCustomColours);
private class CatchExposedPlayer : ExposedPlayer
{
public CatchExposedPlayer(bool userHasCustomColours)
: base(userHasCustomColours)
{
}
public Color4 UsableHyperDashColour =>
GameplayClockContainer.ChildrenOfType<BeatmapSkinProvidingContainer>()
.First()

View File

@ -22,6 +22,7 @@
using osu.Game.Rulesets.Osu.Objects.Drawables;
using osu.Game.Skinning;
using osu.Game.Storyboards;
using osu.Game.Tests.Visual;
namespace osu.Game.Rulesets.Osu.Tests
{
@ -99,7 +100,7 @@ private void checkNextHitObject(string skin) =>
[Resolved]
private AudioManager audio { get; set; }
protected override ISkin GetPlayerSkin() => testUserSkin;
protected override TestPlayer CreatePlayer(Ruleset ruleset) => new SkinProvidingPlayer(testUserSkin);
protected override WorkingBeatmap CreateWorkingBeatmap(IBeatmap beatmap, Storyboard storyboard = null) => new CustomSkinWorkingBeatmap(beatmap, storyboard, Clock, audio, testBeatmapSkin);
@ -116,6 +117,27 @@ public CustomSkinWorkingBeatmap(IBeatmap beatmap, Storyboard storyboard, IFrameB
protected override ISkin GetSkin() => skin;
}
public class SkinProvidingPlayer : TestPlayer
{
private readonly TestSource userSkin;
public SkinProvidingPlayer(TestSource userSkin)
{
this.userSkin = userSkin;
}
private DependencyContainer dependencies;
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
dependencies = new DependencyContainer(base.CreateChildDependencies(parent));
dependencies.CacheAs<ISkinSource>(userSkin);
return dependencies;
}
}
public class TestSource : ISkinSource
{
private readonly string identifier;

View File

@ -228,7 +228,7 @@ private void load(AudioManager audio, OsuConfigManager config, OsuGameBase game)
dependencies.CacheAs(GameplayBeatmap);
var rulesetSkinProvider = CreateRulesetSkinProvider(GameplayRuleset, playableBeatmap, Beatmap.Value.Skin);
var rulesetSkinProvider = new RulesetSkinProvidingContainer(GameplayRuleset, playableBeatmap, Beatmap.Value.Skin);
// load the skinning hierarchy first.
// this is intentionally done in two stages to ensure things are in a loaded state before exposing the ruleset to skin sources.
@ -309,8 +309,6 @@ private void load(AudioManager audio, OsuConfigManager config, OsuGameBase game)
protected virtual GameplayClockContainer CreateGameplayClockContainer(WorkingBeatmap beatmap, double gameplayStart) => new MasterGameplayClockContainer(beatmap, gameplayStart);
protected virtual RulesetSkinProvidingContainer CreateRulesetSkinProvider(Ruleset ruleset, IBeatmap beatmap, ISkin beatmapSkin) => new RulesetSkinProvidingContainer(ruleset, beatmap, beatmapSkin);
private Drawable createUnderlayComponents() =>
DimmableStoryboard = new DimmableStoryboard(Beatmap.Value.Storyboard) { RelativeSizeAxes = Axes.Both };

View File

@ -47,11 +47,15 @@ public abstract class HitObjectSampleTest : PlayerTestScene, IStorageResourcePro
private readonly TestResourceStore userSkinResourceStore = new TestResourceStore();
private readonly TestResourceStore beatmapSkinResourceStore = new TestResourceStore();
private SkinSourceDependencyContainer dependencies;
private IBeatmap currentTestBeatmap;
protected sealed override bool HasCustomSteps => true;
protected override bool Autoplay => true;
protected sealed override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
=> new DependencyContainer(dependencies = new SkinSourceDependencyContainer(base.CreateChildDependencies(parent)));
protected sealed override IBeatmap CreateBeatmap(RulesetInfo ruleset) => currentTestBeatmap;
protected sealed override WorkingBeatmap CreateWorkingBeatmap(IBeatmap beatmap, Storyboard storyboard = null)
@ -59,8 +63,6 @@ protected sealed override WorkingBeatmap CreateWorkingBeatmap(IBeatmap beatmap,
protected override TestPlayer CreatePlayer(Ruleset ruleset) => new TestPlayer(false);
protected override ISkin GetPlayerSkin() => Skin;
protected void CreateTestWithBeatmap(string filename)
{
CreateTest(() =>
@ -107,7 +109,8 @@ protected void SetupSkins(string beatmapFile, string userFile)
}
};
Skin = new LegacySkin(userSkinInfo, this);
// Need to refresh the cached skin source to refresh the skin resource store.
dependencies.SkinSource = new SkinProvidingContainer(Skin = new LegacySkin(userSkinInfo, this));
});
}
@ -129,6 +132,39 @@ protected void AssertNoLookup(string name) => AddAssert($"\"{name}\" not looked
#endregion
private class SkinSourceDependencyContainer : IReadOnlyDependencyContainer
{
public ISkinSource SkinSource;
private readonly IReadOnlyDependencyContainer fallback;
public SkinSourceDependencyContainer(IReadOnlyDependencyContainer fallback)
{
this.fallback = fallback;
}
public object Get(Type type)
{
if (type == typeof(ISkinSource))
return SkinSource;
return fallback.Get(type);
}
public object Get(Type type, CacheInfo info)
{
if (type == typeof(ISkinSource))
return SkinSource;
return fallback.Get(type, info);
}
public void Inject<T>(T instance) where T : class
{
// Never used directly
}
}
private class TestResourceStore : IResourceStore<byte[]>
{
public readonly List<string> PerformedLookups = new List<string>();

View File

@ -4,11 +4,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Audio;
using osu.Framework.Bindables;
using osu.Framework.IO.Stores;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Screens.Play;
using osu.Game.Skinning;
using osu.Game.Tests.Visual;
using osuTK.Graphics;
@ -47,24 +49,36 @@ private void configureSettings(bool beatmapSkins, bool beatmapColours)
protected virtual ExposedPlayer LoadBeatmap(bool userHasCustomColours)
{
ExposedPlayer player;
Beatmap.Value = testBeatmap;
ExposedPlayer player = CreateTestPlayer();
player.SetSkin(new TestSkin(userHasCustomColours));
LoadScreen(player);
LoadScreen(player = CreateTestPlayer(userHasCustomColours));
return player;
}
protected virtual ExposedPlayer CreateTestPlayer() => new ExposedPlayer();
protected virtual ExposedPlayer CreateTestPlayer(bool userHasCustomColours) => new ExposedPlayer(userHasCustomColours);
protected class ExposedPlayer : TestPlayer
protected class ExposedPlayer : Player
{
public ExposedPlayer()
: base(false, false)
protected readonly bool UserHasCustomColours;
public ExposedPlayer(bool userHasCustomColours)
: base(new PlayerConfiguration
{
AllowPause = false,
ShowResults = false,
})
{
UserHasCustomColours = userHasCustomColours;
}
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
{
var dependencies = new DependencyContainer(base.CreateChildDependencies(parent));
dependencies.CacheAs<ISkinSource>(new TestSkin(UserHasCustomColours));
return dependencies;
}
public IReadOnlyList<Color4> UsableComboColours =>

View File

@ -6,6 +6,7 @@
using osu.Framework.Allocation;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Testing;
using osu.Game.Rulesets;
using osu.Game.Skinning;
namespace osu.Game.Tests.Visual
@ -15,12 +16,15 @@ public abstract class LegacySkinPlayerTestScene : PlayerTestScene
{
protected LegacySkin LegacySkin { get; private set; }
protected override ISkin GetPlayerSkin() => LegacySkin;
private ISkinSource legacySkinSource;
protected override TestPlayer CreatePlayer(Ruleset ruleset) => new SkinProvidingPlayer(legacySkinSource);
[BackgroundDependencyLoader]
private void load(SkinManager skins)
{
LegacySkin = new DefaultLegacySkin(skins);
legacySkinSource = new SkinProvidingContainer(LegacySkin);
}
[SetUpSteps]
@ -47,5 +51,16 @@ private void addResetTargetsStep()
AddUntilStep("wait for components to load", () => this.ChildrenOfType<SkinnableTargetContainer>().All(t => t.ComponentsLoaded));
}
public class SkinProvidingPlayer : TestPlayer
{
[Cached(typeof(ISkinSource))]
private readonly ISkinSource skinSource;
public SkinProvidingPlayer(ISkinSource skinSource)
{
this.skinSource = skinSource;
}
}
}
}

View File

@ -10,7 +10,6 @@
using osu.Game.Configuration;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Skinning;
namespace osu.Game.Tests.Visual
{
@ -79,8 +78,6 @@ protected void LoadPlayer()
}
Player = CreatePlayer(ruleset);
Player.SetSkin(GetPlayerSkin());
LoadScreen(Player);
}
@ -96,11 +93,6 @@ protected override void Dispose(bool isDisposing)
[NotNull]
protected abstract Ruleset CreatePlayerRuleset();
/// <summary>
/// Creates an <see cref="ISkin"/> to be put inside the <see cref="Player"/>'s ruleset skin providing container.
/// </summary>
protected virtual ISkin GetPlayerSkin() => null;
protected sealed override Ruleset CreateRuleset() => CreatePlayerRuleset();
protected virtual TestPlayer CreatePlayer(Ruleset ruleset) => new TestPlayer(false, false);

View File

@ -1,21 +1,15 @@
// 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 System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using JetBrains.Annotations;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Scoring;
using osu.Game.Rulesets.UI;
using osu.Game.Screens.Play;
using osu.Game.Skinning;
namespace osu.Game.Tests.Visual
{
@ -80,41 +74,5 @@ private void load()
{
ScoreProcessor.NewJudgement += r => Results.Add(r);
}
public ISkin Skin { get; private set; }
private TestSkinProvidingContainer rulesetSkinProvider;
internal void SetSkin(ISkin skin)
{
Debug.Assert(rulesetSkinProvider == null);
if (Skin != null)
throw new InvalidOperationException("A skin has already been set.");
Skin = skin;
}
protected override RulesetSkinProvidingContainer CreateRulesetSkinProvider(Ruleset ruleset, IBeatmap beatmap, ISkin beatmapSkin)
=> rulesetSkinProvider = new TestSkinProvidingContainer(Skin, ruleset, beatmap, beatmapSkin);
private class TestSkinProvidingContainer : RulesetSkinProvidingContainer
{
private readonly ISkin skin;
public TestSkinProvidingContainer(ISkin skin, Ruleset ruleset, IBeatmap beatmap, [CanBeNull] ISkin beatmapSkin)
: base(ruleset, beatmap, beatmapSkin)
{
this.skin = skin;
}
protected override void UpdateSkins()
{
base.UpdateSkins();
if (skin != null)
SkinSources.Insert(0, skin is LegacySkin ? GetLegacyRulesetTransformedSkin(skin) : skin);
}
}
}
}