640cd184087d0c0fd4b1693fd7de9f6e862e49b9
[gph-cmath] / test / test.cc
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include <assert.h>
5 #include <gmath/gmath.h>
6 #include "cgmath.h"
7
8 bool test_vec3();
9 bool test_mat();
10 float frand(float low, float high);
11
12 int main(void)
13 {
14         srand(time(0));
15
16         if(!test_vec3()) {
17                 fprintf(stderr, "test_vec3 failed\n");
18                 return 1;
19         }
20         if(!test_mat()) {
21                 fprintf(stderr, "test_mat failed\n");
22                 return 1;
23         }
24         return 0;
25 }
26
27 #define ASSERT_EQ(a, b) assert(memcmp(&a, &b, sizeof a) == 0)
28
29 bool test_vec3()
30 {
31         Vec3 rv3[2];
32         cgm_vec3 crv3[2];
33         Vec3 v3;
34         cgm_vec3 cv3;
35
36         for(int i=0; i<2; i++) {
37                 rv3[i].x = crv3[i].x = frand(-100, 100);
38                 rv3[i].y = crv3[i].y = frand(-100, 100);
39                 rv3[i].z = crv3[i].z = frand(-100, 100);
40         }
41
42         cgm_vcross(&cv3, crv3, crv3 + 1);
43         v3 = cross(rv3[0], rv3[1]);
44         ASSERT_EQ(v3, cv3);
45
46         cv3 = crv3[0];
47         cgm_vreflect(&cv3, crv3 + 1);
48         v3 = reflect(rv3[0], rv3[1]);
49         ASSERT_EQ(v3, cv3);
50
51         float ior = frand(1, 2);
52         cv3 = crv3[0];
53         cgm_vrefract(&cv3, crv3 + 1, ior);
54         v3 = refract(rv3[0], rv3[1], ior);
55         ASSERT_EQ(v3, cv3);
56
57         return true;
58 }
59
60 bool test_mat()
61 {
62         float ca[16], cb[16], cc[16];
63         Mat4 a, b, c;
64
65         float angle = frand(-100, 100);
66         Vec3 axis = Vec3(frand(-10, 10), frand(-10, 10), frand(-10, 10));
67         cgm_mrotation(ca, angle, axis.x, axis.y, axis.z);
68         a.rotation(angle, axis.x, axis.y, axis.z);
69         ASSERT_EQ(a, ca);
70
71         Vec3 trans = Vec3(frand(-100, 100), frand(-100, 100), frand(-100, 100));
72         Vec3 scale = Vec3(frand(0.1, 10), frand(0.1, 10), frand(0.1, 10));
73         cgm_mtranslate(ca, trans.x, trans.y, trans.z);
74         cgm_mscale(ca, scale.x, scale.y, scale.z);
75         a.translate(trans.x, trans.y, trans.z);
76         a.scale(scale.x, scale.y, scale.z);
77         ASSERT_EQ(a, ca);
78
79         cgm_mprerotate_y(ca, trans.x);
80         a.pre_rotate_y(trans.x);
81         ASSERT_EQ(a, ca);
82
83         cgm_minverse(ca);
84         a.inverse();
85         ASSERT_EQ(a, ca);
86
87         return true;
88 }
89
90 float frand(float low, float high)
91 {
92         float range = high - low;
93         return ((float)rand() / (float)RAND_MAX) * range + low;
94 }