[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-scene3d / utc-Dali-ModelNode.cpp
1 /*
2  * Copyright (c) 2023 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-toolkit-test-suite-utils.h>
19 #include <dali-toolkit/dali-toolkit.h>
20 #include <stdlib.h>
21 #include <iostream>
22
23 #include <dali-scene3d/public-api/model-components/model-node.h>
24 #include "mesh-builder.h"
25
26 using namespace Dali;
27 using namespace Dali::Toolkit;
28
29 void model_components_model_node_startup(void)
30 {
31   test_return_value = TET_UNDEF;
32 }
33
34 void model_components_model_node_cleanup(void)
35 {
36   test_return_value = TET_PASS;
37 }
38
39 // Negative test case for a method
40 int UtcDaliModelNodeUninitialized(void)
41 {
42   ToolkitTestApplication application;
43   tet_infoline(" UtcDaliModelNodeUninitialized");
44
45   Scene3D::ModelNode modelNode;
46
47   try
48   {
49     // New() must be called to create a ModelNode or it wont be valid.
50     Actor a = Actor::New();
51     modelNode.Add(a);
52     DALI_TEST_CHECK(false);
53   }
54   catch(Dali::DaliException& e)
55   {
56     // Tests that a negative test of an assertion succeeds
57     DALI_TEST_PRINT_ASSERT(e);
58     DALI_TEST_CHECK(!modelNode);
59   }
60   END_TEST;
61 }
62
63 // Positive test case for a method
64 int UtcDaliModelNodeNew(void)
65 {
66   ToolkitTestApplication application;
67   tet_infoline(" UtcDaliModelNodeNew");
68
69   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
70   DALI_TEST_CHECK(modelNode);
71   END_TEST;
72 }
73
74 // Positive test case for a method
75 int UtcDaliModelNodeDownCast(void)
76 {
77   ToolkitTestApplication application;
78   tet_infoline(" UtcDaliModelNodeDownCast");
79
80   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
81   BaseHandle         handle(modelNode);
82
83   Scene3D::ModelNode modelNode2 = Scene3D::ModelNode::DownCast(handle);
84   DALI_TEST_CHECK(modelNode);
85   DALI_TEST_CHECK(modelNode2);
86   DALI_TEST_CHECK(modelNode2 == modelNode);
87   END_TEST;
88 }
89
90 int UtcDaliModelNodeTypeRegistry(void)
91 {
92   ToolkitTestApplication application;
93
94   TypeRegistry typeRegistry = TypeRegistry::Get();
95   DALI_TEST_CHECK(typeRegistry);
96
97   TypeInfo typeInfo = typeRegistry.GetTypeInfo("ModelNode");
98   DALI_TEST_CHECK(typeInfo);
99
100   BaseHandle handle = typeInfo.CreateInstance();
101   DALI_TEST_CHECK(handle);
102
103   Scene3D::ModelNode modelNode = Scene3D::ModelNode::DownCast(handle);
104   DALI_TEST_CHECK(modelNode);
105
106   END_TEST;
107 }
108
109 // Positive test case for a method
110 int UtcDaliModelNodeAddRemove(void)
111 {
112   ToolkitTestApplication application;
113   tet_infoline(" UtcDaliModelAddRemove");
114
115   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
116   DALI_TEST_CHECK(modelNode);
117
118   Actor actor = Actor::New();
119   DALI_TEST_CHECK(!actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
120
121   modelNode.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
122   modelNode.SetProperty(Actor::Property::SIZE, application.GetScene().GetSize());
123   modelNode.Add(actor);
124   application.GetScene().Add(modelNode);
125
126   DALI_TEST_CHECK(actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
127
128   modelNode.Remove(actor);
129
130   DALI_TEST_CHECK(!actor.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE));
131   END_TEST;
132 }
133
134 int UtcDaliModelNodeCopyAndAssignment(void)
135 {
136   ToolkitTestApplication application;
137
138   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
139   DALI_TEST_CHECK(modelNode);
140
141   Scene3D::ModelNode copy(modelNode);
142   DALI_TEST_CHECK(modelNode == copy);
143
144   Scene3D::ModelNode assign;
145   DALI_TEST_CHECK(!assign);
146
147   assign = copy;
148   DALI_TEST_CHECK(assign == modelNode);
149
150   END_TEST;
151 }
152
153 int UtcDaliModelNodeMoveConstructor(void)
154 {
155   ToolkitTestApplication application;
156
157   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
158   DALI_TEST_EQUALS(1, modelNode.GetBaseObject().ReferenceCount(), TEST_LOCATION);
159   modelNode.SetProperty(Actor::Property::SENSITIVE, false);
160   DALI_TEST_CHECK(false == modelNode.GetProperty<bool>(Actor::Property::SENSITIVE));
161
162   Scene3D::ModelNode moved = std::move(modelNode);
163   DALI_TEST_CHECK(moved);
164   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
165   DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
166   DALI_TEST_CHECK(!modelNode);
167
168   END_TEST;
169 }
170
171 int UtcDaliModelNodeMoveAssignment(void)
172 {
173   ToolkitTestApplication application;
174
175   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
176   DALI_TEST_EQUALS(1, modelNode.GetBaseObject().ReferenceCount(), TEST_LOCATION);
177   modelNode.SetProperty(Actor::Property::SENSITIVE, false);
178   DALI_TEST_CHECK(false == modelNode.GetProperty<bool>(Actor::Property::SENSITIVE));
179
180   Scene3D::ModelNode moved;
181   moved = std::move(modelNode);
182   DALI_TEST_CHECK(moved);
183   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
184   DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
185   DALI_TEST_CHECK(!modelNode);
186
187   END_TEST;
188 }
189
190 int UtcDaliModelNodeOnSizeSet(void)
191 {
192   ToolkitTestApplication application;
193
194   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
195
196   application.GetScene().Add(modelNode);
197
198   application.SendNotification();
199   application.Render();
200
201   Vector2 size(200.0f, 300.0f);
202   modelNode.SetProperty(Actor::Property::SIZE, size);
203
204   application.SendNotification();
205   application.Render();
206
207   DALI_TEST_EQUALS(modelNode.GetCurrentProperty<Vector2>(Actor::Property::SIZE), size, TEST_LOCATION);
208
209   END_TEST;
210 }
211
212 // Method test
213
214 int UtcDaliModelNodeAddRemovePrimitive(void)
215 {
216   tet_infoline(" UtcDaliModelNodeAddPrimitive.");
217
218   ToolkitTestApplication application;
219
220   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
221
222   uint32_t expect = 0u;
223
224   tet_printf("Test empty primitive case\n");
225
226   DALI_TEST_EQUALS(expect, modelNode.GetModelPrimitiveCount(), TEST_LOCATION);
227   DALI_TEST_CHECK(!modelNode.GetModelPrimitive(0u));
228   DALI_TEST_CHECK(!modelNode.GetModelPrimitive(1u));
229
230   Scene3D::ModelPrimitive primitive1 = Scene3D::ModelPrimitive::New();
231   Scene3D::ModelPrimitive primitive2 = Scene3D::ModelPrimitive::New();
232
233   Scene3D::Material material = Scene3D::Material::New();
234
235   primitive1.SetMaterial(material);
236   primitive2.SetMaterial(material);
237
238   tet_printf("Test primitive appended during off scene\n");
239
240   modelNode.AddModelPrimitive(primitive1);
241   ++expect;
242   DALI_TEST_EQUALS(expect, modelNode.GetModelPrimitiveCount(), TEST_LOCATION);
243   DALI_TEST_CHECK(primitive1 == modelNode.GetModelPrimitive(0u));
244   DALI_TEST_CHECK(!modelNode.GetModelPrimitive(1u));
245
246   tet_printf("Test primitive appended during on scene\n");
247
248   application.GetScene().Add(modelNode);
249
250   modelNode.AddModelPrimitive(primitive2);
251   ++expect;
252   DALI_TEST_EQUALS(expect, modelNode.GetModelPrimitiveCount(), TEST_LOCATION);
253   DALI_TEST_CHECK(primitive1 == modelNode.GetModelPrimitive(0u));
254   DALI_TEST_CHECK(primitive2 == modelNode.GetModelPrimitive(1u));
255
256   modelNode.RemoveModelPrimitive(primitive1);
257   DALI_TEST_CHECK(primitive2 == modelNode.GetModelPrimitive(0u));
258   DALI_TEST_CHECK(!modelNode.GetModelPrimitive(1u));
259
260   modelNode.RemoveModelPrimitive(0u);
261   DALI_TEST_CHECK(!modelNode.GetModelPrimitive(0u));
262   DALI_TEST_CHECK(!modelNode.GetModelPrimitive(1u));
263
264   modelNode.Unparent();
265
266   END_TEST;
267 }
268
269 int UtcDaliModelNodeFindChildModelNodeByName(void)
270 {
271   tet_infoline(" UtcDaliModelNodeFindChildModelNodeByName.");
272
273   ToolkitTestApplication application;
274
275   Scene3D::ModelNode modelNode = Scene3D::ModelNode::New();
276   Scene3D::ModelNode modelNode1 = Scene3D::ModelNode::New();
277   Scene3D::ModelNode modelNode2 = Scene3D::ModelNode::New();
278
279   modelNode1.SetProperty(Dali::Actor::Property::NAME, "modelNode1");
280   modelNode2.SetProperty(Dali::Actor::Property::NAME, "modelNode2");
281   modelNode.Add(modelNode1);
282   modelNode.Add(modelNode2);
283
284   Scene3D::ModelNode child1 = modelNode.FindChildModelNodeByName("modelNode1");
285   DALI_TEST_CHECK(child1);
286   DALI_TEST_EQUALS(child1, modelNode1, TEST_LOCATION);
287
288   Scene3D::ModelNode child2 = modelNode.FindChildModelNodeByName("modelNode2");
289   DALI_TEST_CHECK(child2);
290   DALI_TEST_EQUALS(child2, modelNode2, TEST_LOCATION);
291
292   END_TEST;
293 }
294
295 int UtcDaliModelNodeCustomNode1(void)
296 {
297   tet_infoline(" UtcDaliModelNodeCustomNode1.");
298
299   ToolkitTestApplication application;
300
301   Scene3D::ModelNode      modelNode      = Scene3D::ModelNode::New();
302   Scene3D::ModelPrimitive modelPrimitive = Scene3D::ModelPrimitive::New();
303   Scene3D::Material       material       = Scene3D::Material::New();
304   Geometry                geometry       = CreateQuadGeometry();
305
306   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 0, TEST_LOCATION);
307
308   modelNode.AddModelPrimitive(modelPrimitive);
309
310   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 0, TEST_LOCATION);
311   
312   modelPrimitive.SetGeometry(geometry);
313
314   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 0, TEST_LOCATION);
315
316   modelPrimitive.SetMaterial(material);
317
318   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 1, TEST_LOCATION);
319
320   END_TEST;
321 }
322
323 int UtcDaliModelNodeCustomNode2(void)
324 {
325   tet_infoline(" UtcDaliModelNodeCustomNode2.");
326
327   ToolkitTestApplication application;
328
329   Scene3D::ModelNode      modelNode      = Scene3D::ModelNode::New();
330   Scene3D::ModelPrimitive modelPrimitive = Scene3D::ModelPrimitive::New();
331   Scene3D::Material       material       = Scene3D::Material::New();
332   Geometry                geometry       = CreateQuadGeometry();
333   modelPrimitive.SetGeometry(geometry);
334   modelPrimitive.SetMaterial(material);
335
336   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 0, TEST_LOCATION);
337
338   modelNode.AddModelPrimitive(modelPrimitive);
339
340   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 1, TEST_LOCATION);
341
342   END_TEST;
343 }
344
345 int UtcDaliModelNodeCustomNode3(void)
346 {
347   tet_infoline(" UtcDaliModelNodeCustomNode3.");
348
349   ToolkitTestApplication application;
350
351   Scene3D::ModelNode      modelNode      = Scene3D::ModelNode::New();
352   Scene3D::ModelPrimitive modelPrimitive = Scene3D::ModelPrimitive::New();
353   Scene3D::Material       material       = Scene3D::Material::New();
354   Geometry                geometry       = CreateQuadGeometry();
355   modelPrimitive.SetGeometry(geometry);
356   modelPrimitive.SetMaterial(material);
357
358   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 0, TEST_LOCATION);
359
360   modelNode.AddModelPrimitive(modelPrimitive);
361
362   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 1, TEST_LOCATION);
363
364   modelNode.AddModelPrimitive(modelPrimitive);
365
366   DALI_TEST_EQUALS(modelNode.GetRendererCount(), 1, TEST_LOCATION);
367
368   END_TEST;
369 }