1 #define GLM_FORCE_SWIZZLE
2 #include <glm/vector_relational.hpp>
3 #include <glm/vec2.hpp>
4 #include <vector>
5 #if GLM_HAS_TRIVIAL_QUERIES
6 # include <type_traits>
7 #endif
8
9 static glm::vec2 v1;
10 static glm::vec2 v2(1);
11 static glm::vec2 v3(1, 1);
12
test_vec2_operators()13 int test_vec2_operators()
14 {
15 int Error = 0;
16
17 {
18 glm::vec2 A(1.0f);
19 glm::vec2 B(1.0f);
20 Error += A != B ? 1 : 0;
21 Error += A == B ? 0 : 1;
22 }
23
24 {
25 glm::vec2 A(1.0f);
26 glm::vec2 C = A + 1.0f;
27 A += 1.0f;
28 Error += A.x == 2.0f && A.y == 2.0f ? 0 : 1;
29 Error += A.x == C.x && A.y == C.y ? 0 : 1;
30 }
31
32 {
33 glm::vec2 A(1.0f);
34 glm::vec2 B(2.0f,-1.0f);
35 glm::vec2 C = A + B;
36 A += B;
37 Error += A.x == 3.0f && A.y == 0.0f ? 0 : 1;
38 Error += A.x == C.x && A.y == C.y ? 0 : 1;
39 }
40
41 {
42 glm::vec2 A(1.0f);
43 glm::vec2 C = A - 1.0f;
44 A -= 1.0f;
45 Error += A.x == 0.0f && A.y == 0.0f ? 0 : 1;
46 Error += A.x == C.x && A.y == C.y ? 0 : 1;
47 }
48
49 {
50 glm::vec2 A(1.0f);
51 glm::vec2 B(2.0f,-1.0f);
52 glm::vec2 C = A - B;
53 A -= B;
54 Error += A.x == -1.0f && A.y == 2.0f ? 0 : 1;
55 Error += A.x == C.x && A.y == C.y ? 0 : 1;
56 }
57
58 {
59 glm::vec2 A(1.0f);
60 glm::vec2 C = A * 2.0f;
61 A *= 2.0f;
62 Error += A.x == 2.0f && A.y == 2.0f ? 0 : 1;
63 Error += A.x == C.x && A.y == C.y ? 0 : 1;
64 }
65
66 {
67 glm::vec2 A(2.0f);
68 glm::vec2 B(2.0f);
69 glm::vec2 C = A / B;
70 A /= B;
71 Error += A.x == 1.0f && A.y == 1.0f ? 0 : 1;
72 Error += A.x == C.x && A.y == C.y ? 0 : 1;
73 }
74
75 {
76 glm::vec2 A(1.0f, 2.0f);
77 glm::vec2 B(4.0f, 5.0f);
78
79 glm::vec2 C = A + B;
80 Error += C == glm::vec2(5, 7) ? 0 : 1;
81
82 glm::vec2 D = B - A;
83 Error += D == glm::vec2(3, 3) ? 0 : 1;
84
85 glm::vec2 E = A * B;
86 Error += E == glm::vec2(4, 10) ? 0 : 1;
87
88 glm::vec2 F = B / A;
89 Error += F == glm::vec2(4, 2.5) ? 0 : 1;
90
91 glm::vec2 G = A + 1.0f;
92 Error += G == glm::vec2(2, 3) ? 0 : 1;
93
94 glm::vec2 H = B - 1.0f;
95 Error += H == glm::vec2(3, 4) ? 0 : 1;
96
97 glm::vec2 I = A * 2.0f;
98 Error += I == glm::vec2(2, 4) ? 0 : 1;
99
100 glm::vec2 J = B / 2.0f;
101 Error += J == glm::vec2(2, 2.5) ? 0 : 1;
102
103 glm::vec2 K = 1.0f + A;
104 Error += K == glm::vec2(2, 3) ? 0 : 1;
105
106 glm::vec2 L = 1.0f - B;
107 Error += L == glm::vec2(-3, -4) ? 0 : 1;
108
109 glm::vec2 M = 2.0f * A;
110 Error += M == glm::vec2(2, 4) ? 0 : 1;
111
112 glm::vec2 N = 2.0f / B;
113 Error += N == glm::vec2(0.5, 2.0 / 5.0) ? 0 : 1;
114 }
115
116 {
117 glm::vec2 A(1.0f, 2.0f);
118 glm::vec2 B(4.0f, 5.0f);
119
120 A += B;
121 Error += A == glm::vec2(5, 7) ? 0 : 1;
122
123 A += 1.0f;
124 Error += A == glm::vec2(6, 8) ? 0 : 1;
125 }
126 {
127 glm::vec2 A(1.0f, 2.0f);
128 glm::vec2 B(4.0f, 5.0f);
129
130 B -= A;
131 Error += B == glm::vec2(3, 3) ? 0 : 1;
132
133 B -= 1.0f;
134 Error += B == glm::vec2(2, 2) ? 0 : 1;
135 }
136 {
137 glm::vec2 A(1.0f, 2.0f);
138 glm::vec2 B(4.0f, 5.0f);
139
140 A *= B;
141 Error += A == glm::vec2(4, 10) ? 0 : 1;
142
143 A *= 2.0f;
144 Error += A == glm::vec2(8, 20) ? 0 : 1;
145 }
146 {
147 glm::vec2 A(1.0f, 2.0f);
148 glm::vec2 B(4.0f, 5.0f);
149
150 B /= A;
151 Error += B == glm::vec2(4, 2.5) ? 0 : 1;
152
153 B /= 2.0f;
154 Error += B == glm::vec2(2, 1.25) ? 0 : 1;
155 }
156 {
157 glm::vec2 B(2.0f);
158
159 B /= B.y;
160 Error += B == glm::vec2(1.0f) ? 0 : 1;
161 }
162
163 {
164 glm::vec2 A(1.0f, 2.0f);
165 glm::vec2 B = -A;
166 Error += B == glm::vec2(-1.0f, -2.0f) ? 0 : 1;
167 }
168
169 {
170 glm::vec2 A(1.0f, 2.0f);
171 glm::vec2 B = --A;
172 Error += B == glm::vec2(0.0f, 1.0f) ? 0 : 1;
173 }
174
175 {
176 glm::vec2 A(1.0f, 2.0f);
177 glm::vec2 B = A--;
178 Error += B == glm::vec2(1.0f, 2.0f) ? 0 : 1;
179 Error += A == glm::vec2(0.0f, 1.0f) ? 0 : 1;
180 }
181
182 {
183 glm::vec2 A(1.0f, 2.0f);
184 glm::vec2 B = ++A;
185 Error += B == glm::vec2(2.0f, 3.0f) ? 0 : 1;
186 }
187
188 {
189 glm::vec2 A(1.0f, 2.0f);
190 glm::vec2 B = A++;
191 Error += B == glm::vec2(1.0f, 2.0f) ? 0 : 1;
192 Error += A == glm::vec2(2.0f, 3.0f) ? 0 : 1;
193 }
194
195 return Error;
196 }
197
test_vec2_ctor()198 int test_vec2_ctor()
199 {
200 int Error = 0;
201
202 {
203 glm::vec2 A(1);
204 glm::vec2 B(A);
205 Error += A == B ? 0 : 1;
206 }
207
208 # if GLM_HAS_TRIVIAL_QUERIES
209 // Error += std::is_trivially_default_constructible<glm::vec2>::value ? 0 : 1;
210 // Error += std::is_trivially_copy_assignable<glm::vec2>::value ? 0 : 1;
211 Error += std::is_trivially_copyable<glm::vec2>::value ? 0 : 1;
212 Error += std::is_trivially_copyable<glm::dvec2>::value ? 0 : 1;
213 Error += std::is_trivially_copyable<glm::ivec2>::value ? 0 : 1;
214 Error += std::is_trivially_copyable<glm::uvec2>::value ? 0 : 1;
215
216 Error += std::is_copy_constructible<glm::vec2>::value ? 0 : 1;
217 # endif
218
219 #if GLM_HAS_INITIALIZER_LISTS
220 {
221 glm::vec2 a{ 0, 1 };
222 std::vector<glm::vec2> v = {
223 {0, 1},
224 {4, 5},
225 {8, 9}};
226 }
227
228 {
229 glm::dvec2 a{ 0, 1 };
230 std::vector<glm::dvec2> v = {
231 {0, 1},
232 {4, 5},
233 {8, 9}};
234 }
235 #endif
236
237 #if GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)
238 {
239 glm::vec2 A = glm::vec2(1.0f, 2.0f);
240 glm::vec2 B = A.xy;
241 glm::vec2 C(A.xy);
242 glm::vec2 D(A.xy());
243
244 Error += glm::all(glm::equal(A, B)) ? 0 : 1;
245 Error += glm::all(glm::equal(A, C)) ? 0 : 1;
246 Error += glm::all(glm::equal(A, D)) ? 0 : 1;
247 }
248 #endif//GLM_HAS_UNRESTRICTED_UNIONS && defined(GLM_FORCE_SWIZZLE)
249
250 {
251 glm::vec2 A = glm::vec2(2.0f);
252 glm::vec2 B = glm::vec2(2.0f, 3.0f);
253 glm::vec2 C = glm::vec2(2.0f, 3.0);
254 //glm::vec2 D = glm::dvec2(2.0); // Build error TODO: What does the specification says?
255 glm::vec2 E(glm::dvec2(2.0));
256 glm::vec2 F(glm::ivec2(2));
257 }
258
259 return Error;
260 }
261
test_vec2_size()262 int test_vec2_size()
263 {
264 int Error = 0;
265
266 Error += sizeof(glm::vec2) == sizeof(glm::mediump_vec2) ? 0 : 1;
267 Error += 8 == sizeof(glm::mediump_vec2) ? 0 : 1;
268 Error += sizeof(glm::dvec2) == sizeof(glm::highp_dvec2) ? 0 : 1;
269 Error += 16 == sizeof(glm::highp_dvec2) ? 0 : 1;
270 Error += glm::vec2().length() == 2 ? 0 : 1;
271 Error += glm::dvec2().length() == 2 ? 0 : 1;
272 Error += glm::vec2::length() == 2 ? 0 : 1;
273 Error += glm::dvec2::length() == 2 ? 0 : 1;
274
275 return Error;
276 }
277
test_operator_increment()278 int test_operator_increment()
279 {
280 int Error(0);
281
282 glm::ivec2 v0(1);
283 glm::ivec2 v1(v0);
284 glm::ivec2 v2(v0);
285 glm::ivec2 v3 = ++v1;
286 glm::ivec2 v4 = v2++;
287
288 Error += glm::all(glm::equal(v0, v4)) ? 0 : 1;
289 Error += glm::all(glm::equal(v1, v2)) ? 0 : 1;
290 Error += glm::all(glm::equal(v1, v3)) ? 0 : 1;
291
292 int i0(1);
293 int i1(i0);
294 int i2(i0);
295 int i3 = ++i1;
296 int i4 = i2++;
297
298 Error += i0 == i4 ? 0 : 1;
299 Error += i1 == i2 ? 0 : 1;
300 Error += i1 == i3 ? 0 : 1;
301
302 return Error;
303 }
304
main()305 int main()
306 {
307 int Error = 0;
308
309 glm::vec2 v;
310 assert(v.length() == 2);
311
312 Error += test_vec2_size();
313 Error += test_vec2_ctor();
314 Error += test_vec2_operators();
315 Error += test_operator_increment();
316
317 return Error;
318 }
319