using AcDream.Core.Physics; using DatReaderWriter.DBObjs; using Xunit; namespace AcDream.Core.Tests.Physics; public sealed class AnimationCommandRouterTests { private const uint NonCombat = 0x8000003Du; [Theory] [InlineData(0x00000000u, AnimationCommandRouteKind.None)] [InlineData(0x10000057u, AnimationCommandRouteKind.Action)] // Sanctuary [InlineData(0x2500003Bu, AnimationCommandRouteKind.Modifier)] // Jump [InlineData(0x13000087u, AnimationCommandRouteKind.ChatEmote)] // Wave [InlineData(0x41000003u, AnimationCommandRouteKind.SubState)] // Ready [InlineData(0x40000011u, AnimationCommandRouteKind.SubState)] // Dead [InlineData(0x8000003Du, AnimationCommandRouteKind.Ignored)] // NonCombat style public void Classify_ReturnsRetailRouteKind(uint command, AnimationCommandRouteKind expected) { Assert.Equal(expected, AnimationCommandRouter.Classify(command)); } [Fact] public void RouteWireCommand_SubState_UsesSetCycle() { var seq = MakeEmptySequencer(); var route = AnimationCommandRouter.RouteWireCommand(seq, NonCombat, 0x0011); Assert.Equal(AnimationCommandRouteKind.SubState, route); Assert.Equal(NonCombat, seq.CurrentStyle); Assert.Equal(MotionCommand.Dead, seq.CurrentMotion); } [Fact] public void RouteWireCommand_Sanctuary_IsActionNotDeadCycle() { var seq = MakeEmptySequencer(); var route = AnimationCommandRouter.RouteWireCommand(seq, NonCombat, 0x0057); Assert.Equal(AnimationCommandRouteKind.Action, route); Assert.Equal(0u, seq.CurrentMotion); } [Fact] public void RouteWireCommand_Wave_IsChatEmote() { var seq = MakeEmptySequencer(); var route = AnimationCommandRouter.RouteWireCommand(seq, NonCombat, 0x0087); Assert.Equal(AnimationCommandRouteKind.ChatEmote, route); } private static AnimationSequencer MakeEmptySequencer() { return new AnimationSequencer(new Setup(), new MotionTable(), new NullAnimationLoader()); } private sealed class NullAnimationLoader : IAnimationLoader { public Animation? LoadAnimation(uint id) => null; } }