fe2420f08ede125dfad2f64f9327ecd74d28e5eb
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Visuals-internal.cpp
1 /*
2  * Copyright (c) 2024 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
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <toolkit-event-thread-callback.h>
25 #include <toolkit-text-utils.h>
26
27 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
28 #include <dali-toolkit/devel-api/visuals/arc-visual-properties-devel.h>
29 #include <dali-toolkit/internal/visuals/color/color-visual.h>
30 #include <dali-toolkit/internal/visuals/npatch/npatch-visual.h>
31 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
32
33 #include <../dali-toolkit/dali-toolkit-test-utils/dummy-control.h>
34 #include <dummy-visual.h>
35
36 using namespace Dali;
37 using namespace Toolkit;
38
39 namespace
40 {
41 const char* TEST_VECTOR_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/insta_camera.json";
42 const char* TEST_GIF_FILE_NAME          = TEST_RESOURCE_DIR "/anim.gif";
43
44 } // namespace
45
46 int UtcDaliVisualAction(void)
47 {
48   ToolkitTestApplication application;
49   tet_infoline("Register an ImageVisual and and perform an Action on Visual directly");
50   Vector2 controlSize(20.f, 30.f);
51
52   //Created DummyVisual
53   Property::Map                     settings;
54   Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
55
56   DummyControl        dummyControl = DummyControl::New(true);
57   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
58
59   tet_infoline("Register visual and stage control");
60
61   Toolkit::Visual::Base visualBaseHandle = Toolkit::Visual::Base(dummyVisualPtr.Get());
62   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visualBaseHandle);
63   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
64   application.GetScene().Add(dummyControl);
65
66   application.SendNotification();
67   application.Render();
68
69   tet_infoline("Check action counter is 0 before DoAction");
70   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
71
72   tet_infoline("Perform TEST_ACTION action on Visual. Should increase the action counter");
73
74   Property::Map attributes;
75   visualBaseHandle.DoAction(Dali::Toolkit::Internal::DummyVisual::TEST_ACTION, attributes);
76   application.SendNotification();
77   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 1, TEST_LOCATION);
78
79   END_TEST;
80 }
81
82 int UtcDaliVisualActionNotImplemented(void)
83 {
84   ToolkitTestApplication application;
85   tet_infoline("Register an ImageVisual and and perform an Action on a Visual which does not support any Actions");
86   Vector2 controlSize(20.f, 30.f);
87
88   //Created DummyVisual
89   Property::Map                     settings;
90   Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
91
92   DummyControl        dummyControl = DummyControl::New(true);
93   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
94
95   tet_infoline("Register visual and stage control");
96
97   VisualFactory factory = VisualFactory::Get();
98   Property::Map propertyMap;
99   propertyMap.Insert(Visual::Property::TYPE, Visual::COLOR);
100   propertyMap.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE);
101   Visual::Base visual = factory.CreateVisual(propertyMap);
102
103   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
104   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
105   application.GetScene().Add(dummyControl);
106
107   application.SendNotification();
108   application.Render();
109
110   tet_infoline("Check action counter is 0 before DoAction");
111   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
112
113   tet_infoline("Perform TEST_ACTION action on Color Visual which does not support it.. Should not increment the action counter");
114   Property::Map attributes;
115   visual.DoAction(Dali::Toolkit::Internal::DummyVisual::TEST_ACTION, attributes);
116   application.SendNotification();
117   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
118
119   END_TEST;
120 }
121
122 int UtcDaliVisualActionExtension(void)
123 {
124   ToolkitTestApplication application;
125   tet_infoline("Register an ImageVisual and and perform an Action with Any attributes on Visual directly");
126   Vector2 controlSize(20.f, 30.f);
127
128   //Created DummyVisual
129   Property::Map                     settings;
130   Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
131
132   DummyControl        dummyControl = DummyControl::New(true);
133   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
134
135   tet_infoline("Register visual and stage control");
136
137   Toolkit::Visual::Base visualBaseHandle = Toolkit::Visual::Base(dummyVisualPtr.Get());
138   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visualBaseHandle);
139   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
140   application.GetScene().Add(dummyControl);
141
142   application.SendNotification();
143   application.Render();
144
145   tet_infoline("Check action counter is 0 before DoAction");
146   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
147
148   tet_infoline("Perform TEST_ACTION_EXTENSION action on Visual. Should increase the action counter");
149   Dali::Any attributes;
150   visualBaseHandle.DoActionExtension(Dali::Toolkit::Internal::DummyVisual::TEST_ACTION_EXTENSION, attributes);
151   application.SendNotification();
152   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 1, TEST_LOCATION);
153
154   END_TEST;
155 }
156
157 int UtcDaliVisualActionExtensionNotImplemented(void)
158 {
159   ToolkitTestApplication application;
160   tet_infoline("Register an ImageVisual and and perform an ActionExtension on a Visual which does not support any Actions");
161   Vector2 controlSize(20.f, 30.f);
162
163   //Created DummyVisual
164   Property::Map                     settings;
165   Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
166
167   DummyControl        dummyControl = DummyControl::New(true);
168   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
169
170   tet_infoline("Register visual and stage control");
171
172   VisualFactory factory = VisualFactory::Get();
173   Property::Map propertyMap;
174   propertyMap.Insert(Visual::Property::TYPE, Visual::COLOR);
175   propertyMap.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE);
176   Visual::Base visual = factory.CreateVisual(propertyMap);
177
178   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
179   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
180   application.GetScene().Add(dummyControl);
181
182   application.SendNotification();
183   application.Render();
184
185   tet_infoline("Check action counter is 0 before DoActionExtension");
186   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
187
188   tet_infoline("Perform TEST_ACTION_EXTENSION action on Color Visual which does not support it.. Should not increment the action counter");
189   Dali::Any attributes;
190   visual.DoActionExtension(Dali::Toolkit::Internal::DummyVisual::TEST_ACTION_EXTENSION, attributes);
191   application.SendNotification();
192   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
193
194   END_TEST;
195 }
196
197 int UtcDaliVisualSetProperties(void)
198 {
199   ToolkitTestApplication application;
200   tet_infoline("Register a visual and SetProperties");
201
202   Toolkit::Internal::VisualFactoryCache* factoryCache = new Toolkit::Internal::VisualFactoryCache(false);
203
204   //Created ColorVisual
205   Property::Map propertyMap1;
206   propertyMap1.Insert(Visual::Property::TYPE, Visual::COLOR);
207   propertyMap1.Insert(ColorVisual::Property::MIX_COLOR, Color::RED);
208   Toolkit::Internal::ColorVisualPtr colorVisualPtr = Toolkit::Internal::ColorVisual::New(*factoryCache, propertyMap1);
209
210   DummyControl        dummyControl = DummyControl::New(true);
211   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
212
213   Toolkit::Visual::Base visualBaseHandle = Toolkit::Visual::Base(colorVisualPtr.Get());
214   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visualBaseHandle);
215   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
216   application.GetScene().Add(dummyControl);
217
218   application.SendNotification();
219   application.Render();
220
221   Property::Map propertyMap;
222   propertyMap.Insert(Visual::Property::MIX_COLOR, Color::BLUE);
223
224   colorVisualPtr->SetProperties(propertyMap);
225   application.SendNotification();
226   application.Render();
227
228   Property::Map resultMap;
229   visualBaseHandle.CreatePropertyMap(resultMap);
230
231   Property::Value* colorValue = resultMap.Find(Visual::Property::MIX_COLOR, Property::VECTOR4);
232   DALI_TEST_CHECK(colorValue);
233   DALI_TEST_CHECK(colorValue->Get<Vector4>() == Color::BLUE);
234
235   delete factoryCache;
236
237   END_TEST;
238 }
239
240 int UtcDaliAnimatedVectorImageVisualCreateInstancePropertyMap(void)
241 {
242   ToolkitTestApplication application;
243   tet_infoline("UtcDaliAnimatedVectorImageVisualCreateInstancePropertyMap");
244
245   Property::Map propertyMap;
246   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
247     .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME);
248
249   // request AnimatedVectorImageVisual with a property map
250   VisualFactory                    factory    = VisualFactory::Get();
251   Visual::Base                     visual     = factory.CreateVisual(propertyMap);
252   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
253
254   Property::Map resultMap;
255   visualImpl.CreateInstancePropertyMap(resultMap);
256
257   // check the property values from the returned map from a visual
258   DALI_TEST_CHECK(resultMap.Empty()); // Now the map is empty
259
260   END_TEST;
261 }
262
263 int UtcDaliAnimatedImageVisualCreateInstancePropertyMap(void)
264 {
265   ToolkitTestApplication application;
266   tet_infoline("UtcDaliAnimatedImageVisualCreateInstancePropertyMap");
267
268   Property::Map propertyMap;
269   propertyMap.Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
270     .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
271     .Add(ImageVisual::Property::DESIRED_WIDTH, 10)
272     .Add(ImageVisual::Property::DESIRED_HEIGHT, 12);
273
274   // request AnimatedVectorImageVisual with a property map
275   VisualFactory                    factory    = VisualFactory::Get();
276   Visual::Base                     visual     = factory.CreateVisual(propertyMap);
277   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
278
279   Property::Map resultMap;
280   visualImpl.CreateInstancePropertyMap(resultMap);
281
282   // check the property values from the returned map from a visual
283   DALI_TEST_EQUALS(resultMap.Count(), 3u, TEST_LOCATION);
284
285   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
286   DALI_TEST_CHECK(value);
287   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
288
289   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER);
290   DALI_TEST_CHECK(value);
291   DALI_TEST_CHECK(value->Get<int>() == 10);
292
293   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER);
294   DALI_TEST_CHECK(value);
295   DALI_TEST_CHECK(value->Get<int>() == 12);
296
297   END_TEST;
298 }
299
300 int UtcDaliAnimatedVectorImageVisualSetProperties(void)
301 {
302   ToolkitTestApplication application;
303   tet_infoline("UtcDaliAnimatedVectorImageVisualSetProperties");
304
305   Property::Map propertyMap;
306   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
307     .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME)
308     .Add(DevelImageVisual::Property::LOOP_COUNT, 3)
309     .Add(DevelImageVisual::Property::PLAY_RANGE, Vector2(0.2f, 0.8f))
310     .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false);
311
312   Visual::Base                     visual     = VisualFactory::Get().CreateVisual(propertyMap);
313   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
314   DALI_TEST_CHECK(visual);
315
316   DummyControl      actor     = DummyControl::New(true);
317   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
318   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
319   actor.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 200.0f));
320   application.GetScene().Add(actor);
321
322   application.SendNotification();
323   application.Render();
324
325   // Trigger count is 2 - load, resource ready
326   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
327
328   // renderer is added to actor
329   DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
330   Renderer renderer = actor.GetRendererAt(0u);
331   DALI_TEST_CHECK(renderer);
332
333   Property::Map propertyMap1;
334   propertyMap1.Add(DevelImageVisual::Property::LOOP_COUNT, 1)
335     .Add(DevelImageVisual::Property::PLAY_RANGE, Vector2(0.4f, 0.6f));
336
337   visualImpl.SetProperties(propertyMap1);
338
339   application.SendNotification();
340   application.Render();
341
342   DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
343   renderer = actor.GetRendererAt(0u);
344   DALI_TEST_CHECK(renderer);
345
346   actor.Unparent();
347   DALI_TEST_CHECK(actor.GetRendererCount() == 0u);
348
349   END_TEST;
350 }
351
352 int UtcDaliArcVisualCreateInstancePropertyMap(void)
353 {
354   ToolkitTestApplication application;
355   tet_infoline("UtcDaliArcVisualCreateInstancePropertyMap");
356
357   Property::Map propertyMap;
358   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ARC)
359     .Add(DevelArcVisual::Property::THICKNESS, 20.0f);
360
361   // request ArcVisual with a property map
362   VisualFactory                    factory    = VisualFactory::Get();
363   Visual::Base                     visual     = factory.CreateVisual(propertyMap);
364   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
365
366   Property::Map resultMap;
367   visualImpl.CreateInstancePropertyMap(resultMap);
368
369   // check the property values from the returned map from a visual
370   DALI_TEST_CHECK(resultMap.Empty()); // Now the map is empty
371
372   END_TEST;
373 }
374 int UtcDaliVisualUpdateBrokenImageRenderer(void)
375 {
376   ToolkitTestApplication application;
377   tet_infoline("UpdateBrokenImageRenderer Test");
378
379   Toolkit::Internal::VisualFactoryCache* factoryCache = new Toolkit::Internal::VisualFactoryCache(false);
380
381   std::string defaultBrokenImageUrl = "not-9patch.png";
382
383   // Set default broken image
384   factoryCache->SetBrokenImageUrl(defaultBrokenImageUrl, std::vector<std::string>());
385
386   //Created dummy renderer
387   Geometry geometry = factoryCache->GetGeometry(Toolkit::Internal::VisualFactoryCache::QUAD_GEOMETRY);
388   Shader   shader   = Shader::New("foo", "bar");
389   Renderer renderer = Renderer::New(geometry, shader);
390
391   DALI_TEST_CHECK(renderer);
392
393   // renderer doesn't changed.
394   factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, true);
395   Shader testShader1 = renderer.GetShader();
396
397   // Get default image renderer.
398   factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, false);
399   Shader testShader2 = renderer.GetShader();
400
401   // Get default image renderer but nine patch.
402   // Note : This API behavior can be changed. (DALi don't consider about default BrokenImageUrl is failed.
403   defaultBrokenImageUrl = "yes-9patch.9.png";
404   factoryCache->SetBrokenImageUrl(defaultBrokenImageUrl, std::vector<std::string>());
405   factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, false);
406   Shader testShader3 = renderer.GetShader();
407
408   DALI_TEST_CHECK(testShader1 != factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::IMAGE_SHADER));
409   DALI_TEST_CHECK(testShader1 != factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::NINE_PATCH_SHADER));
410   DALI_TEST_CHECK(testShader2 == factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::IMAGE_SHADER));
411   DALI_TEST_CHECK(testShader3 == factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::NINE_PATCH_SHADER));
412
413   delete factoryCache;
414
415   END_TEST;
416 }