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