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