Files
Project-M/Assets/_Project/Tests/EditMode/CharacterControlMathTests.cs
T
2026-06-02 08:56:26 -07:00

59 lines
2.5 KiB
C#

using NUnit.Framework;
using ProjectM.Simulation;
using Unity.Mathematics;
namespace ProjectM.Tests
{
/// <summary>
/// Pure-helper unit tests for <see cref="CharacterControlMath.DesiredMovement"/> (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
/// <see cref="PlayerControlSystem"/> 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.
/// </summary>
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.");
}
}
}