1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-15 01:23:44 +08:00

Add manual test coverage of storyboard videos

This commit is contained in:
Dean Herbert 2024-04-22 23:04:56 +08:00
parent 9e7182acf0
commit 50afd48812
No known key found for this signature in database

View File

@ -10,6 +10,7 @@ using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Framework.IO.Stores; using osu.Framework.IO.Stores;
using osu.Framework.Testing; using osu.Framework.Testing;
@ -40,7 +41,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("disallow all lookups", () => AddStep("disallow all lookups", () =>
{ {
storyboard.UseSkinSprites = false; storyboard.UseSkinSprites = false;
storyboard.AlwaysProvideTexture = false; storyboard.ProvideResources = false;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -55,7 +56,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("allow storyboard lookup", () => AddStep("allow storyboard lookup", () =>
{ {
storyboard.UseSkinSprites = false; storyboard.UseSkinSprites = false;
storyboard.AlwaysProvideTexture = true; storyboard.ProvideResources = true;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -67,13 +68,47 @@ namespace osu.Game.Tests.Visual.Gameplay
assertStoryboardSourced(); assertStoryboardSourced();
} }
[TestCase(false)]
[TestCase(true)]
public void TestVideo(bool scaleTransformProvided)
{
AddStep("allow storyboard lookup", () =>
{
storyboard.ProvideResources = true;
});
AddStep("create video", () => SetContents(_ =>
{
var layer = storyboard.GetLayer("Video");
var sprite = new StoryboardVideo("Videos/test-video.mp4", Time.Current);
sprite.AddLoop(Time.Current, 100).Alpha.Add(Easing.None, 0, 10000, 1, 1);
if (scaleTransformProvided)
sprite.TimelineGroup.Scale.Add(Easing.None, Time.Current, Time.Current, 1, 1);
layer.Elements.Clear();
layer.Add(sprite);
return new Container
{
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
storyboard.CreateDrawable()
}
};
}));
}
[Test] [Test]
public void TestSkinLookupPreferredOverStoryboard() public void TestSkinLookupPreferredOverStoryboard()
{ {
AddStep("allow all lookups", () => AddStep("allow all lookups", () =>
{ {
storyboard.UseSkinSprites = true; storyboard.UseSkinSprites = true;
storyboard.AlwaysProvideTexture = true; storyboard.ProvideResources = true;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -91,7 +126,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("allow skin lookup", () => AddStep("allow skin lookup", () =>
{ {
storyboard.UseSkinSprites = true; storyboard.UseSkinSprites = true;
storyboard.AlwaysProvideTexture = false; storyboard.ProvideResources = false;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -109,7 +144,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("allow all lookups", () => AddStep("allow all lookups", () =>
{ {
storyboard.UseSkinSprites = true; storyboard.UseSkinSprites = true;
storyboard.AlwaysProvideTexture = true; storyboard.ProvideResources = true;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -127,7 +162,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("allow all lookups", () => AddStep("allow all lookups", () =>
{ {
storyboard.UseSkinSprites = true; storyboard.UseSkinSprites = true;
storyboard.AlwaysProvideTexture = true; storyboard.ProvideResources = true;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -142,7 +177,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("allow all lookups", () => AddStep("allow all lookups", () =>
{ {
storyboard.UseSkinSprites = true; storyboard.UseSkinSprites = true;
storyboard.AlwaysProvideTexture = true; storyboard.ProvideResources = true;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -156,7 +191,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("allow all lookups", () => AddStep("allow all lookups", () =>
{ {
storyboard.UseSkinSprites = true; storyboard.UseSkinSprites = true;
storyboard.AlwaysProvideTexture = true; storyboard.ProvideResources = true;
}); });
AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero))); AddStep("create sprites", () => SetContents(_ => createSprite(lookup_name, Anchor.TopLeft, Vector2.Zero)));
@ -170,7 +205,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddAssert("origin back", () => sprites.All(s => s.Origin == Anchor.TopLeft)); AddAssert("origin back", () => sprites.All(s => s.Origin == Anchor.TopLeft));
} }
private DrawableStoryboard createSprite(string lookupName, Anchor origin, Vector2 initialPosition) private Drawable createSprite(string lookupName, Anchor origin, Vector2 initialPosition)
{ {
var layer = storyboard.GetLayer("Background"); var layer = storyboard.GetLayer("Background");
@ -180,7 +215,14 @@ namespace osu.Game.Tests.Visual.Gameplay
layer.Elements.Clear(); layer.Elements.Clear();
layer.Add(sprite); layer.Add(sprite);
return storyboard.CreateDrawable().With(s => s.RelativeSizeAxes = Axes.Both); return new Container
{
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
storyboard.CreateDrawable()
}
};
} }
private void assertStoryboardSourced() private void assertStoryboardSourced()
@ -202,42 +244,52 @@ namespace osu.Game.Tests.Visual.Gameplay
return new TestDrawableStoryboard(this, mods); return new TestDrawableStoryboard(this, mods);
} }
public bool AlwaysProvideTexture { get; set; } public bool ProvideResources { get; set; }
public override string GetStoragePathFromStoryboardPath(string path) => AlwaysProvideTexture ? path : string.Empty; public override string GetStoragePathFromStoryboardPath(string path) => ProvideResources ? path : string.Empty;
private partial class TestDrawableStoryboard : DrawableStoryboard private partial class TestDrawableStoryboard : DrawableStoryboard
{ {
private readonly bool alwaysProvideTexture; private readonly bool provideResources;
public TestDrawableStoryboard(TestStoryboard storyboard, IReadOnlyList<Mod>? mods) public TestDrawableStoryboard(TestStoryboard storyboard, IReadOnlyList<Mod>? mods)
: base(storyboard, mods) : base(storyboard, mods)
{ {
alwaysProvideTexture = storyboard.AlwaysProvideTexture; provideResources = storyboard.ProvideResources;
} }
protected override IResourceStore<byte[]> CreateResourceLookupStore() => alwaysProvideTexture protected override IResourceStore<byte[]> CreateResourceLookupStore() => provideResources
? new AlwaysReturnsTextureStore() ? new ResourcesTextureStore()
: new ResourceStore<byte[]>(); : new ResourceStore<byte[]>();
internal class AlwaysReturnsTextureStore : IResourceStore<byte[]> internal class ResourcesTextureStore : IResourceStore<byte[]>
{ {
private const string test_image = "Resources/Textures/test-image.png";
private readonly DllResourceStore store; private readonly DllResourceStore store;
public AlwaysReturnsTextureStore() public ResourcesTextureStore()
{ {
store = TestResources.GetStore(); store = TestResources.GetStore();
} }
public void Dispose() => store.Dispose(); public void Dispose() => store.Dispose();
public byte[] Get(string name) => store.Get(test_image); public byte[] Get(string name) => store.Get(map(name));
public Task<byte[]> GetAsync(string name, CancellationToken cancellationToken = new CancellationToken()) => store.GetAsync(test_image, cancellationToken); public Task<byte[]> GetAsync(string name, CancellationToken cancellationToken = new CancellationToken()) => store.GetAsync(map(name), cancellationToken);
public Stream GetStream(string name) => store.GetStream(test_image); public Stream GetStream(string name) => store.GetStream(map(name));
private string map(string name)
{
switch (name)
{
case lookup_name:
return "Resources/Textures/test-image.png";
default:
return $"Resources/{name}";
}
}
public IEnumerable<string> GetAvailableResources() => store.GetAvailableResources(); public IEnumerable<string> GetAvailableResources() => store.GetAvailableResources();
} }