aboutsummaryrefslogtreecommitdiff
path: root/test/tests/TestQuat.c
blob: 57a40f7eb46bed4f25aa075fd84c09472fb57734 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <BH/Math/Quat.h>
#include <BH/Unit.h>


#define ACCEPTABLE_DELTA 0.0001f


BH_UNIT_TEST(Identity)
{
    float r[4];

    BH_Quat4fIdentity(r);
    BH_VERIFY_DELTA(r[0], 0.000f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[1], 0.000f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[2], 0.000f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[3], 1.000f, ACCEPTABLE_DELTA);

    return 0;
}


BH_UNIT_TEST(Conjugate)
{
    float a[4], r[4];

    a[0] = -0.9018f; a[1] = -0.0010f; a[2] = -0.4099f; a[3] = 0.1370f;

    BH_Quat4fConjugate(a, r);
    BH_VERIFY_DELTA(r[0], 0.9018f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[1], 0.0010f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[2], 0.4099f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[3], 0.1370f, ACCEPTABLE_DELTA);

    return 0;
}


BH_UNIT_TEST(ToEuler)
{
    float a[4];
    float roll, pitch, yaw;

    a[0] = -0.9018f; a[1] = -0.0010f; a[2] = -0.4099f; a[3] = 0.1370f;

    BH_Quat4fToEuler(a, &roll, &pitch, &yaw);
    BH_VERIFY_DELTA(roll,  -2.7671f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(pitch, -0.8324f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(yaw,   -0.1649f, ACCEPTABLE_DELTA);

    return 0;
}


BH_UNIT_TEST(FromEuler)
{
    float r[4];

    BH_Quat4fFromEuler(-2.7671f, -0.8324f, -0.1649f, r);
    BH_VERIFY_DELTA(r[0], -0.9018f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[1], -0.0010f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[2], -0.4099f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[3],  0.1370f, ACCEPTABLE_DELTA);

    return 0;
}


BH_UNIT_TEST(ToAxis)
{
    float a[4], r[3];
    float angle;

    a[0] = -0.9018f; a[1] = -0.0010f; a[2] = -0.4099f; a[3] = 0.1370f;

    BH_Quat4fToAxis(a, r, &angle);
    BH_VERIFY_DELTA(r[0], -0.9104f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[1], -0.0010f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[2], -0.4138f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(angle, 2.8668f, ACCEPTABLE_DELTA);

    return 0;
}


BH_UNIT_TEST(FromAxis)
{
    float a[3], r[4];
    a[0] = -0.9104f; a[1] = -0.0010f; a[2] = -0.4138f;

    BH_Quat4fFromAxis(a, 2.8668f, r);
    BH_VERIFY_DELTA(r[0], -0.9018f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[1], -0.0010f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[2], -0.4099f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[3],  0.1370f, ACCEPTABLE_DELTA);

    return 0;
}


BH_UNIT_TEST(InverseMultiply)
{
    float a[4], r[4];

    a[0] = -0.9018f; a[1] = -0.0010f; a[2] = -0.4099f; a[3] = 0.1370f;

    BH_Quat4fInverse(a, r);
    BH_Quat4fMul(a, r, r);
    BH_VERIFY_DELTA(r[0], 0.000f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[1], 0.000f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[2], 0.000f, ACCEPTABLE_DELTA);
    BH_VERIFY_DELTA(r[3], 1.000f, ACCEPTABLE_DELTA);

    return 0;
}


int main(int argc, char **argv)
{
    (void)argc;
    (void)argv;

    BH_UNIT_ADD(Identity);
    BH_UNIT_ADD(Conjugate);
    BH_UNIT_ADD(ToEuler);
    BH_UNIT_ADD(FromEuler);
    BH_UNIT_ADD(ToAxis);
    BH_UNIT_ADD(FromAxis);
    BH_UNIT_ADD(InverseMultiply);

    return BH_UnitRun();
}