mirror of https://github.com/ppy/osu
Remove all test skinning changes in favour of the `ISkinSource.AllSources` path
This commit is contained in:
parent
14bdcef26b
commit
b12adc6073
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 };
|
||||
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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 =>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue