20ee4d786b622e77de4c1fd67cf4366a5bf8d63b
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedVectorImageVisual.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 <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 <dali-toolkit/dali-toolkit.h>
25 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
26 #include <dali-toolkit/devel-api/controls/control-devel.h>
27 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
28 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
29 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
30 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-signals-devel.h>
31 #include "dummy-control.h"
32
33 using namespace Dali;
34 using namespace Dali::Toolkit;
35
36 void dali_animated_vector_image_visual_startup(void)
37 {
38   test_return_value = TET_UNDEF;
39 }
40
41 void dali_animated_vector_image_visual_cleanup(void)
42 {
43   test_return_value = TET_PASS;
44 }
45
46 namespace
47 {
48
49 const char* TEST_VECTOR_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/insta_camera.json";
50
51 bool gAnimationFinishedSignalFired = false;
52
53 void VisualEventSignal( Control control, Dali::Property::Index visualIndex, Dali::Property::Index signalId )
54 {
55   if( visualIndex == DummyControl::Property::TEST_VISUAL && signalId == DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED )
56   {
57     gAnimationFinishedSignalFired = true;
58   }
59 }
60
61 }
62
63 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void)
64 {
65   ToolkitTestApplication application;
66   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual01: Request animated vector image visual with a json url" );
67
68   VisualFactory factory = VisualFactory::Get();
69   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
70   DALI_TEST_CHECK( visual );
71
72   DummyControl actor = DummyControl::New( true );
73   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
74   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
75   actor.SetSize( 200.0f, 200.0f );
76   Stage::GetCurrent().Add( actor );
77
78   application.SendNotification();
79   application.Render();
80
81   // Wait for resource ready event callback
82   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
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 SetOffStage().
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.SetSize( 200.0f, 200.0f );
112   Stage::GetCurrent().Add( actor );
113
114   application.SendNotification();
115   application.Render();
116
117   // Wait for resource ready event callback
118   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
119
120   // renderer is added to actor
121   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
122   Renderer renderer = actor.GetRendererAt( 0u );
123   DALI_TEST_CHECK( renderer );
124
125   actor.Unparent( );
126   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
127
128   END_TEST;
129 }
130
131 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void)
132 {
133   ToolkitTestApplication application;
134   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" );
135
136   int startFrame = 1, endFrame = 3;
137   Property::Array playRange;
138   playRange.PushBack( startFrame );
139   playRange.PushBack( endFrame );
140
141   Property::Map propertyMap;
142   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
143              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
144              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
145              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
146
147   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
148   DALI_TEST_CHECK( visual );
149
150   DummyControl actor = DummyControl::New( true );
151   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
152   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
153   actor.SetSize( 200.0f, 200.0f );
154   Stage::GetCurrent().Add( actor );
155
156   application.SendNotification();
157   application.Render();
158
159   // Wait for resource ready event callback
160   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
161
162   // renderer is added to actor
163   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
164   Renderer renderer = actor.GetRendererAt( 0u );
165   DALI_TEST_CHECK( renderer );
166
167   actor.Unparent( );
168   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
169
170   END_TEST;
171 }
172
173 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
174 {
175   ToolkitTestApplication application;
176   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
177
178   int startFrame = 1, endFrame = 3;
179   Property::Array playRange;
180   playRange.PushBack( startFrame );
181   playRange.PushBack( endFrame );
182
183   Property::Map propertyMap;
184   propertyMap.Add( "visualType", DevelVisual::ANIMATED_VECTOR_IMAGE )
185              .Add( "url", TEST_VECTOR_IMAGE_FILE_NAME )
186              .Add( "loopCount", 3 )
187              .Add( "playRange", playRange )
188              .Add( "stopBehavior", DevelImageVisual::StopBehavior::FIRST_FRAME )
189              .Add( "loopingMode", DevelImageVisual::LoopingMode::AUTO_REVERSE );
190
191   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
192   DALI_TEST_CHECK( visual );
193
194   DummyControl actor = DummyControl::New( true );
195   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
196   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
197   actor.SetSize( 200.0f, 200.0f );
198   Stage::GetCurrent().Add( actor );
199
200   application.SendNotification();
201   application.Render();
202
203   // Wait for resource ready event callback
204   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
205
206   // renderer is added to actor
207   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
208   Renderer renderer = actor.GetRendererAt( 0u );
209   DALI_TEST_CHECK( renderer );
210
211   Property::Map resultMap;
212   visual.CreatePropertyMap( resultMap );
213
214   // check the property values from the returned map from a visual
215   Property::Value* value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
216   DALI_TEST_CHECK( value );
217   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
218
219   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
220   DALI_TEST_CHECK( value );
221   DALI_TEST_CHECK( value->Get< int >() == 3 );
222
223   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
224   DALI_TEST_CHECK( value );
225
226   Property::Array* result = value->GetArray();
227   DALI_TEST_CHECK( result );
228
229   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
230   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
231
232   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
233   DALI_TEST_CHECK( value );
234   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::FIRST_FRAME );
235
236   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
237   DALI_TEST_CHECK( value );
238   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::AUTO_REVERSE );
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   Property::Map resultMap;
267   visual.CreatePropertyMap( resultMap );
268
269   // check the property values from the returned map from a visual
270   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
271   DALI_TEST_CHECK( value );
272   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
273
274   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
275   DALI_TEST_CHECK( value );
276   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
277
278   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
279   DALI_TEST_CHECK( value );
280   DALI_TEST_CHECK( value->Get< int >() == 3 );
281
282   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
283   DALI_TEST_CHECK( value );
284
285   Property::Array* result = value->GetArray();
286   DALI_TEST_CHECK( result );
287
288   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
289   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
290
291   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
292   DALI_TEST_CHECK( value );
293   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::CURRENT_FRAME );
294
295   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
296   DALI_TEST_CHECK( value );
297   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::RESTART );
298
299   // request AnimatedVectorImageVisual with an URL
300   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
301
302   resultMap.Clear();
303   visual2.CreatePropertyMap( resultMap );
304
305   // check the property values from the returned map from a visual
306   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
307   DALI_TEST_CHECK( value );
308   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
309
310   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
311   DALI_TEST_CHECK( value );
312   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
313
314   END_TEST;
315 }
316
317 int UtcDaliAnimatedVectorImageVisualPlayback(void)
318 {
319   ToolkitTestApplication application;
320
321   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
322
323   {
324     // request AnimatedVectorImageVisual with a property map
325     VisualFactory factory = VisualFactory::Get();
326     Visual::Base visual = factory.CreateVisual(
327       Property::Map()
328       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
329       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
330
331     DummyControl dummyControl = DummyControl::New( true );
332     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
333     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
334     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
335
336     Property::Map attributes;
337     tet_infoline( "Test Play action" );
338     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
339
340     Stage::GetCurrent().Add( dummyControl );
341     application.SendNotification();
342     application.Render( 16 );
343
344     std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) );    // wait for one animation loop (16fps, 5frames, need 80ms)
345
346     DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
347
348     Property::Map map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
349     Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
350     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
351
352     tet_infoline( "Test Pause action" );
353     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
354
355     application.SendNotification();
356     application.Render(16);
357
358     std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
359
360     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
361     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
362     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED );
363
364     tet_infoline( "Test Play action" );
365     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
366
367     application.SendNotification();
368     application.Render(16);
369
370     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
371     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
372     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
373
374     tet_infoline( "Test Stop action" );
375     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
376
377     application.SendNotification();
378     application.Render(16);
379
380     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
381     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
382     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
383
384     tet_infoline( "Test Stop action again" );
385     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
386
387     application.SendNotification();
388     application.Render(16);
389
390     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
391     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
392     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
393
394     tet_infoline( "Test Play action" );
395     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
396
397     application.SendNotification();
398     application.Render(16);
399
400     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
401     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
402     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
403
404     tet_infoline( "Off stage" );
405     dummyControl.Unparent();
406
407     application.SendNotification();
408     application.Render(16);
409
410     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
411     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
412     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED );
413
414     tet_infoline( "On stage again" );
415     Stage::GetCurrent().Add( dummyControl );
416
417     application.SendNotification();
418     application.Render(16);
419
420     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
421     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
422     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED );
423
424     tet_infoline( "Test Play action" );
425     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
426
427     application.SendNotification();
428     application.Render(16);
429
430     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
431     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
432     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
433
434     // Change Size
435     Vector3 newSize( 100.0f, 100.0f, 0.0f );
436     dummyControl.SetSize( newSize );
437
438     application.SendNotification();
439     application.Render(16);
440
441     // Size should be changed
442     Vector3 naturalSize = dummyControl.GetNaturalSize();
443     DALI_TEST_CHECK( naturalSize == newSize );
444
445     dummyControl.Unparent();
446   }
447
448   END_TEST;
449 }
450
451 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
452 {
453   ToolkitTestApplication application;
454   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
455
456   VisualFactory factory = VisualFactory::Get();
457   Property::Map properties;
458   Property::Map shader;
459   const std::string vertexShader = "Foobar";
460   const std::string fragmentShader = "Foobar sampler2D Foobar";
461   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
462   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
463
464   properties[Visual::Property::TYPE] = Visual::IMAGE;
465   properties[Visual::Property::SHADER] = shader;
466   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
467
468   Visual::Base visual = factory.CreateVisual( properties );
469
470   // trigger creation through setting on stage
471   DummyControl dummy = DummyControl::New( true );
472   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
473   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
474
475   dummy.SetSize( 200.f, 200.f );
476   dummy.SetParentOrigin( ParentOrigin::CENTER );
477   Stage::GetCurrent().Add( dummy );
478
479   application.SendNotification();
480   application.Render();
481
482   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
483
484   Renderer renderer = dummy.GetRendererAt( 0 );
485   Shader shader2 = renderer.GetShader();
486   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
487   Property::Map* map = value.GetMap();
488   DALI_TEST_CHECK( map );
489
490   std::string resultFragmentShader, resultVertexShader;
491   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
492   fragment->Get( resultFragmentShader );
493   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
494
495   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
496   vertex->Get( resultVertexShader );
497   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
498
499   END_TEST;
500 }
501
502 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
503 {
504   ToolkitTestApplication application;
505   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
506
507   VisualFactory factory = VisualFactory::Get();
508   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
509   DALI_TEST_CHECK( visual );
510
511   DummyControl actor = DummyControl::New( true );
512   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
513   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
514
515   Vector2 controlSize( 20.f, 30.f );
516   Vector2 naturalSize;
517
518   Stage::GetCurrent().Add( actor );
519
520   application.SendNotification();
521   application.Render();
522
523   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
524
525   visual.GetNaturalSize( naturalSize );
526
527   DALI_TEST_EQUALS( naturalSize, Vector2( 100.0f, 100.0f ), TEST_LOCATION );    // 100x100 is the content default size.
528
529   actor.SetSize( controlSize );
530
531   application.SendNotification();
532   application.Render();
533
534   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
535
536   visual.GetNaturalSize( naturalSize );
537
538   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
539
540   END_TEST;
541 }
542
543 int UtcDaliAnimatedVectorImageVisualLoopCount(void)
544 {
545   ToolkitTestApplication application;
546   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopCount" );
547
548   Property::Map propertyMap;
549   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
550              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
551              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
552
553   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
554   DALI_TEST_CHECK( visual );
555
556   DummyControl actor = DummyControl::New( true );
557   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
558   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
559
560   Vector2 controlSize( 20.f, 30.f );
561   actor.SetSize( controlSize );
562
563   Stage::GetCurrent().Add( actor );
564
565   Property::Map attributes;
566   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
567
568   application.SendNotification();
569   application.Render();
570
571   // Trigger count is 2 - resource ready and animation finished
572   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
573
574   // renderer is added to actor
575   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
576   Renderer renderer = actor.GetRendererAt( 0u );
577   DALI_TEST_CHECK( renderer );
578
579   END_TEST;
580 }
581
582 int UtcDaliAnimatedVectorImageVisualPlayRange(void)
583 {
584   ToolkitTestApplication application;
585   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" );
586
587   int startFrame = 3, endFrame = 1;
588   Property::Array array;
589   array.PushBack( startFrame );
590   array.PushBack( endFrame );
591
592   Property::Map propertyMap;
593   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
594              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
595              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
596
597   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
598   DALI_TEST_CHECK( visual );
599
600   DummyControl actor = DummyControl::New( true );
601   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
602   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
603
604   Vector2 controlSize( 20.f, 30.f );
605   actor.SetSize( controlSize );
606
607   Stage::GetCurrent().Add( actor );
608
609   Property::Map attributes;
610   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
611
612   application.SendNotification();
613   application.Render();
614
615   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
616
617   // renderer is added to actor
618   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
619   Renderer renderer = actor.GetRendererAt( 0u );
620   DALI_TEST_CHECK( renderer );
621
622   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
623   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
624
625   int resultStartFrame, resultEndFrame;
626   Property::Array* result = value->GetArray();
627   result->GetElementAt( 0 ).Get( resultStartFrame );
628   result->GetElementAt( 1 ).Get( resultEndFrame );
629
630   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );
631   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
632
633   // Set invalid play range
634   array.Clear();
635   array.PushBack( -1 );
636   array.PushBack( 100 );
637
638   attributes.Clear();
639   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
640   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
641
642   application.SendNotification();
643   application.Render();
644
645   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
646   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
647
648   result = value->GetArray();
649   result->GetElementAt( 0 ).Get( resultStartFrame );
650   result->GetElementAt( 1 ).Get( resultEndFrame );
651
652   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );  // Should not be changed
653   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
654
655   END_TEST;
656 }
657
658 int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void)
659 {
660   ToolkitTestApplication application;
661   tet_infoline( "UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal" );
662
663   Property::Map propertyMap;
664   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
665              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
666              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
667
668   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
669   DALI_TEST_CHECK( visual );
670
671   DummyControl actor = DummyControl::New( true );
672   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
673   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
674
675   DevelControl::VisualEventSignal( actor ).Connect( &VisualEventSignal );
676
677   Vector2 controlSize( 20.f, 30.f );
678   actor.SetSize( controlSize );
679
680   Stage::GetCurrent().Add( actor );
681
682   Property::Map attributes;
683   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
684
685   application.SendNotification();
686   application.Render();
687
688   // Wait for animation finish
689   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
690
691   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
692   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
693   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
694
695   DALI_TEST_EQUALS( gAnimationFinishedSignalFired, true, TEST_LOCATION );
696
697   END_TEST;
698 }
699
700 int UtcDaliAnimatedVectorImageVisualJumpTo(void)
701 {
702   ToolkitTestApplication application;
703   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpTo" );
704
705   Property::Map propertyMap;
706   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
707              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
708
709   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
710   DALI_TEST_CHECK( visual );
711
712   DummyControl actor = DummyControl::New( true );
713   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
714   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
715
716   Vector2 controlSize( 20.f, 30.f );
717   actor.SetSize( controlSize );
718
719   Stage::GetCurrent().Add( actor );
720
721   application.SendNotification();
722   application.Render();
723
724   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
725
726   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2 );
727
728   application.SendNotification();
729   application.Render();
730
731   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
732   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
733   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
734
735   Property::Array array;
736   array.PushBack( 0 );
737   array.PushBack( 2 );
738
739   Property::Map attributes;
740   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
741   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
742
743   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
744
745   application.SendNotification();
746   application.Render();
747
748   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
749   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
750   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
751
752   // Change play range
753   attributes.Clear();
754   array.Clear();
755
756   array.PushBack( 0 );
757   array.PushBack( 4 );
758
759   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
760   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
761
762   attributes.Clear();
763   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
764
765   application.SendNotification();
766   application.Render();
767
768   // Stop and jump to 3
769   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
770
771   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
772
773   application.SendNotification();
774   application.Render();
775
776   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
777   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
778   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
779
780   END_TEST;
781 }
782
783 int UtcDaliAnimatedVectorImageVisualUpdateProperty(void)
784 {
785   ToolkitTestApplication application;
786   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress" );
787
788   int startFrame = 1, endFrame = 3;
789   Property::Array playRange;
790   playRange.PushBack( startFrame );
791   playRange.PushBack( endFrame );
792
793   Property::Map propertyMap;
794   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
795              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
796              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
797              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
798
799   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
800   DALI_TEST_CHECK( visual );
801
802   DummyControl actor = DummyControl::New( true );
803   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
804   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
805
806   Vector2 controlSize( 20.f, 30.f );
807   actor.SetSize( controlSize );
808
809   Stage::GetCurrent().Add( actor );
810
811   application.SendNotification();
812   application.Render();
813
814   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
815
816   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
817   Property::Value* value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
818   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
819
820   value = map.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
821   DALI_TEST_CHECK( value );
822
823   Property::Array* result = value->GetArray();
824   DALI_TEST_CHECK( result );
825
826   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
827   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
828
829   playRange.Clear();
830   playRange.PushBack( 0 );
831   playRange.PushBack( 2 );
832
833   Property::Map attributes;
834   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
835   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 5 );
836
837   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
838
839   application.SendNotification();
840   application.Render();
841
842   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
843   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
844   DALI_TEST_EQUALS( value->Get< int >(), 5, TEST_LOCATION );
845
846   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
847   result = value->GetArray();
848   DALI_TEST_CHECK( result );
849
850   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == 0 );
851   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == 2 );
852
853   attributes.Clear();
854
855   playRange.Clear();
856   playRange.PushBack( startFrame );
857   playRange.PushBack( endFrame );
858
859   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
860
861   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
862
863   application.SendNotification();
864   application.Render();
865
866   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
867   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
868
869   result = value->GetArray();
870   DALI_TEST_CHECK( result );
871
872   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
873   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
874
875   END_TEST;
876 }
877
878 int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
879 {
880   ToolkitTestApplication application;
881   tet_infoline( "UtcDaliAnimatedVectorImageVisualStopBehavior" );
882
883   Property::Map propertyMap;
884   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
885              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
886              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
887              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME );
888
889   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
890   DALI_TEST_CHECK( visual );
891
892   DummyControl actor = DummyControl::New( true );
893   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
894   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
895
896   Vector2 controlSize( 20.f, 30.f );
897   actor.SetSize( controlSize );
898
899   Stage::GetCurrent().Add( actor );
900
901   Property::Map attributes;
902   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
903
904   application.SendNotification();
905   application.Render();
906
907   // Trigger count is 2 - resource ready and animation finished
908   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
909
910   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
911   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
912   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
913
914   // Change stop behavior
915   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
916
917   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
918
919   attributes.Clear();
920
921   // Play again
922   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
923
924   application.SendNotification();
925   application.Render();
926
927   // Trigger count is 1 - animation finished
928   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
929
930   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
931
932   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
933   int totalFrameNumber = value1->Get< int >();
934
935   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
936   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
937
938   // Change stop behavior
939   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
940   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, -1 );
941
942   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
943
944   attributes.Clear();
945
946   // Play again
947   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
948
949   application.SendNotification();
950   application.Render();
951
952   // Pause
953   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
954
955   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
956   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
957   int currentFrameNumber = value->Get< int >();
958
959   // Stop
960   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
961
962   // Trigger count is 1 - animation finished
963   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
964
965   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
966   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
967   DALI_TEST_EQUALS( value->Get< int >(), currentFrameNumber, TEST_LOCATION );  // Should be same with currentFrameNumber
968
969   END_TEST;
970 }
971
972 int UtcDaliAnimatedVectorImageVisualLoopingMode(void)
973 {
974   ToolkitTestApplication application;
975   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopingMode" );
976
977   Property::Map propertyMap;
978   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
979              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
980              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
981              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME )
982              .Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::AUTO_REVERSE );
983
984   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
985   DALI_TEST_CHECK( visual );
986
987   DummyControl actor = DummyControl::New( true );
988   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
989   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
990
991   Vector2 controlSize( 20.f, 30.f );
992   actor.SetSize( controlSize );
993
994   Stage::GetCurrent().Add( actor );
995
996   Property::Map attributes;
997   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
998
999   application.SendNotification();
1000   application.Render();
1001
1002   // Trigger count is 2 - resource ready and animation finished
1003   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1004
1005   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1006   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1007   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame because of auto reverse
1008
1009   // Change stop behavior
1010   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1011
1012   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1013
1014   // Play again
1015   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1016
1017   application.SendNotification();
1018   application.Render();
1019
1020   // Trigger count is 1 - animation finished
1021   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1022
1023   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1024   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1025   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1026
1027   // Change looping mode
1028   attributes.Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::RESTART );
1029
1030   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1031
1032   // Play again
1033   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1034
1035   application.SendNotification();
1036   application.Render();
1037
1038   // Trigger count is 1 - animation finished
1039   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1040
1041   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1042   int totalFrameNumber = value1->Get< int >();
1043
1044   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1045   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1046   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1047
1048   END_TEST;
1049 }