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