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