12276e8d05593e626673837f8151011fb59b2697
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-DebugRendering.cpp
1 /*
2  * Copyright (c) 2020 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 #include <unistd.h>
18
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>
24
25 #include <dali-toolkit/dali-toolkit.h>
26
27 #include <toolkit-environment-variable.h> // for setting environment variable: DALI_DEBUG_RENDERING
28
29 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
30
31 #include "dummy-control.h"
32
33 using namespace Dali;
34 using namespace Dali::Toolkit;
35
36 namespace
37 {
38 const char* TEST_IMAGE_FILE_NAME =  "image_01.jpg";
39 const char* TEST_NPATCH_FILE_NAME =  "image_01.9.jpg";
40 const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
41 const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif";
42
43 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
44
45 void TestDebugVisual( Integration::Scene scene,  Visual::Base& visual, Visual::Type actualType, Vector2 expectedNaturalSize )
46 {
47   {
48     auto& impl = GetImplementation( visual );
49     DALI_TEST_CHECK( &typeid( Toolkit::Internal::WireframeVisual ) == &typeid( impl ) );
50   }
51
52   Vector2 naturalSize;
53   visual.GetNaturalSize( naturalSize );
54   DALI_TEST_EQUALS( naturalSize, expectedNaturalSize, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
55
56   Property::Map propertyMap;
57   visual.CreatePropertyMap( propertyMap );
58   Property::Value* typeValue = propertyMap.Find( Toolkit::Visual::Property::TYPE,  Property::INTEGER );
59   if ( typeValue )
60   {
61     DALI_TEST_CHECK( typeValue->Get<int>() == actualType );
62   }
63
64   DummyControl actor = DummyControl::New();
65   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
66   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
67   scene.Add( actor );
68
69   DALI_TEST_EQUALS( actor.GetRendererCount(), 1, TEST_LOCATION );
70   if( actor.GetRendererCount() > 0 )
71   {
72     Geometry geometry = actor.GetRendererAt( 0 ).GetGeometry();
73     DALI_TEST_CHECK( geometry.GetType() == Geometry::LINES );
74   }
75 }
76 }
77
78 void dali_debug_rendering_startup(void)
79 {
80   test_return_value = TET_UNDEF;
81   DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
82 }
83
84 void dali_debug_rendering_cleanup(void)
85 {
86   test_return_value = TET_PASS;
87 }
88
89 int UtcDaliDebugRenderingGetVisual1(void)
90 {
91   EnvironmentVariable::SetTestingEnvironmentVariable(true);
92   ToolkitTestApplication application;
93   tet_infoline( "UtcDaliDebugRenderingGetVisual1:  Request visual with a Property::Map" );
94
95   VisualFactory factory = VisualFactory::Get();
96   DALI_TEST_CHECK( factory );
97
98   // Test that color visual is replaced with debug visual
99   Property::Map propertyMap1;
100   propertyMap1.Insert(Visual::Property::TYPE,  Visual::COLOR);
101   propertyMap1.Insert(ColorVisual::Property::MIX_COLOR,  Color::BLUE);
102   Visual::Base colorVisual = factory.CreateVisual(propertyMap1);
103   DALI_TEST_CHECK( colorVisual );
104   TestDebugVisual( application.GetScene(),  colorVisual, Visual::COLOR, Vector2::ZERO );
105
106   // Test that border visual is replaced with debug visual
107   Property::Map propertyMap2;
108   propertyMap2.Insert(Visual::Property::TYPE,  Visual::BORDER);
109   propertyMap2.Insert(BorderVisual::Property::COLOR,  Color::BLUE);
110   propertyMap2.Insert(BorderVisual::Property::SIZE,  2.f);
111   Visual::Base borderVisual = factory.CreateVisual(propertyMap2);
112   DALI_TEST_CHECK( borderVisual );
113   TestDebugVisual( application.GetScene(),  borderVisual, Visual::BORDER, Vector2::ZERO );
114
115   // Test that gradient visual is replaced with debug visual
116   Property::Map propertyMap3;
117   propertyMap3.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
118   Vector2 start(-1.f, -1.f);
119   Vector2 end(1.f, 1.f);
120   propertyMap3.Insert(GradientVisual::Property::START_POSITION, start);
121   propertyMap3.Insert(GradientVisual::Property::END_POSITION, end);
122   propertyMap3.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT);
123   Property::Array stopOffsets;
124   stopOffsets.PushBack( 0.2f );
125   stopOffsets.PushBack( 0.8f );
126   propertyMap3.Insert(GradientVisual::Property::STOP_OFFSET, stopOffsets);
127   Property::Array stopColors;
128   stopColors.PushBack( Color::RED );
129   stopColors.PushBack( Color::GREEN );
130   propertyMap3.Insert(GradientVisual::Property::STOP_COLOR, stopColors);
131   Visual::Base gradientVisual = factory.CreateVisual(propertyMap3);
132   DALI_TEST_CHECK( gradientVisual );
133   TestDebugVisual( application.GetScene(),  gradientVisual, Visual::GRADIENT, Vector2::ZERO );
134
135   // Test that image visual is replaced with debug visual
136   Property::Map propertyMap4;
137   propertyMap4.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
138   propertyMap4.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
139   propertyMap4.Insert( ImageVisual::Property::DESIRED_WIDTH,  50.f );
140   propertyMap4.Insert( ImageVisual::Property::DESIRED_HEIGHT,  100.f );
141   Visual::Base imageVisual = factory.CreateVisual( propertyMap4 );
142   DALI_TEST_CHECK( imageVisual );
143   TestDebugVisual( application.GetScene(),  imageVisual, Visual::IMAGE, Vector2( 50.f, 100.f ) );
144
145   // Test that SVG visual is replaced with debug visual
146   // TEST_SVG_FILE:
147   //  <svg width="100" height="100">
148   //  <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
149   //  </svg>
150   Property::Map propertyMap5;
151   propertyMap5.Insert( Toolkit::Visual::Property::TYPE, Visual::SVG );
152   propertyMap5.Insert( ImageVisual::Property::URL,  TEST_SVG_FILE_NAME );
153   Visual::Base svgVisual = factory.CreateVisual( propertyMap5 );
154   DALI_TEST_CHECK( svgVisual );
155   TestDebugVisual( application.GetScene(),  svgVisual, Visual::SVG, Vector2(100.f, 100.f) );
156
157   // Test that AnimatedImageVisual is replaced with debug visual
158   // TEST_GIF_FILE: anim.gif
159   // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame
160   Property::Map propertyMap6;
161   propertyMap6.Insert( Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE );
162   propertyMap6.Insert( ImageVisual::Property::URL,  TEST_GIF_FILE_NAME );
163   Visual::Base animatedImageVisual = factory.CreateVisual( propertyMap6 );
164   DALI_TEST_CHECK( animatedImageVisual );
165   TestDebugVisual( application.GetScene(),  animatedImageVisual, Visual::ANIMATED_IMAGE, Vector2(50.f, 50.f) );
166
167   // Test that text visual is replaced with debug visual
168
169   // Load some fonts to get the same metrics on different platforms.
170   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
171   fontClient.SetDpi( 96u, 96u );
172
173   char* pathNamePtr = get_current_dir_name();
174   const std::string pathName( pathNamePtr );
175   free( pathNamePtr );
176
177   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
178
179   Property::Map propertyMap7;
180   propertyMap7.Insert( Toolkit::Visual::Property::TYPE, Visual::TEXT );
181   propertyMap7.Insert( TextVisual::Property::ENABLE_MARKUP, true );
182   propertyMap7.Insert( TextVisual::Property::TEXT, "<font family='TizenSans' size='12'>Hello world</font>" );
183   propertyMap7.Insert( TextVisual::Property::MULTI_LINE, true );
184
185   Visual::Base textVisual = factory.CreateVisual( propertyMap7 );
186   DALI_TEST_CHECK( textVisual );
187   {
188     auto&& impl = GetImplementation( textVisual );
189     DALI_TEST_CHECK( &typeid( Toolkit::Internal::WireframeVisual ) == &typeid( impl ) );
190   }
191
192   Vector2 naturalSize;
193   textVisual.GetNaturalSize( naturalSize );
194   DALI_TEST_EQUALS( naturalSize, Vector2( 82.f, 20.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION );
195
196   const float height = textVisual.GetHeightForWidth( 40.f );
197   DALI_TEST_EQUALS( height, 57.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
198
199   // Test that NPatchVisual is replaced with debug visual
200   // TEST_NPATCH_FILE_NAME: image_01.9.jpg
201   Property::Map propertyMap8;
202   propertyMap8.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
203   propertyMap8.Insert( ImageVisual::Property::URL,  TEST_NPATCH_FILE_NAME );
204   Visual::Base nPatchVisual = factory.CreateVisual( propertyMap8 );
205   DALI_TEST_CHECK( nPatchVisual );
206   TestDebugVisual( application.GetScene(),  nPatchVisual, Visual::N_PATCH, Vector2::ZERO );
207
208   EnvironmentVariable::SetTestingEnvironmentVariable(false);
209   END_TEST;
210 }
211
212 int UtcDaliDebugRenderingGetVisual2(void)
213 {
214   EnvironmentVariable::SetTestingEnvironmentVariable(true);
215   ToolkitTestApplication application;
216   tet_infoline( "UtcDaliDebugRenderingGetVisual2: Request visual with various parameters" );
217
218   VisualFactory factory = VisualFactory::Get();
219   DALI_TEST_CHECK( factory );
220
221   // Test that color visual is replaced with debug visual
222   Dali::Property::Map map;
223   map[ Toolkit::Visual::Property::TYPE ] = Visual::COLOR;
224   map[ ColorVisual::Property::MIX_COLOR ] = Color::CYAN;
225
226   Visual::Base colorVisual = factory.CreateVisual( map);
227   DALI_TEST_CHECK( colorVisual );
228   TestDebugVisual( application.GetScene(),  colorVisual, Visual::COLOR, Vector2::ZERO );
229
230   // Test that border visual is replaced with debug visual
231   map.Clear();
232   map[ Toolkit::Visual::Property::TYPE ] = Visual::BORDER;
233   map[ BorderVisual::Property::COLOR  ] = Color::GREEN;
234   map[ BorderVisual::Property::SIZE   ] = 2.f;
235   Visual::Base borderVisual = factory.CreateVisual( map );
236   DALI_TEST_CHECK( borderVisual );
237   TestDebugVisual( application.GetScene(),  borderVisual, Visual::BORDER, Vector2::ZERO );
238
239   // Test that image visual is replaced with debug visual
240   map.Clear();
241   map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
242   map[ ImageVisual::Property::URL ] = TEST_IMAGE_FILE_NAME;
243   Visual::Base imageVisual = factory.CreateVisual( map );
244   DALI_TEST_CHECK( imageVisual );
245   TestDebugVisual( application.GetScene(),  imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */ ));
246
247   // Test that n patch visual is replaced with debug visual
248   Visual::Base nPatchVisual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() );
249   DALI_TEST_CHECK( nPatchVisual );
250   TestDebugVisual( application.GetScene(),  nPatchVisual, Visual::N_PATCH, Vector2::ZERO );
251
252   EnvironmentVariable::SetTestingEnvironmentVariable(false);
253   END_TEST;
254 }
255
256 int UtcDaliDebugRenderingGetVisualObject01(void)
257 {
258   EnvironmentVariable::SetTestingEnvironmentVariable( true );
259   ToolkitTestApplication application;
260
261   VisualFactory factory = VisualFactory::Get();
262   DALI_TEST_CHECK( factory );
263
264   tet_infoline( "Create a TextVisual when debugging is enabled, thus creating a proxy Wireframe Visual" );
265
266   Dali::Property::Map map;
267   map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT;
268   map[ TextVisual::Property::TEXT ] = "Hello";
269
270   Visual::Base textVisual = factory.CreateVisual( map);
271   DALI_TEST_CHECK( textVisual );
272
273   tet_infoline( "Check that GetVisualObject returns the actual TextVisual" );
274   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject();
275   DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) );
276
277   tet_infoline( "Compare the returned TextVisual with the visual implementation, should differ" );
278   DALI_TEST_CHECK( textVisual.GetObjectPtr() != &visualImpl );
279
280   END_TEST;
281 }
282
283 int UtcDaliDebugRenderingGetVisualObject02(void)
284 {
285   ToolkitTestApplication application;
286
287   VisualFactory factory = VisualFactory::Get();
288   DALI_TEST_CHECK( factory );
289
290   tet_infoline( "Create a TextVisual without debugging enabled, thus no proxy Wireframe Visual" );
291
292   Dali::Property::Map map;
293   map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT;
294   map[ TextVisual::Property::TEXT ] = "Hello";
295
296   Visual::Base textVisual = factory.CreateVisual( map);
297   DALI_TEST_CHECK( textVisual );
298
299   tet_infoline( "Check that GetVisualObject returns the actual TextVisual" );
300   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject();
301   DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) );
302
303   tet_infoline( "Compare the returned TextVisual with the visual implementation, should be the same" );
304   DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl );
305
306   END_TEST;
307 }
308
309 int UtcDaliDebugRenderingGetVisualObject03(void)
310 {
311   ToolkitTestApplication application;
312
313   VisualFactory factory = VisualFactory::Get();
314   DALI_TEST_CHECK( factory );
315
316   tet_infoline( "Create a WireframeVisual without debugging enabled, thus no proxy Wireframe Visual either" );
317
318   Dali::Property::Map map;
319   map[ Toolkit::Visual::Property::TYPE ] = Visual::WIREFRAME;
320
321   Visual::Base textVisual = factory.CreateVisual( map);
322   DALI_TEST_CHECK( textVisual );
323
324   tet_infoline( "Check that GetVisualObject returns the WireframeVisual" );
325   Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject();
326   DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::WireframeVisual* >( &visualImpl ) );
327
328   tet_infoline( "Compare the returned Visual with the visual implementation, should be the same" );
329   DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl );
330
331   END_TEST;
332 }
333
334 int UtcDaliDebugRenderingRenderText(void)
335 {
336   EnvironmentVariable::SetTestingEnvironmentVariable( true );
337   ToolkitTestApplication application;
338   tet_infoline( "Ensure we can render text when in debug mode" );
339
340   try
341   {
342     Toolkit::TextLabel label = TextLabel::New( "Hello" );
343     application.GetScene().Add( label );
344     DALI_TEST_CHECK( true );
345   } catch( ... )
346   {
347     DALI_TEST_CHECK( false );
348   }
349
350   END_TEST;
351 }