[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Visuals-internal.cpp
1 /*
2  * Copyright (c) 2022 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   Toolkit::Internal::Visual::Base& internalVisualBase = GetImplementation(visualBaseHandle);
76   internalVisualBase.DoAction(Dali::Toolkit::Internal::DummyVisual::TEST_ACTION, attributes);
77   application.SendNotification();
78   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 1, TEST_LOCATION);
79
80   END_TEST;
81 }
82
83 int UtcDaliVisualActionNotImplemented(void)
84 {
85   ToolkitTestApplication application;
86   tet_infoline("Register an ImageVisual and and perform an Action on a Visual which does not support any Actions");
87   Vector2 controlSize(20.f, 30.f);
88
89   //Created DummyVisual
90   Property::Map                     settings;
91   Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
92
93   DummyControl        dummyControl = DummyControl::New(true);
94   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
95
96   tet_infoline("Register visual and stage control");
97
98   VisualFactory factory = VisualFactory::Get();
99   Property::Map propertyMap;
100   propertyMap.Insert(Visual::Property::TYPE, Visual::COLOR);
101   propertyMap.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE);
102   Visual::Base visual = factory.CreateVisual(propertyMap);
103
104   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
105   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
106   application.GetScene().Add(dummyControl);
107
108   application.SendNotification();
109   application.Render();
110
111   tet_infoline("Check action counter is 0 before DoAction");
112   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
113
114   tet_infoline("Perform TEST_ACTION action on Color Visual which does not support it.. Should not increment the action counter");
115   Property::Map attributes;
116   GetImplementation(visual).DoAction(Dali::Toolkit::Internal::DummyVisual::TEST_ACTION, attributes);
117   application.SendNotification();
118   DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
119
120   END_TEST;
121 }
122
123 int UtcDaliVisualSetProperties(void)
124 {
125   ToolkitTestApplication application;
126   tet_infoline("Register a visual and SetProperties");
127
128   Toolkit::Internal::VisualFactoryCache* factoryCache = new Toolkit::Internal::VisualFactoryCache(false);
129
130   //Created ColorVisual
131   Property::Map propertyMap1;
132   propertyMap1.Insert(Visual::Property::TYPE, Visual::COLOR);
133   propertyMap1.Insert(ColorVisual::Property::MIX_COLOR, Color::RED);
134   Toolkit::Internal::ColorVisualPtr colorVisualPtr = Toolkit::Internal::ColorVisual::New(*factoryCache, propertyMap1);
135
136   DummyControl        dummyControl = DummyControl::New(true);
137   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
138
139   Toolkit::Visual::Base visualBaseHandle = Toolkit::Visual::Base(colorVisualPtr.Get());
140   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visualBaseHandle);
141   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
142   application.GetScene().Add(dummyControl);
143
144   application.SendNotification();
145   application.Render();
146
147   Property::Map propertyMap;
148   propertyMap.Insert(Visual::Property::MIX_COLOR, Color::BLUE);
149
150   colorVisualPtr->SetProperties(propertyMap);
151   application.SendNotification();
152   application.Render();
153
154   Property::Map resultMap;
155   visualBaseHandle.CreatePropertyMap(resultMap);
156
157   Property::Value* colorValue = resultMap.Find(Visual::Property::MIX_COLOR, Property::VECTOR4);
158   DALI_TEST_CHECK(colorValue);
159   DALI_TEST_CHECK(colorValue->Get<Vector4>() == Color::BLUE);
160
161   delete factoryCache;
162
163   END_TEST;
164 }
165
166 int UtcDaliAnimatedVectorImageVisualCreateInstancePropertyMap(void)
167 {
168   ToolkitTestApplication application;
169   tet_infoline("UtcDaliAnimatedVectorImageVisualCreateInstancePropertyMap");
170
171   Property::Map propertyMap;
172   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
173     .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME);
174
175   // request AnimatedVectorImageVisual with a property map
176   VisualFactory                    factory    = VisualFactory::Get();
177   Visual::Base                     visual     = factory.CreateVisual(propertyMap);
178   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
179
180   Property::Map resultMap;
181   visualImpl.CreateInstancePropertyMap(resultMap);
182
183   // check the property values from the returned map from a visual
184   DALI_TEST_CHECK(resultMap.Empty()); // Now the map is empty
185
186   END_TEST;
187 }
188
189 int UtcDaliAnimatedImageVisualCreateInstancePropertyMap(void)
190 {
191   ToolkitTestApplication application;
192   tet_infoline("UtcDaliAnimatedImageVisualCreateInstancePropertyMap");
193
194   Property::Map propertyMap;
195   propertyMap.Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
196     .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
197     .Add(ImageVisual::Property::DESIRED_WIDTH, 10)
198     .Add(ImageVisual::Property::DESIRED_HEIGHT, 12);
199
200   // request AnimatedVectorImageVisual with a property map
201   VisualFactory                    factory    = VisualFactory::Get();
202   Visual::Base                     visual     = factory.CreateVisual(propertyMap);
203   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
204
205   Property::Map resultMap;
206   visualImpl.CreateInstancePropertyMap(resultMap);
207
208   // check the property values from the returned map from a visual
209   DALI_TEST_EQUALS(resultMap.Count(), 3u, TEST_LOCATION);
210
211   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
212   DALI_TEST_CHECK(value);
213   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
214
215   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER);
216   DALI_TEST_CHECK(value);
217   DALI_TEST_CHECK(value->Get<int>() == 10);
218
219   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER);
220   DALI_TEST_CHECK(value);
221   DALI_TEST_CHECK(value->Get<int>() == 12);
222
223   END_TEST;
224 }
225
226 int UtcDaliAnimatedVectorImageVisualSetProperties(void)
227 {
228   ToolkitTestApplication application;
229   tet_infoline("UtcDaliAnimatedVectorImageVisualSetProperties");
230
231   Property::Map propertyMap;
232   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
233     .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME)
234     .Add(DevelImageVisual::Property::LOOP_COUNT, 3)
235     .Add(DevelImageVisual::Property::PLAY_RANGE, Vector2(0.2f, 0.8f))
236     .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false);
237
238   Visual::Base                     visual     = VisualFactory::Get().CreateVisual(propertyMap);
239   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
240   DALI_TEST_CHECK(visual);
241
242   DummyControl      actor     = DummyControl::New(true);
243   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
244   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
245   actor.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 200.0f));
246   application.GetScene().Add(actor);
247
248   application.SendNotification();
249   application.Render();
250
251   // Trigger count is 2 - load, resource ready
252   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
253
254   // renderer is added to actor
255   DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
256   Renderer renderer = actor.GetRendererAt(0u);
257   DALI_TEST_CHECK(renderer);
258
259   Property::Map propertyMap1;
260   propertyMap1.Add(DevelImageVisual::Property::LOOP_COUNT, 1)
261     .Add(DevelImageVisual::Property::PLAY_RANGE, Vector2(0.4f, 0.6f));
262
263   visualImpl.SetProperties(propertyMap1);
264
265   application.SendNotification();
266   application.Render();
267
268   DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
269   renderer = actor.GetRendererAt(0u);
270   DALI_TEST_CHECK(renderer);
271
272   actor.Unparent();
273   DALI_TEST_CHECK(actor.GetRendererCount() == 0u);
274
275   END_TEST;
276 }
277
278 int UtcDaliArcVisualCreateInstancePropertyMap(void)
279 {
280   ToolkitTestApplication application;
281   tet_infoline("UtcDaliArcVisualCreateInstancePropertyMap");
282
283   Property::Map propertyMap;
284   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ARC)
285     .Add(DevelArcVisual::Property::THICKNESS, 20.0f);
286
287   // request ArcVisual with a property map
288   VisualFactory                    factory    = VisualFactory::Get();
289   Visual::Base                     visual     = factory.CreateVisual(propertyMap);
290   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
291
292   Property::Map resultMap;
293   visualImpl.CreateInstancePropertyMap(resultMap);
294
295   // check the property values from the returned map from a visual
296   DALI_TEST_CHECK(resultMap.Empty()); // Now the map is empty
297
298   END_TEST;
299 }
300 int UtcDaliVisualUpdateBrokenImageRenderer(void)
301 {
302   ToolkitTestApplication application;
303   tet_infoline("UpdateBrokenImageRenderer Test");
304
305   Toolkit::Internal::VisualFactoryCache* factoryCache = new Toolkit::Internal::VisualFactoryCache(false);
306
307   std::string defaultBrokenImageUrl = "not-9patch.png";
308
309   // Set default broken image
310   factoryCache->SetBrokenImageUrl(defaultBrokenImageUrl, std::vector<std::string>());
311
312   //Created dummy renderer
313   Geometry geometry = factoryCache->GetGeometry(Toolkit::Internal::VisualFactoryCache::QUAD_GEOMETRY);
314   Shader   shader   = Shader::New("foo", "bar");
315   Renderer renderer = Renderer::New(geometry, shader);
316
317   DALI_TEST_CHECK(renderer);
318
319   // renderer doesn't changed.
320   factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, true);
321   Shader testShader1 = renderer.GetShader();
322
323   // Get default image renderer.
324   factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, false);
325   Shader testShader2 = renderer.GetShader();
326
327   // Get default image renderer but nine patch.
328   // Note : This API behavior can be changed. (DALi don't consider about default BrokenImageUrl is failed.
329   defaultBrokenImageUrl = "yes-9patch.9.png";
330   factoryCache->SetBrokenImageUrl(defaultBrokenImageUrl, std::vector<std::string>());
331   factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, false);
332   Shader testShader3 = renderer.GetShader();
333
334   DALI_TEST_CHECK(testShader1 != factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::IMAGE_SHADER));
335   DALI_TEST_CHECK(testShader1 != factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::NINE_PATCH_SHADER));
336   DALI_TEST_CHECK(testShader2 == factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::IMAGE_SHADER));
337   DALI_TEST_CHECK(testShader3 == factoryCache->GetShader(Toolkit::Internal::VisualFactoryCache::NINE_PATCH_SHADER));
338
339   delete factoryCache;
340
341   END_TEST;
342 }