README, Makefile, and license headers
[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_mcopy(cb, ca);
84         cgm_mtranspose(cb);
85         b = a;
86         b.transpose();
87         ASSERT_EQ(b, cb);
88
89         for(int i=0; i<4; i++) {
90                 for(int j=0; j<4; j++) {
91                         cgm_mcopy(cb, ca);
92                         b = a;
93
94                         cgm_msubmatrix(cb, i, j);
95                         Mat3 sub = b.submatrix(i, j);
96                         b = Mat4::identity;
97                         float *bp = b[0];
98                         float *sp = sub[0];
99                         bp[0] = sp[0]; bp[1] = sp[1]; bp[2] = sp[2];
100                         bp[4] = sp[3]; bp[5] = sp[4]; bp[6] = sp[5];
101                         bp[8] = sp[6]; bp[9] = sp[7]; bp[10] = sp[8];
102
103                         ASSERT_EQ(b, cb);
104                 }
105         }
106
107         cgm_minverse(ca);
108         a.inverse();
109         ASSERT_EQ(a, ca);
110
111         return true;
112 }
113
114 float frand(float low, float high)
115 {
116         float range = high - low;
117         return ((float)rand() / (float)RAND_MAX) * range + low;
118 }