Geometry Batching
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-Visual.cpp
1 /*
2  * Copyright (c) 2016 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 <iostream>
18 #include <stdlib.h>
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <dali/public-api/rendering/renderer.h>
21 #include <dali/public-api/rendering/texture-set.h>
22 #include <dali/public-api/rendering/shader.h>
23 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
24 #include <dali-toolkit/dali-toolkit.h>
25
26 using namespace Dali;
27 using namespace Dali::Toolkit;
28
29 namespace
30 {
31 const char* TEST_IMAGE_FILE_NAME =  "gallery_image_01.jpg";
32 const char* TEST_NPATCH_FILE_NAME =  "gallery_image_01.9.jpg";
33 const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
34 const char* TEST_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube.obj";
35 const char* TEST_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal.mtl";
36 const char* TEST_RESOURCE_LOCATION = TEST_RESOURCE_DIR "/";
37 }
38
39 void dali_visual_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void dali_visual_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 int UtcDaliVisualCopyAndAssignment(void)
50 {
51   ToolkitTestApplication application;
52   tet_infoline( "UtcDaliVisualCopyAndAssignment" );
53
54   VisualFactory factory = VisualFactory::Get();
55   Property::Map propertyMap;
56   propertyMap.Insert(Visual::Property::TYPE,  Visual::COLOR);
57   propertyMap.Insert(ColorVisual::Property::MIX_COLOR,  Color::BLUE);
58   Visual::Base visual = factory.CreateVisual( propertyMap );
59
60   Visual::Base visualCopy( visual );
61   DALI_TEST_CHECK(visual == visualCopy);
62
63   Visual::Base emptyVisual;
64   Visual::Base emptyVisualCopy( emptyVisual );
65   DALI_TEST_CHECK(emptyVisual == emptyVisualCopy);
66
67   Visual::Base visualEquals;
68   visualEquals = visual;
69   DALI_TEST_CHECK(visual == visualEquals);
70
71   Visual::Base emptyVisualEquals;
72   emptyVisualEquals = emptyVisual;
73   DALI_TEST_CHECK( emptyVisual == emptyVisualEquals );
74
75   //self assignment
76   visual = visual;
77   DALI_TEST_CHECK( visual = visualCopy );
78
79   END_TEST;
80 }
81
82 int UtcDaliVisualSetGetDepthIndex(void)
83 {
84   ToolkitTestApplication application;
85   tet_infoline( "UtcDaliVisualSetDepthIndex" );
86
87   VisualFactory factory = VisualFactory::Get();
88   Property::Map propertyMap;
89   propertyMap.Insert(Visual::Property::TYPE,  Visual::COLOR);
90   propertyMap.Insert(ColorVisual::Property::MIX_COLOR,  Color::BLUE);
91   Visual::Base visual = factory.CreateVisual( propertyMap );
92
93   visual.SetDepthIndex( 1.f );
94
95   Actor actor = Actor::New();
96   actor.SetSize(200.f, 200.f);
97   Stage::GetCurrent().Add( actor );
98   visual.SetOnStage( actor );
99
100   int depthIndex = actor.GetRendererAt(0u).GetProperty<int>( Renderer::Property::DEPTH_INDEX );
101   DALI_TEST_EQUALS( depthIndex, 1, TEST_LOCATION );
102   DALI_TEST_EQUALS( visual.GetDepthIndex(), 1.f, TEST_LOCATION );
103
104   visual.SetDepthIndex( -1.f );
105   depthIndex = actor.GetRendererAt(0u).GetProperty<int>( Renderer::Property::DEPTH_INDEX );
106   DALI_TEST_EQUALS( depthIndex, -1, TEST_LOCATION );
107   DALI_TEST_EQUALS( visual.GetDepthIndex(), -1.f, TEST_LOCATION );
108
109   END_TEST;
110 }
111
112 int UtcDaliVisualSize(void)
113 {
114   ToolkitTestApplication application;
115   tet_infoline( "UtcDaliVisualGetNaturalSize" );
116
117   VisualFactory factory = VisualFactory::Get();
118   Vector2 visualSize( 20.f, 30.f );
119   Vector2 naturalSize;
120
121   // color colorVisual
122   Dali::Property::Map map;
123   map[ Visual::Property::TYPE ] = Visual::COLOR;
124   map[ ColorVisual::Property::MIX_COLOR ] = Color::MAGENTA;
125   Visual::Base colorVisual = factory.CreateVisual( map );
126   colorVisual.SetSize( visualSize );
127   DALI_TEST_EQUALS( colorVisual.GetSize(), visualSize, TEST_LOCATION );
128   colorVisual.GetNaturalSize(naturalSize);
129   DALI_TEST_EQUALS( naturalSize, Vector2::ZERO, TEST_LOCATION );
130
131   // image visual
132   Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME, ImageDimensions(100, 200));
133   Visual::Base imageVisual = factory.CreateVisual( image );
134   imageVisual.SetSize( visualSize );
135   DALI_TEST_EQUALS( imageVisual.GetSize(), visualSize, TEST_LOCATION );
136   imageVisual.GetNaturalSize(naturalSize);
137   DALI_TEST_EQUALS( naturalSize, Vector2(100.f, 200.f), TEST_LOCATION );
138
139   // n patch visual
140   TestPlatformAbstraction& platform = application.GetPlatform();
141   Vector2 testSize(80.f, 160.f);
142   platform.SetClosestImageSize(testSize);
143   image = ResourceImage::New(TEST_NPATCH_FILE_NAME);
144   Visual::Base nPatchVisual = factory.CreateVisual( image );
145   nPatchVisual.SetSize( visualSize );
146   DALI_TEST_EQUALS( nPatchVisual.GetSize(), visualSize, TEST_LOCATION );
147   nPatchVisual.GetNaturalSize(naturalSize);
148   DALI_TEST_EQUALS( naturalSize, testSize, TEST_LOCATION );
149
150   // border visual
151   float borderSize = 5.f;
152   map.Clear();
153   map[ Visual::Property::TYPE ] = Visual::BORDER;
154   map[ BorderVisual::Property::COLOR  ] = Color::RED;
155   map[ BorderVisual::Property::SIZE   ] = borderSize;
156   Visual::Base borderVisual = factory.CreateVisual( map );
157   borderVisual.SetSize( visualSize );
158   DALI_TEST_EQUALS( borderVisual.GetSize(), visualSize, TEST_LOCATION );
159   borderVisual.GetNaturalSize(naturalSize);
160   DALI_TEST_EQUALS( naturalSize, Vector2::ZERO, TEST_LOCATION );
161
162   // gradient gradientVisual
163   Property::Map propertyMap;
164   propertyMap.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
165   Vector2 start(-1.f, -1.f);
166   Vector2 end(1.f, 1.f);
167   propertyMap.Insert(GradientVisual::Property::START_POSITION,   start);
168   propertyMap.Insert(GradientVisual::Property::END_POSITION,   end);
169   propertyMap.Insert(GradientVisual::Property::STOP_OFFSET,   Vector2(0.f, 1.f));
170   Property::Array stopColors;
171   stopColors.PushBack( Color::RED );
172   stopColors.PushBack( Color::GREEN );
173   propertyMap.Insert(GradientVisual::Property::STOP_COLOR,   stopColors);
174   Visual::Base gradientVisual = factory.CreateVisual(propertyMap);
175   gradientVisual.SetSize( visualSize );
176   DALI_TEST_EQUALS( gradientVisual.GetSize(), visualSize, TEST_LOCATION );
177   gradientVisual.GetNaturalSize(naturalSize);
178   DALI_TEST_EQUALS( naturalSize, Vector2::ZERO,TEST_LOCATION );
179
180   // svg visual
181   Visual::Base svgVisual = factory.CreateVisual( TEST_SVG_FILE_NAME, ImageDimensions() );
182   svgVisual.SetSize( visualSize );
183   DALI_TEST_EQUALS( svgVisual.GetSize(), visualSize, TEST_LOCATION );
184   svgVisual.GetNaturalSize(naturalSize);
185   // TEST_SVG_FILE:
186   //  <svg width="100" height="100">
187   //  <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
188   //  </svg>
189   DALI_TEST_EQUALS( naturalSize, Vector2(100.f, 100.f), TEST_LOCATION );
190
191   // Batch Image visual
192   propertyMap.Clear();
193   propertyMap.Insert( Visual::Property::TYPE, Visual::BATCH_IMAGE );
194   propertyMap.Insert( BatchImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
195   Visual::Base batchImageVisual = factory.CreateVisual( propertyMap );
196   batchImageVisual.SetSize( visualSize );
197   DALI_TEST_EQUALS( batchImageVisual.GetSize(), visualSize, TEST_LOCATION );
198   batchImageVisual.GetNaturalSize( naturalSize );
199   DALI_TEST_EQUALS( naturalSize, Vector2( 80.0f, 160.0f ), TEST_LOCATION );
200
201   END_TEST;
202 }
203
204 int UtcDaliVisualSetOnOffStage(void)
205 {
206   ToolkitTestApplication application;
207   tet_infoline( "UtcDaliVisualSetDepthIndex" );
208
209   VisualFactory factory = VisualFactory::Get();
210   Property::Map propertyMap;
211   propertyMap.Insert(Visual::Property::TYPE,  Visual::COLOR);
212   propertyMap.Insert(ColorVisual::Property::MIX_COLOR,  Color::BLUE);
213   Visual::Base visual = factory.CreateVisual( propertyMap );
214
215   Actor actor = Actor::New();
216   actor.SetSize(200.f, 200.f);
217   Stage::GetCurrent().Add( actor );
218
219   application.SendNotification();
220   application.Render(0);
221   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
222
223   visual.SetOnStage( actor );
224   application.SendNotification();
225   application.Render(0);
226   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
227
228   visual.SetOffStage( actor );
229   application.SendNotification();
230   application.Render(0);
231   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
232
233   END_TEST;
234 }
235
236 int UtcDaliVisualRemoveAndReset(void)
237 {
238   ToolkitTestApplication application;
239   tet_infoline( "intUtcDaliVisualRemoveAndReset" );
240
241   VisualFactory factory = VisualFactory::Get();
242
243   Actor actor = Actor::New();
244   actor.SetSize(200.f, 200.f);
245   Stage::GetCurrent().Add( actor );
246
247   Visual::Base imageVisual;
248   // test calling RemoveAndReset with an empty handle
249   try
250   {
251     imageVisual.RemoveAndReset( actor );
252     tet_result(TET_PASS);
253   }
254   catch (DaliException& exception)
255   {
256     tet_result(TET_FAIL);
257   }
258
259   Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME, ImageDimensions(100, 200));
260   imageVisual = factory.CreateVisual(image);
261   DALI_TEST_CHECK( imageVisual );
262
263   imageVisual.SetOnStage( actor );
264   application.SendNotification();
265   application.Render(0);
266   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
267
268   imageVisual.RemoveAndReset( actor );
269   application.SendNotification();
270   application.Render(0);
271   DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); // visual is removed from actor
272   DALI_TEST_CHECK( !imageVisual ); // visual is reset
273
274   END_TEST;
275 }
276
277 int UtcDaliVisualGetPropertyMap1(void)
278 {
279   ToolkitTestApplication application;
280   tet_infoline( "UtcDaliVisualGetPropertyMap1: ColorVisual" );
281
282   VisualFactory factory = VisualFactory::Get();
283   Property::Map propertyMap;
284   propertyMap.Insert(Visual::Property::TYPE,  Visual::COLOR);
285   propertyMap.Insert(ColorVisual::Property::MIX_COLOR,  Color::BLUE);
286   Visual::Base colorVisual = factory.CreateVisual( propertyMap );
287
288   Property::Map resultMap;
289   colorVisual.CreatePropertyMap( resultMap );
290
291   Property::Value* typeValue = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
292   DALI_TEST_CHECK( typeValue );
293   DALI_TEST_CHECK( typeValue->Get<int>() == Visual::COLOR );
294
295   Property::Value* colorValue = resultMap.Find( ColorVisual::Property::MIX_COLOR,  Property::VECTOR4 );
296   DALI_TEST_CHECK( colorValue );
297   DALI_TEST_CHECK( colorValue->Get<Vector4>() == Color::BLUE );
298
299   // change the blend color
300   Actor actor;
301   colorVisual.RemoveAndReset( actor );
302   propertyMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
303   colorVisual = factory.CreateVisual( propertyMap  );
304   colorVisual.CreatePropertyMap( resultMap );
305
306   colorValue = resultMap.Find( ColorVisual::Property::MIX_COLOR,  Property::VECTOR4 );
307   DALI_TEST_CHECK( colorValue );
308   DALI_TEST_CHECK( colorValue->Get<Vector4>() == Color::CYAN );
309
310   END_TEST;
311 }
312
313 int UtcDaliVisualGetPropertyMap2(void)
314 {
315   ToolkitTestApplication application;
316   tet_infoline( "UtcDaliVisualGetPropertyMap2: BorderVisual" );
317
318   VisualFactory factory = VisualFactory::Get();
319   Property::Map propertyMap;
320   propertyMap.Insert(Visual::Property::TYPE,  Visual::BORDER);
321   propertyMap.Insert(BorderVisual::Property::COLOR,  Color::BLUE);
322   propertyMap.Insert(BorderVisual::Property::SIZE,  5.f);
323   Visual::Base borderVisual = factory.CreateVisual( propertyMap );
324
325   Property::Map resultMap;
326   borderVisual.CreatePropertyMap( resultMap );
327
328   // check the property values from the returned map from visual
329   Property::Value* typeValue = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
330   DALI_TEST_CHECK( typeValue );
331   DALI_TEST_CHECK( typeValue->Get<int>() == Visual::BORDER );
332
333   Property::Value* colorValue = resultMap.Find( BorderVisual::Property::COLOR,  Property::VECTOR4 );
334   DALI_TEST_CHECK( colorValue );
335   DALI_TEST_CHECK( colorValue->Get<Vector4>() == Color::BLUE );
336
337   Property::Value* sizeValue = resultMap.Find( BorderVisual::Property::SIZE,  Property::FLOAT );
338   DALI_TEST_CHECK( sizeValue );
339   DALI_TEST_CHECK( sizeValue->Get<float>() == 5.f );
340
341   Property::Map propertyMap1;
342   propertyMap1[ Visual::Property::TYPE ] = Visual::BORDER;
343   propertyMap1[ BorderVisual::Property::COLOR  ] = Color::CYAN;
344   propertyMap1[ BorderVisual::Property::SIZE   ] = 10.0f;
345   borderVisual = factory.CreateVisual( propertyMap1 );
346   borderVisual.CreatePropertyMap( resultMap );
347
348   typeValue = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
349   DALI_TEST_CHECK( typeValue );
350   DALI_TEST_CHECK( typeValue->Get<int>() == Visual::BORDER );
351
352   colorValue = resultMap.Find( BorderVisual::Property::COLOR,  Property::VECTOR4 );
353   DALI_TEST_CHECK( colorValue );
354   DALI_TEST_CHECK( colorValue->Get<Vector4>() == Color::CYAN );
355
356   colorValue = resultMap.Find( BorderVisual::Property::SIZE,  Property::FLOAT );
357   DALI_TEST_CHECK( colorValue );
358   DALI_TEST_CHECK( colorValue->Get<float>() == 10.f );
359
360   END_TEST;
361 }
362
363 int UtcDaliVisualGetPropertyMap3(void)
364 {
365   ToolkitTestApplication application;
366   tet_infoline( "UtcDaliVisualGetPropertyMap3: linear GradientVisual" );
367
368   VisualFactory factory = VisualFactory::Get();
369   DALI_TEST_CHECK( factory );
370
371   Property::Map propertyMap;
372   propertyMap.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
373
374   Vector2 start(-1.f, -1.f);
375   Vector2 end(1.f, 1.f);
376   propertyMap.Insert(GradientVisual::Property::START_POSITION, start);
377   propertyMap.Insert(GradientVisual::Property::END_POSITION, end);
378   propertyMap.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT);
379
380   propertyMap.Insert(GradientVisual::Property::STOP_OFFSET,   Vector2(0.2f, 0.8f));
381
382   Property::Array stopColors;
383   stopColors.PushBack( Color::RED );
384   stopColors.PushBack( Color::GREEN );
385   propertyMap.Insert(GradientVisual::Property::STOP_COLOR,   stopColors);
386
387   Visual::Base gradientVisual = factory.CreateVisual(propertyMap);
388
389   Property::Map resultMap;
390   gradientVisual.CreatePropertyMap( resultMap );
391
392   // check the property values from the returned map from visual
393   Property::Value* value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
394   DALI_TEST_CHECK( value );
395   DALI_TEST_CHECK( value->Get<int>() == Visual::GRADIENT );
396
397   value = resultMap.Find( GradientVisual::Property::UNITS,  Property::INTEGER );
398   DALI_TEST_CHECK( value );
399   DALI_TEST_CHECK( value->Get<int>() == GradientVisual::Units::OBJECT_BOUNDING_BOX );
400
401   value = resultMap.Find( GradientVisual::Property::SPREAD_METHOD,   Property::INTEGER );
402   DALI_TEST_CHECK( value );
403   DALI_TEST_CHECK( value->Get<int>() == GradientVisual::SpreadMethod::REPEAT );
404
405   value = resultMap.Find( GradientVisual::Property::START_POSITION,   Property::VECTOR2 );
406   DALI_TEST_CHECK( value );
407   DALI_TEST_EQUALS( value->Get<Vector2>(), start , Math::MACHINE_EPSILON_100, TEST_LOCATION );
408
409   value = resultMap.Find( GradientVisual::Property::END_POSITION,   Property::VECTOR2 );
410   DALI_TEST_CHECK( value );
411   DALI_TEST_EQUALS( value->Get<Vector2>(), end , Math::MACHINE_EPSILON_100, TEST_LOCATION );
412
413   value = resultMap.Find( GradientVisual::Property::STOP_OFFSET,   Property::ARRAY );
414   DALI_TEST_CHECK( value );
415   Property::Array* offsetArray = value->GetArray();
416   DALI_TEST_CHECK( offsetArray->Count() == 2 );
417   DALI_TEST_EQUALS( offsetArray->GetElementAt(0).Get<float>(), 0.2f , Math::MACHINE_EPSILON_100, TEST_LOCATION );
418   DALI_TEST_EQUALS( offsetArray->GetElementAt(1).Get<float>(), 0.8f , Math::MACHINE_EPSILON_100, TEST_LOCATION );
419
420   value = resultMap.Find( GradientVisual::Property::STOP_COLOR,   Property::ARRAY );
421   DALI_TEST_CHECK( value );
422   Property::Array* colorArray = value->GetArray();
423   DALI_TEST_CHECK( colorArray->Count() == 2 );
424   DALI_TEST_EQUALS( colorArray->GetElementAt(0).Get<Vector4>(), Color::RED , Math::MACHINE_EPSILON_100, TEST_LOCATION );
425   DALI_TEST_EQUALS( colorArray->GetElementAt(1).Get<Vector4>(), Color::GREEN , Math::MACHINE_EPSILON_100, TEST_LOCATION );
426
427   END_TEST;
428 }
429
430 int UtcDaliVisualGetPropertyMap4(void)
431 {
432   ToolkitTestApplication application;
433   tet_infoline( "UtcDaliVisualGetPropertyMap4: radial GradientVisual" );
434
435   VisualFactory factory = VisualFactory::Get();
436   DALI_TEST_CHECK( factory );
437
438   Property::Map propertyMap;
439   propertyMap.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
440
441   Vector2 center(100.f, 100.f);
442   float radius = 100.f;
443   propertyMap.Insert(GradientVisual::Property::UNITS,  GradientVisual::Units::USER_SPACE);
444   propertyMap.Insert(GradientVisual::Property::CENTER,  center);
445   propertyMap.Insert(GradientVisual::Property::RADIUS,  radius);
446   propertyMap.Insert(GradientVisual::Property::STOP_OFFSET,   Vector3(0.1f, 0.3f, 1.1f));
447
448   Property::Array stopColors;
449   stopColors.PushBack( Color::RED );
450   stopColors.PushBack( Color::BLACK );
451   stopColors.PushBack( Color::GREEN );
452   propertyMap.Insert(GradientVisual::Property::STOP_COLOR,   stopColors);
453
454   Visual::Base gradientVisual = factory.CreateVisual(propertyMap);
455   DALI_TEST_CHECK( gradientVisual );
456
457   Property::Map resultMap;
458   gradientVisual.CreatePropertyMap( resultMap );
459
460   // check the property values from the returned map from visual
461   Property::Value* value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
462   DALI_TEST_CHECK( value );
463   DALI_TEST_CHECK( value->Get<int>() == Visual::GRADIENT );
464
465   value = resultMap.Find( GradientVisual::Property::UNITS,  Property::INTEGER );
466   DALI_TEST_CHECK( value );
467   DALI_TEST_CHECK( value->Get<int>() == GradientVisual::Units::USER_SPACE );
468
469   value = resultMap.Find( GradientVisual::Property::SPREAD_METHOD,   Property::INTEGER );
470   DALI_TEST_CHECK( value );
471   DALI_TEST_CHECK( value->Get<int>() == GradientVisual::SpreadMethod::PAD );
472
473   value = resultMap.Find( GradientVisual::Property::CENTER,  Property::VECTOR2 );
474   DALI_TEST_CHECK( value );
475   DALI_TEST_EQUALS( value->Get<Vector2>(), center , Math::MACHINE_EPSILON_100, TEST_LOCATION );
476
477   value = resultMap.Find( GradientVisual::Property::RADIUS,  Property::FLOAT );
478   DALI_TEST_CHECK( value );
479   DALI_TEST_EQUALS( value->Get<float>(), radius , Math::MACHINE_EPSILON_100, TEST_LOCATION );
480
481   value = resultMap.Find( GradientVisual::Property::STOP_OFFSET,   Property::ARRAY );
482   DALI_TEST_CHECK( value );
483   Property::Array* offsetArray = value->GetArray();
484   DALI_TEST_CHECK( offsetArray->Count() == 3 );
485   DALI_TEST_EQUALS( offsetArray->GetElementAt(0).Get<float>(), 0.1f , Math::MACHINE_EPSILON_100, TEST_LOCATION );
486   DALI_TEST_EQUALS( offsetArray->GetElementAt(1).Get<float>(), 0.3f , Math::MACHINE_EPSILON_100, TEST_LOCATION );
487   // any stop value will be clamped to [0.0, 1.0];
488   DALI_TEST_EQUALS( offsetArray->GetElementAt(2).Get<float>(), 1.0f , Math::MACHINE_EPSILON_100, TEST_LOCATION );
489
490   value = resultMap.Find( GradientVisual::Property::STOP_COLOR,   Property::ARRAY );
491   DALI_TEST_CHECK( value );
492   Property::Array* colorArray = value->GetArray();
493   DALI_TEST_CHECK( colorArray->Count() == 3 );
494   DALI_TEST_EQUALS( colorArray->GetElementAt(0).Get<Vector4>(), Color::RED , Math::MACHINE_EPSILON_100, TEST_LOCATION );
495   DALI_TEST_EQUALS( colorArray->GetElementAt(1).Get<Vector4>(), Color::BLACK , Math::MACHINE_EPSILON_100, TEST_LOCATION );
496   DALI_TEST_EQUALS( colorArray->GetElementAt(2).Get<Vector4>(), Color::GREEN , Math::MACHINE_EPSILON_100, TEST_LOCATION );
497
498   END_TEST;
499 }
500
501 int UtcDaliVisualGetPropertyMap5(void)
502 {
503   ToolkitTestApplication application;
504   tet_infoline( "UtcDaliVisualGetPropertyMap5: ImageVisual" );
505
506   VisualFactory factory = VisualFactory::Get();
507   Property::Map propertyMap;
508   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
509   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
510   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
511   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
512   propertyMap.Insert( ImageVisual::Property::FITTING_MODE,   FittingMode::FIT_HEIGHT );
513   propertyMap.Insert( ImageVisual::Property::SAMPLING_MODE,   SamplingMode::BOX_THEN_NEAREST );
514   propertyMap.Insert( "synchronousLoading",   true );
515
516   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
517   DALI_TEST_CHECK( imageVisual );
518
519   Property::Map resultMap;
520   imageVisual.CreatePropertyMap( resultMap );
521
522   // check the property values from the returned map from visual
523   Property::Value* value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
524   DALI_TEST_CHECK( value );
525   DALI_TEST_CHECK( value->Get<int>() == Visual::IMAGE );
526
527   value = resultMap.Find( ImageVisual::Property::URL,  Property::STRING );
528   DALI_TEST_CHECK( value );
529   DALI_TEST_CHECK( value->Get<std::string>() == TEST_IMAGE_FILE_NAME );
530
531   value = resultMap.Find( ImageVisual::Property::FITTING_MODE,   Property::INTEGER );
532   DALI_TEST_CHECK( value );
533   DALI_TEST_CHECK( value->Get<int>() == FittingMode::FIT_HEIGHT );
534
535   value = resultMap.Find( ImageVisual::Property::SAMPLING_MODE,   Property::INTEGER );
536   DALI_TEST_CHECK( value );
537   DALI_TEST_CHECK( value->Get<int>() == SamplingMode::BOX_THEN_NEAREST );
538
539   value = resultMap.Find( ImageVisual::Property::DESIRED_WIDTH,   Property::INTEGER );
540   DALI_TEST_CHECK( value );
541   DALI_TEST_CHECK( value->Get<int>() == 20 );
542
543   value = resultMap.Find( ImageVisual::Property::DESIRED_HEIGHT,   Property::INTEGER );
544   DALI_TEST_CHECK( value );
545   DALI_TEST_CHECK( value->Get<int>() == 30 );
546
547   value = resultMap.Find( "synchronousLoading",   Property::BOOLEAN );
548   DALI_TEST_CHECK( value );
549   DALI_TEST_CHECK( value->Get<bool>() == true );
550
551   // Get an image visual with an image handle, and test the default property values
552   Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME, ImageDimensions(100, 200));
553   imageVisual = factory.CreateVisual(image);
554   imageVisual.CreatePropertyMap( resultMap );
555
556   value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
557   DALI_TEST_CHECK( value );
558   DALI_TEST_CHECK( value->Get<int>() == Visual::IMAGE );
559
560   value = resultMap.Find( ImageVisual::Property::URL,  Property::STRING );
561   DALI_TEST_CHECK( value );
562   DALI_TEST_CHECK( value->Get<std::string>() == TEST_IMAGE_FILE_NAME );
563
564   value = resultMap.Find( ImageVisual::Property::FITTING_MODE,   Property::INTEGER );
565   DALI_TEST_CHECK( value );
566   DALI_TEST_CHECK( value->Get<int>() == FittingMode::SHRINK_TO_FIT );
567
568   value = resultMap.Find( ImageVisual::Property::SAMPLING_MODE,   Property::INTEGER );
569   DALI_TEST_CHECK( value );
570   DALI_TEST_CHECK( value->Get<int>() == SamplingMode::BOX );
571
572   value = resultMap.Find( ImageVisual::Property::DESIRED_WIDTH,   Property::INTEGER );
573   DALI_TEST_CHECK( value );
574   DALI_TEST_CHECK( value->Get<int>() == 100 );
575
576   value = resultMap.Find( ImageVisual::Property::DESIRED_HEIGHT,   Property::INTEGER );
577   DALI_TEST_CHECK( value );
578   DALI_TEST_CHECK( value->Get<int>() == 200 );
579
580   value = resultMap.Find( "synchronousLoading",   Property::BOOLEAN );
581   DALI_TEST_CHECK( value );
582   DALI_TEST_CHECK( value->Get<bool>() == false );
583
584   END_TEST;
585 }
586
587 int UtcDaliVisualGetPropertyMap6(void)
588 {
589   ToolkitTestApplication application;
590   tet_infoline( "UtcDaliVisualGetPropertyMap6: NPatchVisual" );
591
592   VisualFactory factory = VisualFactory::Get();
593   Property::Map propertyMap;
594   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
595   propertyMap.Insert( ImageVisual::Property::URL,  TEST_NPATCH_FILE_NAME );
596   propertyMap.Insert( ImageVisual::Property::BORDER_ONLY,  true );
597   Visual::Base nPatchVisual = factory.CreateVisual( propertyMap );
598
599   Property::Map resultMap;
600   nPatchVisual.CreatePropertyMap( resultMap );
601
602   // check the property values from the returned map from visual
603   Property::Value* value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
604   DALI_TEST_CHECK( value );
605   DALI_TEST_CHECK( value->Get<int>() == Visual::IMAGE );
606
607   value = resultMap.Find( ImageVisual::Property::URL,  Property::STRING );
608   DALI_TEST_CHECK( value );
609   DALI_TEST_CHECK( value->Get<std::string>() == TEST_NPATCH_FILE_NAME );
610
611   value = resultMap.Find( ImageVisual::Property::BORDER_ONLY,  Property::BOOLEAN );
612   DALI_TEST_CHECK( value );
613   DALI_TEST_CHECK( value->Get<bool>() );
614
615   END_TEST;
616 }
617
618 int UtcDaliVisualGetPropertyMap7(void)
619 {
620   ToolkitTestApplication application;
621   tet_infoline( "UtcDaliVisualGetPropertyMap7: SvgVisual" );
622
623   // request SvgVisual with a property map
624   VisualFactory factory = VisualFactory::Get();
625   Property::Map propertyMap;
626   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
627   propertyMap.Insert( ImageVisual::Property::URL,  TEST_SVG_FILE_NAME );
628   Visual::Base svgVisual = factory.CreateVisual( propertyMap );
629
630   Property::Map resultMap;
631   svgVisual.CreatePropertyMap( resultMap );
632   // check the property values from the returned map from a visual
633   Property::Value* value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
634   DALI_TEST_CHECK( value );
635   DALI_TEST_CHECK( value->Get<int>() == Visual::IMAGE );
636
637   value = resultMap.Find( ImageVisual::Property::URL,  Property::STRING );
638   DALI_TEST_CHECK( value );
639   DALI_TEST_CHECK( value->Get<std::string>() == TEST_SVG_FILE_NAME );
640
641   // request SvgVisual with an URL
642   Visual::Base svgVisual2 = factory.CreateVisual( TEST_SVG_FILE_NAME, ImageDimensions() );
643   resultMap.Clear();
644   svgVisual2.CreatePropertyMap( resultMap );
645   // check the property values from the returned map from a visual
646   value = resultMap.Find( Visual::Property::TYPE,  Property::INTEGER );
647   DALI_TEST_CHECK( value );
648   DALI_TEST_CHECK( value->Get<int>() == Visual::IMAGE );
649
650   value = resultMap.Find( ImageVisual::Property::URL,  Property::STRING );
651   DALI_TEST_CHECK( value );
652   DALI_TEST_CHECK( value->Get<std::string>() == TEST_SVG_FILE_NAME );
653
654   END_TEST;
655 }
656
657 //Mesh visual
658 int UtcDaliVisualGetPropertyMap8(void)
659 {
660   ToolkitTestApplication application;
661   tet_infoline( "UtcDaliVisualGetPropertyMap8: MeshVisual" );
662
663   //Request MeshVisual using a property map.
664   VisualFactory factory = VisualFactory::Get();
665   Property::Map propertyMap;
666   propertyMap.Insert( Visual::Property::TYPE, Visual::MESH );
667   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
668   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
669   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_LOCATION );
670   propertyMap.Insert( MeshVisual::Property::SHADING_MODE, MeshVisual::ShadingMode::TEXTURELESS_WITH_DIFFUSE_LIGHTING );
671   propertyMap.Insert( MeshVisual::Property::LIGHT_POSITION, Vector3( 5.0f, 10.0f, 15.0f) );
672   Visual::Base meshVisual = factory.CreateVisual( propertyMap );
673
674   Property::Map resultMap;
675   meshVisual.CreatePropertyMap( resultMap );
676
677   //Check values in the result map are identical to the initial map's values.
678   Property::Value* value = resultMap.Find( Visual::Property::TYPE, Property::INTEGER );
679   DALI_TEST_CHECK( value );
680   DALI_TEST_EQUALS( value->Get<int>(), (int)Visual::MESH, TEST_LOCATION );
681
682   value = resultMap.Find( MeshVisual::Property::OBJECT_URL, Property::STRING );
683   DALI_TEST_CHECK( value );
684   DALI_TEST_EQUALS( value->Get<std::string>(), TEST_OBJ_FILE_NAME, TEST_LOCATION );
685
686   value = resultMap.Find( MeshVisual::Property::MATERIAL_URL, Property::STRING );
687   DALI_TEST_CHECK( value );
688   DALI_TEST_EQUALS( value->Get<std::string>(), TEST_MTL_FILE_NAME, TEST_LOCATION );
689
690   value = resultMap.Find( MeshVisual::Property::TEXTURES_PATH, Property::STRING );
691   DALI_TEST_CHECK( value );
692   DALI_TEST_EQUALS( value->Get<std::string>(), TEST_RESOURCE_LOCATION, TEST_LOCATION );
693
694   value = resultMap.Find( MeshVisual::Property::SHADING_MODE, Property::INTEGER );
695   DALI_TEST_CHECK( value );
696   DALI_TEST_EQUALS( value->Get<int>(), (int)MeshVisual::ShadingMode::TEXTURELESS_WITH_DIFFUSE_LIGHTING, TEST_LOCATION );
697
698   value = resultMap.Find( MeshVisual::Property::LIGHT_POSITION, Property::VECTOR3 );
699   DALI_TEST_CHECK( value );
700   DALI_TEST_EQUALS( value->Get<Vector3>(), Vector3( 5.0f, 10.0f, 15.0f), Math::MACHINE_EPSILON_100, TEST_LOCATION );
701
702   END_TEST;
703 }
704
705 //Primitive shape visual
706 int UtcDaliVisualGetPropertyMap9(void)
707 {
708   ToolkitTestApplication application;
709   tet_infoline( "UtcDaliVisualGetPropertyMap9: PrimitiveVisual" );
710
711   Vector4 color = Vector4( 1.0, 0.8, 0.6, 1.0);
712   Vector3 dimensions = Vector3( 1.0, 2.0, 3.0 );
713
714   //Request PrimitiveVisual using a property map.
715   VisualFactory factory = VisualFactory::Get();
716   Property::Map propertyMap;
717   propertyMap.Insert( Visual::Property::TYPE, Visual::PRIMITIVE );
718   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::CUBE );
719   propertyMap.Insert( PrimitiveVisual::Property::COLOR, color );
720   propertyMap.Insert( PrimitiveVisual::Property::SLICES, 10 );
721   propertyMap.Insert( PrimitiveVisual::Property::STACKS, 20 );
722   propertyMap.Insert( PrimitiveVisual::Property::SCALE_TOP_RADIUS, 30.0f );
723   propertyMap.Insert( PrimitiveVisual::Property::SCALE_BOTTOM_RADIUS, 40.0f );
724   propertyMap.Insert( PrimitiveVisual::Property::SCALE_HEIGHT, 50.0f );
725   propertyMap.Insert( PrimitiveVisual::Property::SCALE_RADIUS, 60.0f );
726   propertyMap.Insert( PrimitiveVisual::Property::SCALE_DIMENSIONS, dimensions );
727   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_PERCENTAGE, 0.3f );
728   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_SMOOTHNESS, 0.6f );
729   propertyMap.Insert( PrimitiveVisual::Property::LIGHT_POSITION, Vector3( 5.0f, 10.0f, 15.0f) );
730   Visual::Base primitiveVisual = factory.CreateVisual( propertyMap );
731
732   Property::Map resultMap;
733   primitiveVisual.CreatePropertyMap( resultMap );
734
735   //Check values in the result map are identical to the initial map's values.
736   Property::Value* value = resultMap.Find( Visual::Property::TYPE, Property::INTEGER );
737   DALI_TEST_CHECK( value );
738   DALI_TEST_EQUALS( value->Get<int>(), (int)Visual::PRIMITIVE, TEST_LOCATION );
739
740   value = resultMap.Find( PrimitiveVisual::Property::SHAPE, Property::INTEGER );
741   DALI_TEST_CHECK( value );
742   DALI_TEST_EQUALS( value->Get<int>(), (int)PrimitiveVisual::Shape::CUBE, TEST_LOCATION );
743
744   value = resultMap.Find( PrimitiveVisual::Property::COLOR, Property::VECTOR4 );
745   DALI_TEST_CHECK( value );
746   DALI_TEST_CHECK( value->Get<Vector4>() == color );
747   DALI_TEST_EQUALS( value->Get<Vector4>(), color, Math::MACHINE_EPSILON_100, TEST_LOCATION );
748
749   value = resultMap.Find( PrimitiveVisual::Property::SLICES, Property::INTEGER );
750   DALI_TEST_CHECK( value );
751   DALI_TEST_EQUALS( value->Get<int>(), 10, TEST_LOCATION );
752
753   value = resultMap.Find( PrimitiveVisual::Property::STACKS, Property::INTEGER );
754   DALI_TEST_CHECK( value );
755   DALI_TEST_EQUALS( value->Get<int>(), 20, TEST_LOCATION );
756
757   value = resultMap.Find( PrimitiveVisual::Property::SCALE_TOP_RADIUS, Property::FLOAT );
758   DALI_TEST_CHECK( value );
759   DALI_TEST_EQUALS( value->Get<float>(), 30.0f, Math::MACHINE_EPSILON_100, TEST_LOCATION );
760
761   value = resultMap.Find( PrimitiveVisual::Property::SCALE_BOTTOM_RADIUS, Property::FLOAT );
762   DALI_TEST_CHECK( value );
763   DALI_TEST_EQUALS( value->Get<float>(), 40.0f, Math::MACHINE_EPSILON_100, TEST_LOCATION );
764
765   value = resultMap.Find( PrimitiveVisual::Property::SCALE_HEIGHT, Property::FLOAT );
766   DALI_TEST_CHECK( value );
767   DALI_TEST_EQUALS( value->Get<float>(), 50.0f, Math::MACHINE_EPSILON_100, TEST_LOCATION );
768
769   value = resultMap.Find( PrimitiveVisual::Property::SCALE_RADIUS, Property::FLOAT );
770   DALI_TEST_CHECK( value );
771   DALI_TEST_EQUALS( value->Get<float>(), 60.0f, Math::MACHINE_EPSILON_100, TEST_LOCATION );
772
773   value = resultMap.Find( PrimitiveVisual::Property::SCALE_DIMENSIONS, Property::VECTOR3 );
774   DALI_TEST_CHECK( value );
775   DALI_TEST_EQUALS( value->Get<Vector3>(), dimensions, Math::MACHINE_EPSILON_100, TEST_LOCATION );
776
777   value = resultMap.Find( PrimitiveVisual::Property::BEVEL_PERCENTAGE, Property::FLOAT );
778   DALI_TEST_CHECK( value );
779   DALI_TEST_EQUALS( value->Get<float>(), 0.3f, Math::MACHINE_EPSILON_100, TEST_LOCATION );
780
781   value = resultMap.Find( PrimitiveVisual::Property::BEVEL_SMOOTHNESS, Property::FLOAT );
782   DALI_TEST_CHECK( value );
783   DALI_TEST_EQUALS( value->Get<float>(), 0.6f, Math::MACHINE_EPSILON_100, TEST_LOCATION );
784
785   value = resultMap.Find( PrimitiveVisual::Property::LIGHT_POSITION, Property::VECTOR3 );
786   DALI_TEST_CHECK( value );
787   DALI_TEST_EQUALS( value->Get<Vector3>(), Vector3( 5.0f, 10.0f, 15.0f), Math::MACHINE_EPSILON_100, TEST_LOCATION );
788
789   END_TEST;
790 }
791
792 int UtcDaliVisualGetPropertyMapBatchImageVisual(void)
793 {
794   ToolkitTestApplication application;
795   tet_infoline( "UtcDaliVisualGetPropertyMapBatchImageVisual:" );
796
797   VisualFactory factory = VisualFactory::Get();
798   Property::Map propertyMap;
799   propertyMap.Insert( Visual::Property::TYPE, Visual::BATCH_IMAGE );
800   propertyMap.Insert( BatchImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
801   propertyMap.Insert( BatchImageVisual::Property::DESIRED_WIDTH, 20 );
802   propertyMap.Insert( BatchImageVisual::Property::DESIRED_HEIGHT, 30 );
803
804   Visual::Base batchImageVisual = factory.CreateVisual( propertyMap );
805   DALI_TEST_CHECK( batchImageVisual );
806
807   Property::Map resultMap;
808   batchImageVisual.CreatePropertyMap( resultMap );
809
810   // Check the property values from the returned map from visual
811   Property::Value* value = resultMap.Find( Visual::Property::TYPE, Property::INTEGER );
812   DALI_TEST_CHECK( value );
813   DALI_TEST_CHECK( value->Get<int>() == Visual::BATCH_IMAGE );
814
815   value = resultMap.Find( BatchImageVisual::Property::URL, Property::STRING );
816   DALI_TEST_CHECK( value );
817   DALI_TEST_CHECK( value->Get<std::string>() == TEST_IMAGE_FILE_NAME );
818
819   value = resultMap.Find( BatchImageVisual::Property::DESIRED_WIDTH, Property::INTEGER );
820   DALI_TEST_CHECK( value );
821   DALI_TEST_CHECK( value->Get<int>() == 20 );
822
823   value = resultMap.Find( BatchImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER );
824   DALI_TEST_CHECK( value );
825   DALI_TEST_CHECK( value->Get<int>() == 30 );
826
827   END_TEST;
828 }
829
830 int UtcDaliVisualGetPropertyMapBatchImageVisualNoAtlas(void)
831 {
832   ToolkitTestApplication application;
833   tet_infoline( "UtcDaliVisualGetPropertyMapBatchImageVisualNoAtlas:" );
834
835   VisualFactory factory = VisualFactory::Get();
836   Property::Map propertyMap;
837   propertyMap.Insert( Visual::Property::TYPE, Visual::BATCH_IMAGE );
838   propertyMap.Insert( BatchImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
839
840   // Set the desired size to be larger than the atlas limit of 1024x1024.
841   propertyMap.Insert( BatchImageVisual::Property::DESIRED_WIDTH, 2048 );
842   propertyMap.Insert( BatchImageVisual::Property::DESIRED_HEIGHT, 2048 );
843
844   // Create the visual.
845   Visual::Base batchImageVisual = factory.CreateVisual( propertyMap );
846
847   DALI_TEST_CHECK( batchImageVisual );
848
849   Actor actor = Actor::New();
850   batchImageVisual.SetOnStage( actor );
851
852   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
853
854   END_TEST;
855 }