2 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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>
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>
33 #include <../dali-toolkit/dali-toolkit-test-utils/dummy-control.h>
34 #include <dummy-visual.h>
37 using namespace Toolkit;
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";
46 int UtcDaliVisualAction(void)
48 ToolkitTestApplication application;
49 tet_infoline("Register an ImageVisual and and perform an Action on Visual directly");
50 Vector2 controlSize(20.f, 30.f);
53 Property::Map settings;
54 Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
56 DummyControl dummyControl = DummyControl::New(true);
57 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
59 tet_infoline("Register visual and stage control");
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);
66 application.SendNotification();
69 tet_infoline("Check action counter is 0 before DoAction");
70 DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
72 tet_infoline("Perform TEST_ACTION action on Visual. Should increase the action counter");
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);
82 int UtcDaliVisualActionNotImplemented(void)
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);
89 Property::Map settings;
90 Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
92 DummyControl dummyControl = DummyControl::New(true);
93 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
95 tet_infoline("Register visual and stage control");
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);
103 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
104 dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
105 application.GetScene().Add(dummyControl);
107 application.SendNotification();
108 application.Render();
110 tet_infoline("Check action counter is 0 before DoAction");
111 DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
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);
122 int UtcDaliVisualActionExtension(void)
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);
128 //Created DummyVisual
129 Property::Map settings;
130 Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
132 DummyControl dummyControl = DummyControl::New(true);
133 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
135 tet_infoline("Register visual and stage control");
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);
142 application.SendNotification();
143 application.Render();
145 tet_infoline("Check action counter is 0 before DoAction");
146 DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
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);
157 int UtcDaliVisualActionExtensionNotImplemented(void)
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);
163 //Created DummyVisual
164 Property::Map settings;
165 Toolkit::Internal::DummyVisualPtr dummyVisualPtr = Toolkit::Internal::DummyVisual::New(settings);
167 DummyControl dummyControl = DummyControl::New(true);
168 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
170 tet_infoline("Register visual and stage control");
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);
178 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
179 dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
180 application.GetScene().Add(dummyControl);
182 application.SendNotification();
183 application.Render();
185 tet_infoline("Check action counter is 0 before DoActionExtension");
186 DALI_TEST_EQUALS(dummyVisualPtr->GetActionCounter(), 0, TEST_LOCATION);
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);
197 int UtcDaliVisualSetProperties(void)
199 ToolkitTestApplication application;
200 tet_infoline("Register a visual and SetProperties");
202 Toolkit::Internal::VisualFactoryCache* factoryCache = new Toolkit::Internal::VisualFactoryCache(false);
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);
210 DummyControl dummyControl = DummyControl::New(true);
211 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
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);
218 application.SendNotification();
219 application.Render();
221 Property::Map propertyMap;
222 propertyMap.Insert(Visual::Property::MIX_COLOR, Color::BLUE);
224 colorVisualPtr->SetProperties(propertyMap);
225 application.SendNotification();
226 application.Render();
228 Property::Map resultMap;
229 visualBaseHandle.CreatePropertyMap(resultMap);
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);
240 int UtcDaliAnimatedVectorImageVisualCreateInstancePropertyMap(void)
242 ToolkitTestApplication application;
243 tet_infoline("UtcDaliAnimatedVectorImageVisualCreateInstancePropertyMap");
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);
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);
254 Property::Map resultMap;
255 visualImpl.CreateInstancePropertyMap(resultMap);
257 // check the property values from the returned map from a visual
258 DALI_TEST_CHECK(resultMap.Empty()); // Now the map is empty
263 int UtcDaliAnimatedImageVisualCreateInstancePropertyMap(void)
265 ToolkitTestApplication application;
266 tet_infoline("UtcDaliAnimatedImageVisualCreateInstancePropertyMap");
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);
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);
279 Property::Map resultMap;
280 visualImpl.CreateInstancePropertyMap(resultMap);
282 // check the property values from the returned map from a visual
283 DALI_TEST_EQUALS(resultMap.Count(), 3u, TEST_LOCATION);
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);
289 value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER);
290 DALI_TEST_CHECK(value);
291 DALI_TEST_CHECK(value->Get<int>() == 10);
293 value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER);
294 DALI_TEST_CHECK(value);
295 DALI_TEST_CHECK(value->Get<int>() == 12);
300 int UtcDaliAnimatedVectorImageVisualSetProperties(void)
302 ToolkitTestApplication application;
303 tet_infoline("UtcDaliAnimatedVectorImageVisualSetProperties");
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);
312 Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap);
313 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(visual);
314 DALI_TEST_CHECK(visual);
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);
322 application.SendNotification();
323 application.Render();
325 // Trigger count is 2 - load, resource ready
326 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
328 // renderer is added to actor
329 DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
330 Renderer renderer = actor.GetRendererAt(0u);
331 DALI_TEST_CHECK(renderer);
333 Property::Map propertyMap1;
334 propertyMap1.Add(DevelImageVisual::Property::LOOP_COUNT, 1)
335 .Add(DevelImageVisual::Property::PLAY_RANGE, Vector2(0.4f, 0.6f));
337 visualImpl.SetProperties(propertyMap1);
339 application.SendNotification();
340 application.Render();
342 DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
343 renderer = actor.GetRendererAt(0u);
344 DALI_TEST_CHECK(renderer);
347 DALI_TEST_CHECK(actor.GetRendererCount() == 0u);
352 int UtcDaliArcVisualCreateInstancePropertyMap(void)
354 ToolkitTestApplication application;
355 tet_infoline("UtcDaliArcVisualCreateInstancePropertyMap");
357 Property::Map propertyMap;
358 propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ARC)
359 .Add(DevelArcVisual::Property::THICKNESS, 20.0f);
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);
366 Property::Map resultMap;
367 visualImpl.CreateInstancePropertyMap(resultMap);
369 // check the property values from the returned map from a visual
370 DALI_TEST_CHECK(resultMap.Empty()); // Now the map is empty
374 int UtcDaliVisualUpdateBrokenImageRenderer(void)
376 ToolkitTestApplication application;
377 tet_infoline("UpdateBrokenImageRenderer Test");
379 Toolkit::Internal::VisualFactoryCache* factoryCache = new Toolkit::Internal::VisualFactoryCache(false);
381 std::string defaultBrokenImageUrl = "not-9patch.png";
383 // Set default broken image
384 factoryCache->SetBrokenImageUrl(defaultBrokenImageUrl, std::vector<std::string>());
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);
391 DALI_TEST_CHECK(renderer);
393 // renderer doesn't changed.
394 factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, true);
395 Shader testShader1 = renderer.GetShader();
397 // Get default image renderer.
398 factoryCache->UpdateBrokenImageRenderer(renderer, Vector2::ZERO, false);
399 Shader testShader2 = renderer.GetShader();
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();
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));