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