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