2fc3dcdd583419ee763bb20e2628f525895761f9
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedVectorImageVisual.cpp
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <iostream>
18 #include <stdlib.h>
19 #include <chrono>
20 #include <thread>
21 #include <dali-toolkit-test-suite-utils.h>
22 #include <toolkit-timer.h>
23 #include <toolkit-event-thread-callback.h>
24 #include <dali-toolkit/dali-toolkit.h>
25 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
26 #include <dali-toolkit/devel-api/controls/control-devel.h>
27 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
28 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
29 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
30 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-signals-devel.h>
31 #include "dummy-control.h"
32
33 using namespace Dali;
34 using namespace Dali::Toolkit;
35
36 void dali_animated_vector_image_visual_startup(void)
37 {
38   test_return_value = TET_UNDEF;
39 }
40
41 void dali_animated_vector_image_visual_cleanup(void)
42 {
43   test_return_value = TET_PASS;
44 }
45
46 namespace
47 {
48
49 const char* TEST_VECTOR_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/insta_camera.json";
50
51 bool gAnimationFinishedSignalFired = false;
52
53 void VisualEventSignal( Control control, Dali::Property::Index visualIndex, Dali::Property::Index signalId )
54 {
55   if( visualIndex == DummyControl::Property::TEST_VISUAL && signalId == DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED )
56   {
57     gAnimationFinishedSignalFired = true;
58   }
59 }
60
61 }
62
63 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void)
64 {
65   ToolkitTestApplication application;
66   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual01: Request animated vector image visual with a json url" );
67
68   VisualFactory factory = VisualFactory::Get();
69   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
70   DALI_TEST_CHECK( visual );
71
72   DummyControl actor = DummyControl::New( true );
73   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
74   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
75   actor.SetSize( 200.0f, 200.0f );
76   Stage::GetCurrent().Add( actor );
77
78   application.SendNotification();
79   application.Render();
80
81   // Wait for resource ready event callback
82   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
83
84   // renderer is added to actor
85   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
86   Renderer renderer = actor.GetRendererAt( 0u );
87   DALI_TEST_CHECK( renderer );
88
89   // Test SetOffStage().
90   actor.Unparent();
91   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
92
93   END_TEST;
94 }
95
96 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void)
97 {
98   ToolkitTestApplication application;
99   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual02: Request animated vector image visual with a Property::Map" );
100
101   Property::Map propertyMap;
102   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
103              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
104
105   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
106   DALI_TEST_CHECK( visual );
107
108   DummyControl actor = DummyControl::New( true );
109   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
110   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
111   actor.SetSize( 200.0f, 200.0f );
112   Stage::GetCurrent().Add( actor );
113
114   application.SendNotification();
115   application.Render();
116
117   // Wait for resource ready event callback
118   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
119
120   // renderer is added to actor
121   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
122   Renderer renderer = actor.GetRendererAt( 0u );
123   DALI_TEST_CHECK( renderer );
124
125   actor.Unparent( );
126   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
127
128   END_TEST;
129 }
130
131 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void)
132 {
133   ToolkitTestApplication application;
134   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" );
135
136   int startFrame = 1, endFrame = 3;
137   Property::Array playRange;
138   playRange.PushBack( startFrame );
139   playRange.PushBack( endFrame );
140
141   Property::Map propertyMap;
142   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
143              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
144              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
145              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
146
147   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
148   DALI_TEST_CHECK( visual );
149
150   DummyControl actor = DummyControl::New( true );
151   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
152   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
153   actor.SetSize( 200.0f, 200.0f );
154   Stage::GetCurrent().Add( actor );
155
156   application.SendNotification();
157   application.Render();
158
159   // Wait for resource ready event callback
160   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
161
162   // renderer is added to actor
163   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
164   Renderer renderer = actor.GetRendererAt( 0u );
165   DALI_TEST_CHECK( renderer );
166
167   actor.Unparent( );
168   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
169
170   END_TEST;
171 }
172
173 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
174 {
175   ToolkitTestApplication application;
176   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
177
178   Property::Map propertyMap;
179   propertyMap.Add( "visualType", DevelVisual::ANIMATED_VECTOR_IMAGE )
180              .Add( "url", TEST_VECTOR_IMAGE_FILE_NAME  )
181              .Add( "loopCount", 3  )
182              .Add( "playRange", Vector2( 0.2f, 0.8f )  );
183
184   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
185   DALI_TEST_CHECK( visual );
186
187   DummyControl actor = DummyControl::New( true );
188   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
189   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
190   actor.SetSize( 200.0f, 200.0f );
191   Stage::GetCurrent().Add( actor );
192
193   application.SendNotification();
194   application.Render();
195
196   // Wait for resource ready event callback
197   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
198
199   // renderer is added to actor
200   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
201   Renderer renderer = actor.GetRendererAt( 0u );
202   DALI_TEST_CHECK( renderer );
203
204   actor.Unparent( );
205   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
206
207   END_TEST;
208 }
209
210 int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
211 {
212   ToolkitTestApplication application;
213   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
214
215   int startFrame = 1, endFrame = 3;
216   Property::Array playRange;
217   playRange.PushBack( startFrame );
218   playRange.PushBack( endFrame );
219
220   Property::Map propertyMap;
221   propertyMap.Add( Toolkit::Visual::Property::TYPE,  DevelVisual::ANIMATED_VECTOR_IMAGE )
222              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
223              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
224              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
225
226   // request AnimatedVectorImageVisual with a property map
227   VisualFactory factory = VisualFactory::Get();
228   Visual::Base visual = factory.CreateVisual( propertyMap );
229
230   Property::Map resultMap;
231   visual.CreatePropertyMap( resultMap );
232
233   // check the property values from the returned map from a visual
234   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
235   DALI_TEST_CHECK( value );
236   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
237
238   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
239   DALI_TEST_CHECK( value );
240   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
241
242   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
243   DALI_TEST_CHECK( value );
244   DALI_TEST_CHECK( value->Get< int >() == 3 );
245
246   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
247   DALI_TEST_CHECK( value );
248
249   Property::Array* result = value->GetArray();
250   DALI_TEST_CHECK( result );
251
252   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
253   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
254
255   // request AnimatedVectorImageVisual with an URL
256   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
257
258   resultMap.Clear();
259   visual2.CreatePropertyMap( resultMap );
260
261   // check the property values from the returned map from a visual
262   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
263   DALI_TEST_CHECK( value );
264   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
265
266   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
267   DALI_TEST_CHECK( value );
268   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
269
270   END_TEST;
271 }
272
273 int UtcDaliAnimatedVectorImageVisualPlayback(void)
274 {
275   ToolkitTestApplication application;
276
277   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
278
279   {
280     // request AnimatedVectorImageVisual with a property map
281     VisualFactory factory = VisualFactory::Get();
282     Visual::Base visual = factory.CreateVisual(
283       Property::Map()
284       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
285       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
286
287     DummyControl dummyControl = DummyControl::New( true );
288     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
289     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
290     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
291
292     Property::Map attributes;
293     tet_infoline( "Test Play action" );
294     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
295
296     Stage::GetCurrent().Add( dummyControl );
297     application.SendNotification();
298     application.Render( 16 );
299
300     std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) );    // wait for one animation loop (16fps, 5frames, need 80ms)
301
302     DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
303
304     Property::Map map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
305     Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
306     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PLAYING ) );
307
308     tet_infoline( "Test Pause action" );
309     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
310
311     application.SendNotification();
312     application.Render(16);
313
314     std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
315
316     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
317     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
318     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PAUSED ) );
319
320     tet_infoline( "Test Play action" );
321     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
322
323     application.SendNotification();
324     application.Render(16);
325
326     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
327     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
328     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PLAYING ) );
329
330     tet_infoline( "Test Stop action" );
331     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
332
333     application.SendNotification();
334     application.Render(16);
335
336     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
337     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
338     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::STOPPED ) );
339
340     tet_infoline( "Test Stop action again" );
341     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
342
343     application.SendNotification();
344     application.Render(16);
345
346     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
347     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
348     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::STOPPED ) );
349
350     tet_infoline( "Test Play action" );
351     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
352
353     application.SendNotification();
354     application.Render(16);
355
356     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
357     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
358     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PLAYING ) );
359
360     tet_infoline( "Off stage" );
361     dummyControl.Unparent();
362
363     application.SendNotification();
364     application.Render(16);
365
366     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
367     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
368     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PAUSED ) );
369
370     tet_infoline( "On stage again" );
371     Stage::GetCurrent().Add( dummyControl );
372
373     application.SendNotification();
374     application.Render(16);
375
376     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
377     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
378     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PAUSED ) );
379
380     tet_infoline( "Test Play action" );
381     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
382
383     application.SendNotification();
384     application.Render(16);
385
386     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
387     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
388     DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PLAYING ) );
389
390     // Change Size
391     Vector3 newSize( 100.0f, 100.0f, 0.0f );
392     dummyControl.SetSize( newSize );
393
394     application.SendNotification();
395     application.Render(16);
396
397     // Size should be changed
398     Vector3 naturalSize = dummyControl.GetNaturalSize();
399     DALI_TEST_CHECK( naturalSize == newSize );
400
401     dummyControl.Unparent();
402   }
403
404   END_TEST;
405 }
406
407 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
408 {
409   ToolkitTestApplication application;
410   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
411
412   VisualFactory factory = VisualFactory::Get();
413   Property::Map properties;
414   Property::Map shader;
415   const std::string vertexShader = "Foobar";
416   const std::string fragmentShader = "Foobar sampler2D Foobar";
417   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
418   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
419
420   properties[Visual::Property::TYPE] = Visual::IMAGE;
421   properties[Visual::Property::SHADER] = shader;
422   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
423
424   Visual::Base visual = factory.CreateVisual( properties );
425
426   // trigger creation through setting on stage
427   DummyControl dummy = DummyControl::New( true );
428   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
429   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
430
431   dummy.SetSize( 200.f, 200.f );
432   dummy.SetParentOrigin( ParentOrigin::CENTER );
433   Stage::GetCurrent().Add( dummy );
434
435   application.SendNotification();
436   application.Render();
437
438   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
439
440   Renderer renderer = dummy.GetRendererAt( 0 );
441   Shader shader2 = renderer.GetShader();
442   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
443   Property::Map* map = value.GetMap();
444   DALI_TEST_CHECK( map );
445
446   std::string resultFragmentShader, resultVertexShader;
447   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
448   fragment->Get( resultFragmentShader );
449   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
450
451   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
452   vertex->Get( resultVertexShader );
453   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
454
455   END_TEST;
456 }
457
458 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
459 {
460   ToolkitTestApplication application;
461   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
462
463   VisualFactory factory = VisualFactory::Get();
464   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
465   DALI_TEST_CHECK( visual );
466
467   DummyControl actor = DummyControl::New( true );
468   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
469   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
470
471   Vector2 controlSize( 20.f, 30.f );
472   Vector2 naturalSize;
473
474   Stage::GetCurrent().Add( actor );
475
476   application.SendNotification();
477   application.Render();
478
479   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
480
481   visual.GetNaturalSize( naturalSize );
482
483   DALI_TEST_EQUALS( naturalSize, Vector2( 100.0f, 100.0f ), TEST_LOCATION );    // 100x100 is the content default size.
484
485   actor.SetSize( controlSize );
486
487   application.SendNotification();
488   application.Render();
489
490   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
491
492   visual.GetNaturalSize( naturalSize );
493
494   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
495
496   END_TEST;
497 }
498
499 int UtcDaliAnimatedVectorImageVisualLoopCount(void)
500 {
501   ToolkitTestApplication application;
502   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopCount" );
503
504   Property::Map propertyMap;
505   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
506              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
507              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
508
509   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
510   DALI_TEST_CHECK( visual );
511
512   DummyControl actor = DummyControl::New( true );
513   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
514   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
515
516   Vector2 controlSize( 20.f, 30.f );
517   actor.SetSize( controlSize );
518
519   Stage::GetCurrent().Add( actor );
520
521   Property::Map attributes;
522   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
523
524   application.SendNotification();
525   application.Render();
526
527   // Trigger count is 2 - resource ready and animation finished
528   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
529
530   // renderer is added to actor
531   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
532   Renderer renderer = actor.GetRendererAt( 0u );
533   DALI_TEST_CHECK( renderer );
534
535   END_TEST;
536 }
537
538 int UtcDaliAnimatedVectorImageVisualPlayRange(void)
539 {
540   ToolkitTestApplication application;
541   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" );
542
543   int startFrame = 3, endFrame = 1;
544   Property::Array array;
545   array.PushBack( startFrame );
546   array.PushBack( endFrame );
547
548   Property::Map propertyMap;
549   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
550              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
551              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
552
553   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
554   DALI_TEST_CHECK( visual );
555
556   DummyControl actor = DummyControl::New( true );
557   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
558   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
559
560   Vector2 controlSize( 20.f, 30.f );
561   actor.SetSize( controlSize );
562
563   Stage::GetCurrent().Add( actor );
564
565   Property::Map attributes;
566   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
567
568   application.SendNotification();
569   application.Render();
570
571   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
572
573   // renderer is added to actor
574   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
575   Renderer renderer = actor.GetRendererAt( 0u );
576   DALI_TEST_CHECK( renderer );
577
578   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
579   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
580
581   int resultStartFrame, resultEndFrame;
582   Property::Array* result = value->GetArray();
583   result->GetElementAt( 0 ).Get( resultStartFrame );
584   result->GetElementAt( 1 ).Get( resultEndFrame );
585
586   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );
587   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
588
589   // Set invalid play range
590   array.Clear();
591   array.PushBack( -1 );
592   array.PushBack( 100 );
593
594   attributes.Clear();
595   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
596   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
597
598   application.SendNotification();
599   application.Render();
600
601   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
602   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
603
604   result = value->GetArray();
605   result->GetElementAt( 0 ).Get( resultStartFrame );
606   result->GetElementAt( 1 ).Get( resultEndFrame );
607
608   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );  // Should not be changed
609   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
610
611   END_TEST;
612 }
613
614 int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void)
615 {
616   ToolkitTestApplication application;
617   tet_infoline( "UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal" );
618
619   Property::Map propertyMap;
620   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
621              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
622              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
623
624   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
625   DALI_TEST_CHECK( visual );
626
627   DummyControl actor = DummyControl::New( true );
628   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
629   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
630
631   DevelControl::VisualEventSignal( actor ).Connect( &VisualEventSignal );
632
633   Vector2 controlSize( 20.f, 30.f );
634   actor.SetSize( controlSize );
635
636   Stage::GetCurrent().Add( actor );
637
638   Property::Map attributes;
639   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
640
641   application.SendNotification();
642   application.Render();
643
644   // Wait for animation finish
645   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
646
647   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
648   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
649   DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::STOPPED ) );
650
651   DALI_TEST_EQUALS( gAnimationFinishedSignalFired, true, TEST_LOCATION );
652
653   END_TEST;
654 }
655
656 int UtcDaliAnimatedVectorImageVisualJumpTo(void)
657 {
658   ToolkitTestApplication application;
659   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpTo" );
660
661   Property::Map propertyMap;
662   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
663              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
664
665   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
666   DALI_TEST_CHECK( visual );
667
668   DummyControl actor = DummyControl::New( true );
669   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
670   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
671
672   Vector2 controlSize( 20.f, 30.f );
673   actor.SetSize( controlSize );
674
675   Stage::GetCurrent().Add( actor );
676
677   application.SendNotification();
678   application.Render();
679
680   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
681
682   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2 );
683
684   application.SendNotification();
685   application.Render();
686
687   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
688   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
689   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
690
691   Property::Array array;
692   array.PushBack( 0 );
693   array.PushBack( 2 );
694
695   Property::Map attributes;
696   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
697   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
698
699   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
700
701   application.SendNotification();
702   application.Render();
703
704   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
705   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
706   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
707
708   // Change play range
709   attributes.Clear();
710   array.Clear();
711
712   array.PushBack( 0 );
713   array.PushBack( 4 );
714
715   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
716   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
717
718   attributes.Clear();
719   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
720
721   application.SendNotification();
722   application.Render();
723
724   // Stop and jump to 3
725   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
726
727   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
728
729   application.SendNotification();
730   application.Render();
731
732   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
733   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
734   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
735
736   END_TEST;
737 }
738
739 int UtcDaliAnimatedVectorImageVisualUpdateProperty(void)
740 {
741   ToolkitTestApplication application;
742   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress" );
743
744   int startFrame = 1, endFrame = 3;
745   Property::Array playRange;
746   playRange.PushBack( startFrame );
747   playRange.PushBack( endFrame );
748
749   Property::Map propertyMap;
750   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
751              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
752              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
753              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
754
755   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
756   DALI_TEST_CHECK( visual );
757
758   DummyControl actor = DummyControl::New( true );
759   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
760   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
761
762   Vector2 controlSize( 20.f, 30.f );
763   actor.SetSize( controlSize );
764
765   Stage::GetCurrent().Add( actor );
766
767   application.SendNotification();
768   application.Render();
769
770   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
771
772   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
773   Property::Value* value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
774   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
775
776   value = map.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
777   DALI_TEST_CHECK( value );
778
779   Property::Array* result = value->GetArray();
780   DALI_TEST_CHECK( result );
781
782   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
783   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
784
785   playRange.Clear();
786   playRange.PushBack( 0 );
787   playRange.PushBack( 2 );
788
789   Property::Map attributes;
790   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
791   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 5 );
792
793   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
794
795   application.SendNotification();
796   application.Render();
797
798   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
799   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
800   DALI_TEST_EQUALS( value->Get< int >(), 5, TEST_LOCATION );
801
802   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
803   result = value->GetArray();
804   DALI_TEST_CHECK( result );
805
806   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == 0 );
807   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == 2 );
808
809   attributes.Clear();
810
811   playRange.Clear();
812   playRange.PushBack( startFrame );
813   playRange.PushBack( endFrame );
814
815   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
816
817   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
818
819   application.SendNotification();
820   application.Render();
821
822   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
823   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
824
825   result = value->GetArray();
826   DALI_TEST_CHECK( result );
827
828   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
829   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
830
831   END_TEST;
832 }