2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <dali/public-api/dali-core.h>
23 #include <dali-test-suite-utils.h>
27 void utc_dali_vector4_startup(void)
29 test_return_value = TET_UNDEF;
32 void utc_dali_vector4_cleanup(void)
34 test_return_value = TET_PASS;
40 int UtcDaliVector4Vector4(void)
42 float f[] = {2.0f, 3.0f, 4.0f, 5.0f};
43 Vector2 vec2(1.0f, 2.0f);
44 Vector3 vec3(1.0f, 2.0f, 3.0f);
46 Vector4 v1(f[0], f[1], f[2], f[3]);
49 v3 = (const float*) f;
53 DALI_TEST_EQUALS(v0, v1, TEST_LOCATION);
54 DALI_TEST_EQUALS(v0, v2, TEST_LOCATION);
55 DALI_TEST_EQUALS(v3, v0, TEST_LOCATION);
56 DALI_TEST_EQUALS(v4, Vector4(1.0f, 2.0f, 0.0f, 0.0f), TEST_LOCATION);
57 DALI_TEST_EQUALS(v5, Vector4(1.0f, 2.0f, 3.0f, 0.0f), TEST_LOCATION);
58 DALI_TEST_CHECK(v0 == v1);
62 DALI_TEST_EQUALS(v1.x, 1.0f, TEST_LOCATION);
63 DALI_TEST_EQUALS(v1.y, 2.0f, TEST_LOCATION);
64 DALI_TEST_EQUALS(v2.x, 1.0f, TEST_LOCATION);
65 DALI_TEST_EQUALS(v2.y, 2.0f, TEST_LOCATION);
66 DALI_TEST_EQUALS(v2.z, 3.0f, TEST_LOCATION);
71 int UtcDaliVector4Add(void)
73 Vector4 v0(1.0f, 2.0f, 3.0f, 4.0f);
74 Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
75 Vector4 r0(11.0f, 22.0f, 33.0f, 44.0f);
78 DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
81 DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
86 int UtcDaliVector4Constants(void)
88 float f[] = {2.0f, 3.0f, 4.0f, 5.0f};
90 Vector4 v1(f[0], f[1], f[2], f[3]);
93 DALI_TEST_EQUALS(v0, v1, TEST_LOCATION);
94 DALI_TEST_EQUALS(v0, v2, TEST_LOCATION);
95 DALI_TEST_CHECK(v0 == v1);
100 int UtcDaliVector4Cross(void)
102 DALI_TEST_EQUALS(Vector4::XAXIS.Cross(Vector4::YAXIS), Vector4::ZAXIS, 0.0001f, TEST_LOCATION);
103 DALI_TEST_EQUALS(Vector4::YAXIS.Cross(Vector4::ZAXIS), Vector4::XAXIS, 0.0001f, TEST_LOCATION);
104 DALI_TEST_EQUALS(Vector4::ZAXIS.Cross(Vector4::XAXIS), Vector4::YAXIS, 0.0001f, TEST_LOCATION);
106 DALI_TEST_EQUALS(Vector4::XAXIS.Cross(Vector4::ZAXIS), -Vector4::YAXIS, 0.0001f, TEST_LOCATION);
107 DALI_TEST_EQUALS(Vector4::YAXIS.Cross(Vector4::XAXIS), -Vector4::ZAXIS, 0.0001f, TEST_LOCATION);
108 DALI_TEST_EQUALS(Vector4::ZAXIS.Cross(Vector4::YAXIS), -Vector4::XAXIS, 0.0001f, TEST_LOCATION);
110 Vector4 v0(2.0f, 3.0f, 4.0f, 5.0f);
111 Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
112 Vector4 result( (v0.y * v1.z) - (v0.z * v1.y),
113 (v0.z * v1.x) - (v0.x * v1.z),
114 (v0.x * v1.y) - (v0.y * v1.x),
117 DALI_TEST_EQUALS(v0.Cross(v1), result, 0.001f, TEST_LOCATION);
122 int UtcDaliVector4Dot(void)
124 DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector4::YAXIS), 0.0f, TEST_LOCATION);
125 DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector4::ZAXIS), 0.0f, TEST_LOCATION);
126 DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector4::XAXIS), 1.0f, TEST_LOCATION);
127 DALI_TEST_EQUALS(Vector4::YAXIS.Dot(Vector4::YAXIS), 1.0f, TEST_LOCATION);
128 DALI_TEST_EQUALS(Vector4::ZAXIS.Dot(Vector4::ZAXIS), 1.0f, TEST_LOCATION);
130 DALI_TEST_EQUALS(Vector4(1.0f, 0.0f, 0.0f, 1.0f).Dot(Vector4(1.0f, 0.0f, 0.0f, 1.0f)), 1.0f, TEST_LOCATION);
132 // Test v0 . v0 and v0 . v1 (v1 is always 90 degrees out of phase with v0)
133 for (float x = 0; x<6.0f; x+=1.0f)
135 // vectors rotating in the XY plane.
136 Vector4 v0(cosf(x), sinf(x), 0.0f, 1.0f);
137 Vector4 v1(sinf(x), -cosf(x), 0.0f, 1.0f);
138 DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
139 DALI_TEST_EQUALS(v0.Dot(v0), 1.0f, 0.0001f, TEST_LOCATION);
141 // vectors rotating in the XZ plane.
142 v0 = Vector4(cosf(x), 0.0f, sinf(x), 0.0f);
143 v1 = Vector4(sinf(x), 0.0f, -cosf(x), 0.0f);
144 DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
145 DALI_TEST_EQUALS(v0.Dot(v0), 1.0f, 0.0001f, TEST_LOCATION);
148 Vector4 v0 = Vector4(12.0f, 7.0f, 9.0f, 14.0f);
151 Vector4 v1 = v0 * 2.0f;
152 DALI_TEST_EQUALS(v0.Dot(v1), 2.0f, 0.001f, TEST_LOCATION);
156 // Dot (with vector3)
157 int UtcDaliVector4DotVector3(void)
159 DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector3::YAXIS), 0.0f, TEST_LOCATION);
160 DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector3::ZAXIS), 0.0f, TEST_LOCATION);
161 DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector3::XAXIS), 1.0f, TEST_LOCATION);
162 DALI_TEST_EQUALS(Vector4::YAXIS.Dot(Vector3::YAXIS), 1.0f, TEST_LOCATION);
163 DALI_TEST_EQUALS(Vector4::ZAXIS.Dot(Vector3::ZAXIS), 1.0f, TEST_LOCATION);
165 DALI_TEST_EQUALS(Vector4(1.0f, 0.0f, 0.0f, 1.0f).Dot(Vector3(1.0f, 0.0f, 0.0f)), 1.0f, TEST_LOCATION);
167 // Test v0 . v0b and v0 . v1 (v1 is always 90 degrees out of phase with v0)
168 for (float x = 0; x<6.0f; x+=1.0f)
170 // vectors rotating in the XY plane.
171 Vector4 v0(cosf(x), sinf(x), 0.0f, 1.0f);
172 Vector3 v0b(cosf(x), sinf(x), 0.0f);
173 Vector3 v1(sinf(x), -cosf(x), 0.0f);
174 DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
175 DALI_TEST_EQUALS(v0.Dot(v0b), 1.0f, 0.0001f, TEST_LOCATION);
177 // vectors rotating in the XZ plane.
178 v0 = Vector4(cosf(x), 0.0f, sinf(x), 0.0f);
179 v0b = Vector3(cosf(x), 0.0f, sinf(x));
180 v1 = Vector3(sinf(x), 0.0f, -cosf(x));
181 DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
182 DALI_TEST_EQUALS(v0.Dot(v0b), 1.0f, 0.0001f, TEST_LOCATION);
185 Vector4 v0 = Vector4(12.0f, 7.0f, 9.0f, 14.0f);
188 Vector3 v1(v0 * 2.0f);
189 DALI_TEST_EQUALS(v0.Dot(v1), 2.0f, 0.001f, TEST_LOCATION);
194 int UtcDaliVector4Dot4(void)
196 DALI_TEST_EQUALS(Vector4::XAXIS.Dot4(Vector4::YAXIS), 0.0f, TEST_LOCATION);
197 DALI_TEST_EQUALS(Vector4::XAXIS.Dot4(Vector4::ZAXIS), 0.0f, TEST_LOCATION);
198 DALI_TEST_EQUALS(Vector4::YAXIS.Dot4(Vector4::ZAXIS), 0.0f, TEST_LOCATION);
200 DALI_TEST_EQUALS(Vector4::XAXIS.Dot4(Vector4::XAXIS), 1.0f, TEST_LOCATION);
201 DALI_TEST_EQUALS(Vector4::YAXIS.Dot4(Vector4::YAXIS), 1.0f, TEST_LOCATION);
202 DALI_TEST_EQUALS(Vector4::ZAXIS.Dot4(Vector4::ZAXIS), 1.0f, TEST_LOCATION);
204 DALI_TEST_EQUALS(Vector4(1.0f, 0.0f, 0.0f, 1.0f).Dot4(Vector4(1.0f, 0.0f, 0.0f, 1.0f)), 2.0f, TEST_LOCATION);
206 for (float x = 0; x<6.0f; x+=1.0f)
208 Vector4 v0(cosf(x), sinf(x), 0.0f, 1.0f);
209 Vector4 v1(sinf(x), -cosf(x), 0.0f, 1.0f);
210 DALI_TEST_EQUALS(v0.Dot4(v1), 1.0f, 0.0001f, TEST_LOCATION);
211 DALI_TEST_EQUALS(v0.Dot4(v0), 2.0f, 0.0001f, TEST_LOCATION);
213 v0 = Vector4(cosf(x), 0.0f, sinf(x), 0.0f);
214 v1 = Vector4(sinf(x), 0.0f, -cosf(x), 0.0f);
215 DALI_TEST_EQUALS(v0.Dot4(v1), 0.0f, 0.0001f, TEST_LOCATION);
216 DALI_TEST_EQUALS(v0.Dot4(v0), 1.0f, 0.0001f, TEST_LOCATION);
219 Vector4 v0(12.0f, 7.0f, 9.0f, 3.0f);
222 Vector4 v1 = v0 * 2.0f;
223 DALI_TEST_EQUALS(v0.Dot4(v1), 2.0f + 3.0f*6.0f, 0.001f, TEST_LOCATION);
228 int UtcDaliVector4Equals(void)
230 Vector4 v0(1.0f, 2.0f, 3.0f, 4.0f);
231 Vector4 v1(1.0f, 2.0f, 3.0f, 4.0f);
233 DALI_TEST_CHECK(v0 == v1);
235 Vector4 v2 = Vector4(0.0f, 2.0f, 3.0f, 4.0f);
236 DALI_TEST_CHECK(v0 != v2);
238 v2 = Vector4(1.0f, 0.0f, 3.0f, 4.0f);
239 DALI_TEST_CHECK(v0 != v2);
241 v2 = Vector4(1.0f, 2.0f, 0.0f, 4.0f);
242 DALI_TEST_CHECK(v0 != v2);
244 v2 = Vector4(1.0f, 2.0f, 3.0f, 0.0f);
245 DALI_TEST_CHECK(v0 != v2);
250 int UtcDaliVector4Length(void)
252 Vector4 v(1.0f, 2.0f, 3.0f, 4.0f);
253 DALI_TEST_EQUALS(v.Length(), sqrtf(v.x*v.x + v.y*v.y + v.z*v.z), 0.001f, TEST_LOCATION);
255 Vector4 v1(0.0f, 0.0f, 0.0f, 0.0f);
256 DALI_TEST_EQUALS(v1.Length(), 0.0f, TEST_LOCATION);
261 int UtcDaliVector4LengthSquared(void)
263 Vector4 v(1.0f, 2.0f, 3.0f, 4.0f);
264 DALI_TEST_EQUALS(v.LengthSquared(), v.x*v.x + v.y*v.y + v.z*v.z, 0.001f, TEST_LOCATION);
266 Vector4 v1(0.0f, 0.0f, 0.0f, 0.0f);
267 DALI_TEST_EQUALS(v1.LengthSquared(), 0.0f, TEST_LOCATION);
272 int UtcDaliVector4Max(void)
274 Vector4 v0(2.0f, 2.0f, 1.0f, 1.0f);
275 Vector4 v1(1.0f, 1.0f, 2.0f, 2.0f);
277 DALI_TEST_EQUALS(Max(v0, v1), Vector4(2.0f, 2.0f, 2.0f, 2.0f), 0.01f, TEST_LOCATION);
282 int UtcDaliVector4Min(void)
284 Vector4 v0(2.0f, 2.0f, 1.0f, 1.0f);
285 Vector4 v1(1.0f, 1.0f, 2.0f, 2.0f);
287 DALI_TEST_EQUALS(Min(v0, v1), Vector4(1.0f, 1.0f, 1.0f, 1.0f), 0.01f, TEST_LOCATION);
292 int UtcDaliVector4Clamp(void)
294 tet_infoline("Testing Dali::Vector4::Clamp()");
296 Vector4 v0(2.0f, 2.0f, -2.0f, -2.0f);
297 DALI_TEST_EQUALS(Clamp(v0, -1.0f, 1.0f), Vector4(1.0f, 1.0f, -1.0f, -1.0f), 0.01f, TEST_LOCATION);
299 Vector4 v1(1.0f, 0.0f, 0.0f, -1.0f);
300 DALI_TEST_EQUALS(Clamp(v1, -1.0f, 1.0f), v1, 0.01f, TEST_LOCATION);
305 int UtcDaliVector4ClampVector4(void)
307 tet_infoline("Testing Dali::Vector4::Clamp( const Vector4& v, const Vector4& min, const Vector4& max )");
309 Vector4 v0(2.0f, 0.8f, 0.0f, 5.0f);
310 Vector4 v1(-1.0f, 2.0f, 10.0f, -10.0f);
311 Vector4 v2(10.0f, 5.0f, 0.0f, 10.0f);
312 Vector4 v3(8.0f, 10.0f, 5.0f, -20.0f);
313 Vector4 v4(4.9f, 5.1f, 10.0f, 0.0f);
315 Vector4 min(1.0f, -2.0f, -8.0f, -16.0f);
316 Vector4 max(2.0f, 4.0f, 4.0f, -8.0f);
318 v0.Clamp( min, max );
319 v1.Clamp( min, max );
320 v2.Clamp( min, max );
321 v3.Clamp( min, max );
322 v4.Clamp( min, max );
324 DALI_TEST_EQUALS( v0, Vector4( 2.0f, 0.8f, 0.0f, -8.0f), 0.01f, TEST_LOCATION );
325 DALI_TEST_EQUALS( v1, Vector4( 1.0f, 2.0f, 4.0f, -10.0f), 0.01f, TEST_LOCATION );
326 DALI_TEST_EQUALS( v2, Vector4( 2.0f, 4.0f, 0.0f, -8.0f), 0.01f, TEST_LOCATION );
327 DALI_TEST_EQUALS( v3, Vector4( 2.0f, 4.0f, 4.0f, -16.0f), 0.01f, TEST_LOCATION );
328 DALI_TEST_EQUALS( v4, Vector4( 2.0f, 4.0f, 4.0f, -8.0f), 0.01f, TEST_LOCATION );
333 int UtcDaliVector4Multiply(void)
335 Vector4 v0(2.0f, 3.0f, 4.0f, 5.0f);
336 Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
337 Vector4 r0(20.0f, 60.0f, 120.0f, 200.0f);
339 Vector4 v2 = v0 * v1;
340 DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
343 DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
348 int UtcDaliVector4Divide(void)
350 Vector4 v0(1.0f, 1.0f, 1.0f, 1.0f);
351 Vector4 v1(2.0f, 3.0f, 5.0f, 7.0f);
352 Vector4 v2(4.0f, 9.0f, 25.0f, 49.0f);
354 DALI_TEST_EQUALS( v0/v0, v0, TEST_LOCATION);
355 DALI_TEST_EQUALS( v1/v0, v1, TEST_LOCATION);
356 DALI_TEST_EQUALS( v1/v1, v0, TEST_LOCATION);
357 DALI_TEST_EQUALS( v2/v1, v1, TEST_LOCATION);
361 DALI_TEST_EQUALS(v4, v0, TEST_LOCATION);
365 DALI_TEST_EQUALS(v5, v1, TEST_LOCATION);
369 DALI_TEST_EQUALS(v6, v0, TEST_LOCATION);
372 DALI_TEST_EQUALS(v2, v1, TEST_LOCATION);
377 int UtcDaliVector4Scale(void)
379 Vector4 v0(2.0f, 4.0f, 8.0f, 16.0f);
380 const Vector4 r0(20.0f, 40.0f, 80.0f, 160.0f);
381 const Vector4 r1(10.0f, 20.0f, 40.0f, 80.0f);
382 const Vector4 r2( 1.0f, 2.0f, 4.0f, 8.0f);
383 const Vector4 r3(2.0f, 4.0f, 8.0f, 16.0f);
385 Vector4 v2 = v0 * 10.0f;
386 DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
389 DALI_TEST_EQUALS(v0, r1, TEST_LOCATION);
392 DALI_TEST_EQUALS(v2, r3, TEST_LOCATION);
396 DALI_TEST_EQUALS(v2, r2, TEST_LOCATION);
402 int UtcDaliVector4Normalize(void)
404 for (float f=0.0f; f<6.0f; f+=1.0f)
406 Vector4 v(cosf(f)*10.0f, cosf(f+1.0f)*10.0f, cosf(f+2.0f)*10.0f, 1.0f);
408 DALI_TEST_EQUALS(v.LengthSquared(), 1.0f, 0.001f, TEST_LOCATION);
411 Vector4 v(0.0f, 0.0f, 0.0f, 1.0f);
413 DALI_TEST_EQUALS(v.LengthSquared(), 0.0f, 0.00001f, TEST_LOCATION);
418 int UtcDaliVector4Subtract(void)
420 Vector4 v0(11.0f, 22.0f, 33.0f, 44.0f);
421 Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
422 Vector4 r0(1.0f, 2.0f, 3.0f, 4.0f);
425 DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
428 DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
432 int UtcDaliVector4OperatorSubscript(void)
434 Vector4 testVector(1.0f, 2.0f, 3.0f, 4.0f);
436 // read array subscripts
437 DALI_TEST_EQUALS( testVector[0], 1.0f, TEST_LOCATION );
438 DALI_TEST_EQUALS( testVector[1], 2.0f, TEST_LOCATION );
439 DALI_TEST_EQUALS( testVector[2], 3.0f, TEST_LOCATION );
440 DALI_TEST_EQUALS( testVector[3], 4.0f, TEST_LOCATION );
442 // write array subscripts/read struct memebers
443 testVector[0] = 5.0f;
444 testVector[1] = 6.0f;
445 testVector[2] = 7.0f;
446 testVector[3] = 8.0f;
448 DALI_TEST_EQUALS( testVector.x, 5.0f, TEST_LOCATION );
449 DALI_TEST_EQUALS( testVector.y, 6.0f, TEST_LOCATION );
450 DALI_TEST_EQUALS( testVector.z, 7.0f, TEST_LOCATION );
451 DALI_TEST_EQUALS( testVector.w, 8.0f, TEST_LOCATION );
453 // write struct members/read array subscripts
455 testVector.y = 10.0f;
456 testVector.z = 11.0f;
457 testVector.w = 12.0f;
459 DALI_TEST_EQUALS( testVector[0], 9.0f, TEST_LOCATION );
460 DALI_TEST_EQUALS( testVector[1], 10.0f, TEST_LOCATION );
461 DALI_TEST_EQUALS( testVector[2], 11.0f, TEST_LOCATION );
462 DALI_TEST_EQUALS( testVector[3], 12.0f, TEST_LOCATION );
465 // write struct members/read array subscripts
466 const Vector4 testVector2(1.0f, 2.0f, 3.0f, 4.0f);
467 const float& x = testVector2[0];
468 const float& y = testVector2[1];
469 const float& z ( testVector2[2] );
470 const float& w ( testVector2[3] );
472 DALI_TEST_EQUALS( x, 1.0f, TEST_LOCATION );
473 DALI_TEST_EQUALS( y, 2.0f, TEST_LOCATION );
474 DALI_TEST_EQUALS( z, 3.0f, TEST_LOCATION );
475 DALI_TEST_EQUALS( w, 4.0f, TEST_LOCATION );
479 float& w = testVector[4];
481 tet_result(TET_FAIL);
483 catch (Dali::DaliException& e)
485 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
486 DALI_TEST_ASSERT( e, "index < 4", TEST_LOCATION );
491 const float& w = testVector2[4];
493 tet_result(TET_FAIL);
495 catch (Dali::DaliException& e)
497 tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
498 DALI_TEST_ASSERT( e, "index < 4", TEST_LOCATION );
503 int UtcDaliVector4OStreamOperator(void)
505 std::ostringstream oss;
507 Vector4 vector(1.0f, 2.0f, 3.0f, 4.0f);
511 std::string expectedOutput = "[1, 2, 3, 4]";
513 DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
517 int UtcDaliVector4AsFloat(void)
519 float values[] = {0.0f, 1.0f, 2.0f, 3.0f};
522 for (int i=0;i<4;++i)
524 DALI_TEST_EQUALS(v0.AsFloat()[i], values[i], TEST_LOCATION);
527 const Vector4 v1(values);
528 for (int i=0;i<4;++i)
530 DALI_TEST_EQUALS(v1.AsFloat()[i], values[i], TEST_LOCATION);