dev/HumanoidRetargeter.Tests/Target/CompiledRigSourceSpaceTests.cs
using System.Numerics;
using HumanoidRetargeter.Maths;
using HumanoidRetargeter.Target;
using Xunit;

namespace HumanoidRetargeter.Tests.Target;

public sealed class CompiledRigSourceSpaceTests
{
    [Fact]
    public void UnrealZUpRootKeepsItsOrientation()
    {
        var engine = new XForm(new Vector3(4, 8, 36), Quaternion.Identity);

        var source = CompiledRigSourceSpace.FromEngineLocal(engine, true, TargetUpAxis.ZUpCm);

        AssertVectorClose(new Vector3(4, 8, 36) / RetargetTargetSpec.SboxSourceScale, source.Pos);
        AssertQuaternionClose(Quaternion.Identity, source.Rot);
    }

    [Fact]
    public void YUpRootReceivesInverseBasisConversion()
    {
        var engine = new XForm(new Vector3(4, -12, 36), Quaternion.Identity);

        var source = CompiledRigSourceSpace.FromEngineLocal(engine, true, TargetUpAxis.YUpCm);

        AssertVectorClose(new Vector3(4, 36, 12) / RetargetTargetSpec.SboxSourceScale, source.Pos);
        var expected = Quaternion.CreateFromAxisAngle(Vector3.UnitX, -MathF.PI * 0.5f);
        AssertQuaternionClose(expected, source.Rot);
    }

    [Fact]
    public void ChildLocalsNeverReceiveAWorldBasisRotation()
    {
        var rotation = Quaternion.CreateFromYawPitchRoll(0.2f, -0.3f, 0.1f);
        var engine = new XForm(new Vector3(1, 2, 3), rotation);

        var source = CompiledRigSourceSpace.FromEngineLocal(engine, false, TargetUpAxis.YUpCm);

        AssertVectorClose(engine.Pos / RetargetTargetSpec.SboxSourceScale, source.Pos);
        AssertQuaternionClose(rotation, source.Rot);
    }

    private static void AssertVectorClose(Vector3 expected, Vector3 actual)
    {
        Assert.InRange(Vector3.Distance(expected, actual), 0, 1e-4f);
    }

    private static void AssertQuaternionClose(Quaternion expected, Quaternion actual)
    {
        Assert.InRange(MathF.Abs(Quaternion.Dot(expected, actual)), 0.99999f, 1.00001f);
    }
}