2 * Copyright (c) 2021 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/wireframe/wireframe-visual.h>
22 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
23 #include <dali-toolkit/internal/visuals/text/text-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" );
47 void TestDebugVisual( Integration::Scene scene, Visual::Base& visual, Visual::Type actualType, Vector2 expectedNaturalSize )
50 auto& impl = GetImplementation( visual );
51 DALI_TEST_CHECK( &typeid( Toolkit::Internal::WireframeVisual ) == &typeid( impl ) );
55 visual.GetNaturalSize( naturalSize );
56 DALI_TEST_EQUALS( naturalSize, expectedNaturalSize, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
58 Property::Map propertyMap;
59 visual.CreatePropertyMap( propertyMap );
60 Property::Value* typeValue = propertyMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
63 DALI_TEST_CHECK( typeValue->Get<int>() == actualType );
66 DummyControl actor = DummyControl::New();
67 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
68 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
71 DALI_TEST_EQUALS( actor.GetRendererCount(), 1, TEST_LOCATION );
72 if( actor.GetRendererCount() > 0 )
74 Geometry geometry = actor.GetRendererAt( 0 ).GetGeometry();
75 DALI_TEST_CHECK( geometry.GetType() == Geometry::LINES );
80 void dali_debug_rendering_startup(void)
82 test_return_value = TET_UNDEF;
83 #if defined(ELDBUS_ENABLED)
84 DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
88 void dali_debug_rendering_cleanup(void)
90 test_return_value = TET_PASS;
93 int UtcDaliDebugRenderingGetVisual1(void)
95 EnvironmentVariable::SetTestingEnvironmentVariable(true);
96 ToolkitTestApplication application;
97 tet_infoline( "UtcDaliDebugRenderingGetVisual1: Request visual with a Property::Map" );
99 VisualFactory factory = VisualFactory::Get();
100 DALI_TEST_CHECK( factory );
102 // Test that color visual is replaced with debug visual
103 Property::Map propertyMap1;
104 propertyMap1.Insert(Visual::Property::TYPE, Visual::COLOR);
105 propertyMap1.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE);
106 Visual::Base colorVisual = factory.CreateVisual(propertyMap1);
107 DALI_TEST_CHECK( colorVisual );
108 TestDebugVisual( application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO );
110 // Test that border visual is replaced with debug visual
111 Property::Map propertyMap2;
112 propertyMap2.Insert(Visual::Property::TYPE, Visual::BORDER);
113 propertyMap2.Insert(BorderVisual::Property::COLOR, Color::BLUE);
114 propertyMap2.Insert(BorderVisual::Property::SIZE, 2.f);
115 Visual::Base borderVisual = factory.CreateVisual(propertyMap2);
116 DALI_TEST_CHECK( borderVisual );
117 TestDebugVisual( application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO );
119 // Test that gradient visual is replaced with debug visual
120 Property::Map propertyMap3;
121 propertyMap3.Insert(Visual::Property::TYPE, Visual::GRADIENT);
122 Vector2 start(-1.f, -1.f);
123 Vector2 end(1.f, 1.f);
124 propertyMap3.Insert(GradientVisual::Property::START_POSITION, start);
125 propertyMap3.Insert(GradientVisual::Property::END_POSITION, end);
126 propertyMap3.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT);
127 Property::Array stopOffsets;
128 stopOffsets.PushBack( 0.2f );
129 stopOffsets.PushBack( 0.8f );
130 propertyMap3.Insert(GradientVisual::Property::STOP_OFFSET, stopOffsets);
131 Property::Array stopColors;
132 stopColors.PushBack( Color::RED );
133 stopColors.PushBack( Color::GREEN );
134 propertyMap3.Insert(GradientVisual::Property::STOP_COLOR, stopColors);
135 Visual::Base gradientVisual = factory.CreateVisual(propertyMap3);
136 DALI_TEST_CHECK( gradientVisual );
137 TestDebugVisual( application.GetScene(), gradientVisual, Visual::GRADIENT, Vector2::ZERO );
139 // Test that image visual is replaced with debug visual
140 Property::Map propertyMap4;
141 propertyMap4.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
142 propertyMap4.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
143 propertyMap4.Insert( ImageVisual::Property::DESIRED_WIDTH, 50.f );
144 propertyMap4.Insert( ImageVisual::Property::DESIRED_HEIGHT, 100.f );
145 Visual::Base imageVisual = factory.CreateVisual( propertyMap4 );
146 DALI_TEST_CHECK( imageVisual );
147 TestDebugVisual( application.GetScene(), imageVisual, Visual::IMAGE, Vector2( 50.f, 100.f ) );
149 // Test that SVG visual is replaced with debug visual
151 // <svg width="100" height="100">
152 // <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
154 Property::Map propertyMap5;
155 propertyMap5.Insert( Toolkit::Visual::Property::TYPE, Visual::SVG );
156 propertyMap5.Insert( ImageVisual::Property::URL, TEST_SVG_FILE_NAME );
157 Visual::Base svgVisual = factory.CreateVisual( propertyMap5 );
158 DALI_TEST_CHECK( svgVisual );
159 TestDebugVisual( application.GetScene(), svgVisual, Visual::SVG, Vector2(100.f, 100.f) );
161 // Test that AnimatedImageVisual is replaced with debug visual
162 // TEST_GIF_FILE: anim.gif
163 // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame
164 Property::Map propertyMap6;
165 propertyMap6.Insert( Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE );
166 propertyMap6.Insert( ImageVisual::Property::URL, TEST_GIF_FILE_NAME );
167 Visual::Base animatedImageVisual = factory.CreateVisual( propertyMap6 );
168 DALI_TEST_CHECK( animatedImageVisual );
169 TestDebugVisual( application.GetScene(), animatedImageVisual, Visual::ANIMATED_IMAGE, Vector2(50.f, 50.f) );
171 // Test that text visual is replaced with debug visual
173 // Load some fonts to get the same metrics on different platforms.
174 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
175 fontClient.SetDpi( 96u, 96u );
177 char* pathNamePtr = get_current_dir_name();
178 const std::string pathName( pathNamePtr );
181 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
183 Property::Map propertyMap7;
184 propertyMap7.Insert( Toolkit::Visual::Property::TYPE, Visual::TEXT );
185 propertyMap7.Insert( TextVisual::Property::ENABLE_MARKUP, true );
186 propertyMap7.Insert( TextVisual::Property::TEXT, "<font family='TizenSans' size='12'>Hello world</font>" );
187 propertyMap7.Insert( TextVisual::Property::MULTI_LINE, true );
189 Visual::Base textVisual = factory.CreateVisual( propertyMap7 );
190 DALI_TEST_CHECK( textVisual );
192 auto&& impl = GetImplementation( textVisual );
193 DALI_TEST_CHECK( &typeid( Toolkit::Internal::WireframeVisual ) == &typeid( impl ) );
197 textVisual.GetNaturalSize( naturalSize );
198 DALI_TEST_EQUALS( naturalSize, Vector2( 82.f, 20.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
200 const float height = textVisual.GetHeightForWidth( 40.f );
201 DALI_TEST_EQUALS( height, 60.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
203 // Test that NPatchVisual is replaced with debug visual
204 // TEST_NPATCH_FILE_NAME: image_01.9.jpg
205 Property::Map propertyMap8;
206 propertyMap8.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
207 propertyMap8.Insert( ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME );
208 Visual::Base nPatchVisual = factory.CreateVisual( propertyMap8 );
209 DALI_TEST_CHECK( nPatchVisual );
210 TestDebugVisual( application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO );
212 EnvironmentVariable::SetTestingEnvironmentVariable(false);
216 int UtcDaliDebugRenderingGetVisual2(void)
218 EnvironmentVariable::SetTestingEnvironmentVariable(true);
219 ToolkitTestApplication application;
220 tet_infoline( "UtcDaliDebugRenderingGetVisual2: Request visual with various parameters" );
222 VisualFactory factory = VisualFactory::Get();
223 DALI_TEST_CHECK( factory );
225 // Test that color visual is replaced with debug visual
226 Dali::Property::Map map;
227 map[ Toolkit::Visual::Property::TYPE ] = Visual::COLOR;
228 map[ ColorVisual::Property::MIX_COLOR ] = Color::CYAN;
230 Visual::Base colorVisual = factory.CreateVisual( map);
231 DALI_TEST_CHECK( colorVisual );
232 TestDebugVisual( application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO );
234 // Test that border visual is replaced with debug visual
236 map[ Toolkit::Visual::Property::TYPE ] = Visual::BORDER;
237 map[ BorderVisual::Property::COLOR ] = Color::GREEN;
238 map[ BorderVisual::Property::SIZE ] = 2.f;
239 Visual::Base borderVisual = factory.CreateVisual( map );
240 DALI_TEST_CHECK( borderVisual );
241 TestDebugVisual( application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO );
243 // Test that image visual is replaced with debug visual
245 map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
246 map[ ImageVisual::Property::URL ] = TEST_IMAGE_FILE_NAME;
247 Visual::Base imageVisual = factory.CreateVisual( map );
248 DALI_TEST_CHECK( imageVisual );
249 TestDebugVisual( application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */ ));
251 // Test that n patch visual is replaced with debug visual
252 Visual::Base nPatchVisual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() );
253 DALI_TEST_CHECK( nPatchVisual );
254 TestDebugVisual( application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO );
256 EnvironmentVariable::SetTestingEnvironmentVariable(false);
260 int UtcDaliDebugRenderingGetVisualObject01(void)
262 EnvironmentVariable::SetTestingEnvironmentVariable( true );
263 ToolkitTestApplication application;
265 VisualFactory factory = VisualFactory::Get();
266 DALI_TEST_CHECK( factory );
268 tet_infoline( "Create a TextVisual when debugging is enabled, thus creating a proxy Wireframe Visual" );
270 Dali::Property::Map map;
271 map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT;
272 map[ TextVisual::Property::TEXT ] = "Hello";
274 Visual::Base textVisual = factory.CreateVisual( map);
275 DALI_TEST_CHECK( textVisual );
277 tet_infoline( "Check that GetVisualObject returns the actual TextVisual" );
278 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject();
279 DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) );
281 tet_infoline( "Compare the returned TextVisual with the visual implementation, should differ" );
282 DALI_TEST_CHECK( textVisual.GetObjectPtr() != &visualImpl );
287 int UtcDaliDebugRenderingGetVisualObject02(void)
289 ToolkitTestApplication application;
291 VisualFactory factory = VisualFactory::Get();
292 DALI_TEST_CHECK( factory );
294 tet_infoline( "Create a TextVisual without debugging enabled, thus no proxy Wireframe Visual" );
296 Dali::Property::Map map;
297 map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT;
298 map[ TextVisual::Property::TEXT ] = "Hello";
300 Visual::Base textVisual = factory.CreateVisual( map);
301 DALI_TEST_CHECK( textVisual );
303 tet_infoline( "Check that GetVisualObject returns the actual TextVisual" );
304 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject();
305 DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) );
307 tet_infoline( "Compare the returned TextVisual with the visual implementation, should be the same" );
308 DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl );
313 int UtcDaliDebugRenderingGetVisualObject03(void)
315 ToolkitTestApplication application;
317 VisualFactory factory = VisualFactory::Get();
318 DALI_TEST_CHECK( factory );
320 tet_infoline( "Create a WireframeVisual without debugging enabled, thus no proxy Wireframe Visual either" );
322 Dali::Property::Map map;
323 map[ Toolkit::Visual::Property::TYPE ] = Visual::WIREFRAME;
325 Visual::Base textVisual = factory.CreateVisual( map);
326 DALI_TEST_CHECK( textVisual );
328 tet_infoline( "Check that GetVisualObject returns the WireframeVisual" );
329 Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject();
330 DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::WireframeVisual* >( &visualImpl ) );
332 tet_infoline( "Compare the returned Visual with the visual implementation, should be the same" );
333 DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl );
338 int UtcDaliDebugRenderingRenderText(void)
340 EnvironmentVariable::SetTestingEnvironmentVariable( true );
341 ToolkitTestApplication application;
342 tet_infoline( "Ensure we can render text when in debug mode" );
346 Toolkit::TextLabel label = TextLabel::New( "Hello" );
347 application.GetScene().Add( label );
348 DALI_TEST_CHECK( true );
351 DALI_TEST_CHECK( false );