Merge branch 'devel/master' into tizen
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Matrix3.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23
24
25 using namespace Dali;
26
27 void utc_dali_matrix3_startup(void)
28 {
29   test_return_value = TET_UNDEF;
30 }
31
32 void utc_dali_matrix3_cleanup(void)
33 {
34   test_return_value = TET_PASS;
35 }
36
37 namespace
38 {
39
40 Matrix3 m1(
41   -18.6f, 1.88e-09f, -6.85e-09f,
42   0.0f,13.2f, 13.2f,
43   -1.36e-08f,13.2f, -13.2f);
44
45 Matrix3 m2(
46   -18.6f,6.91e-06f, 6.76e-06f,
47   8.04e-09f,13.2f, 13.2f,
48   3.01e-06f,13.2f, -13.2f);
49
50 Matrix3 m3(
51   6.24f,-12.4f, -12.4f,
52   -17.6f,-4.46f, -4.37f,
53   -0.0641f,13.2f, -13.2f);
54
55 Matrix3 m4(
56   -16.3f,6.42f, 6.38f,
57   9.05f,11.6f, 11.4f,
58   -0.0371f,13.1f, -13.3f);
59
60 Matrix3 m5(
61   -2.43f,13.2f, 12.9f,
62   18.5f,1.92f, 1.51f,
63   -0.257f,13.0f, -13.4f);
64
65 Matrix3 m6(
66   -2.43f,  -13.2f,   -200.9f,
67   18.5f,     1.92f,    1.51f,
68    0.257f,  13.0f,    13.4f);
69
70
71 Matrix3 i1(
72   -0.05,  -0.00,   0.00,
73   -0.00,   0.04,   0.04,
74    0.00,   0.04,  -0.04);
75
76 Matrix3 i2(
77   -0.05,   0.00,  -0.00,
78    0.00,   0.04,   0.04,
79    0.00,   0.04,  -0.04);
80
81 Matrix3 i3(
82    0.02,  -0.05,  -0.00,
83   -0.04,  -0.01,   0.04,
84   -0.04,  -0.01,  -0.04);
85
86 Matrix3 i4(
87   -0.05,   0.03,  -0.00,
88    0.02,   0.03,   0.04,
89    0.02,   0.03,  -0.04);
90
91 Matrix3 i5(
92   -0.01,   0.05,  -0.00,
93    0.04,   0.01,   0.04,
94    0.04,   0.00,  -0.04);
95
96
97
98 Matrix3 t1(
99   -18.6f, 0.0f, -1.36e-08f,
100   1.88e-09f,13.2f, 13.2f,
101   -6.85e-09f,13.2f, -13.2f);
102
103 Matrix3 t2(
104   -18.6f,8.04e-09f, 3.01e-06f,
105   6.91e-06f,13.2f, 13.2f,
106   6.76e-06f,13.2f, -13.2f);
107
108 Matrix3 t3(
109   6.24f,-17.6f, -0.0641f,
110   -12.4f,-4.46f, 13.2f,
111   -12.4f, -4.37f, -13.2f);
112
113 Matrix3 t4(
114   -16.3f,9.05f, -0.0371f,
115   6.42f, 11.6f, 13.1f,
116   6.38f,11.4f, -13.3f);
117
118 Matrix3 t5(
119   -2.43f,18.5f, -0.257f,
120   13.2f, 1.92f, 13.0f,
121   12.9f, 1.51f, -13.4f);
122
123
124
125 Matrix3* matrices[5] = { &m1, &m2, &m3, &m4, &m5 };
126 Matrix3* inverseMatrices[5] = { &i1, &i2, &i3, &i4, &i5 };
127 Matrix3* transposeMatrices[5] = { &t1, &t2, &t3, &t4, &t5 };
128
129 } // anonymous namespace
130
131 int UtcDaliMatrix3FromMatrix(void)
132 {
133   float els0[] = { 0.0f,  1.0f,  2.0f, 3.0f,
134                    4.0f,  5.0f,  6.0f, 7.0f,
135                    8.0f,  9.0f, 10.0f, 11.0f,
136                    12.0f, 13.0f, 14.0f, 15.0f};
137   Matrix m0(els0);
138   Matrix3 m1(0.0f,  1.0f,  2.0f,
139              4.0f,  5.0f,  6.0f,
140              8.0f,  9.0f, 10.0f);
141
142   Matrix3 m2(m0);
143
144   DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
145   END_TEST;
146 }
147
148 int UtcDaliMatrix3CopyConstructor(void)
149 {
150   Matrix3 m0( Matrix3::IDENTITY );
151   Matrix3 m1( m0 );
152   DALI_TEST_EQUALS(m1, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
153
154   END_TEST;
155 }
156
157 int UtcDaliMatrix3MoveConstructor(void)
158 {
159   Matrix3 m0( Matrix3::IDENTITY );
160   Matrix3 m1 = std::move( m0 );
161   DALI_TEST_EQUALS(m1, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
162
163   END_TEST;
164 }
165
166 int UtcDaliMatrix3CopyAssignment(void)
167 {
168   Matrix3 m0( Matrix3::IDENTITY );
169   Matrix3 m1;
170   m1 = m0;
171   DALI_TEST_EQUALS(m1, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
172
173   END_TEST;
174 }
175
176 int UtcDaliMatrix3MoveAssignment(void)
177 {
178   Matrix3 m0( Matrix3::IDENTITY );
179   Matrix3 m1;
180   m1 = std::move( m0 );
181   DALI_TEST_EQUALS(m1, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
182
183   END_TEST;
184 }
185
186 int UtcDaliMatrix3OperatorAssign01(void)
187 {
188   float els0[] = { 0.0f,  1.0f,  2.0f, 3.0f,
189                    4.0f,  5.0f,  6.0f, 7.0f,
190                    8.0f,  9.0f, 10.0f, 11.0f,
191                    12.0f, 13.0f, 14.0f, 15.0f};
192   Matrix m0(els0);
193
194   Matrix3 m1(0.0f,  1.0f,  2.0f,
195              4.0f,  5.0f,  6.0f,
196              8.0f,  9.0f, 10.0f);
197
198   Matrix3 m2;
199   m2 = m0;
200   m2 = m2; // Test branch
201
202   DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
203   END_TEST;
204 }
205
206
207 int UtcDaliMatrix3OperatorAssign02(void)
208 {
209   Matrix3 m0(0.0f,  1.0f,  2.0f,
210              4.0f,  5.0f,  6.0f,
211              8.0f,  9.0f, 10.0f);
212
213   Matrix3 m1(0.0f,  1.0f,  2.0f,
214              4.0f,  5.0f,  6.0f,
215              8.0f,  9.0f, 10.0f);
216
217   Matrix3 m2;
218   m2 = m0;
219
220   DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
221   END_TEST;
222 }
223
224
225
226 // AsFloat
227 int UtcDaliMatrix3AsFloat(void)
228 {
229   float values[] = {0.0f,  1.0f,  2.0f,
230                     4.0f,  5.0f,  6.0f,
231                     8.0f,  9.0f, 10.0f };
232
233   Matrix3 m1(values[0], values[1], values[2], values[3],values[4], values[5], values[6], values[7],values[8]);
234
235   for (int i=0;i<9;++i)
236   {
237     DALI_TEST_EQUALS(m1.AsFloat()[i], values[i],       TEST_LOCATION);
238   }
239   END_TEST;
240 }
241
242
243 // Invert works
244 int UtcDaliMatrix3Invert(void)
245 {
246   // We're going to invert a whole load of different matrices to make sure we don't
247   // fail on particular orientations.
248   for (int i=0;i<5;++i)
249   {
250     Matrix3 m = *matrices[i];
251     Matrix3 inverseResult1 = *inverseMatrices[i];
252
253     // Convert to Mat4, perform inverse, and convert back to Mat3
254     float* mf = m.AsFloat();
255     float els[] = { mf[0], mf[1], mf[2], 0.0f,
256                     mf[3], mf[4], mf[5], 0.0f,
257                     mf[6], mf[7], mf[8], 0.0f,
258                     0.0f,  0.0f,  0.0f,  1.0f };
259     Matrix mat4(els);
260     mat4.Invert();
261     Matrix3 inverseResult2 = mat4;
262
263     Matrix3 mInv = m;
264     mInv.Invert();
265
266     DALI_TEST_EQUALS(mInv, inverseResult1, 0.01f, TEST_LOCATION);
267     DALI_TEST_EQUALS(mInv, inverseResult2, 0.01f, TEST_LOCATION);
268
269     Matrix3 m2 = mInv;
270     m2.Invert();    // double invert - should be back to m
271
272     DALI_TEST_EQUALS(m, m2, 0.01f, TEST_LOCATION);
273   }
274   END_TEST;
275 }
276
277 int UtcDaliMatrix3Transpose(void)
278 {
279   for (int i=0;i<5;++i)
280   {
281     Matrix3 m0    = *matrices[i];
282     Matrix3 trans = *transposeMatrices[i];
283
284     Matrix3 m1 = m0;
285     m1.Transpose();
286
287     DALI_TEST_EQUALS(m1, trans, 0.001f, TEST_LOCATION);
288
289     Matrix3 m2 = m1;
290     m2.Transpose();
291
292     DALI_TEST_EQUALS(m0, m2, 0.001f, TEST_LOCATION);
293   }
294   END_TEST;
295 }
296
297 // SetIdentity
298 int UtcDaliMatrix3SetIdentity(void)
299 {
300   Matrix3 m( 0.0f,  1.0f,  2.0f,
301              4.0f,  5.0f,  6.0f,
302              8.0f,  9.0f, 10.0f);
303   m.SetIdentity();
304
305   DALI_TEST_EQUALS(m, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
306   END_TEST;
307 }
308
309
310 int UtcDaliMatrix3Scale(void)
311 {
312   Matrix3 m1( 0.0f,  1.0f,  2.0f,
313              4.0f,  5.0f,  6.0f,
314              8.0f,  9.0f, 10.0f);
315
316   Matrix3 m2( 0.0f,  3.0f,  6.0f,
317              12.0f,  15.0f, 18.0f,
318              24.0f,  27.0f, 30.0f);
319
320   m1.Scale(3.0f);
321
322   DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
323   END_TEST;
324 }
325
326 int UtcDaliMatrix3Magnitude(void)
327 {
328   Matrix3 m1( 0.0f,  1.0f,  -2.0f,
329               3.0f,  -4.0f,  5.0f,
330               -6.0f,  7.0f,  8.0f);
331
332   DALI_TEST_EQUALS(Matrix3::IDENTITY.Magnitude(), 1.0f, 0.001f, TEST_LOCATION);
333   DALI_TEST_EQUALS(m1.Magnitude(), 12.0f, 0.001f, TEST_LOCATION);
334   END_TEST;
335 }
336
337
338
339 int UtcDaliMatrix3ScaleInverseTranspose(void)
340 {
341   Matrix3* matrices[6] = { &m1, &m2, &m3, &m4, &m5, &m6 };
342
343
344   for (int i=0;i<6;++i)
345   {
346     Matrix3 m0    = *matrices[i];
347
348     Matrix3 m1 = m0;
349     m1.Invert();
350     m1.Transpose();
351     m1.Scale(3.0f/(m1.Magnitude()));
352
353     Matrix3 m2 = m0;
354     m2.ScaledInverseTranspose();
355
356     DALI_TEST_EQUALS(m1, m2, 0.001f, TEST_LOCATION);
357   }
358   END_TEST;
359 }
360
361 int UtcDaliMatrix3OStreamOperator(void)
362 {
363   std::ostringstream oss;
364
365   Matrix3 matrix( 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f );
366
367   oss << matrix;
368
369   std::string expectedOutput = "[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]";
370
371   DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
372   END_TEST;
373 }
374
375 int UtcDaliMatrix3Multiply(void)
376 {
377   Matrix3 m1( 0.0f,  3.0f,  6.0f,
378              12.0f,  15.0f, 18.0f,
379              24.0f,  27.0f, 30.0f);
380
381   Matrix3 m2( 0.0f,  1.0f,  0.0f,
382              -1.0f,  0.0f,  0.0f,
383               0.0f,  0.0f,  1.0f);
384
385   Matrix3 m3( -3.0f,  0.0f,  6.0f,
386              -15.0f, 12.0f, 18.0f,
387              -27.0f, 24.0f, 30.0f);
388
389   Matrix3 result;
390   Matrix3::Multiply(result, m1, m2);
391
392   DALI_TEST_EQUALS(m3, result, 0.01f, TEST_LOCATION);
393   END_TEST;
394 }
395
396 int UtcDaliMatrix3EqualityOperator(void)
397 {
398   Matrix3 m1( 0.0f,  3.0f,  6.0f,
399               12.0f,  15.0f, 18.0f,
400               24.0f,  27.0f, 30.0f);
401
402   Matrix3 m2( 0.0f,  3.0f,  6.0f,
403              12.0f,  15.0f, 18.0f,
404              24.0f,  27.0f, 30.0f);
405
406   DALI_TEST_CHECK(m1 == m2);
407   END_TEST;
408 }
409
410 int UtcDaliMatrix3InequalityOperator(void)
411 {
412   Matrix3 m1( 1.0f,  0.0f,  0.0f,
413               0.0f,  1.0f,  0.0f,
414               0.0f,  0.0f,  1.0f);
415
416   Matrix3 m2( 0.0f,  3.0f,  6.0f,
417              12.0f,  15.0f, 18.0f,
418              24.0f,  27.0f, 30.0f);
419
420   DALI_TEST_CHECK(m1 != m2);
421   END_TEST;
422 }