[dali_2.0.15] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedVectorImageVisual.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <iostream>
18 #include <stdlib.h>
19 #include <chrono>
20 #include <thread>
21 #include <dali-toolkit-test-suite-utils.h>
22 #include <toolkit-timer.h>
23 #include <toolkit-event-thread-callback.h>
24 #include <toolkit-vector-animation-renderer.h>
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
27 #include <dali-toolkit/devel-api/controls/control-devel.h>
28 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
30 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
31 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-signals-devel.h>
32 #include <dali/devel-api/rendering/renderer-devel.h>
33 #include <dali/devel-api/adaptor-framework/window-devel.h>
34 #include "dummy-control.h"
35
36 using namespace Dali;
37 using namespace Dali::Toolkit;
38
39 void dali_animated_vector_image_visual_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void dali_animated_vector_image_visual_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 namespace
50 {
51
52 const char* TEST_VECTOR_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/insta_camera.json";
53
54 bool gAnimationFinishedSignalFired = false;
55
56 void VisualEventSignal( Control control, Dali::Property::Index visualIndex, Dali::Property::Index signalId )
57 {
58   if( visualIndex == DummyControl::Property::TEST_VISUAL && signalId == DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED )
59   {
60     gAnimationFinishedSignalFired = true;
61   }
62 }
63
64 }
65
66 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void)
67 {
68   ToolkitTestApplication application;
69   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual01: Request animated vector image visual with a json url" );
70
71   VisualFactory factory = VisualFactory::Get();
72   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
73   DALI_TEST_CHECK( visual );
74
75   DummyControl actor = DummyControl::New( true );
76   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
77   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
78   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
79   application.GetScene().Add( actor );
80
81   application.SendNotification();
82   application.Render();
83
84   // renderer is added to actor
85   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
86   Renderer renderer = actor.GetRendererAt( 0u );
87   DALI_TEST_CHECK( renderer );
88
89   // Test SetOffScene().
90   actor.Unparent();
91   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
92
93   END_TEST;
94 }
95
96 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void)
97 {
98   ToolkitTestApplication application;
99   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual02: Request animated vector image visual with a Property::Map" );
100
101   Property::Map propertyMap;
102   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
103              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
104
105   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
106   DALI_TEST_CHECK( visual );
107
108   DummyControl actor = DummyControl::New( true );
109   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
110   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
111   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
112   application.GetScene().Add( actor );
113
114   application.SendNotification();
115   application.Render();
116
117   // renderer is added to actor
118   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
119   Renderer renderer = actor.GetRendererAt( 0u );
120   DALI_TEST_CHECK( renderer );
121
122   actor.Unparent( );
123   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
124
125   END_TEST;
126 }
127
128 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void)
129 {
130   ToolkitTestApplication application;
131   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" );
132
133   int startFrame = 1, endFrame = 3;
134   Property::Array playRange;
135   playRange.PushBack( startFrame );
136   playRange.PushBack( endFrame );
137
138   Property::Map propertyMap;
139   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
140              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
141              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
142              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
143
144   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
145   DALI_TEST_CHECK( visual );
146
147   DummyControl actor = DummyControl::New( true );
148   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
149   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
150   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
151   application.GetScene().Add( actor );
152
153   application.SendNotification();
154   application.Render();
155
156   // renderer is added to actor
157   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
158   Renderer renderer = actor.GetRendererAt( 0u );
159   DALI_TEST_CHECK( renderer );
160
161   actor.Unparent( );
162   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
163
164   END_TEST;
165 }
166
167 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
168 {
169   ToolkitTestApplication application;
170   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
171
172   int startFrame = 1, endFrame = 3;
173   Property::Array playRange;
174   playRange.PushBack( startFrame );
175   playRange.PushBack( endFrame );
176
177   Property::Map propertyMap;
178   propertyMap.Add( "visualType", DevelVisual::ANIMATED_VECTOR_IMAGE )
179              .Add( "url", TEST_VECTOR_IMAGE_FILE_NAME )
180              .Add( "loopCount", 3 )
181              .Add( "playRange", playRange )
182              .Add( "stopBehavior", DevelImageVisual::StopBehavior::FIRST_FRAME )
183              .Add( "loopingMode", DevelImageVisual::LoopingMode::AUTO_REVERSE )
184              .Add( "redrawInScalingDown", false );
185
186   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
187   DALI_TEST_CHECK( visual );
188
189   DummyControl actor = DummyControl::New( true );
190   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
191   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
192   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
193   application.GetScene().Add( actor );
194
195   application.SendNotification();
196   application.Render();
197
198   // Trigger count is 1 - render a frame
199   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
200
201   // renderer is added to actor
202   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
203
204   Renderer renderer = actor.GetRendererAt( 0u );
205   DALI_TEST_CHECK( renderer );
206
207   Property::Map resultMap;
208   visual.CreatePropertyMap( resultMap );
209
210   // check the property values from the returned map from a visual
211   Property::Value* value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
212   DALI_TEST_CHECK( value );
213   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
214
215   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
216   DALI_TEST_CHECK( value );
217   DALI_TEST_CHECK( value->Get< int >() == 3 );
218
219   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
220   DALI_TEST_CHECK( value );
221
222   Property::Array* result = value->GetArray();
223   DALI_TEST_CHECK( result );
224
225   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
226   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
227
228   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
229   DALI_TEST_CHECK( value );
230   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::FIRST_FRAME );
231
232   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
233   DALI_TEST_CHECK( value );
234   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::AUTO_REVERSE );
235
236   value = resultMap.Find( DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, Property::BOOLEAN );
237   DALI_TEST_CHECK( value );
238   DALI_TEST_CHECK( value->Get< bool >() == false );
239
240   actor.Unparent( );
241   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
242
243   END_TEST;
244 }
245
246 int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
247 {
248   ToolkitTestApplication application;
249   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
250
251   int startFrame = 1, endFrame = 3;
252   Property::Array playRange;
253   playRange.PushBack( startFrame );
254   playRange.PushBack( endFrame );
255
256   Property::Map propertyMap;
257   propertyMap.Add( Toolkit::Visual::Property::TYPE,  DevelVisual::ANIMATED_VECTOR_IMAGE )
258              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
259              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
260              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
261
262   // request AnimatedVectorImageVisual with a property map
263   VisualFactory factory = VisualFactory::Get();
264   Visual::Base visual = factory.CreateVisual( propertyMap );
265
266   DummyControl actor = DummyControl::New( true );
267   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
268   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
269
270   Vector2 controlSize( 20.f, 30.f );
271   actor.SetProperty( Actor::Property::SIZE, controlSize );
272
273   application.GetScene().Add( actor );
274
275   application.SendNotification();
276   application.Render();
277
278   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
279
280   Property::Map resultMap;
281   resultMap = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
282
283   // check the property values from the returned map from a visual
284   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
285   DALI_TEST_CHECK( value );
286   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
287
288   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
289   DALI_TEST_CHECK( value );
290   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
291
292   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
293   DALI_TEST_CHECK( value );
294   DALI_TEST_CHECK( value->Get< int >() == 3 );
295
296   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
297   DALI_TEST_CHECK( value );
298
299   Property::Array* result = value->GetArray();
300   DALI_TEST_CHECK( result );
301
302   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
303   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
304
305   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
306   DALI_TEST_CHECK( value );
307   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::CURRENT_FRAME );
308
309   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
310   DALI_TEST_CHECK( value );
311   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::RESTART );
312
313   value = resultMap.Find( DevelImageVisual::Property::CONTENT_INFO, Property::MAP );
314   DALI_TEST_CHECK( value );
315
316   value = resultMap.Find( DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, Property::BOOLEAN );
317   DALI_TEST_CHECK( value );
318   DALI_TEST_CHECK( value->Get< bool >() == true );    // Check default value
319
320   // request AnimatedVectorImageVisual with an URL
321   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
322
323   resultMap.Clear();
324   visual2.CreatePropertyMap( resultMap );
325
326   // check the property values from the returned map from a visual
327   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
328   DALI_TEST_CHECK( value );
329   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
330
331   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
332   DALI_TEST_CHECK( value );
333   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
334
335   END_TEST;
336 }
337
338 int UtcDaliAnimatedVectorImageVisualPlayback(void)
339 {
340   ToolkitTestApplication application;
341
342   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
343
344   {
345     // request AnimatedVectorImageVisual with a property map
346     VisualFactory factory = VisualFactory::Get();
347     Visual::Base visual = factory.CreateVisual(
348       Property::Map()
349       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
350       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
351
352     DummyControl dummyControl = DummyControl::New( true );
353     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
354     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
355     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
356
357     Property::Map attributes;
358     tet_infoline( "Test Play action" );
359     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
360
361     application.GetScene().Add( dummyControl );
362     application.SendNotification();
363     application.Render( 16 );
364
365     Property::Map map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
366     Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
367     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
368
369     tet_infoline( "Test Pause action" );
370     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
371
372     application.SendNotification();
373     application.Render(16);
374
375     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
376     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
377     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED );
378
379     tet_infoline( "Test Play action" );
380     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
381
382     application.SendNotification();
383     application.Render(16);
384
385     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
386     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
387     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
388
389     tet_infoline( "Test Stop action" );
390     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
391
392     application.SendNotification();
393     application.Render(16);
394
395     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
396     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
397     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
398
399     tet_infoline( "Test Stop action again" );
400     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
401
402     application.SendNotification();
403     application.Render(16);
404
405     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
406     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
407     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
408
409     tet_infoline( "Test Play action" );
410     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
411
412     application.SendNotification();
413     application.Render(16);
414
415     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
416     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
417     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
418
419     tet_infoline( "Off stage" );
420     dummyControl.Unparent();
421
422     application.SendNotification();
423     application.Render(16);
424
425     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
426     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
427     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
428
429     tet_infoline( "On stage again" );
430     application.GetScene().Add( dummyControl );
431
432     application.SendNotification();
433     application.Render(16);
434
435     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
436     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
437     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
438
439     tet_infoline( "Test Play action" );
440     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
441
442     application.SendNotification();
443     application.Render(16);
444
445     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
446     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
447     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
448
449     // Change Size
450     Vector3 newSize( 100.0f, 100.0f, 0.0f );
451     dummyControl.SetProperty( Actor::Property::SIZE, newSize );
452
453     application.SendNotification();
454     application.Render(16);
455
456     // Size should be changed
457     Vector3 naturalSize = dummyControl.GetNaturalSize();
458     DALI_TEST_CHECK( naturalSize == newSize );
459
460     dummyControl.Unparent();
461   }
462
463   END_TEST;
464 }
465
466 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
467 {
468   ToolkitTestApplication application;
469   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
470
471   VisualFactory factory = VisualFactory::Get();
472   Property::Map properties;
473   Property::Map shader;
474   const std::string vertexShader = "Foobar";
475   const std::string fragmentShader = "Foobar sampler2D Foobar";
476   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
477   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
478
479   properties[Visual::Property::TYPE] = Visual::IMAGE;
480   properties[Visual::Property::SHADER] = shader;
481   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
482
483   Visual::Base visual = factory.CreateVisual( properties );
484
485   // trigger creation through setting on stage
486   DummyControl dummy = DummyControl::New( true );
487   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
488   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
489
490   dummy.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
491   dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
492   application.GetScene().Add( dummy );
493
494   application.SendNotification();
495   application.Render();
496
497   Renderer renderer = dummy.GetRendererAt( 0 );
498   Shader shader2 = renderer.GetShader();
499   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
500   Property::Map* map = value.GetMap();
501   DALI_TEST_CHECK( map );
502
503   std::string resultFragmentShader, resultVertexShader;
504   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
505   fragment->Get( resultFragmentShader );
506   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
507
508   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
509   vertex->Get( resultVertexShader );
510   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
511
512   END_TEST;
513 }
514
515 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
516 {
517   ToolkitTestApplication application;
518   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
519
520   VisualFactory factory = VisualFactory::Get();
521   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
522   DALI_TEST_CHECK( visual );
523
524   DummyControl actor = DummyControl::New( true );
525   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
526   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
527
528   Vector2 controlSize( 20.f, 30.f );
529   Vector2 naturalSize;
530
531   application.GetScene().Add( actor );
532
533   application.SendNotification();
534   application.Render();
535
536   visual.GetNaturalSize( naturalSize );
537
538   DALI_TEST_EQUALS( naturalSize, Vector2( 100.0f, 100.0f ), TEST_LOCATION );    // 100x100 is the content default size.
539
540   actor.SetProperty( Actor::Property::SIZE, controlSize );
541
542   application.SendNotification();
543   application.Render();
544
545   visual.GetNaturalSize( naturalSize );
546
547   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
548
549   END_TEST;
550 }
551
552 int UtcDaliAnimatedVectorImageVisualLoopCount(void)
553 {
554   ToolkitTestApplication application;
555   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopCount" );
556
557   Property::Map propertyMap;
558   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
559              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
560              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
561
562   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
563   DALI_TEST_CHECK( visual );
564
565   DummyControl actor = DummyControl::New( true );
566   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
567   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
568
569   Vector2 controlSize( 20.f, 30.f );
570   actor.SetProperty( Actor::Property::SIZE, controlSize );
571
572   application.GetScene().Add( actor );
573
574   Property::Map attributes;
575   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
576
577   application.SendNotification();
578   application.Render();
579
580   // Trigger count is 1 - render a frame
581   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
582
583   // renderer is added to actor
584   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
585   Renderer renderer = actor.GetRendererAt( 0u );
586   DALI_TEST_CHECK( renderer );
587
588   END_TEST;
589 }
590
591 int UtcDaliAnimatedVectorImageVisualPlayRange(void)
592 {
593   ToolkitTestApplication application;
594   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" );
595
596   int startFrame = 1, endFrame = 3;
597   Property::Array array;
598   array.PushBack( endFrame );
599   array.PushBack( startFrame );
600
601   Property::Map propertyMap;
602   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
603              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
604              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
605
606   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
607   DALI_TEST_CHECK( visual );
608
609   DummyControl actor = DummyControl::New( true );
610   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
611   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
612
613   Vector2 controlSize( 20.f, 30.f );
614   actor.SetProperty( Actor::Property::SIZE, controlSize );
615
616   application.GetScene().Add( actor );
617
618   Property::Map attributes;
619   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
620
621   application.SendNotification();
622   application.Render();
623
624   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
625
626   // renderer is added to actor
627   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
628   Renderer renderer = actor.GetRendererAt( 0u );
629   DALI_TEST_CHECK( renderer );
630
631   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
632   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
633
634   int resultStartFrame, resultEndFrame;
635   Property::Array* result = value->GetArray();
636   result->GetElementAt( 0 ).Get( resultStartFrame );
637   result->GetElementAt( 1 ).Get( resultEndFrame );
638
639   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );
640   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
641
642   // Set invalid play range
643   array.Clear();
644   array.PushBack( 1 );
645   array.PushBack( 100 );
646
647   attributes.Clear();
648   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
649   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
650
651   application.SendNotification();
652   application.Render();
653
654   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
655
656   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
657   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
658
659   result = value->GetArray();
660   result->GetElementAt( 0 ).Get( resultStartFrame );
661   result->GetElementAt( 1 ).Get( resultEndFrame );
662
663   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );  // Should not be changed
664   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
665
666   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, Property::Map() );
667
668   application.SendNotification();
669   application.Render();
670
671   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
672
673   application.SendNotification();
674   application.Render();
675
676   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
677
678   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
679   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
680   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
681
682   array.Clear();
683   array.PushBack( 0 );
684   array.PushBack( 2 );
685
686   attributes.Clear();
687   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
688   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
689
690   application.SendNotification();
691   application.Render();
692
693   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
694
695   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
696   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
697
698   result = value->GetArray();
699   result->GetElementAt( 0 ).Get( resultStartFrame );
700   result->GetElementAt( 1 ).Get( resultEndFrame );
701
702   DALI_TEST_EQUALS( 0, resultStartFrame, TEST_LOCATION );
703   DALI_TEST_EQUALS( 2, resultEndFrame, TEST_LOCATION );
704
705   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
706   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );    // CURRENT_FRAME_NUMBER should be changed also.
707
708   END_TEST;
709 }
710
711 int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void)
712 {
713   ToolkitTestApplication application;
714   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRangeMarker" );
715
716   Property::Array array;
717   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
718
719   Property::Map propertyMap;
720   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
721              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
722              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
723
724   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
725   DALI_TEST_CHECK( visual );
726
727   DummyControl actor = DummyControl::New( true );
728   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
729   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
730
731   Vector2 controlSize( 20.f, 30.f );
732   actor.SetProperty( Actor::Property::SIZE, controlSize );
733
734   application.GetScene().Add( actor );
735
736   Property::Map attributes;
737   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
738
739   application.SendNotification();
740   application.Render();
741
742   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
743
744   // renderer is added to actor
745   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
746   Renderer renderer = actor.GetRendererAt( 0u );
747   DALI_TEST_CHECK( renderer );
748
749   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
750   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
751
752   int resultStartFrame, resultEndFrame;
753   Property::Array* result = value->GetArray();
754   result->GetElementAt( 0 ).Get( resultStartFrame );
755   result->GetElementAt( 1 ).Get( resultEndFrame );
756
757   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );
758   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_1, resultEndFrame, TEST_LOCATION );
759
760   // Set 2 markers
761   array.Clear();
762   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
763   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_2 );
764
765   attributes.Clear();
766   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
767   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
768
769   application.SendNotification();
770   application.Render();
771
772   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
773
774   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
775   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
776
777   result = value->GetArray();
778   result->GetElementAt( 0 ).Get( resultStartFrame );
779   result->GetElementAt( 1 ).Get( resultEndFrame );
780
781   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );
782   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION );
783
784   // Set invalid play range
785   array.Clear();
786   array.PushBack( 1 );
787   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
788
789   attributes.Clear();
790   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
791   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
792
793   application.SendNotification();
794   application.Render();
795
796   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
797
798   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
799   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
800
801   result = value->GetArray();
802   result->GetElementAt( 0 ).Get( resultStartFrame );
803   result->GetElementAt( 1 ).Get( resultEndFrame );
804
805   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );  // Should not be changed
806   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION );
807
808   END_TEST;
809 }
810
811 int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void)
812 {
813   ToolkitTestApplication application;
814   tet_infoline( "UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal" );
815
816   Property::Map propertyMap;
817   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
818              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
819              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
820
821   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
822   DALI_TEST_CHECK( visual );
823
824   DummyControl actor = DummyControl::New( true );
825   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
826   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
827
828   DevelControl::VisualEventSignal( actor ).Connect( &VisualEventSignal );
829
830   Vector2 controlSize( 20.f, 30.f );
831   actor.SetProperty( Actor::Property::SIZE, controlSize );
832
833   application.GetScene().Add( actor );
834
835   Property::Map attributes;
836   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
837
838   application.SendNotification();
839   application.Render();
840
841   // Wait for animation finish
842   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
843
844   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
845   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
846   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
847
848   DALI_TEST_EQUALS( gAnimationFinishedSignalFired, true, TEST_LOCATION );
849
850   END_TEST;
851 }
852
853 int UtcDaliAnimatedVectorImageVisualJumpTo(void)
854 {
855   ToolkitTestApplication application;
856   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpTo" );
857
858   Property::Map propertyMap;
859   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
860              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
861
862   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
863   DALI_TEST_CHECK( visual );
864
865   tet_printf( "1. Visual is created.\n" );
866
867   DummyControl actor = DummyControl::New( true );
868   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
869   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
870
871   Vector2 controlSize( 20.f, 30.f );
872   actor.SetProperty( Actor::Property::SIZE, controlSize );
873
874   application.GetScene().Add( actor );
875
876   application.SendNotification();
877   application.Render();
878
879   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2 );
880
881   application.SendNotification();
882   application.Render();
883
884   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
885
886   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
887   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
888   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
889
890   tet_printf( "2. The current frame number is [%d].\n", value->Get< int >() );
891
892   Property::Array array;
893   array.PushBack( 0 );
894   array.PushBack( 2 );
895
896   Property::Map attributes;
897   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
898   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
899
900   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
901
902   application.SendNotification();
903   application.Render();
904
905   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
906
907   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
908   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
909   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
910
911   tet_printf( "3. The current frame number is [%d].\n", value->Get< int >() );
912
913   // Change play range
914   attributes.Clear();
915   array.Clear();
916
917   array.PushBack( 0 );
918   array.PushBack( 4 );
919
920   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
921   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
922
923   attributes.Clear();
924   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
925
926   application.SendNotification();
927   application.Render();
928
929   // Stop and jump to 3
930   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
931
932   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
933
934   application.SendNotification();
935   application.Render();
936
937   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
938
939   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
940   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
941   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
942
943   tet_printf( "4. The current frame number is [%d].\n", value->Get< int >() );
944
945   // Jump to the same position
946   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
947
948   application.SendNotification();
949   application.Render();
950
951   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
952
953   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
954   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
955   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
956
957   tet_printf( "5. The current frame number is [%d].\n", value->Get< int >() );
958
959   END_TEST;
960 }
961
962 int UtcDaliAnimatedVectorImageVisualUpdateProperty(void)
963 {
964   ToolkitTestApplication application;
965   tet_infoline( "UtcDaliAnimatedVectorImageVisualUpdateProperty" );
966
967   int startFrame = 1, endFrame = 3;
968   Property::Array playRange;
969   playRange.PushBack( startFrame );
970   playRange.PushBack( endFrame );
971
972   Property::Map propertyMap;
973   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
974              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
975              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
976              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
977
978   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
979   DALI_TEST_CHECK( visual );
980
981   DummyControl actor = DummyControl::New( true );
982   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
983   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
984
985   Vector2 controlSize( 20.f, 30.f );
986   actor.SetProperty( Actor::Property::SIZE, controlSize );
987
988   application.GetScene().Add( actor );
989
990   application.SendNotification();
991   application.Render();
992
993   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
994
995   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
996   Property::Value* value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
997   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
998
999   value = map.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
1000   DALI_TEST_CHECK( value );
1001
1002   Property::Array* result = value->GetArray();
1003   DALI_TEST_CHECK( result );
1004
1005   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
1006   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
1007
1008   playRange.Clear();
1009   playRange.PushBack( 0 );
1010   playRange.PushBack( 2 );
1011
1012   Property::Map attributes;
1013   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
1014   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 5 );
1015
1016   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1017
1018   application.SendNotification();
1019   application.Render();
1020
1021   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1022
1023   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1024   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1025   DALI_TEST_EQUALS( value->Get< int >(), 5, TEST_LOCATION );
1026
1027   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
1028   result = value->GetArray();
1029   DALI_TEST_CHECK( result );
1030
1031   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == 0 );
1032   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == 2 );
1033
1034   attributes.Clear();
1035
1036   playRange.Clear();
1037   playRange.PushBack( startFrame );
1038   playRange.PushBack( endFrame );
1039
1040   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
1041
1042   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1043
1044   application.SendNotification();
1045   application.Render();
1046
1047   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1048
1049   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1050   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
1051
1052   result = value->GetArray();
1053   DALI_TEST_CHECK( result );
1054
1055   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
1056   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
1057
1058   // Play and update property
1059   attributes.Clear();
1060   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1061
1062   application.SendNotification();
1063   application.Render();
1064
1065   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 10 );
1066
1067   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1068
1069   application.SendNotification();
1070   application.Render();
1071
1072   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1073   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1074   DALI_TEST_EQUALS( value->Get< int >(), 10, TEST_LOCATION );
1075
1076   END_TEST;
1077 }
1078
1079 int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
1080 {
1081   ToolkitTestApplication application;
1082   tet_infoline( "UtcDaliAnimatedVectorImageVisualStopBehavior" );
1083
1084   Property::Map propertyMap;
1085   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1086              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
1087              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
1088              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME );
1089
1090   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1091   DALI_TEST_CHECK( visual );
1092
1093   DummyControl actor = DummyControl::New( true );
1094   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1095   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1096
1097   Vector2 controlSize( 20.f, 30.f );
1098   actor.SetProperty( Actor::Property::SIZE, controlSize );
1099
1100   application.GetScene().Add( actor );
1101
1102   Property::Map attributes;
1103   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1104
1105   application.SendNotification();
1106   application.Render();
1107
1108   // Trigger count is 1 - animation finished
1109   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1110
1111   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1112   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1113   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1114
1115   // Change stop behavior
1116   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
1117
1118   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1119
1120   attributes.Clear();
1121
1122   // Play again
1123   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1124
1125   application.SendNotification();
1126   application.Render();
1127
1128   // Trigger count is 1 - animation finished
1129   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1130
1131   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1132
1133   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1134   int totalFrameNumber = value1->Get< int >();
1135
1136   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1137   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1138
1139   // Change stop behavior
1140   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1141   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, -1 );
1142
1143   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1144
1145   attributes.Clear();
1146
1147   // Play again
1148   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1149
1150   application.SendNotification();
1151   application.Render();
1152
1153   // Pause
1154   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
1155
1156   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1157   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1158   int currentFrameNumber = value->Get< int >();
1159
1160   // Stop
1161   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
1162
1163   application.SendNotification();
1164   application.Render( 16 );
1165
1166   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1167   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1168   DALI_TEST_EQUALS( value->Get< int >(), currentFrameNumber, TEST_LOCATION );  // Should be same with currentFrameNumber
1169
1170   END_TEST;
1171 }
1172
1173 int UtcDaliAnimatedVectorImageVisualLoopingMode(void)
1174 {
1175   ToolkitTestApplication application;
1176   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopingMode" );
1177
1178   Property::Map propertyMap;
1179   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1180              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
1181              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
1182              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME )
1183              .Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::AUTO_REVERSE );
1184
1185   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1186   DALI_TEST_CHECK( visual );
1187
1188   DummyControl actor = DummyControl::New( true );
1189   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1190   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1191
1192   Vector2 controlSize( 20.f, 30.f );
1193   actor.SetProperty( Actor::Property::SIZE, controlSize );
1194
1195   application.GetScene().Add( actor );
1196
1197   Property::Map attributes;
1198   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1199
1200   application.SendNotification();
1201   application.Render();
1202
1203   // Trigger count is 1 - animation finished
1204   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1205
1206   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1207   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1208   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame because of auto reverse
1209
1210   // Change stop behavior
1211   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1212
1213   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1214
1215   // Play again
1216   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1217
1218   application.SendNotification();
1219   application.Render();
1220
1221   // Trigger count is 1 - animation finished
1222   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1223
1224   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1225   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1226   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1227
1228   // Change looping mode
1229   attributes.Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::RESTART );
1230
1231   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1232
1233   // Play again
1234   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1235
1236   application.SendNotification();
1237   application.Render();
1238
1239   // Trigger count is 1 - animation finished
1240   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1241
1242   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1243   int totalFrameNumber = value1->Get< int >();
1244
1245   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1246   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1247   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1248
1249   END_TEST;
1250 }
1251
1252 int UtcDaliAnimatedVectorImageVisualPropertyNotification(void)
1253 {
1254   ToolkitTestApplication application;
1255   tet_infoline( "UtcDaliAnimatedVectorImageVisualPropertyNotification" );
1256
1257   Property::Map propertyMap;
1258   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1259              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
1260
1261   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1262   DALI_TEST_CHECK( visual );
1263
1264   DummyControl actor = DummyControl::New( true );
1265   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1266   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1267
1268   Vector2 controlSize( 20.f, 30.f );
1269   Vector3 controlScale( 2.0f, 2.0f, 1.0f );
1270   actor.SetProperty( Actor::Property::SIZE, controlSize );
1271   actor.SetProperty( Actor::Property::SCALE, controlScale );
1272
1273   application.GetScene().Add( actor );
1274
1275   application.SendNotification();
1276   application.Render();
1277
1278   application.SendNotification();
1279   application.Render();
1280
1281   Renderer renderer = actor.GetRendererAt( 0u );
1282   DALI_TEST_CHECK( renderer );
1283
1284   auto textureSet = renderer.GetTextures();
1285   auto texture = textureSet.GetTexture(0);
1286
1287   DALI_TEST_EQUALS( controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION );
1288   DALI_TEST_EQUALS( controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION );
1289
1290   // Change scale and size
1291   controlSize = Vector2( 50.f, 40.f );
1292   controlScale= Vector3( 0.5f, 0.5f, 1.0f );
1293   actor.SetProperty( Actor::Property::SIZE, controlSize );
1294   actor.SetProperty( Actor::Property::SCALE, controlScale );
1295
1296   application.SendNotification();
1297   application.Render();
1298
1299   application.SendNotification();
1300   application.Render();
1301
1302   renderer = actor.GetRendererAt( 0u );
1303   DALI_TEST_CHECK( renderer );
1304
1305   textureSet = renderer.GetTextures();
1306   texture = textureSet.GetTexture(0);
1307
1308   DALI_TEST_EQUALS( controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION );
1309   DALI_TEST_EQUALS( controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION );
1310
1311   END_TEST;
1312 }
1313
1314 int UtcDaliAnimatedVectorImageVisualMultipleInstances(void)
1315 {
1316   ToolkitTestApplication application;
1317   tet_infoline( "UtcDaliAnimatedVectorImageVisualMultipleInstances" );
1318
1319   Property::Map propertyMap;
1320   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1321              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1322
1323   Visual::Base visual1 = VisualFactory::Get().CreateVisual( propertyMap );
1324   DALI_TEST_CHECK( visual1 );
1325
1326   DummyControl actor1 = DummyControl::New( true );
1327   DummyControlImpl& dummyImpl1 = static_cast< DummyControlImpl& >( actor1.GetImplementation() );
1328   dummyImpl1.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual1 );
1329
1330   Vector2 controlSize( 20.f, 30.f );
1331   actor1.SetProperty( Actor::Property::SIZE, controlSize );
1332
1333   application.GetScene().Add( actor1 );
1334
1335   propertyMap.Clear();
1336   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1337              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1338
1339   Visual::Base visual2 = VisualFactory::Get().CreateVisual( propertyMap );
1340   DALI_TEST_CHECK( visual2 );
1341
1342   DummyControl actor2 = DummyControl::New( true );
1343   DummyControlImpl& dummyImpl2 = static_cast< DummyControlImpl& >( actor2.GetImplementation() );
1344   dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual2 );
1345
1346   actor2.SetProperty( Actor::Property::SIZE, controlSize );
1347
1348   application.GetScene().Add( actor2 );
1349
1350   DevelControl::DoAction( actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map() );
1351
1352   application.SendNotification();
1353   application.Render();
1354
1355   std::this_thread::sleep_for( std::chrono::milliseconds( 200 ) );
1356
1357   Property::Map attributes;
1358   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
1359
1360   DevelControl::DoAction( actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1361   DevelControl::DoAction( actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1362
1363   DevelControl::DoAction( actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map() );
1364
1365   // renderer is added to actor
1366   DALI_TEST_CHECK( actor1.GetRendererCount() == 1u );
1367   Renderer renderer1 = actor1.GetRendererAt( 0u );
1368   DALI_TEST_CHECK( renderer1 );
1369
1370   // renderer is added to actor
1371   DALI_TEST_CHECK( actor2.GetRendererCount() == 1u );
1372   Renderer renderer2 = actor2.GetRendererAt( 0u );
1373   DALI_TEST_CHECK( renderer2 );
1374
1375   END_TEST;
1376 }
1377
1378 int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void)
1379 {
1380   ToolkitTestApplication application;
1381   tet_infoline( "UtcDaliAnimatedVectorImageVisualControlVisibilityChanged" );
1382
1383   Property::Map propertyMap;
1384   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1385              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1386
1387   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1388   DALI_TEST_CHECK( visual );
1389
1390   DummyControl actor = DummyControl::New( true );
1391   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1392   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1393
1394   Vector2 controlSize( 20.f, 30.f );
1395   actor.SetProperty( Actor::Property::SIZE, controlSize );
1396
1397   application.GetScene().Add( actor );
1398
1399   application.SendNotification();
1400   application.Render();
1401
1402   Property::Map attributes;
1403   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1404
1405   application.SendNotification();
1406   application.Render();
1407
1408   // Check rendering behavior
1409   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1410   Renderer renderer = actor.GetRendererAt( 0u );
1411   DALI_TEST_CHECK( renderer );
1412   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY );
1413
1414   actor.SetProperty( Actor::Property::VISIBLE, false );
1415
1416   application.SendNotification();
1417   application.Render();
1418
1419   // Check rendering behavior again
1420   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED );
1421
1422   END_TEST;
1423 }
1424
1425 int UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged(void)
1426 {
1427   ToolkitTestApplication application;
1428   tet_infoline( "UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged" );
1429
1430   Property::Map propertyMap;
1431   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1432              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1433
1434   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1435   DALI_TEST_CHECK( visual );
1436
1437   DummyControl actor = DummyControl::New( true );
1438   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1439   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1440
1441   Vector2 controlSize( 20.f, 30.f );
1442   actor.SetProperty( Actor::Property::SIZE, controlSize );
1443
1444   application.GetScene().Add( actor );
1445
1446   application.SendNotification();
1447   application.Render();
1448
1449   Property::Map attributes;
1450   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1451
1452   application.SendNotification();
1453   application.Render();
1454
1455   // Check rendering behavior
1456   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1457   Renderer renderer = actor.GetRendererAt( 0u );
1458   DALI_TEST_CHECK( renderer );
1459   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY );
1460
1461   Window window = DevelWindow::Get( actor );
1462   window.Hide();
1463
1464   application.SendNotification();
1465   application.Render();
1466
1467   // Check rendering behavior again
1468   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED );
1469
1470   END_TEST;
1471 }