using NUnit.Framework; using ProjectM.Simulation; using Unity.Mathematics; namespace ProjectM.Tests { /// /// Pure-helper unit tests for (M5b: Unity Character /// Controller). Replaces the M5 PlayerMoveSystemTests: the character now moves via collide-and-slide /// inside the predicted physics loop, so the unit-testable seam is the input→world-velocity mapping that /// feeds the CC processor. The actual sweep/collision/replication is /// covered by the Play Mode runtime check (a full PhysicsWorld is not built in a bare EditMode world). /// Netcode-free and version-independent. /// public class CharacterControlMathTests { [Test] public void DesiredMovement_Maps_Cardinal_To_Planar_Velocity() { const float speed = 5f; var v = CharacterControlMath.DesiredMovement(new float2(1f, 0f), speed); Assert.AreEqual(speed, v.x, 1e-4f, "Move=(1,0) -> +X scaled by speed."); Assert.AreEqual(0f, v.y, 1e-4f, "Movement is planar; Y must be zero."); Assert.AreEqual(0f, v.z, 1e-4f, "Move=(1,0) maps to +X only; Z must be zero."); } [Test] public void DesiredMovement_Clamps_Diagonal_To_Unit_Speed() { const float speed = 6f; var v = CharacterControlMath.DesiredMovement(new float2(1f, 1f), speed); float planarSpeed = math.length(new float2(v.x, v.z)); Assert.AreEqual(speed, planarSpeed, 1e-3f, "Diagonal input clamped to unit length -> speed == MoveSpeed."); Assert.AreEqual(0f, v.y, 1e-4f, "Linear Y must stay zero."); } [Test] public void DesiredMovement_Sub_Unit_Input_Is_Proportional() { const float speed = 10f; var v = CharacterControlMath.DesiredMovement(new float2(0.5f, 0f), speed); Assert.AreEqual(0.5f * speed, v.x, 1e-3f, "Sub-unit analog input scales speed proportionally (not renormalised)."); } [Test] public void DesiredMovement_Is_Deterministic_And_Maps_Z() { var a = CharacterControlMath.DesiredMovement(new float2(0f, 1f), 3f); var b = CharacterControlMath.DesiredMovement(new float2(0f, 1f), 3f); Assert.AreEqual(a.z, b.z, 0f, "Deterministic: identical args -> identical result."); Assert.AreEqual(3f, a.z, 1e-4f, "Move=(0,1) maps to +Z scaled by speed."); } } }