Files
mrgameeng/tests/MrGameEng.Graphics.Tests/SpriteAnimationTests.cs
T
Leonid Pershin fd6343bd09
CI / build-test (push) Failing after 1m8s
@
Add MrGameEng.AI utility-AI module; format codebase with CSharpier

New MrGameEng.AI module (ResponseCurve, Consideration, UtilityAction,
UtilityAi selector, Blackboard) plus CSharpier formatting applied across
the whole engine. Documents the CSharpier convention in CLAUDE.md.
@
2026-06-12 07:19:10 +03:00

67 lines
2.0 KiB
C#

using Friflo.Engine.ECS;
using Microsoft.Xna.Framework;
using MrGameEng.Core;
using MrGameEng.Graphics;
using Xunit;
namespace MrGameEng.Graphics.Tests;
public class SpriteAnimationTests
{
private static Texture2DRegion Region(int x) => new(null!, new Rectangle(x, 0, 16, 16));
private static SpriteAnimationClip Clip(bool loop, params int[] xs) =>
new(Array.ConvertAll(xs, Region), framesPerSecond: 10f, loop);
[Fact]
public void FrameAt_LoopingClip_WrapsAround()
{
var clip = Clip(loop: true, 0, 1, 2);
Assert.Equal(0, clip.FrameAt(0.00f).Bounds.X);
Assert.Equal(1, clip.FrameAt(0.10f).Bounds.X);
Assert.Equal(2, clip.FrameAt(0.25f).Bounds.X);
Assert.Equal(0, clip.FrameAt(0.30f).Bounds.X); // wrapped
}
[Fact]
public void FrameAt_NonLoopingClip_ClampsToLastFrame()
{
var clip = Clip(loop: false, 0, 1);
Assert.Equal(1, clip.FrameAt(10f).Bounds.X);
}
private sealed class AnimScene : Scene
{
public Entity Animated;
public SpriteAnimationClip Clip = SpriteAnimationTests.Clip(loop: false, 0, 1, 2);
protected override void OnLoad()
{
this.UseSpriteAnimation();
Animated = Store.CreateEntity(
new Sprite { Color = Color.White },
new SpriteAnimator(Clip)
);
}
}
[Fact]
public void AnimationSystem_AdvancesFrames_AndStopsAtEnd()
{
var context = new EngineContext();
var scene = new AnimScene();
context.Scenes.Switch(scene);
context.Clock.Advance(0.15f); // 10 fps → frame 1
context.Scenes.Update(context.Clock);
Assert.Equal(1, scene.Animated.GetComponent<Sprite>().Region!.Bounds.X);
context.Clock.Advance(1.0f); // far past the end of a non-looping clip
context.Scenes.Update(context.Clock);
Assert.Equal(2, scene.Animated.GetComponent<Sprite>().Region!.Bounds.X);
Assert.False(scene.Animated.GetComponent<SpriteAnimator>().Playing);
}
}