2 * Copyright (c) 2022 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.
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
21 #include <dali-toolkit/internal/visuals/text/text-visual.h>
22 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
23 #include <dali-toolkit/internal/visuals/wireframe/wireframe-visual.h>
25 #include <dali-toolkit/dali-toolkit.h>
27 #include <toolkit-environment-variable.h> // for setting environment variable: DALI_DEBUG_RENDERING
29 #if defined(ELDBUS_ENABLED)
30 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
33 #include "dummy-control.h"
36 using namespace Dali::Toolkit;
40 const char* TEST_IMAGE_FILE_NAME = "image_01.jpg";
41 const char* TEST_NPATCH_FILE_NAME = "image_01.9.jpg";
42 const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
43 const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif";
45 const std::string DEFAULT_FONT_DIR("/resources/fonts");
46 const char* const DALI_DEBUG_RENDERING("DALI_DEBUG_RENDERING");
48 void TestDebugVisual(Integration::Scene scene, Visual::Base& visual, DevelVisual::Type actualType, Vector2 expectedNaturalSize)
51 auto& impl = GetImplementation(visual);
52 DALI_TEST_CHECK(&typeid(Toolkit::Internal::WireframeVisual) == &typeid(impl));
56 visual.GetNaturalSize(naturalSize);
57 DALI_TEST_EQUALS(naturalSize, expectedNaturalSize, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
59 Property::Map propertyMap;
60 visual.CreatePropertyMap(propertyMap);
61 Property::Value* typeValue = propertyMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
64 DALI_TEST_CHECK(typeValue->Get<int>() == actualType);
67 DummyControl actor = DummyControl::New();
68 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
69 dummyImpl.RegisterVisual(Control::CONTROL_PROPERTY_END_INDEX + 1, visual);
72 DALI_TEST_EQUALS(actor.GetRendererCount(), 1, TEST_LOCATION);
73 if(actor.GetRendererCount() > 0)
75 Geometry geometry = actor.GetRendererAt(0).GetGeometry();
76 DALI_TEST_CHECK(geometry.GetType() == Geometry::LINES);
79 void TestDebugVisual(Integration::Scene scene, Visual::Base& visual, Visual::Type actualType, Vector2 expectedNaturalSize)
81 TestDebugVisual(scene, visual, (DevelVisual::Type)actualType, expectedNaturalSize);
85 void dali_debug_rendering_startup(void)
87 test_return_value = TET_UNDEF;
88 #if defined(ELDBUS_ENABLED)
89 DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
93 void dali_debug_rendering_cleanup(void)
95 test_return_value = TET_PASS;
98 int UtcDaliDebugRenderingGetVisual1(void)
100 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "1");
101 ToolkitTestApplication application;
102 tet_infoline("UtcDaliDebugRenderingGetVisual1: Request visual with a Property::Map");
104 VisualFactory factory = VisualFactory::Get();
105 DALI_TEST_CHECK(factory);
107 // Test that color visual is replaced with debug visual
108 Property::Map propertyMap1;
109 propertyMap1.Insert(Visual::Property::TYPE, Visual::COLOR);
110 propertyMap1.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE);
111 Visual::Base colorVisual = factory.CreateVisual(propertyMap1);
112 DALI_TEST_CHECK(colorVisual);
113 TestDebugVisual(application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO);
115 // Test that border visual is replaced with debug visual
116 Property::Map propertyMap2;
117 propertyMap2.Insert(Visual::Property::TYPE, Visual::BORDER);
118 propertyMap2.Insert(BorderVisual::Property::COLOR, Color::BLUE);
119 propertyMap2.Insert(BorderVisual::Property::SIZE, 2.f);
120 Visual::Base borderVisual = factory.CreateVisual(propertyMap2);
121 DALI_TEST_CHECK(borderVisual);
122 TestDebugVisual(application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO);
124 // Test that gradient visual is replaced with debug visual
125 Property::Map propertyMap3;
126 propertyMap3.Insert(Visual::Property::TYPE, Visual::GRADIENT);
127 Vector2 start(-1.f, -1.f);
128 Vector2 end(1.f, 1.f);
129 propertyMap3.Insert(GradientVisual::Property::START_POSITION, start);
130 propertyMap3.Insert(GradientVisual::Property::END_POSITION, end);
131 propertyMap3.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT);
132 Property::Array stopOffsets;
133 stopOffsets.PushBack(0.2f);
134 stopOffsets.PushBack(0.8f);
135 propertyMap3.Insert(GradientVisual::Property::STOP_OFFSET, stopOffsets);
136 Property::Array stopColors;
137 stopColors.PushBack(Color::RED);
138 stopColors.PushBack(Color::GREEN);
139 propertyMap3.Insert(GradientVisual::Property::STOP_COLOR, stopColors);
140 Visual::Base gradientVisual = factory.CreateVisual(propertyMap3);
141 DALI_TEST_CHECK(gradientVisual);
142 TestDebugVisual(application.GetScene(), gradientVisual, Visual::GRADIENT, Vector2::ZERO);
144 // Test that image visual is replaced with debug visual
145 Property::Map propertyMap4;
146 propertyMap4.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
147 propertyMap4.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
148 propertyMap4.Insert(ImageVisual::Property::DESIRED_WIDTH, 50.f);
149 propertyMap4.Insert(ImageVisual::Property::DESIRED_HEIGHT, 100.f);
150 Visual::Base imageVisual = factory.CreateVisual(propertyMap4);
151 DALI_TEST_CHECK(imageVisual);
152 TestDebugVisual(application.GetScene(), imageVisual, Visual::IMAGE, Vector2(50.f, 100.f));
154 // Test that SVG visual is replaced with debug visual
156 // <svg width="100" height="100">
157 // <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
159 Property::Map propertyMap5;
160 propertyMap5.Insert(Toolkit::Visual::Property::TYPE, Visual::SVG);
161 propertyMap5.Insert(ImageVisual::Property::URL, TEST_SVG_FILE_NAME);
162 Visual::Base svgVisual = factory.CreateVisual(propertyMap5);
163 DALI_TEST_CHECK(svgVisual);
164 TestDebugVisual(application.GetScene(), svgVisual, Visual::SVG, Vector2::ZERO);
166 // Test that AnimatedImageVisual is replaced with debug visual
167 // TEST_GIF_FILE: anim.gif
168 // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame
169 Property::Map propertyMap6;
170 propertyMap6.Insert(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
171 propertyMap6.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
172 Visual::Base animatedImageVisual = factory.CreateVisual(propertyMap6);
173 DALI_TEST_CHECK(animatedImageVisual);
174 TestDebugVisual(application.GetScene(), animatedImageVisual, Visual::ANIMATED_IMAGE, Vector2(50.f, 50.f));
176 // Test that text visual is replaced with debug visual
178 // Load some fonts to get the same metrics on different platforms.
179 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
180 fontClient.SetDpi(96u, 96u);
182 char* pathNamePtr = get_current_dir_name();
183 const std::string pathName(pathNamePtr);
186 fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf");
188 Property::Map propertyMap7;
189 propertyMap7.Insert(Toolkit::Visual::Property::TYPE, Visual::TEXT);
190 propertyMap7.Insert(TextVisual::Property::ENABLE_MARKUP, true);
191 propertyMap7.Insert(TextVisual::Property::TEXT, "<font family='TizenSans' size='12'>Hello world</font>");
192 propertyMap7.Insert(TextVisual::Property::MULTI_LINE, true);
194 Visual::Base textVisual = factory.CreateVisual(propertyMap7);
195 DALI_TEST_CHECK(textVisual);
197 auto&& impl = GetImplementation(textVisual);
198 DALI_TEST_CHECK(&typeid(Toolkit::Internal::WireframeVisual) == &typeid(impl));
202 textVisual.GetNaturalSize(naturalSize);
203 DALI_TEST_EQUALS(naturalSize, Vector2(82.f, 20.f), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
205 const float height = textVisual.GetHeightForWidth(40.f);
206 DALI_TEST_EQUALS(height, 60.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
208 // Test that NPatchVisual is replaced with debug visual
209 // TEST_NPATCH_FILE_NAME: image_01.9.jpg
210 Property::Map propertyMap8;
211 propertyMap8.Insert(Toolkit::Visual::Property::TYPE, Visual::N_PATCH);
212 propertyMap8.Insert(ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME);
213 Visual::Base nPatchVisual = factory.CreateVisual(propertyMap8);
214 DALI_TEST_CHECK(nPatchVisual);
215 TestDebugVisual(application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO);
217 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "0");
221 int UtcDaliDebugRenderingGetVisual2(void)
223 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "1");
224 ToolkitTestApplication application;
225 tet_infoline("UtcDaliDebugRenderingGetVisual2: Request visual with various parameters");
227 VisualFactory factory = VisualFactory::Get();
228 DALI_TEST_CHECK(factory);
230 // Test that color visual is replaced with debug visual
231 Dali::Property::Map map;
232 map[Toolkit::Visual::Property::TYPE] = Visual::COLOR;
233 map[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
235 Visual::Base colorVisual = factory.CreateVisual(map);
236 DALI_TEST_CHECK(colorVisual);
237 TestDebugVisual(application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO);
239 // Test that border visual is replaced with debug visual
241 map[Toolkit::Visual::Property::TYPE] = Visual::BORDER;
242 map[BorderVisual::Property::COLOR] = Color::GREEN;
243 map[BorderVisual::Property::SIZE] = 2.f;
244 Visual::Base borderVisual = factory.CreateVisual(map);
245 DALI_TEST_CHECK(borderVisual);
246 TestDebugVisual(application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO);
248 // Test that image visual is replaced with debug visual
250 map[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
251 map[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
252 Visual::Base imageVisual = factory.CreateVisual(map);
253 DALI_TEST_CHECK(imageVisual);
254 TestDebugVisual(application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */));
256 // Test that n patch visual is replaced with debug visual
257 Visual::Base nPatchVisual = factory.CreateVisual(TEST_NPATCH_FILE_NAME, ImageDimensions());
258 DALI_TEST_CHECK(nPatchVisual);
259 TestDebugVisual(application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO);
261 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "0");
265 int UtcDaliDebugRenderingGetVisual3(void)
267 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "1");
268 ToolkitTestApplication application;
269 tet_infoline("UtcDaliDebugRenderingGetVisual3: Request visual with various parameters");
271 VisualFactory factory = VisualFactory::Get();
272 DALI_TEST_CHECK(factory);
274 // Test that image visual is replaced with debug visual
275 Dali::Property::Map map;
276 map[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
277 map[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
278 Visual::Base imageVisual = factory.CreateVisual(map);
279 DALI_TEST_CHECK(imageVisual);
280 TestDebugVisual(application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */));
282 // Test that image visual with null string don't make visual
284 map[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
285 map[ImageVisual::Property::URL] = "";
286 Visual::Base emptyVisual = factory.CreateVisual(map);
287 DALI_TEST_CHECK(emptyVisual);
288 TestDebugVisual(application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO);
290 tet_infoline("Check that GetVisualObject returns the actual WireframeVisual");
291 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(emptyVisual).GetVisualObject();
292 DALI_TEST_CHECK(dynamic_cast<Toolkit::Internal::WireframeVisual*>(&visualImpl));
294 tet_infoline("Compare the returned emptyVisual with the visual implementation, should be the same");
295 DALI_TEST_CHECK(emptyVisual.GetObjectPtr() == &visualImpl);
297 // Test that image view with empty property map don't make visual even DebugRendering is enabled.
299 ImageView imageView1 = ImageView::New();
300 imageView1.SetProperty(Control::Property::BACKGROUND, map);
301 imageView1.SetProperty(ImageView::Property::IMAGE, map);
303 // Test that image view with empty property value don't make visual even DebugRendering is enabled.
304 Property::Value emptyValue;
305 ImageView imageView2 = ImageView::New();
306 imageView2.SetProperty(Control::Property::BACKGROUND, emptyValue);
307 imageView2.SetProperty(ImageView::Property::IMAGE, emptyValue);
309 // Test that image view with invalid property value don't make visual even DebugRendering is enabled.
310 Property::Value invalidValue(static_cast<int>(3));
311 ImageView imageView3 = ImageView::New();
312 imageView3.SetProperty(Control::Property::BACKGROUND, invalidValue);
313 imageView3.SetProperty(ImageView::Property::IMAGE, invalidValue);
315 application.GetScene().Add(imageView1);
316 application.GetScene().Add(imageView2);
317 application.GetScene().Add(imageView3);
319 application.SendNotification();
320 application.Render();
322 DALI_TEST_EQUALS(imageView1.GetRendererCount(), 0u, TEST_LOCATION);
323 DALI_TEST_EQUALS(imageView2.GetRendererCount(), 0u, TEST_LOCATION);
324 DALI_TEST_EQUALS(imageView3.GetRendererCount(), 0u, TEST_LOCATION);
326 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "0");
330 int UtcDaliDebugRenderingGetVisual4(void)
332 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "1");
333 ToolkitTestApplication application;
334 tet_infoline("UtcDaliDebugRenderingGetVisual4: Request visual with empty URL and empty Array");
336 VisualFactory factory = VisualFactory::Get();
337 DALI_TEST_CHECK(factory);
339 // Test that image visual with null string don't make visual
340 for(auto type : {DevelVisual::IMAGE, DevelVisual::ANIMATED_IMAGE, DevelVisual::SVG, DevelVisual::N_PATCH, DevelVisual::ANIMATED_VECTOR_IMAGE})
342 Dali::Property::Map map;
343 map[Toolkit::Visual::Property::TYPE] = type;
344 map[ImageVisual::Property::URL] = "";
345 Visual::Base emptyVisual = factory.CreateVisual(map);
346 DALI_TEST_CHECK(emptyVisual);
347 TestDebugVisual(application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO);
349 tet_infoline("Check that GetVisualObject returns the actual WireframeVisual");
350 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(emptyVisual).GetVisualObject();
351 DALI_TEST_CHECK(dynamic_cast<Toolkit::Internal::WireframeVisual*>(&visualImpl));
353 tet_infoline("Compare the returned emptyVisual with the visual implementation, should be the same");
354 DALI_TEST_CHECK(emptyVisual.GetObjectPtr() == &visualImpl);
357 // Test that image visual with empty array don't make visual
358 for(auto type : {Visual::IMAGE, Visual::ANIMATED_IMAGE})
360 Dali::Property::Map map;
361 Dali::Property::Array emptyArray;
362 map[Toolkit::Visual::Property::TYPE] = type;
363 map[ImageVisual::Property::URL] = emptyArray;
364 Visual::Base emptyVisual = factory.CreateVisual(map);
365 DALI_TEST_CHECK(emptyVisual);
366 TestDebugVisual(application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO);
368 tet_infoline("Check that GetVisualObject returns the actual WireframeVisual");
369 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(emptyVisual).GetVisualObject();
370 DALI_TEST_CHECK(dynamic_cast<Toolkit::Internal::WireframeVisual*>(&visualImpl));
372 tet_infoline("Compare the returned emptyVisual with the visual implementation, should be the same");
373 DALI_TEST_CHECK(emptyVisual.GetObjectPtr() == &visualImpl);
376 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "0");
380 int UtcDaliDebugRenderingGetVisualObject01(void)
382 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "1");
383 ToolkitTestApplication application;
385 VisualFactory factory = VisualFactory::Get();
386 DALI_TEST_CHECK(factory);
388 tet_infoline("Create a TextVisual when debugging is enabled, thus creating a proxy Wireframe Visual");
390 Dali::Property::Map map;
391 map[Toolkit::Visual::Property::TYPE] = Visual::TEXT;
392 map[TextVisual::Property::TEXT] = "Hello";
394 Visual::Base textVisual = factory.CreateVisual(map);
395 DALI_TEST_CHECK(textVisual);
397 tet_infoline("Check that GetVisualObject returns the actual TextVisual");
398 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(textVisual).GetVisualObject();
399 DALI_TEST_CHECK(dynamic_cast<Toolkit::Internal::TextVisual*>(&visualImpl));
401 tet_infoline("Compare the returned TextVisual with the visual implementation, should differ");
402 DALI_TEST_CHECK(textVisual.GetObjectPtr() != &visualImpl);
404 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "0");
408 int UtcDaliDebugRenderingGetVisualObject02(void)
410 ToolkitTestApplication application;
412 VisualFactory factory = VisualFactory::Get();
413 DALI_TEST_CHECK(factory);
415 tet_infoline("Create a TextVisual without debugging enabled, thus no proxy Wireframe Visual");
417 Dali::Property::Map map;
418 map[Toolkit::Visual::Property::TYPE] = Visual::TEXT;
419 map[TextVisual::Property::TEXT] = "Hello";
421 Visual::Base textVisual = factory.CreateVisual(map);
422 DALI_TEST_CHECK(textVisual);
424 tet_infoline("Check that GetVisualObject returns the actual TextVisual");
425 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(textVisual).GetVisualObject();
426 DALI_TEST_CHECK(dynamic_cast<Toolkit::Internal::TextVisual*>(&visualImpl));
428 tet_infoline("Compare the returned TextVisual with the visual implementation, should be the same");
429 DALI_TEST_CHECK(textVisual.GetObjectPtr() == &visualImpl);
434 int UtcDaliDebugRenderingGetVisualObject03(void)
436 ToolkitTestApplication application;
438 VisualFactory factory = VisualFactory::Get();
439 DALI_TEST_CHECK(factory);
441 tet_infoline("Create a WireframeVisual without debugging enabled, thus no proxy Wireframe Visual either");
443 Dali::Property::Map map;
444 map[Toolkit::Visual::Property::TYPE] = Visual::WIREFRAME;
446 Visual::Base textVisual = factory.CreateVisual(map);
447 DALI_TEST_CHECK(textVisual);
449 tet_infoline("Check that GetVisualObject returns the WireframeVisual");
450 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(textVisual).GetVisualObject();
451 DALI_TEST_CHECK(dynamic_cast<Toolkit::Internal::WireframeVisual*>(&visualImpl));
453 tet_infoline("Compare the returned Visual with the visual implementation, should be the same");
454 DALI_TEST_CHECK(textVisual.GetObjectPtr() == &visualImpl);
459 int UtcDaliDebugRenderingRenderText(void)
461 EnvironmentVariable::SetTestEnvironmentVariable(DALI_DEBUG_RENDERING, "1");
462 ToolkitTestApplication application;
463 tet_infoline("Ensure we can render text when in debug mode");
467 Toolkit::TextLabel label = TextLabel::New("Hello");
468 application.GetScene().Add(label);
469 DALI_TEST_CHECK(true);
473 DALI_TEST_CHECK(false);