Replace visual opacity with Renderer's opacity
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-VisualFactory.cpp
1 /*
2  * Copyright (c) 2018 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 <toolkit-timer.h>
21 #include <toolkit-event-thread-callback.h>
22 #include <dali/devel-api/images/nine-patch-image.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
25 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
26 #include "dummy-control.h"
27
28 using namespace Dali;
29 using namespace Dali::Toolkit;
30
31 namespace
32 {
33 typedef NinePatchImage::StretchRanges StretchRanges;
34
35 const char* TEST_NPATCH_FILE_NAME =  TEST_RESOURCE_DIR  "/demo-tile-texture-focused.9.png";
36 const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
37 const char* TEST_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube.obj";
38 const char* TEST_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal.mtl";
39 const char* TEST_SIMPLE_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube-Points-Only.obj";
40 const char* TEST_SIMPLE_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal-Simple.mtl";
41 const char* TEST_AUX_IMAGE = TEST_RESOURCE_DIR "/folder_appicon_empty_bg.png";
42
43 // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame
44 const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif";
45
46 // resolution: 34*34, pixel format: RGBA8888
47 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png";
48
49
50 Property::Map DefaultTransform()
51 {
52   Property::Map transformMap;
53   transformMap
54     .Add( Toolkit::Visual::Transform::Property::OFFSET, Vector2(0.0f, 0.0f) )
55     .Add( Toolkit::Visual::Transform::Property::SIZE, Vector2(1.0f, 1.0f) )
56     .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::CENTER )
57     .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::CENTER )
58     .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, Vector2( Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE ) )
59     .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, Vector2( Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE ) );
60   return transformMap;
61 }
62
63 Integration::Bitmap* CreateBitmap( unsigned int imageWidth, unsigned int imageHeight, unsigned int initialColor, Pixel::Format pixelFormat )
64 {
65   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
66   Integration::PixelBuffer* pixbuffer = bitmap->GetPackedPixelsProfile()->ReserveBuffer( pixelFormat, imageWidth, imageHeight, imageWidth, imageHeight );
67   unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat );
68
69   memset( pixbuffer, initialColor, imageHeight * imageWidth * bytesPerPixel );
70
71   return bitmap;
72 }
73
74 void InitialiseRegionsToZeroAlpha( Integration::Bitmap* image, unsigned int imageWidth, unsigned int imageHeight, Pixel::Format pixelFormat )
75 {
76   PixelBuffer* pixbuffer = image->GetBuffer();
77   unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat );
78
79   for( unsigned int row = 0; row < imageWidth; ++row )
80   {
81     unsigned int pixelOffset = row * bytesPerPixel;
82     pixbuffer[ pixelOffset + 3 ] = 0x00;
83     pixelOffset += ( imageHeight - 1 ) * imageWidth * bytesPerPixel;
84     pixbuffer[ pixelOffset + 3 ] = 0x00;
85   }
86
87   for ( unsigned int column = 0; column < imageHeight; ++column )
88   {
89     unsigned int pixelOffset = column * imageWidth * bytesPerPixel;
90     pixbuffer[ pixelOffset + 3 ] = 0x00;
91     pixelOffset += ( imageWidth -1 ) * bytesPerPixel;
92     pixbuffer[ pixelOffset + 3 ] = 0x00;
93   }
94 }
95
96 void AddStretchRegionsToImage( Integration::Bitmap* image, unsigned int imageWidth, unsigned int imageHeight, const StretchRanges& stretchRangesX, const StretchRanges& stretchRangesY, Pixel::Format pixelFormat )
97 {
98   PixelBuffer* pixbuffer = image->GetBuffer();
99   unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat );
100
101   for(StretchRanges::ConstIterator it = stretchRangesX.Begin(); it != stretchRangesX.End(); ++it)
102   {
103     const Uint16Pair& range = *it;
104     //since the stretch range is in the cropped image space, we need to offset by 1 to get it to the uncropped image space
105     for( unsigned int column = range.GetX() + 1u; column < range.GetY() + 1u; ++column )
106     {
107       unsigned int pixelOffset = column * bytesPerPixel;
108       pixbuffer[ pixelOffset ] = 0x00;
109       pixbuffer[ pixelOffset + 1 ] = 0x00;
110       pixbuffer[ pixelOffset + 2 ] = 0x00;
111       pixbuffer[ pixelOffset + 3 ] = 0xFF;
112     }
113   }
114
115
116   for(StretchRanges::ConstIterator it = stretchRangesY.Begin(); it != stretchRangesY.End(); ++it)
117   {
118     const Uint16Pair& range = *it;
119     //since the stretch range is in the cropped image space, we need to offset by 1 to get it to the uncropped image space
120     for( unsigned int row = range.GetX() + 1u; row < range.GetY() + 1u; ++row )
121     {
122       unsigned int pixelOffset = row * imageWidth * bytesPerPixel;
123       pixbuffer[ pixelOffset ] = 0x00;
124       pixbuffer[ pixelOffset + 1 ] = 0x00;
125       pixbuffer[ pixelOffset + 2 ] = 0x00;
126       pixbuffer[ pixelOffset + 3 ] = 0xFF;
127     }
128   }
129 }
130
131 void AddChildRegionsToImage( Integration::Bitmap* image, unsigned int imageWidth, unsigned int imageHeight, const Vector4& requiredChildRegion, Pixel::Format pixelFormat )
132 {
133   PixelBuffer* pixbuffer = image->GetBuffer();
134   unsigned int bytesPerPixel = GetBytesPerPixel( pixelFormat );
135
136   Integration::Bitmap::PackedPixelsProfile* srcProfile = image->GetPackedPixelsProfile();
137   unsigned int bufferStride = srcProfile->GetBufferStride();
138
139   // Add bottom child region
140   for( unsigned int column = requiredChildRegion.x; column < imageWidth - requiredChildRegion.z; ++column )
141   {
142     unsigned int pixelOffset = column * bytesPerPixel;
143     pixelOffset += ( imageHeight - 1 ) * bufferStride;
144     pixbuffer[ pixelOffset ] = 0x00;
145     pixbuffer[ pixelOffset + 1 ] = 0x00;
146     pixbuffer[ pixelOffset + 2 ] = 0x00;
147     pixbuffer[ pixelOffset + 3 ] = 0xFF;
148   }
149
150   // Add right child region
151   for ( unsigned int row = requiredChildRegion.y; row < imageHeight - requiredChildRegion.w; ++row )
152   {
153     unsigned int pixelOffset = row * bufferStride + ( imageWidth - 1 ) * bytesPerPixel;
154     pixbuffer[ pixelOffset ] = 0x00;
155     pixbuffer[ pixelOffset + 1 ] = 0x00;
156     pixbuffer[ pixelOffset + 2 ] = 0x00;
157     pixbuffer[ pixelOffset + 3 ] = 0xFF;
158   }
159 }
160
161 Integration::ResourcePointer CustomizeNinePatch( TestApplication& application,
162                                                  unsigned int ninePatchImageWidth,
163                                                  unsigned int ninePatchImageHeight,
164                                                  const StretchRanges& stretchRangesX,
165                                                  const StretchRanges& stretchRangesY,
166                                                  bool addChildRegion = false,
167                                                  Vector4 requiredChildRegion = Vector4::ZERO )
168 {
169   TestPlatformAbstraction& platform = application.GetPlatform();
170
171   Pixel::Format pixelFormat = Pixel::RGBA8888;
172
173   tet_infoline("Create Bitmap");
174   platform.SetClosestImageSize(Vector2( ninePatchImageWidth, ninePatchImageHeight));
175   Integration::Bitmap* bitmap = CreateBitmap( ninePatchImageWidth, ninePatchImageHeight, 0xFF, pixelFormat );
176
177   tet_infoline("Clear border regions");
178   InitialiseRegionsToZeroAlpha( bitmap, ninePatchImageWidth, ninePatchImageHeight, pixelFormat );
179
180   tet_infoline("Add Stretch regions to Bitmap");
181   AddStretchRegionsToImage( bitmap, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY, pixelFormat );
182
183   if( addChildRegion )
184   {
185     tet_infoline("Add Child regions to Bitmap");
186     AddChildRegionsToImage( bitmap, ninePatchImageWidth, ninePatchImageHeight, requiredChildRegion, pixelFormat );
187   }
188
189   tet_infoline("Getting resource");
190   Integration::ResourcePointer resourcePtr(bitmap);
191   //platform.SetResourceLoaded( 0, Dali::Integration::ResourceBitmap, resourcePtr );
192   platform.SetSynchronouslyLoadedResource( resourcePtr);
193
194   return resourcePtr;
195 }
196
197 void TestVisualRender( ToolkitTestApplication& application,
198                        DummyControl& actor,
199                        Visual::Base& visual,
200                        std::size_t expectedSamplers = 0,
201                        ImageDimensions imageDimensions = ImageDimensions(),
202                        Integration::ResourcePointer resourcePtr = Integration::ResourcePointer())
203 {
204   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
205   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
206
207   if( resourcePtr )
208   {
209     // set the image size, for test case, this needs to be set before loading started
210     application.GetPlatform().SetClosestImageSize(  Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) );
211   }
212
213   actor.SetSize( 200.f, 200.f );
214   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
215
216   Stage::GetCurrent().Add( actor );
217
218   application.SendNotification();
219   application.Render();
220
221   application.Render();
222   application.SendNotification();
223
224   if( resourcePtr )
225   {
226     DALI_TEST_EQUALS( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceSynchronouslyFunc ), true, TEST_LOCATION);
227   }
228
229   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
230
231 }
232
233 } // namespace
234
235
236 void dali_visual_factory_startup(void)
237 {
238   test_return_value = TET_UNDEF;
239 }
240
241 void dali_visual_factory_cleanup(void)
242 {
243   test_return_value = TET_PASS;
244 }
245
246 int UtcDaliVisualFactoryGet(void)
247 {
248   ToolkitTestApplication application;
249   tet_infoline( "UtcDaliVisualFactory" );
250
251   //Register type
252   TypeInfo type;
253   type = TypeRegistry::Get().GetTypeInfo( "VisualFactory" );
254   DALI_TEST_CHECK( type );
255   BaseHandle handle = type.CreateInstance();
256   DALI_TEST_CHECK( handle );
257
258   VisualFactory factory;
259   factory = VisualFactory::Get();
260   DALI_TEST_CHECK( factory );
261
262   VisualFactory newFactory = VisualFactory::Get();
263   DALI_TEST_CHECK( newFactory );
264
265   // Check that visual factory is a singleton
266   DALI_TEST_CHECK(factory == newFactory);
267
268   END_TEST;
269 }
270
271 int UtcDaliVisualFactoryCopyAndAssignment(void)
272 {
273   ToolkitTestApplication application;
274   tet_infoline( "UtcDaliVisualFactoryCopyAndAssignment" );
275   VisualFactory factory = VisualFactory::Get();
276
277   VisualFactory factoryCopy( factory );
278   DALI_TEST_CHECK(factory == factoryCopy);
279
280   VisualFactory emptyFactory;
281   VisualFactory emptyFactoryCopy( emptyFactory );
282   DALI_TEST_CHECK(emptyFactory == emptyFactoryCopy);
283
284   VisualFactory factoryEquals;
285   factoryEquals = factory;
286   DALI_TEST_CHECK(factory == factoryEquals);
287
288   VisualFactory emptyFactoryEquals;
289   emptyFactoryEquals = emptyFactory;
290   DALI_TEST_CHECK( emptyFactory == emptyFactoryEquals );
291
292   //self assignment
293   factory = factory;
294   DALI_TEST_CHECK( factory = factoryCopy );
295
296   END_TEST;
297 }
298
299 int UtcDaliVisualFactoryGetColorVisual1(void)
300 {
301   ToolkitTestApplication application;
302   tet_infoline( "UtcDaliVisualFactoryGetColorVisual1:  Request color visual with a Property::Map" );
303
304   VisualFactory factory = VisualFactory::Get();
305   DALI_TEST_CHECK( factory );
306
307   Property::Map propertyMap;
308   Vector4 testColor( 1.f, 0.5f, 0.3f, 0.2f );
309   propertyMap.Insert(Visual::Property::TYPE,  Visual::COLOR);
310   propertyMap.Insert(ColorVisual::Property::MIX_COLOR,  testColor);
311
312   Visual::Base visual = factory.CreateVisual(propertyMap);
313   DALI_TEST_CHECK( visual );
314
315   DummyControl actor = DummyControl::New(true);
316   TestVisualRender( application, actor, visual );
317
318   Vector3 actualValue(Vector4::ZERO);
319   Vector4 actualColor(Vector4::ZERO);
320   TestGlAbstraction& gl = application.GetGlAbstraction();
321   DALI_TEST_CHECK( gl.GetUniformValue<Vector3>( "mixColor", actualValue ) );
322   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uColor", actualColor ) );
323   DALI_TEST_EQUALS( actualValue, Vector3(testColor), TEST_LOCATION );
324   DALI_TEST_EQUALS( actualColor.a, testColor.a, TEST_LOCATION );
325
326   END_TEST;
327 }
328
329 int UtcDaliVisualFactoryGetColorVisual2(void)
330 {
331   ToolkitTestApplication application;
332   tet_infoline( "UtcDaliVisualFactoryGetColorVisual2: Request color visual with a Vector4" );
333
334   VisualFactory factory = VisualFactory::Get();
335   DALI_TEST_CHECK( factory );
336
337   Vector4 testColor( 1.f, 0.5f, 0.3f, 0.2f );
338   Dali::Property::Map map;
339   map[ Toolkit::Visual::Property::TYPE ] = Visual::COLOR;
340   map[ ColorVisual::Property::MIX_COLOR ] = testColor;
341   Visual::Base visual = factory.CreateVisual( map );
342   DALI_TEST_CHECK( visual );
343
344   DummyControl actor = DummyControl::New(true);
345   TestVisualRender( application, actor, visual );
346
347   Vector3 actualValue;
348   Vector4 actualColor;
349   TestGlAbstraction& gl = application.GetGlAbstraction();
350   DALI_TEST_CHECK( gl.GetUniformValue<Vector3>( "mixColor", actualValue ) );
351   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uColor", actualColor ) );
352   DALI_TEST_EQUALS( actualValue, Vector3(testColor), TEST_LOCATION );
353   DALI_TEST_EQUALS( actualColor.a, testColor.a, TEST_LOCATION );
354
355   Stage::GetCurrent().Remove(actor);
356   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
357
358   END_TEST;
359 }
360
361 int UtcDaliVisualFactoryGetBorderVisual1(void)
362 {
363   ToolkitTestApplication application;
364   tet_infoline( "UtcDaliVisualFactoryGetBorderVisual1:  Request border visual with a Property::Map" );
365
366   VisualFactory factory = VisualFactory::Get();
367   DALI_TEST_CHECK( factory );
368
369   Property::Map propertyMap;
370   Vector4 testColor( 1.f, 0.5f, 0.3f, 0.2f );
371   float testSize = 5.f;
372   propertyMap.Insert(Visual::Property::TYPE,  Visual::BORDER);
373   propertyMap.Insert(BorderVisual::Property::COLOR,  testColor);
374   propertyMap.Insert(BorderVisual::Property::SIZE,  testSize);
375
376   Visual::Base visual = factory.CreateVisual(propertyMap);
377   DALI_TEST_CHECK( visual );
378
379   DummyControl actor = DummyControl::New(true);
380   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
381   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
382   actor.SetSize(200.f, 200.f);
383   Stage::GetCurrent().Add( actor );
384   visual.SetTransformAndSize(DefaultTransform(), Vector2(200.f, 200.f));
385
386   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
387   int blendMode = actor.GetRendererAt(0u).GetProperty<int>( Renderer::Property::BLEND_MODE );
388   DALI_TEST_EQUALS( static_cast<BlendMode::Type>(blendMode), BlendMode::ON, TEST_LOCATION );
389
390   TestGlAbstraction& gl = application.GetGlAbstraction();
391
392   application.SendNotification();
393   application.Render(0);
394
395   Vector4 actualColor(Vector4::ZERO);
396   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "borderColor", actualColor ) );
397   DALI_TEST_EQUALS( actualColor, testColor, TEST_LOCATION );
398
399   float actualSize = 0.f;
400   DALI_TEST_CHECK( gl.GetUniformValue<float>( "borderSize", actualSize ) );
401   DALI_TEST_EQUALS( actualSize, testSize, TEST_LOCATION );
402
403   actor.Unparent();
404   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
405
406   END_TEST;
407 }
408
409 int UtcDaliVisualFactoryGetBorderVisual2(void)
410 {
411   ToolkitTestApplication application;
412   tet_infoline( "UtcDaliVisualFactoryGetBorderVisual2:  Request border visual with a borderSize and a borderColor" );
413
414   VisualFactory factory = VisualFactory::Get();
415   DALI_TEST_CHECK( factory );
416
417   Vector4 testColor( 1.f, 0.5f, 0.3f, 1.f );
418   float testSize = 5.f;
419
420   Dali::Property::Map propertyMap;
421   propertyMap[ Toolkit::Visual::Property::TYPE ] = Visual::BORDER;
422   propertyMap[ BorderVisual::Property::COLOR  ] = testColor;
423   propertyMap[ BorderVisual::Property::SIZE   ] = testSize;
424   Visual::Base visual = factory.CreateVisual( propertyMap );
425   DALI_TEST_CHECK( visual );
426
427   DummyControl actor = DummyControl::New(true);
428   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
429   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
430   actor.SetSize(200.f, 200.f);
431   Stage::GetCurrent().Add( actor );
432   visual.SetTransformAndSize(DefaultTransform(), Vector2(200.f, 200.f));
433
434   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
435
436   TestGlAbstraction& gl = application.GetGlAbstraction();
437
438   application.SendNotification();
439   application.Render(0);
440
441   int blendMode = actor.GetRendererAt(0u).GetProperty<int>( Renderer::Property::BLEND_MODE );
442   DALI_TEST_EQUALS( static_cast<BlendMode::Type>(blendMode), BlendMode::AUTO, TEST_LOCATION );
443
444   Vector4 actualColor(Vector4::ZERO);
445   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "borderColor", actualColor ) );
446   DALI_TEST_EQUALS( actualColor, testColor, TEST_LOCATION );
447
448   float actualSize = 0.f;
449   DALI_TEST_CHECK( gl.GetUniformValue<float>( "borderSize", actualSize ) );
450   DALI_TEST_EQUALS( actualSize, testSize, TEST_LOCATION );
451
452   actor.Unparent();
453
454   // enable the anti-aliasing
455   Dali::Property::Map map;
456   map[ Toolkit::Visual::Property::TYPE ] = Visual::BORDER;
457   map[ BorderVisual::Property::COLOR  ] = testColor;
458   map[ BorderVisual::Property::SIZE   ] = testSize;
459   map[ BorderVisual::Property::ANTI_ALIASING   ] = true;
460   visual = factory.CreateVisual( map );
461
462   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
463   Stage::GetCurrent().Add( actor );
464
465   blendMode = actor.GetRendererAt(0u).GetProperty<int>( Renderer::Property::BLEND_MODE );
466   DALI_TEST_EQUALS( static_cast<BlendMode::Type>(blendMode), BlendMode::ON, TEST_LOCATION );
467
468   END_TEST;
469 }
470
471 int UtcDaliVisualFactoryGetLinearGradientVisual(void)
472 {
473   ToolkitTestApplication application;
474   tet_infoline("UtcDaliVisualFactoryGetRadialGradientVisual");
475
476   VisualFactory factory = VisualFactory::Get();
477   DALI_TEST_CHECK( factory );
478
479   Property::Map propertyMap;
480   propertyMap.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
481
482   Vector2 start(-1.f, -1.f);
483   Vector2 end(1.f, 1.f);
484   propertyMap.Insert(GradientVisual::Property::START_POSITION, start);
485   propertyMap.Insert(GradientVisual::Property::END_POSITION, end);
486   propertyMap.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT);
487
488   Property::Array stopOffsets;
489   stopOffsets.PushBack( 0.2f );
490   stopOffsets.PushBack( 0.8f );
491   propertyMap.Insert(GradientVisual::Property::STOP_OFFSET, stopOffsets);
492
493   Property::Array stopColors;
494   stopColors.PushBack( Color::RED );
495   stopColors.PushBack( Color::GREEN );
496   propertyMap.Insert(GradientVisual::Property::STOP_COLOR, stopColors);
497
498   Visual::Base visual = factory.CreateVisual(propertyMap);
499   DALI_TEST_CHECK( visual );
500
501   // A lookup texture is generated and pass to shader as sampler
502   DummyControl actor = DummyControl::New(true);
503   TestVisualRender( application, actor, visual, 1u);
504
505   END_TEST;
506 }
507
508 int UtcDaliVisualFactoryGetRadialGradientVisual(void)
509 {
510   ToolkitTestApplication application;
511   tet_infoline("UtcDaliVisualFactoryGetRadialGradientVisual");
512
513   VisualFactory factory = VisualFactory::Get();
514   DALI_TEST_CHECK( factory );
515
516   Property::Map propertyMap;
517   propertyMap.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
518
519   Vector2 center(100.f, 100.f);
520   float radius = 100.f;
521   propertyMap.Insert(GradientVisual::Property::UNITS,  GradientVisual::Units::USER_SPACE);
522   propertyMap.Insert(GradientVisual::Property::CENTER,  center);
523   propertyMap.Insert(GradientVisual::Property::RADIUS,  radius);
524
525   Property::Array stopOffsets;
526   stopOffsets.PushBack( 0.0f );
527   stopOffsets.PushBack( 1.f );
528   propertyMap.Insert(GradientVisual::Property::STOP_OFFSET,   stopOffsets);
529
530   Property::Array stopColors;
531   stopColors.PushBack( Color::RED );
532   stopColors.PushBack( Color::GREEN );
533   propertyMap.Insert(GradientVisual::Property::STOP_COLOR,   stopColors);
534
535   Visual::Base visual = factory.CreateVisual(propertyMap);
536   DALI_TEST_CHECK( visual );
537
538   // A lookup texture is generated and pass to shader as sampler
539   DummyControl actor = DummyControl::New(true);
540   TestVisualRender( application, actor, visual, 1u );
541
542   Matrix3 alignMatrix( radius, 0.f, 0.f, 0.f, radius, 0.f, center.x, center.y, 1.f );
543   alignMatrix.Invert();
544
545   Matrix3 actualValue( Matrix3::IDENTITY );
546   TestGlAbstraction& gl = application.GetGlAbstraction();
547   DALI_TEST_CHECK( gl.GetUniformValue<Matrix3>( "uAlignmentMatrix", actualValue ) );
548   DALI_TEST_EQUALS( actualValue, alignMatrix, Math::MACHINE_EPSILON_100, TEST_LOCATION );
549
550   END_TEST;
551 }
552
553 int UtcDaliVisualFactoryDefaultOffsetsGradientVisual(void)
554 {
555   ToolkitTestApplication application;
556   tet_infoline("UtcDaliVisualFactoryGetRadialGradientVisual");
557
558   VisualFactory factory = VisualFactory::Get();
559   DALI_TEST_CHECK( factory );
560
561   Property::Map propertyMap;
562   propertyMap.Insert(Visual::Property::TYPE,  Visual::GRADIENT);
563
564   Vector2 start(-1.f, -1.f);
565   Vector2 end(1.f, 1.f);
566   propertyMap.Insert(GradientVisual::Property::START_POSITION, start);
567   propertyMap.Insert(GradientVisual::Property::END_POSITION, end);
568   propertyMap.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT);
569
570   Property::Array stopColors;
571   stopColors.PushBack( Color::RED );
572   stopColors.PushBack( Color::GREEN );
573   propertyMap.Insert(GradientVisual::Property::STOP_COLOR, stopColors);
574
575   Visual::Base visual = factory.CreateVisual(propertyMap);
576   DALI_TEST_CHECK( visual );
577
578   // A lookup texture is generated and pass to shader as sampler
579   DummyControl actor = DummyControl::New(true);
580   TestVisualRender( application, actor, visual, 1u );
581
582   Stage::GetCurrent().Remove( actor );
583   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
584
585   END_TEST;
586 }
587
588
589
590
591
592 int UtcDaliVisualFactoryGetNPatchVisual1(void)
593 {
594   ToolkitTestApplication application;
595   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual1: Request 9-patch visual with a Property::Map" );
596
597   VisualFactory factory = VisualFactory::Get();
598   DALI_TEST_CHECK( factory );
599
600   const unsigned int ninePatchImageHeight = 18;
601   const unsigned int ninePatchImageWidth = 28;
602   StretchRanges stretchRangesX;
603   stretchRangesX.PushBack( Uint16Pair( 2, 3 ) );
604   StretchRanges stretchRangesY;
605   stretchRangesY.PushBack( Uint16Pair( 4, 5 ) );
606   Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY );
607
608   Property::Map propertyMap;
609   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
610   propertyMap.Insert( ImageVisual::Property::URL,  TEST_NPATCH_FILE_NAME );
611   {
612     tet_infoline( "whole grid" );
613     Visual::Base visual = factory.CreateVisual( propertyMap );
614     DALI_TEST_CHECK( visual );
615
616
617     TestGlAbstraction& gl = application.GetGlAbstraction();
618     TraceCallStack& textureTrace = gl.GetTextureTrace();
619     textureTrace.Enable(true);
620
621     DummyControl actor = DummyControl::New(true);
622     TestVisualRender( application, actor, visual, 1u,
623                       ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
624                       ninePatchResource );
625
626     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
627   }
628
629   propertyMap.Insert( ImageVisual::Property::BORDER_ONLY,  true );
630   {
631     tet_infoline( "border only" );
632     Visual::Base visual = factory.CreateVisual( propertyMap );
633     DALI_TEST_CHECK( visual );
634
635     TestGlAbstraction& gl = application.GetGlAbstraction();
636     TraceCallStack& textureTrace = gl.GetTextureTrace();
637     textureTrace.Enable(true);
638
639     DummyControl actor = DummyControl::New(true);
640     TestVisualRender( application, actor, visual, 1u,
641                       ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
642                       ninePatchResource );
643
644     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
645   }
646
647   END_TEST;
648 }
649
650 int UtcDaliVisualFactoryGetNPatchVisual2(void)
651 {
652   ToolkitTestApplication application;
653   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual1: Request 9-patch visual with a Property::Map including border" );
654
655   VisualFactory factory = VisualFactory::Get();
656   DALI_TEST_CHECK( factory );
657
658   Property::Map propertyMap;
659   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
660   propertyMap.Insert( ImageVisual::Property::URL, gImage_34_RGBA );
661   propertyMap.Insert( ImageVisual::Property::BORDER, Rect< int >( 2, 2, 2, 2 ) );
662   {
663     tet_infoline( "whole grid" );
664     Visual::Base visual = factory.CreateVisual( propertyMap );
665     DALI_TEST_CHECK( visual );
666
667     TestGlAbstraction& gl = application.GetGlAbstraction();
668     TraceCallStack& textureTrace = gl.GetTextureTrace();
669     textureTrace.Enable(true);
670
671     DummyControl actor = DummyControl::New(true);
672     TestVisualRender( application, actor, visual, 1u );
673
674     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
675   }
676
677   propertyMap.Insert( ImageVisual::Property::BORDER_ONLY,  true );
678   {
679     tet_infoline( "border only" );
680     Visual::Base visual = factory.CreateVisual( propertyMap );
681     DALI_TEST_CHECK( visual );
682
683     TestGlAbstraction& gl = application.GetGlAbstraction();
684     TraceCallStack& textureTrace = gl.GetTextureTrace();
685     textureTrace.Enable(true);
686
687     DummyControl actor = DummyControl::New(true);
688     TestVisualRender( application, actor, visual, 1u );
689
690     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
691   }
692
693   propertyMap.Clear();
694   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
695   propertyMap.Insert( ImageVisual::Property::URL, gImage_34_RGBA );
696   propertyMap.Insert( ImageVisual::Property::BORDER, Rect< int >( 1, 1, 1, 1 ) );
697   {
698     tet_infoline( "whole grid" );
699     Visual::Base visual = factory.CreateVisual( propertyMap );
700     DALI_TEST_CHECK( visual );
701
702     TestGlAbstraction& gl = application.GetGlAbstraction();
703     TraceCallStack& textureTrace = gl.GetTextureTrace();
704     textureTrace.Enable(true);
705
706     DummyControl actor = DummyControl::New(true);
707     TestVisualRender( application, actor, visual, 1u );
708
709     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
710   }
711
712   END_TEST;
713 }
714
715 int UtcDaliVisualFactoryGetNPatchVisual3(void)
716 {
717   ToolkitTestApplication application;
718   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual2: Request n-patch visual with a Property::Map" );
719
720   VisualFactory factory = VisualFactory::Get();
721   DALI_TEST_CHECK( factory );
722
723   const unsigned int ninePatchImageWidth = 18;
724   const unsigned int ninePatchImageHeight = 28;
725   StretchRanges stretchRangesX;
726   stretchRangesX.PushBack( Uint16Pair( 2, 3 ) );
727   stretchRangesX.PushBack( Uint16Pair( 5, 7 ) );
728   stretchRangesX.PushBack( Uint16Pair( 12, 15 ) );
729   StretchRanges stretchRangesY;
730   stretchRangesY.PushBack( Uint16Pair( 4, 5 ) );
731   stretchRangesY.PushBack( Uint16Pair( 8, 12 ) );
732   stretchRangesY.PushBack( Uint16Pair( 15, 16 ) );
733   stretchRangesY.PushBack( Uint16Pair( 25, 27 ) );
734   Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY );
735
736   Property::Map propertyMap;
737   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
738   propertyMap.Insert( ImageVisual::Property::URL,  TEST_NPATCH_FILE_NAME );
739   {
740     Visual::Base visual = factory.CreateVisual( propertyMap );
741     DALI_TEST_CHECK( visual );
742
743     TestGlAbstraction& gl = application.GetGlAbstraction();
744     TraceCallStack& textureTrace = gl.GetTextureTrace();
745     textureTrace.Enable(true);
746
747     DummyControl actor = DummyControl::New(true);
748     TestVisualRender( application, actor, visual, 1u,
749                       ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
750                       ninePatchResource );
751
752     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
753
754     Stage::GetCurrent().Remove( actor );
755     DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
756   }
757
758   propertyMap.Insert( ImageVisual::Property::BORDER_ONLY,  true );
759   {
760     tet_infoline( "border only" );
761     Visual::Base visual = factory.CreateVisual( propertyMap );
762     DALI_TEST_CHECK( visual );
763
764     TestGlAbstraction& gl = application.GetGlAbstraction();
765     TraceCallStack& textureTrace = gl.GetTextureTrace();
766     textureTrace.Enable(true);
767     DummyControl actor = DummyControl::New(true);
768     TestVisualRender( application, actor, visual, 1u,
769                       ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
770                       ninePatchResource );
771
772
773     DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
774
775     Stage::GetCurrent().Remove( actor );
776     DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
777   }
778
779   END_TEST;
780 }
781
782 int UtcDaliVisualFactoryGetNPatchVisual4(void)
783 {
784   ToolkitTestApplication application;
785   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual3: Request 9-patch visual with an image url" );
786
787   VisualFactory factory = VisualFactory::Get();
788   DALI_TEST_CHECK( factory );
789
790   const unsigned int ninePatchImageHeight = 18;
791   const unsigned int ninePatchImageWidth = 28;
792   StretchRanges stretchRangesX;
793   stretchRangesX.PushBack( Uint16Pair( 2, 3 ) );
794   StretchRanges stretchRangesY;
795   stretchRangesY.PushBack( Uint16Pair( 4, 5 ) );
796   Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application, ninePatchImageWidth, ninePatchImageHeight, stretchRangesX, stretchRangesY );
797
798   Visual::Base visual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() );
799   DALI_TEST_CHECK( visual );
800
801   TestGlAbstraction& gl = application.GetGlAbstraction();
802   TraceCallStack& textureTrace = gl.GetTextureTrace();
803   textureTrace.Enable(true);
804
805   DummyControl actor = DummyControl::New(true);
806   TestVisualRender( application, actor, visual, 1u,
807                     ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
808                     ninePatchResource );
809
810   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
811
812
813   ResourceImage image = ResourceImage::New(TEST_NPATCH_FILE_NAME);
814   Visual::Base nPatchVisual = factory.CreateVisual( image );
815   Vector2 controlSize( 20.f, 30.f ), naturalSize(0,0);
816   nPatchVisual.SetTransformAndSize(DefaultTransform(), controlSize );
817   nPatchVisual.GetNaturalSize( naturalSize );
818   DALI_TEST_EQUALS( naturalSize, Vector2( ninePatchImageWidth-2, ninePatchImageHeight-2 ), TEST_LOCATION );
819
820   END_TEST;
821 }
822
823 int UtcDaliVisualFactoryGetNPatchVisual5(void)
824 {
825   ToolkitTestApplication application;
826   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual4: Request n-patch visual with an image url" );
827
828   VisualFactory factory = VisualFactory::Get();
829   DALI_TEST_CHECK( factory );
830
831   const unsigned int ninePatchImageHeight = 18;
832   const unsigned int ninePatchImageWidth = 28;
833   StretchRanges stretchRangesX;
834   stretchRangesX.PushBack( Uint16Pair( 2, 3 ) );
835   stretchRangesX.PushBack( Uint16Pair( 5, 7 ) );
836   stretchRangesX.PushBack( Uint16Pair( 12, 15 ) );
837   StretchRanges stretchRangesY;
838   stretchRangesY.PushBack( Uint16Pair( 4, 5 ) );
839   stretchRangesY.PushBack( Uint16Pair( 8, 12 ) );
840   stretchRangesY.PushBack( Uint16Pair( 15, 16 ) );
841   stretchRangesY.PushBack( Uint16Pair( 25, 27 ) );
842   Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application,
843                                                                        ninePatchImageWidth,
844                                                                        ninePatchImageHeight,
845                                                                        stretchRangesX,
846                                                                        stretchRangesY );
847
848   Visual::Base visual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() );
849   DALI_TEST_CHECK( visual );
850
851   TestGlAbstraction& gl = application.GetGlAbstraction();
852   TraceCallStack& textureTrace = gl.GetTextureTrace();
853   textureTrace.Enable(true);
854
855   DummyControl actor = DummyControl::New(true);
856   TestVisualRender( application, actor, visual, 1u,
857                     ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
858                     ninePatchResource );
859
860   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
861
862   END_TEST;
863 }
864
865
866 int UtcDaliNPatchVisualAuxiliaryImage(void)
867 {
868   ToolkitTestApplication application;
869   tet_infoline( "NPatchVisual with aux image" );
870
871   VisualFactory factory = VisualFactory::Get();
872   Property::Map properties;
873   Property::Map shader;
874
875   Property::Map transformMap;
876   transformMap["size"] = Vector2( 0.5f, 0.5f ) ;
877   transformMap["offset"] = Vector2( 20.0f, 0.0f ) ;
878   transformMap["offsetPolicy"] = Vector2( Visual::Transform::Policy::ABSOLUTE, Visual::Transform::Policy::ABSOLUTE );
879   transformMap["anchorPoint"] = Align::CENTER;
880   transformMap["origin"] = Align::CENTER;
881   properties[Visual::Property::TRANSFORM] = transformMap;
882
883   properties[Visual::Property::TYPE] = Visual::IMAGE;
884   properties[Visual::Property::MIX_COLOR] = Color::BLUE;
885   properties[Visual::Property::SHADER]=shader;
886   properties[ImageVisual::Property::URL] = TEST_NPATCH_FILE_NAME;
887   properties[DevelImageVisual::Property::AUXILIARY_IMAGE] = TEST_AUX_IMAGE;
888   properties[DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA] = 0.9f;
889
890   const unsigned int ninePatchImageWidth =  256;
891   const unsigned int ninePatchImageHeight = 256;
892   StretchRanges stretchRangesX;
893   stretchRangesX.PushBack( Uint16Pair( 10, 246 ) );
894   StretchRanges stretchRangesY;
895   stretchRangesY.PushBack( Uint16Pair( 15, 241 ) );
896   Integration::ResourcePointer ninePatchResource = CustomizeNinePatch( application,
897                                                                        ninePatchImageWidth,
898                                                                        ninePatchImageHeight,
899                                                                        stretchRangesX,
900                                                                        stretchRangesY );
901
902   Visual::Base visual = factory.CreateVisual( properties );
903
904   // trigger creation through setting on stage
905   DummyControl dummy = DummyControl::New(true);
906   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummy.GetImplementation());
907   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
908   dummyImpl.SetLayout( DummyControl::Property::TEST_VISUAL, transformMap );
909   dummy.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
910   dummy.SetParentOrigin(ParentOrigin::CENTER);
911   Stage::GetCurrent().Add(dummy);
912   application.SendNotification();
913   application.Render();
914
915   Renderer renderer = dummy.GetRendererAt( 0 );
916   auto textures = renderer.GetTextures();
917   DALI_TEST_EQUALS( textures.GetTextureCount(), 2, TEST_LOCATION );
918
919
920   END_TEST;
921 }
922
923
924 int UtcDaliVisualFactoryGetNPatchVisualN1(void)
925 {
926   //This should still load but display an error image
927
928   ToolkitTestApplication application;
929   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisualN: Request n-patch visual with an invalid image url" );
930
931   VisualFactory factory = VisualFactory::Get();
932   DALI_TEST_CHECK( factory );
933
934   Visual::Base visual = factory.CreateVisual( "ERROR.9.jpg", ImageDimensions() );
935   DALI_TEST_CHECK( visual );
936
937   //The testkit still has to load a bitmap for the broken renderer image
938   Integration::Bitmap* bitmap = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD);
939   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 100, 100, 100, 100 );
940
941   TestGlAbstraction& gl = application.GetGlAbstraction();
942   TraceCallStack& textureTrace = gl.GetTextureTrace();
943   textureTrace.Enable(true);
944
945   DummyControl actor = DummyControl::New(true);
946   TestVisualRender( application, actor, visual, 1u,
947                     ImageDimensions(),
948                     Integration::ResourcePointer(bitmap) );
949
950   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
951
952   END_TEST;
953 }
954
955 int UtcDaliVisualFactoryGetNPatchVisualN2(void)
956 {
957   //This should still load but display an error image
958
959   ToolkitTestApplication application;
960   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisualN: Request n-patch visual with an invalid URL" );
961
962   VisualFactory factory = VisualFactory::Get();
963   DALI_TEST_CHECK( factory );
964
965   Property::Map propertyMap;
966   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH );
967   propertyMap.Insert( ImageVisual::Property::URL,  "ERROR.9.jpg" );
968
969   Visual::Base visual = factory.CreateVisual( propertyMap );
970   DALI_TEST_CHECK( visual );
971
972   //The testkit still has to load a bitmap for the broken renderer image
973   Integration::Bitmap* bitmap = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD);
974   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 100, 100, 100, 100 );
975
976   TestGlAbstraction& gl = application.GetGlAbstraction();
977   TraceCallStack& textureTrace = gl.GetTextureTrace();
978   textureTrace.Enable(true);
979   TraceCallStack& drawTrace = gl.GetDrawTrace();
980   drawTrace.Enable(true);
981
982   DummyControl actor = DummyControl::New(true);
983   TestVisualRender( application, actor, visual, 1u,
984                     ImageDimensions(),
985                     Integration::ResourcePointer(bitmap) );
986
987   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
988
989   END_TEST;
990 }
991
992 int UtcDaliVisualFactoryGetNPatchVisualN3(void)
993 {
994   // Passing in an invalid visual type so we should not get a visual
995
996   ToolkitTestApplication application;
997   tet_infoline( "UtcDaliVisualFactoryGetNPatchVisualN: Request n-patch visual with an invalid visual type" );
998
999   VisualFactory factory = VisualFactory::Get();
1000   DALI_TEST_CHECK( factory );
1001
1002   Property::Map propertyMap;
1003   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  111 );
1004   propertyMap.Insert( ImageVisual::Property::URL,  "ERROR.9.jpg" );
1005
1006   Visual::Base visual = factory.CreateVisual( propertyMap );
1007   DALI_TEST_CHECK( !visual );
1008
1009   END_TEST;
1010 }
1011
1012 int UtcDaliVisualFactoryGetSvgVisual(void)
1013 {
1014   ToolkitTestApplication application;
1015   tet_infoline( "UtcDaliVisualFactoryGetSvgVisual: Request svg visual with a svg url" );
1016
1017   VisualFactory factory = VisualFactory::Get();
1018   Visual::Base visual = factory.CreateVisual( TEST_SVG_FILE_NAME, ImageDimensions() );
1019   DALI_TEST_CHECK( visual );
1020
1021   TestGlAbstraction& gl = application.GetGlAbstraction();
1022   TraceCallStack& textureTrace = gl.GetTextureTrace();
1023   textureTrace.Enable(true);
1024
1025   DummyControl actor = DummyControl::New(true);
1026   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1027   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1028   actor.SetSize( 200.f, 200.f );
1029   Stage::GetCurrent().Add( actor );
1030   visual.SetTransformAndSize(DefaultTransform(), Vector2(200.f, 200.f) );
1031
1032   application.SendNotification();
1033   application.Render();
1034
1035   // renderer is not added to actor until the rasterization is completed.
1036   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1037
1038   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1039
1040   // renderer is added to actor
1041   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1042
1043   // waiting for the resource uploading
1044   application.SendNotification();
1045   application.Render();
1046
1047   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1048
1049   END_TEST;
1050 }
1051
1052 int UtcDaliVisualFactoryGetSvgVisualLarge(void)
1053 {
1054   ToolkitTestApplication application;
1055   tet_infoline( "UtcDaliVisualFactoryGetSvgVisual: Request svg visual with a svg url" );
1056
1057   VisualFactory factory = VisualFactory::Get();
1058   Visual::Base visual = factory.CreateVisual( TEST_SVG_FILE_NAME, ImageDimensions( 2000, 2000 ) );
1059   DALI_TEST_CHECK( visual );
1060
1061   TestGlAbstraction& gl = application.GetGlAbstraction();
1062   TraceCallStack& textureTrace = gl.GetTextureTrace();
1063   textureTrace.Enable(true);
1064
1065   DummyControl actor = DummyControl::New(true);
1066   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1067   actor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); // Only rasterizes when it knows control size.
1068   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1069   Stage::GetCurrent().Add( actor );
1070
1071   application.SendNotification();
1072   application.Render();
1073
1074   // renderer is not added to actor until the rasterization is completed.
1075   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1076
1077   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1078
1079   // renderer is added to actor
1080   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1081
1082   // waiting for the resource uploading
1083   application.SendNotification();
1084   application.Render();
1085
1086   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1087
1088   END_TEST;
1089 }
1090
1091 int UtcDaliVisualFactoryGetSvgVisualAtlas(void)
1092 {
1093   ToolkitTestApplication application;
1094   tet_infoline( "UtcDaliVisualFactoryGetSvgVisual: Request svg visual with enabled atlas" );
1095
1096   VisualFactory factory = VisualFactory::Get();
1097
1098   Property::Map propertyMap;
1099   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::SVG );
1100   propertyMap.Insert( ImageVisual::Property::URL, TEST_SVG_FILE_NAME );
1101   propertyMap.Insert( ImageVisual::Property::ATLASING, true );
1102
1103   Visual::Base visual = factory.CreateVisual( propertyMap );
1104   DALI_TEST_CHECK( visual );
1105
1106   TestGlAbstraction& gl = application.GetGlAbstraction();
1107   TraceCallStack& textureTrace = gl.GetTextureTrace();
1108   textureTrace.Enable(true);
1109
1110   DummyControl actor = DummyControl::New(true);
1111   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1112   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1113   actor.SetSize( 200.f, 200.f );
1114   Stage::GetCurrent().Add( actor );
1115   visual.SetTransformAndSize(DefaultTransform(), Vector2(200.f, 200.f) );
1116
1117   application.SendNotification();
1118   application.Render();
1119
1120   // renderer is not added to actor until the rasterization is completed.
1121   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1122
1123   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1124
1125   // renderer is added to actor
1126   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1127
1128   // waiting for the resource uploading
1129   application.SendNotification();
1130   application.Render();
1131
1132   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1133
1134   END_TEST;
1135 }
1136
1137 //Creates a mesh visual from the given propertyMap and tries to load it on stage in the given application.
1138 //This is expected to succeed, which will then pass the test.
1139 void MeshVisualLoadsCorrectlyTest( Property::Map& propertyMap, ToolkitTestApplication& application )
1140 {
1141   VisualFactory factory = VisualFactory::Get();
1142   DALI_TEST_CHECK( factory );
1143
1144   //Create a mesh visual.
1145   Visual::Base visual = factory.CreateVisual( propertyMap );
1146   DALI_TEST_CHECK( visual );
1147
1148   //Create an actor on stage to house the visual.
1149   DummyControl actor = DummyControl::New(true);
1150   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1151   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1152   actor.SetSize( 200.f, 200.f );
1153   Stage::GetCurrent().Add( actor );
1154   visual.SetTransformAndSize(DefaultTransform(), Vector2( 200.f, 200.f ) );
1155
1156   //Ensure set on stage.
1157   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1158
1159   //Attempt to render to queue resource load requests.
1160   application.SendNotification();
1161   application.Render( 0 );
1162
1163   //Render again to upload the now-loaded textures.
1164   application.SendNotification();
1165   application.Render( 0 );
1166
1167   Matrix testScaleMatrix;
1168   testScaleMatrix.SetIdentityAndScale( Vector3( 1.0, -1.0, 1.0 ) );
1169   Matrix actualScaleMatrix;
1170
1171   //Test to see if the object has been successfully loaded.
1172   DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue<Matrix>( "uObjectMatrix", actualScaleMatrix ) );
1173   DALI_TEST_EQUALS( actualScaleMatrix, testScaleMatrix, Math::MACHINE_EPSILON_100, TEST_LOCATION );
1174
1175   //Finish by setting off stage, and ensuring this was successful.
1176   actor.Unparent();
1177   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1178 }
1179
1180 //Creates a mesh visual from the given propertyMap and tries to load it on stage in the given application.
1181 //This is expected to fail, which will then pass the test.
1182 void MeshVisualDoesNotLoadCorrectlyTest( Property::Map& propertyMap, ToolkitTestApplication& application )
1183 {
1184   VisualFactory factory = VisualFactory::Get();
1185   DALI_TEST_CHECK( factory );
1186
1187   //Create a mesh visual.
1188   Visual::Base visual = factory.CreateVisual( propertyMap );
1189   DALI_TEST_CHECK( visual );
1190
1191   //Create an actor on stage to house the visual.
1192   DummyControl actor = DummyControl::New(true);
1193   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1194   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1195   actor.SetSize( 200.f, 200.f );
1196   Stage::GetCurrent().Add( actor );
1197   visual.SetTransformAndSize(DefaultTransform(),  Vector2( 200.f, 200.f ) );
1198
1199   //Ensure set on stage.
1200   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1201
1202   //Attempt to render to queue resource load requests.
1203   application.SendNotification();
1204   application.Render( 0 );
1205
1206   //Render again to upload the now-loaded textures.
1207   application.SendNotification();
1208   application.Render( 0 );
1209
1210   //Test to see if the object has not been loaded, as expected.
1211   Matrix scaleMatrix;
1212   DALI_TEST_CHECK( !application.GetGlAbstraction().GetUniformValue<Matrix>( "uObjectMatrix", scaleMatrix ) );
1213
1214   //Finish by setting off stage, and ensuring this was successful.
1215   actor.Unparent();
1216   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1217 }
1218
1219 //Test if mesh loads correctly when supplied with only the bare minimum requirements, an object file.
1220 int UtcDaliVisualFactoryGetMeshVisual1(void)
1221 {
1222   //Set up test application first, so everything else can be handled.
1223   ToolkitTestApplication application;
1224
1225   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual1:  Request mesh visual with a valid object file only" );
1226
1227
1228   //Set up visual properties.
1229   Property::Map propertyMap;
1230   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::MESH );
1231   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1232
1233   //Test to see if mesh loads correctly.
1234   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1235
1236   END_TEST;
1237 }
1238
1239
1240 //Test if mesh loads correctly when supplied with an object file as well as a blank material file and images directory.
1241 int UtcDaliVisualFactoryGetMeshVisual2(void)
1242 {
1243   //Set up test application first, so everything else can be handled.
1244   ToolkitTestApplication application;
1245
1246   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual2:  Request mesh visual with blank material file and images directory" );
1247
1248   //Set up visual properties.
1249   Property::Map propertyMap;
1250   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1251   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1252   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, "" );
1253   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, "" );
1254
1255   //Test to see if mesh loads correctly.
1256   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1257
1258   END_TEST;
1259 }
1260
1261 //Test if mesh loads correctly when supplied with all main parameters, an object file, a material file and a directory location, but duff optional parameters
1262 int UtcDaliVisualFactoryGetMeshVisual3b(void)
1263 {
1264   //Set up test application first, so everything else can be handled.
1265   ToolkitTestApplication application;
1266
1267   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual3:  Request mesh visual with all parameters correct" );
1268
1269   //Set up visual properties.
1270   Property::Map propertyMap;
1271   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1272   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1273   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1274   propertyMap.Insert( MeshVisual::Property::USE_MIPMAPPING, Color::GREEN ); // Test that wrong property types don't prevent the object load
1275   propertyMap.Insert( MeshVisual::Property::USE_SOFT_NORMALS, 1.0f );
1276   propertyMap.Insert( MeshVisual::Property::LIGHT_POSITION, 1.0f );
1277   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1278
1279   //Test to see if mesh loads correctly.
1280   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1281
1282   END_TEST;
1283 }
1284
1285 //Test if mesh loads correctly when supplied with all main parameters, an object file, a material file and a directory location.
1286 int UtcDaliVisualFactoryGetMeshVisual3(void)
1287 {
1288   //Set up test application first, so everything else can be handled.
1289   ToolkitTestApplication application;
1290
1291   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual3:  Request mesh visual with all parameters correct" );
1292
1293   //Set up visual properties.
1294   Property::Map propertyMap;
1295   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1296   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1297   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1298   propertyMap.Insert( MeshVisual::Property::USE_MIPMAPPING, false );
1299   propertyMap.Insert( MeshVisual::Property::USE_SOFT_NORMALS, false );
1300   propertyMap.Insert( MeshVisual::Property::LIGHT_POSITION, Vector3::XAXIS );
1301   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1302
1303   //Test to see if mesh loads correctly.
1304   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1305
1306   END_TEST;
1307 }
1308
1309 //Test if mesh visual can load a correctly supplied mesh without a normal map or gloss map in the material file.
1310 int UtcDaliVisualFactoryGetMeshVisual4(void)
1311 {
1312   //Set up test application first, so everything else can be handled.
1313   ToolkitTestApplication application;
1314
1315   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual4:  Request mesh visual with diffuse texture but not normal or gloss." );
1316
1317
1318   //Set up visual properties.
1319   Property::Map propertyMap;
1320   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1321   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1322   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_SIMPLE_MTL_FILE_NAME );
1323   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1324
1325   //Test to see if mesh loads correctly.
1326   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1327
1328   END_TEST;
1329 }
1330
1331 //Test if mesh visual can load when made to use diffuse textures only.
1332 int UtcDaliVisualFactoryGetMeshVisual5(void)
1333 {
1334   //Set up test application first, so everything else can be handled.
1335   ToolkitTestApplication application;
1336
1337   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual5:  Request mesh visual and make it only use diffuse textures." );
1338
1339   //Set up visual properties.
1340   Property::Map propertyMap;
1341   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1342   propertyMap.Insert( "objectUrl", TEST_OBJ_FILE_NAME );
1343   propertyMap.Insert( "materialUrl", TEST_MTL_FILE_NAME );
1344   propertyMap.Insert( "texturesPath", TEST_RESOURCE_DIR "/" );
1345   propertyMap.Insert( "useMipmapping", false );
1346   propertyMap.Insert( "useSoftNormals", false );
1347   propertyMap.Insert( "lightPosition", Vector3::ZAXIS );
1348   propertyMap.Insert( "shadingMode", MeshVisual::ShadingMode::TEXTURED_WITH_SPECULAR_LIGHTING );
1349
1350   //Test to see if mesh loads correctly.
1351   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1352
1353
1354   END_TEST;
1355 }
1356
1357 //Test if mesh visual can load when made to not use the supplied textures.
1358 int UtcDaliVisualFactoryGetMeshVisual6(void)
1359 {
1360   //Set up test application first, so everything else can be handled.
1361   ToolkitTestApplication application;
1362
1363   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual6:  Request mesh visual and make it not use any textures." );
1364
1365   //Set up visual properties.
1366   Property::Map propertyMap;
1367   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1368   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1369   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1370   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1371   propertyMap.Insert( MeshVisual::Property::SHADING_MODE, MeshVisual::ShadingMode::TEXTURELESS_WITH_DIFFUSE_LIGHTING );
1372
1373   //Test to see if mesh loads correctly.
1374   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1375
1376   END_TEST;
1377 }
1378 //Test if mesh visual loads correctly when light position is manually set.
1379 int UtcDaliVisualFactoryGetMeshVisual7(void)
1380 {
1381   //Set up test application first, so everything else can be handled.
1382   ToolkitTestApplication application;
1383
1384
1385   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual7:  Request mesh visual with custom light position." );
1386
1387   //Set up visual properties.
1388   Property::Map propertyMap;
1389   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1390   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1391   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1392   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1393   propertyMap.Insert( MeshVisual::Property::LIGHT_POSITION, Vector3( 0.0, 1.0, 2.0 ) );
1394
1395   //Test to see if mesh loads correctly.
1396   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1397
1398   END_TEST;
1399 }
1400
1401 //Test if mesh visual loads correctly when supplied an object file without face normals or texture points.
1402 //Note that this notably tests object loader functionality.
1403 int UtcDaliVisualFactoryGetMeshVisual8(void)
1404 {
1405   //Set up test application first, so everything else can be handled.
1406   ToolkitTestApplication application;
1407
1408   tet_infoline( "UtcDaliVisualFactoryGetMeshVisual5:  Request mesh visual with normal-less object file." );
1409
1410   //Set up visual properties.
1411   Property::Map propertyMap;
1412   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1413   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_SIMPLE_OBJ_FILE_NAME );
1414   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1415   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1416
1417   //Test to see if mesh loads correctly.
1418   MeshVisualLoadsCorrectlyTest( propertyMap, application );
1419
1420   END_TEST;
1421 }
1422
1423 //Test if mesh visual handles the case of lacking an object file.
1424 int UtcDaliVisualFactoryGetMeshVisualN1(void)
1425 {
1426   //Set up test application first, so everything else can be handled.
1427   ToolkitTestApplication application;
1428
1429   tet_infoline( "UtcDaliVisualFactoryGetMeshVisualN1:  Request mesh visual without object file" );
1430
1431   //Set up visual properties.
1432   Property::Map propertyMap;
1433   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1434   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1435   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1436
1437   //Test to see if mesh doesn't load with these properties, as expected.
1438   MeshVisualDoesNotLoadCorrectlyTest( propertyMap, application );
1439
1440
1441   END_TEST;
1442 }
1443
1444 //Test if mesh visual handles the case of being passed invalid material and images urls.
1445 int UtcDaliVisualFactoryGetMeshVisualN2(void)
1446 {
1447   //Set up test application first, so everything else can be handled.
1448   ToolkitTestApplication application;
1449
1450   tet_infoline( "UtcDaliVisualFactoryGetMeshVisualN2:  Request mesh visual with invalid material and images urls" );
1451
1452   //Set up visual properties.
1453   Property::Map propertyMap;
1454   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1455   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, TEST_OBJ_FILE_NAME );
1456   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, "invalid" );
1457   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, "also invalid" );
1458
1459   //Test to see if mesh doesn't load with these properties, as expected.
1460   MeshVisualDoesNotLoadCorrectlyTest( propertyMap, application );
1461
1462
1463   END_TEST;
1464 }
1465
1466 //Test if mesh visual handles the case of being passed an invalid object url
1467 int UtcDaliVisualFactoryGetMeshVisualN3(void)
1468 {
1469   //Set up test application first, so everything else can be handled.
1470   ToolkitTestApplication application;
1471   tet_infoline( "UtcDaliVisualFactoryGetMeshVisualN3:  Request mesh visual with invalid object url" );
1472
1473
1474   //Set up visual properties.
1475   Property::Map propertyMap;
1476   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::MESH );
1477   propertyMap.Insert( MeshVisual::Property::OBJECT_URL, "invalid" );
1478   propertyMap.Insert( MeshVisual::Property::MATERIAL_URL, TEST_MTL_FILE_NAME );
1479   propertyMap.Insert( MeshVisual::Property::TEXTURES_PATH, TEST_RESOURCE_DIR "/" );
1480
1481   //Test to see if mesh doesn't load with these properties, as expected.
1482   MeshVisualDoesNotLoadCorrectlyTest( propertyMap, application );
1483
1484   END_TEST;
1485 }
1486
1487 //Creates a primitive visual with the given property map and tests to see if it correctly loads in the given application.
1488 void TestPrimitiveVisualWithProperties( Property::Map& propertyMap, ToolkitTestApplication& application )
1489 {
1490   VisualFactory factory = VisualFactory::Get();
1491   DALI_TEST_CHECK( factory );
1492
1493   //Create a primitive visual.
1494   Visual::Base visual = factory.CreateVisual( propertyMap );
1495   DALI_TEST_CHECK( visual );
1496
1497   //Create an actor on stage to house the visual.
1498   DummyControl actor = DummyControl::New(true);
1499   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1500   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1501
1502   actor.SetSize( 200.f, 200.f );
1503   Stage::GetCurrent().Add( actor );
1504   visual.SetTransformAndSize(DefaultTransform(),  Vector2( 200.f, 200.f ) );
1505
1506   //Ensure set on stage.
1507   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1508
1509   //Tell test application to load the visual.
1510   application.SendNotification();
1511   application.Render(0);
1512
1513   Matrix testScaleMatrix;
1514   testScaleMatrix.SetIdentityAndScale( Vector3( 1.0, -1.0, 1.0 ) );
1515   Matrix actualScaleMatrix;
1516
1517   //Test to see if the object has been successfully loaded.
1518   DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue<Matrix>( "uObjectMatrix", actualScaleMatrix ) );
1519   DALI_TEST_EQUALS( actualScaleMatrix, testScaleMatrix, Math::MACHINE_EPSILON_100, TEST_LOCATION );
1520
1521   //Finish by setting off stage, and ensuring this was successful.
1522   actor.Unparent();
1523   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1524 }
1525
1526 //Test if primitive shape loads correctly when supplied with only the bare minimum requirements, the shape to use.
1527 int UtcDaliVisualFactoryGetPrimitiveVisual1(void)
1528 {
1529   //Set up test application first, so everything else can be handled.
1530   ToolkitTestApplication application;
1531
1532   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual1:  Request primitive visual with a shape only" );
1533
1534   //Set up visual properties.
1535   Property::Map propertyMap;
1536   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1537   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::CUBE );
1538
1539   //Test to see if shape loads correctly.
1540   TestPrimitiveVisualWithProperties( propertyMap, application );
1541
1542   END_TEST;
1543 }
1544
1545 //Test if primitive shape loads correctly when supplied with all possible parameters
1546 int UtcDaliVisualFactoryGetPrimitiveVisual2(void)
1547 {
1548   //Set up test application first, so everything else can be handled.
1549   ToolkitTestApplication application;
1550
1551   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual2:  Request primitive visual with everything" );
1552
1553   //Set up visual properties.
1554   Property::Map propertyMap;
1555   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1556   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::CUBE );
1557   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1558   propertyMap.Insert( PrimitiveVisual::Property::SLICES, 10 );
1559   propertyMap.Insert( PrimitiveVisual::Property::STACKS, 20 );
1560   propertyMap.Insert( PrimitiveVisual::Property::SCALE_TOP_RADIUS, 30.0f );
1561   propertyMap.Insert( PrimitiveVisual::Property::SCALE_BOTTOM_RADIUS, 40.0f );
1562   propertyMap.Insert( PrimitiveVisual::Property::SCALE_HEIGHT, 50.0f );
1563   propertyMap.Insert( PrimitiveVisual::Property::SCALE_RADIUS, 60.0f );
1564   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_PERCENTAGE, 0.7f );
1565   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_SMOOTHNESS, 0.8f );
1566   propertyMap.Insert( MeshVisual::Property::LIGHT_POSITION, Vector3( 0.9, 1.0, 1.1 ) );
1567
1568   //Test to see if shape loads correctly.
1569   TestPrimitiveVisualWithProperties( propertyMap, application );
1570
1571   END_TEST;
1572 }
1573
1574 //Test if primitive shape loads a sphere correctly.
1575 int UtcDaliVisualFactoryGetPrimitiveVisual3(void)
1576 {
1577   //Set up test application first, so everything else can be handled.
1578   ToolkitTestApplication application;
1579
1580   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual3:  Request primitive visual to display a sphere" );
1581
1582   //Set up visual properties.
1583   Property::Map propertyMap;
1584   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1585   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1586   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1587   propertyMap.Insert( PrimitiveVisual::Property::SLICES, 10 );
1588   propertyMap.Insert( PrimitiveVisual::Property::STACKS, 20 );
1589
1590   //Test to see if shape loads correctly.
1591   TestPrimitiveVisualWithProperties( propertyMap, application );
1592
1593   END_TEST;
1594 }
1595
1596 //Test if primitive shape loads a conic section correctly.
1597 int UtcDaliVisualFactoryGetPrimitiveVisual4(void)
1598 {
1599   //Set up test application first, so everything else can be handled.
1600   ToolkitTestApplication application;
1601
1602   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual4:  Request primitive visual to display a conic section" );
1603
1604   //Set up visual properties.
1605   Property::Map propertyMap;
1606   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1607   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::CONICAL_FRUSTRUM );
1608   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1609   propertyMap.Insert( PrimitiveVisual::Property::SLICES, 10 );
1610   propertyMap.Insert( PrimitiveVisual::Property::SCALE_TOP_RADIUS, 30.0f );
1611   propertyMap.Insert( PrimitiveVisual::Property::SCALE_BOTTOM_RADIUS, 40.0f );
1612   propertyMap.Insert( PrimitiveVisual::Property::SCALE_HEIGHT, 50.0f );
1613
1614   //Test to see if shape loads correctly.
1615   TestPrimitiveVisualWithProperties( propertyMap, application );
1616
1617   END_TEST;
1618 }
1619
1620 //Test if primitive shape loads a bevelled cube correctly.
1621 int UtcDaliVisualFactoryGetPrimitiveVisual5(void)
1622 {
1623   //Set up test application first, so everything else can be handled.
1624   ToolkitTestApplication application;
1625
1626   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual5:  Request primitive visual to display a bevelled cube" );
1627
1628   //Set up visual properties.
1629   Property::Map propertyMap;
1630   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1631   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::BEVELLED_CUBE );
1632   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1633   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_PERCENTAGE, 0.7f );
1634
1635   //Test to see if shape loads correctly.
1636   TestPrimitiveVisualWithProperties( propertyMap, application );
1637
1638   END_TEST;
1639 }
1640
1641 //Test if primitive shape loads an octahedron correctly.
1642 int UtcDaliVisualFactoryGetPrimitiveVisual6(void)
1643 {
1644   //Set up test application first, so everything else can be handled.
1645   ToolkitTestApplication application;
1646
1647   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual6:  Request primitive visual to display an octahedron" );
1648
1649   //Set up visual properties.
1650   Property::Map propertyMap;
1651   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1652   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::OCTAHEDRON );
1653   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1654
1655   //Test to see if shape loads correctly.
1656   TestPrimitiveVisualWithProperties( propertyMap, application );
1657
1658   END_TEST;
1659 }
1660
1661 //Test if primitive shape loads a cone correctly.
1662 int UtcDaliVisualFactoryGetPrimitiveVisual7(void)
1663 {
1664   //Set up test application first, so everything else can be handled.
1665   ToolkitTestApplication application;
1666
1667   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual7:  Request primitive visual to display a cone" );
1668
1669   //Set up visual properties.
1670   Property::Map propertyMap;
1671   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1672   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::CONE );
1673   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1674   propertyMap.Insert( PrimitiveVisual::Property::SLICES, 10 );
1675   propertyMap.Insert( PrimitiveVisual::Property::SCALE_TOP_RADIUS, 30.0f );
1676   propertyMap.Insert( PrimitiveVisual::Property::SCALE_HEIGHT, 50.0f );
1677
1678   //Test to see if shape loads correctly.
1679   TestPrimitiveVisualWithProperties( propertyMap, application );
1680
1681   END_TEST;
1682 }
1683
1684 //Test if primitive shape loads correctly when light position is manually set.
1685 int UtcDaliVisualFactoryGetPrimitiveVisual8(void)
1686 {
1687   //Set up test application first, so everything else can be handled.
1688   ToolkitTestApplication application;
1689
1690   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual8:  Request primitive visual with set light position" );
1691
1692   //Set up visual properties.
1693   Property::Map propertyMap;
1694   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1695   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1696   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1697   propertyMap.Insert( MeshVisual::Property::LIGHT_POSITION, Vector3( 0.0, 1.0, 2.0 ) );
1698
1699   //Test to see if shape loads correctly.
1700   TestPrimitiveVisualWithProperties( propertyMap, application );
1701
1702   END_TEST;
1703 }
1704
1705 //Test if primitive shape loads correctly when told to use too many slices.
1706 int UtcDaliVisualFactoryGetPrimitiveVisual9(void)
1707 {
1708   //Set up test application first, so everything else can be handled.
1709   ToolkitTestApplication application;
1710
1711   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual9:  Request primitive visual with above-cap slices." );
1712
1713   //Set up visual properties.
1714   Property::Map propertyMap;
1715   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1716   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1717   propertyMap.Insert( PrimitiveVisual::Property::SLICES, Property::Value( 1000000 ) );
1718
1719   //Test to see if shape loads correctly.
1720   TestPrimitiveVisualWithProperties( propertyMap, application );
1721
1722   END_TEST;
1723 }
1724
1725 //Test if primitive shape loads correctly when told to use too few slices. (2 slices or less.)
1726 int UtcDaliVisualFactoryGetPrimitiveVisual10(void)
1727 {
1728   //Set up test application first, so everything else can be handled.
1729   ToolkitTestApplication application;
1730
1731   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual10:  Request primitive visual with too few slices." );
1732
1733   //Set up visual properties.
1734   Property::Map propertyMap;
1735   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1736   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1737   propertyMap.Insert( PrimitiveVisual::Property::SLICES, Property::Value( 2 ) );
1738
1739   //Test to see if shape loads correctly.
1740   TestPrimitiveVisualWithProperties( propertyMap, application );
1741
1742   END_TEST;
1743 }
1744
1745 //Test if primitive shape loads correctly when told to use too many stacks.
1746 int UtcDaliVisualFactoryGetPrimitiveVisual11(void)
1747 {
1748   //Set up test application first, so everything else can be handled.
1749   ToolkitTestApplication application;
1750
1751   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual11:  Request primitive visual with too many stacks." );
1752
1753   //Set up visual properties.
1754   Property::Map propertyMap;
1755   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1756   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1757   propertyMap.Insert( PrimitiveVisual::Property::STACKS, Property::Value( 1000000 ) );
1758
1759   //Test to see if shape loads correctly.
1760   TestPrimitiveVisualWithProperties( propertyMap, application );
1761
1762   END_TEST;
1763 }
1764
1765 //Test if primitive shape loads correctly when told to use too few stacks. (1 stack or less.)
1766 int UtcDaliVisualFactoryGetPrimitiveVisual12(void)
1767 {
1768   //Set up test application first, so everything else can be handled.
1769   ToolkitTestApplication application;
1770
1771   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual12:  Request primitive visual with too few stacks." );
1772
1773   //Set up visual properties.
1774   Property::Map propertyMap;
1775   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1776   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1777   propertyMap.Insert( PrimitiveVisual::Property::STACKS, Property::Value( 1 ) );
1778
1779   //Test to see if shape loads correctly.
1780   TestPrimitiveVisualWithProperties( propertyMap, application );
1781
1782   END_TEST;
1783 }
1784
1785 //Test if primitive shape loads correctly when told to use invalid (zero or negative) dimensions.
1786 int UtcDaliVisualFactoryGetPrimitiveVisual13(void)
1787 {
1788   //Set up test application first, so everything else can be handled.
1789   ToolkitTestApplication application;
1790
1791   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual13:  Request primitive visual with invalid scale dimensions." );
1792
1793   //Set up visual properties.
1794   Property::Map propertyMap;
1795   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1796   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1797   propertyMap.Insert( PrimitiveVisual::Property::SCALE_DIMENSIONS, Vector3::ZERO );
1798
1799   //Test to see if shape loads correctly.
1800   TestPrimitiveVisualWithProperties( propertyMap, application );
1801
1802   END_TEST;
1803 }
1804
1805 //Test if primitive shape loads correctly when told to use too low a bevel percentage.
1806 int UtcDaliVisualFactoryGetPrimitiveVisual14(void)
1807 {
1808   //Set up test application first, so everything else can be handled.
1809   ToolkitTestApplication application;
1810
1811   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual14:  Request primitive visual with too low a bevel percentage." );
1812
1813   //Set up visual properties.
1814   Property::Map propertyMap;
1815   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1816   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1817   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_PERCENTAGE, Property::Value( -1.0f ) );
1818
1819   //Test to see if shape loads correctly.
1820   TestPrimitiveVisualWithProperties( propertyMap, application );
1821
1822   END_TEST;
1823 }
1824
1825 //Test if primitive shape loads correctly when told to use too high a bevel percentage.
1826 int UtcDaliVisualFactoryGetPrimitiveVisual15(void)
1827 {
1828   //Set up test application first, so everything else can be handled.
1829   ToolkitTestApplication application;
1830
1831   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual15:  Request primitive visual with too high a bevel percentage." );
1832
1833   //Set up visual properties.
1834   Property::Map propertyMap;
1835   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1836   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1837   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_PERCENTAGE, Property::Value( 2.0f ) );
1838
1839   //Test to see if shape loads correctly.
1840   TestPrimitiveVisualWithProperties( propertyMap, application );
1841
1842   END_TEST;
1843 }
1844
1845 //Test if primitive shape loads correctly when told to use too low a bevel smoothness.
1846 int UtcDaliVisualFactoryGetPrimitiveVisual16(void)
1847 {
1848   //Set up test application first, so everything else can be handled.
1849   ToolkitTestApplication application;
1850
1851   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual16:  Request primitive visual with too low a bevel smoothness." );
1852
1853   //Set up visual properties.
1854   Property::Map propertyMap;
1855   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1856   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1857   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_SMOOTHNESS, Property::Value( -1.0f ) );
1858
1859   //Test to see if shape loads correctly.
1860   TestPrimitiveVisualWithProperties( propertyMap, application );
1861
1862   END_TEST;
1863 }
1864
1865 //Test if primitive shape loads correctly when told to use too high a bevel smoothness.
1866 int UtcDaliVisualFactoryGetPrimitiveVisual17(void)
1867 {
1868   //Set up test application first, so everything else can be handled.
1869   ToolkitTestApplication application;
1870
1871   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual17:  Request primitive visual with too high a bevel smoothness." );
1872
1873   //Set up visual properties.
1874   Property::Map propertyMap;
1875   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1876   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::SPHERE );
1877   propertyMap.Insert( PrimitiveVisual::Property::BEVEL_SMOOTHNESS, Property::Value( 2.0f ) );
1878
1879   //Test to see if shape loads correctly.
1880   TestPrimitiveVisualWithProperties( propertyMap, application );
1881
1882   END_TEST;
1883 }
1884
1885 //Test if primitive shape loads a conic section correctly.
1886 int UtcDaliVisualFactoryGetPrimitiveVisual18(void)
1887 {
1888   //Set up test application first, so everything else can be handled.
1889   ToolkitTestApplication application;
1890
1891   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisual18:  Request primitive visual to display a conic section" );
1892
1893   //Set up visual properties.
1894   Property::Map propertyMap;
1895   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1896   propertyMap.Insert( PrimitiveVisual::Property::SHAPE, PrimitiveVisual::Shape::CONICAL_FRUSTUM );
1897   propertyMap.Insert( PrimitiveVisual::Property::MIX_COLOR, Vector4( 0.5, 0.5, 0.5, 1.0 ) );
1898   propertyMap.Insert( PrimitiveVisual::Property::SLICES, 10 );
1899   propertyMap.Insert( PrimitiveVisual::Property::SCALE_TOP_RADIUS, 30.0f );
1900   propertyMap.Insert( PrimitiveVisual::Property::SCALE_BOTTOM_RADIUS, 40.0f );
1901   propertyMap.Insert( PrimitiveVisual::Property::SCALE_HEIGHT, 50.0f );
1902
1903   //Test to see if shape loads correctly.
1904   TestPrimitiveVisualWithProperties( propertyMap, application );
1905
1906   END_TEST;
1907 }
1908
1909 //Test if primitive shape visual handles the case of not being passed a specific shape to use.
1910 int UtcDaliVisualFactoryGetPrimitiveVisualN1(void)
1911 {
1912   //Set up test application first, so everything else can be handled.
1913   ToolkitTestApplication application;
1914
1915   tet_infoline( "UtcDaliVisualFactoryGetPrimitiveVisualN1:  Request primitive visual without shape" );
1916
1917   //Set up visual properties, without supplying shape.
1918   Property::Map propertyMap;
1919   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::PRIMITIVE );
1920
1921   //Test to see if shape loads regardless of missing input.
1922   TestPrimitiveVisualWithProperties( propertyMap, application );
1923
1924   END_TEST;
1925 }
1926
1927 int UtcDaliVisualFactoryGetAnimatedImageVisual1(void)
1928 {
1929   ToolkitTestApplication application;
1930   tet_infoline( "UtcDaliVisualFactoryGetAnimatedImageVisual1: Request animated image visual with a gif url" );
1931
1932   TestGlAbstraction& gl = application.GetGlAbstraction();
1933   TraceCallStack& textureTrace = gl.GetTextureTrace();
1934   textureTrace.Enable(true);
1935
1936   VisualFactory factory = VisualFactory::Get();
1937   Visual::Base visual = factory.CreateVisual( TEST_GIF_FILE_NAME, ImageDimensions() );
1938   DALI_TEST_CHECK( visual );
1939
1940   DummyControl actor = DummyControl::New(true);
1941   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1942   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1943   actor.SetSize( 200.0f, 200.0f );
1944   Stage::GetCurrent().Add( actor );
1945
1946   application.SendNotification();
1947   application.Render();
1948
1949   // renderer is added to actor
1950   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1951   Renderer renderer = actor.GetRendererAt( 0u );
1952   DALI_TEST_CHECK( renderer );
1953
1954   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1955   textureTrace.Reset();
1956
1957   // Force the timer used by the animatedImageVisual to tick,
1958   Dali::Timer timer = Timer::New( 0 );
1959   timer.MockEmitSignal();
1960   application.SendNotification();
1961   application.Render();
1962   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1963   textureTrace.Reset();
1964
1965
1966   // Force the timer used by the animatedImageVisual to tick,
1967   timer.MockEmitSignal();
1968   application.SendNotification();
1969   application.Render();
1970   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1971   textureTrace.Reset();
1972
1973   // Force the timer used by the animatedImageVisual to tick,
1974   timer.MockEmitSignal();
1975   application.SendNotification();
1976   application.Render();
1977   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1978   textureTrace.Reset();
1979
1980   // Test SetOffStage().
1981   actor.Unparent();
1982   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1983
1984   END_TEST;
1985 }
1986
1987 int UtcDaliVisualFactoryGetAnimatedImageVisual2(void)
1988 {
1989   ToolkitTestApplication application;
1990   tet_infoline( "UtcDaliVisualFactoryGetAnimatedImageVisual2: Request animated image visual with a Property::Map, test custom wrap mode and pixel area" );
1991
1992   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
1993   Property::Map propertyMap;
1994   propertyMap.Add( Toolkit::Visual::Property::TYPE,  Visual::IMAGE  )
1995              .Add( ImageVisual::Property::URL, TEST_GIF_FILE_NAME  )
1996              .Add( ImageVisual::Property::PIXEL_AREA, pixelArea )
1997              .Add( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT )
1998              .Add( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
1999
2000   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
2001   DALI_TEST_CHECK( visual );
2002
2003   TestGlAbstraction& gl = application.GetGlAbstraction();
2004   TraceCallStack& textureTrace = gl.GetTextureTrace();
2005   textureTrace.Enable(true);
2006   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
2007   texParameterTrace.Enable( true );
2008
2009   DummyControl actor = DummyControl::New(true);
2010   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
2011   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
2012   actor.SetSize( 200.0f, 200.0f );
2013   Stage::GetCurrent().Add( actor );
2014
2015   application.SendNotification();
2016   application.Render();
2017
2018   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
2019
2020   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
2021
2022   // For animated image visual, the wrapping is handled manually in shader, so the following gl function should not be called
2023   std::stringstream out;
2024   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
2025   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
2026   out.str("");
2027   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
2028   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
2029
2030   // test the uniforms which used to handle the wrap mode
2031   Renderer renderer = actor.GetRendererAt( 0u );
2032   DALI_TEST_CHECK( renderer );
2033
2034   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
2035   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
2036   Vector4 pixelAreaUniform;
2037   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
2038   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
2039
2040   Property::Value wrapModeValue = renderer.GetProperty( renderer.GetPropertyIndex( "wrapMode" ) );
2041   Vector2 wrapMode( WrapMode::MIRRORED_REPEAT-1, WrapMode::REPEAT-1 );
2042   DALI_TEST_EQUALS( wrapModeValue.Get<Vector2>(), wrapMode, TEST_LOCATION );
2043   Vector2 wrapModeUniform;
2044   DALI_TEST_CHECK( gl.GetUniformValue<Vector2>( "wrapMode", wrapModeUniform ) );
2045   DALI_TEST_EQUALS( wrapMode, wrapModeUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
2046
2047   actor.Unparent( );
2048   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2049
2050   END_TEST;
2051 }