185 lines
5.8 KiB
C#

#if !UNITY_5_6_OR_NEWER
using NUnit.Framework;
namespace LinearAlgebra.Test {
public class QuaternionTest {
[SetUp]
public void Setup() {
}
[Test]
public void Normalize() {
Quaternion q1 = new(0, 0, 0, 1);
Quaternion r = Quaternion.identity;
r = q1.normalized;
Assert.AreEqual(r, q1, "q.normalized 0 0 0 1");
r = Quaternion.Normalize(q1);
Assert.AreEqual(r, q1, "q.normalized 0 0 0 1");
}
[Test]
public void ToAngles() {
Quaternion q1 = new(0, 0, 0, 1);
Vector3Float v = Vector3Float.zero;
v = Quaternion.ToAngles(q1);
Assert.AreEqual(v, new Vector3Float(0, 0, 0), "ToAngles 0 0 0 1");
q1 = new(1, 0, 0, 0);
v = Quaternion.ToAngles(q1);
Assert.AreEqual(0, v.horizontal, "1 0 0 0 H");
Assert.AreEqual(180, v.vertical, "1 0 0 0 V");
Assert.AreEqual(180, v.depth, "1 0 0 0 D");
}
[Test]
public void Multiplication() {
Quaternion q1 = new(0, 0, 0, 1);
Quaternion q2 = new(1, 0, 0, 0);
Quaternion r;
r = q1 * q2;
Assert.AreEqual(r, new Quaternion(1, 0, 0, 0), "0 0 0 1 * 1 0 0 0 ");
}
[Test]
public void MultiplicationVector() {
Quaternion q1 = new(0, 0, 0, 1);
Vector3Float v1 = new(0, 1, 0);
Vector3Float r;
r = q1 * v1;
Assert.AreEqual(r, new Vector3Float(0, 1, 0), "0 0 0 1 * Vector 0 1 0");
q1 = new(1, 0, 0, 0);
r = q1 * v1;
Assert.AreEqual(r, new Vector3Float(0, -1, 0), "1 0 0 0 * Vector 0 1 0");
}
[Test]
public void Equality() {
Quaternion q1 = new(0, 0, 0, 1);
Quaternion q2 = new(1, 0, 0, 0);
Assert.AreNotEqual(q1, q2, "0 0 0 1 == 1 0 0 0");
q2 = new(0, 0, 0, 1);
Assert.AreEqual(q1, q2, "0 0 0 1 == 1 0 0 0");
}
[Test, Ignore("ToDo")]
public void Inverse() { }
[Test, Ignore("ToDo")]
public void LookRotation() { }
[Test, Ignore("ToDo")]
public void FromToRotation() { }
[Test, Ignore("ToDo")]
public void RotateTowards() { }
[Test, Ignore("ToDo")]
public void AngleAxis() { }
[Test, Ignore("ToDo")]
public void Angle() { }
[Test, Ignore("ToDo")]
public void Slerp() { }
[Test, Ignore("ToDo")]
public void SlerpUnclamped() { }
[Test]
public void Euler() {
Vector3Float v1 = new(0, 0, 0);
Quaternion q;
q = Quaternion.Euler(v1);
Assert.AreEqual(q, Quaternion.identity, "Euler Vector 0 0 0");
q = Quaternion.Euler(0, 0, 0);
Assert.AreEqual(q, Quaternion.identity, "Euler 0 0 0");
v1 = new(90, 90, -90);
q = Quaternion.Euler(v1);
Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler Vector 90 90 -90");
q = Quaternion.Euler(90, 90, -90);
Assert.AreEqual(q, new Quaternion(0, 0.707106709F, -0.707106709F, 0), "Euler 90 90 -90");
}
[Test]
public void EulerToAngles() {
Vector3Float v;
Quaternion q;
Quaternion r;
//v = new(0, 0, 0);
q = Quaternion.Euler(0, 0 , 0);
v = Quaternion.ToAngles(q);
r = Quaternion.Euler(v);
Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0");
q = Quaternion.Euler(-45, -30, -15);
v = Quaternion.ToAngles(q);
r = Quaternion.Euler(v);
Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "-45, -30, -15");
// Gimball lock
// q = Quaternion.Euler(90, 90, -90);
// v = Quaternion.ToAngles(q);
// r = Quaternion.Euler(v);
// Assert.AreEqual(0, Quaternion.UnsignedAngle(q, r), 10e-2f, "0 0 0");
}
[Test]
public void GetAngleAround() {
Vector3Float v1 = new(0, 1, 0);
Quaternion q1 = new(0, 0, 0, 1);
float f = Quaternion.GetAngleAround(v1, q1);
Assert.AreEqual(f, 0, "GetAngleAround 0 1 0 , 0 0 0 1");
q1 = new(0, 0.707106709F, -0.707106709F, 0);
f = Quaternion.GetAngleAround(v1, q1);
Assert.AreEqual(f, 180, "GetAngleAround 0 1 0 , 0 0.7 -0.7 0");
v1 = new(0, 0, 0);
f = Quaternion.GetAngleAround(v1, q1);
Assert.IsTrue(float.IsNaN(f), "GetAngleAround 0 0 0 , 0 0.7 -0.7 0");
}
[Test]
public void GetRotationAround() {
Vector3Float v1 = new(0, 1, 0);
Quaternion q1 = new(0, 0, 0, 1);
Quaternion q = Quaternion.GetRotationAround(v1, q1);
Assert.AreEqual(q, new Quaternion(0, 0, 0, 1), "GetRotationAround 0 1 0 , 0 0 0 1");
q1 = new(0, 0.707106709F, -0.707106709F, 0);
q = Quaternion.GetRotationAround(v1, q1);
Assert.AreEqual(q, new Quaternion(0, 1, 0, 0), "GetRotationAround 0 1 0 , 0 0.7 -0.7 0");
v1 = new(0, 0, 0);
q = Quaternion.GetRotationAround(v1, q1);
bool r = float.IsNaN(q.x) && float.IsNaN(q.y) && float.IsNaN(q.z) && float.IsNaN(q.w);
Assert.IsTrue(r, "GetRotationAround 0 0 0 , 0 0.7 -0.7 0");
}
[Test, Ignore("ToDo")]
public void GetSwingTwist() { }
[Test, Ignore("ToDo")]
public void Dot() { }
}
}
#endif