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