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