2021-07-06 13:32:02 +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.
|
|
|
|
|
2022-06-17 07:37:17 +00:00
|
|
|
#nullable disable
|
|
|
|
|
2021-07-06 13:32:02 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using NUnit.Framework;
|
2022-08-02 10:50:57 +00:00
|
|
|
using osu.Framework.Allocation;
|
2021-07-06 13:32:02 +00:00
|
|
|
using osu.Framework.Audio.Sample;
|
|
|
|
using osu.Framework.Bindables;
|
|
|
|
using osu.Framework.Graphics;
|
2022-08-02 10:50:57 +00:00
|
|
|
using osu.Framework.Graphics.Rendering;
|
2021-07-06 13:32:02 +00:00
|
|
|
using osu.Framework.Graphics.Textures;
|
2021-07-07 07:30:23 +00:00
|
|
|
using osu.Framework.Testing;
|
2021-07-06 13:32:02 +00:00
|
|
|
using osu.Game.Audio;
|
|
|
|
using osu.Game.Skinning;
|
|
|
|
using osu.Game.Tests.Visual;
|
|
|
|
|
|
|
|
namespace osu.Game.Tests.Skins
|
|
|
|
{
|
2021-07-07 07:30:23 +00:00
|
|
|
[HeadlessTest]
|
2021-07-06 13:32:02 +00:00
|
|
|
public partial class TestSceneSkinProvidingContainer : OsuTestScene
|
|
|
|
{
|
2022-08-02 10:50:57 +00:00
|
|
|
[Resolved]
|
|
|
|
private IRenderer renderer { get; set; }
|
|
|
|
|
2021-07-06 13:32:02 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Ensures that the first inserted skin after resetting (via source change)
|
|
|
|
/// is always prioritised over others when providing the same resource.
|
|
|
|
/// </summary>
|
|
|
|
[Test]
|
|
|
|
public void TestPriorityPreservation()
|
|
|
|
{
|
|
|
|
TestSkinProvidingContainer provider = null;
|
|
|
|
TestSkin mostPrioritisedSource = null;
|
|
|
|
|
|
|
|
AddStep("setup sources", () =>
|
|
|
|
{
|
|
|
|
var sources = new List<TestSkin>();
|
|
|
|
for (int i = 0; i < 10; i++)
|
2022-08-02 10:50:57 +00:00
|
|
|
sources.Add(new TestSkin(renderer));
|
2021-07-06 13:32:02 +00:00
|
|
|
|
|
|
|
mostPrioritisedSource = sources.First();
|
|
|
|
|
|
|
|
Child = provider = new TestSkinProvidingContainer(sources);
|
|
|
|
});
|
|
|
|
|
|
|
|
AddAssert("texture provided by expected skin", () =>
|
|
|
|
{
|
|
|
|
return provider.FindProvider(s => s.GetTexture(TestSkin.TEXTURE_NAME) != null) == mostPrioritisedSource;
|
|
|
|
});
|
|
|
|
|
|
|
|
AddStep("trigger source change", () => provider.TriggerSourceChanged());
|
|
|
|
|
|
|
|
AddAssert("texture still provided by expected skin", () =>
|
|
|
|
{
|
|
|
|
return provider.FindProvider(s => s.GetTexture(TestSkin.TEXTURE_NAME) != null) == mostPrioritisedSource;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private partial class TestSkinProvidingContainer : SkinProvidingContainer
|
|
|
|
{
|
|
|
|
private readonly IEnumerable<ISkin> sources;
|
|
|
|
|
|
|
|
public TestSkinProvidingContainer(IEnumerable<ISkin> sources)
|
|
|
|
{
|
|
|
|
this.sources = sources;
|
|
|
|
}
|
|
|
|
|
|
|
|
public new void TriggerSourceChanged() => base.TriggerSourceChanged();
|
|
|
|
|
2021-10-12 04:04:48 +00:00
|
|
|
protected override void RefreshSources()
|
2021-07-06 13:32:02 +00:00
|
|
|
{
|
2021-10-12 02:55:04 +00:00
|
|
|
SetSources(sources);
|
2021-07-06 13:32:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private class TestSkin : ISkin
|
|
|
|
{
|
|
|
|
public const string TEXTURE_NAME = "virtual-texture";
|
|
|
|
|
2022-08-02 10:50:57 +00:00
|
|
|
private readonly IRenderer renderer;
|
|
|
|
|
|
|
|
public TestSkin(IRenderer renderer)
|
|
|
|
{
|
|
|
|
this.renderer = renderer;
|
|
|
|
}
|
|
|
|
|
2022-11-09 07:04:56 +00:00
|
|
|
public Drawable GetDrawableComponent(ISkinComponentLookup lookup) => throw new System.NotImplementedException();
|
2021-07-06 13:32:02 +00:00
|
|
|
|
|
|
|
public Texture GetTexture(string componentName, WrapMode wrapModeS, WrapMode wrapModeT)
|
|
|
|
{
|
|
|
|
if (componentName == TEXTURE_NAME)
|
2022-08-02 10:50:57 +00:00
|
|
|
return renderer.WhitePixel;
|
2021-07-06 13:32:02 +00:00
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ISample GetSample(ISampleInfo sampleInfo) => throw new System.NotImplementedException();
|
|
|
|
|
|
|
|
public IBindable<TValue> GetConfig<TLookup, TValue>(TLookup lookup) => throw new System.NotImplementedException();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|