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