Merge "Fix to use world color for the Fade Transition." into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedVectorImageVisual.cpp
1 /*
2  * Copyright (c) 2021 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 <toolkit-vector-animation-renderer.h>
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
27 #include <dali-toolkit/devel-api/controls/control-devel.h>
28 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
30 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
31 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-signals-devel.h>
32 #include <dali/devel-api/rendering/renderer-devel.h>
33 #include <dali/devel-api/adaptor-framework/window-devel.h>
34 #include "dummy-control.h"
35
36 using namespace Dali;
37 using namespace Dali::Toolkit;
38
39 void dali_animated_vector_image_visual_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void dali_animated_vector_image_visual_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 namespace
50 {
51
52 const char* TEST_VECTOR_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/insta_camera.json";
53 const char* TEST_VECTOR_IMAGE_FILE_NAME_FRAME_DROP = "framedrop.json";
54 const char* TEST_VECTOR_IMAGE_INVALID_FILE_NAME =  "invalid.json";
55
56 bool gAnimationFinishedSignalFired = false;
57
58 void VisualEventSignal( Control control, Dali::Property::Index visualIndex, Dali::Property::Index signalId )
59 {
60   if( visualIndex == DummyControl::Property::TEST_VISUAL && signalId == DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED )
61   {
62     gAnimationFinishedSignalFired = true;
63   }
64 }
65
66 }
67
68 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void)
69 {
70   ToolkitTestApplication application;
71   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual01: Request animated vector image visual with a json url" );
72
73   VisualFactory factory = VisualFactory::Get();
74   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
75   DALI_TEST_CHECK( visual );
76
77   DummyControl actor = DummyControl::New( true );
78   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
79   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
80   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
81   application.GetScene().Add( actor );
82
83   application.SendNotification();
84   application.Render();
85
86   // renderer is added to actor
87   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
88   Renderer renderer = actor.GetRendererAt( 0u );
89   DALI_TEST_CHECK( renderer );
90
91   // Test SetOffScene().
92   actor.Unparent();
93   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
94
95   END_TEST;
96 }
97
98 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void)
99 {
100   ToolkitTestApplication application;
101   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual02: Request animated vector image visual with a Property::Map" );
102
103   Property::Map propertyMap;
104   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
105              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
106
107   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
108   DALI_TEST_CHECK( visual );
109
110   DummyControl actor = DummyControl::New( true );
111   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
112   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
113   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
114   application.GetScene().Add( actor );
115
116   application.SendNotification();
117   application.Render();
118
119   // renderer is added to actor
120   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
121   Renderer renderer = actor.GetRendererAt( 0u );
122   DALI_TEST_CHECK( renderer );
123
124   actor.Unparent( );
125   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
126
127   END_TEST;
128 }
129
130 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void)
131 {
132   ToolkitTestApplication application;
133   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" );
134
135   int startFrame = 1, endFrame = 3;
136   Property::Array playRange;
137   playRange.PushBack( startFrame );
138   playRange.PushBack( endFrame );
139
140   Property::Map propertyMap;
141   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
142              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
143              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
144              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  )
145              .Add( DevelVisual::Property::CORNER_RADIUS, 50.0f )
146              .Add( DevelVisual::Property::BORDERLINE_WIDTH, 20.0f );
147
148   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
149   DALI_TEST_CHECK( visual );
150
151   DummyControl actor = DummyControl::New( true );
152   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
153   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
154   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
155   application.GetScene().Add( actor );
156
157   application.SendNotification();
158   application.Render();
159
160   // renderer is added to actor
161   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
162   Renderer renderer = actor.GetRendererAt( 0u );
163   DALI_TEST_CHECK( renderer );
164
165   actor.Unparent( );
166   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
167
168   END_TEST;
169 }
170
171 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
172 {
173   ToolkitTestApplication application;
174   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
175
176   int startFrame = 1, endFrame = 3;
177   float cornerRadius = 22.0f;
178   float borderlineWidth = 2.0f;
179   Vector4 borderlineColor = Vector4(1.0f, 1.0f, 1.0f, 1.0f);
180   float borderlineOffset = 0.1f;
181   Property::Array playRange;
182   playRange.PushBack( startFrame );
183   playRange.PushBack( endFrame );
184
185   Property::Map propertyMap;
186   propertyMap.Add( "visualType", DevelVisual::ANIMATED_VECTOR_IMAGE )
187              .Add( "url", TEST_VECTOR_IMAGE_FILE_NAME )
188              .Add( "loopCount", 3 )
189              .Add( "playRange", playRange )
190              .Add( "stopBehavior", DevelImageVisual::StopBehavior::FIRST_FRAME )
191              .Add( "loopingMode", DevelImageVisual::LoopingMode::AUTO_REVERSE )
192              .Add( "redrawInScalingDown", false )
193              .Add( "cornerRadius", cornerRadius )
194              .Add( "borderlineWidth", borderlineWidth )
195              .Add( "borderlineColor", borderlineColor )
196              .Add( "borderlineOffset", borderlineOffset );
197
198   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
199   DALI_TEST_CHECK( visual );
200
201   DummyControl actor = DummyControl::New( true );
202   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
203   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
204   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
205   application.GetScene().Add( actor );
206
207   application.SendNotification();
208   application.Render();
209
210   // Trigger count is 1 - render a frame
211   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
212
213   // renderer is added to actor
214   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
215
216   Renderer renderer = actor.GetRendererAt( 0u );
217   DALI_TEST_CHECK( renderer );
218
219   Property::Map resultMap;
220   visual.CreatePropertyMap( resultMap );
221
222   // check the property values from the returned map from a visual
223   Property::Value* value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
224   DALI_TEST_CHECK( value );
225   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
226
227   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
228   DALI_TEST_CHECK( value );
229   DALI_TEST_CHECK( value->Get< int >() == 3 );
230
231   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
232   DALI_TEST_CHECK( value );
233
234   Property::Array* result = value->GetArray();
235   DALI_TEST_CHECK( result );
236
237   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
238   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
239
240   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
241   DALI_TEST_CHECK( value );
242   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::FIRST_FRAME );
243
244   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
245   DALI_TEST_CHECK( value );
246   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::AUTO_REVERSE );
247
248   value = resultMap.Find( DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, Property::BOOLEAN );
249   DALI_TEST_CHECK( value );
250   DALI_TEST_CHECK( value->Get< bool >() == false );
251
252   value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4 );
253   DALI_TEST_CHECK( value );
254   DALI_TEST_EQUALS( value->Get< Vector4 >(), Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius), TEST_LOCATION );
255
256   value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy" );
257   DALI_TEST_CHECK( value );
258   DALI_TEST_CHECK( value->Get< int >() == Visual::Transform::Policy::ABSOLUTE );
259
260   value = resultMap.Find( DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT );
261   DALI_TEST_CHECK( value );
262   DALI_TEST_EQUALS( value->Get< float >(), borderlineWidth, TEST_LOCATION );
263
264   value = resultMap.Find( DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4 );
265   DALI_TEST_CHECK( value );
266   DALI_TEST_EQUALS( value->Get< Vector4 >(), borderlineColor, TEST_LOCATION );
267
268   value = resultMap.Find( DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT );
269   DALI_TEST_CHECK( value );
270   DALI_TEST_EQUALS( value->Get< float >(), borderlineOffset, TEST_LOCATION );
271
272   actor.Unparent( );
273   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
274
275   END_TEST;
276 }
277
278 int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
279 {
280   ToolkitTestApplication application;
281   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
282
283   int startFrame = 1, endFrame = 3;
284   Vector4 cornerRadius(50.0f, 22.0f, 0.0f, 3.0f);
285   float borderlineWidth = 2.3f;
286   Vector4 borderlineColor = Vector4(0.3f, 0.3f, 1.0f, 1.0f);
287   float borderlineOffset = 0.3f;
288   Property::Array playRange;
289   playRange.PushBack( startFrame );
290   playRange.PushBack( endFrame );
291
292   Property::Map propertyMap;
293   propertyMap.Add( Toolkit::Visual::Property::TYPE,  DevelVisual::ANIMATED_VECTOR_IMAGE )
294              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
295              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
296              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange )
297              .Add( DevelVisual::Property::CORNER_RADIUS, cornerRadius )
298              .Add( DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::RELATIVE)
299              .Add( DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth )
300              .Add( DevelVisual::Property::BORDERLINE_COLOR, borderlineColor )
301              .Add( DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset );
302
303   // request AnimatedVectorImageVisual with a property map
304   VisualFactory factory = VisualFactory::Get();
305   Visual::Base visual = factory.CreateVisual( propertyMap );
306
307   DummyControl actor = DummyControl::New( true );
308   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
309   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
310
311   Vector2 controlSize( 20.f, 30.f );
312   actor.SetProperty( Actor::Property::SIZE, controlSize );
313
314   application.GetScene().Add( actor );
315
316   application.SendNotification();
317   application.Render();
318
319   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
320
321   Property::Map resultMap;
322   resultMap = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
323
324   // check the property values from the returned map from a visual
325   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
326   DALI_TEST_CHECK( value );
327   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
328
329   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
330   DALI_TEST_CHECK( value );
331   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
332
333   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
334   DALI_TEST_CHECK( value );
335   DALI_TEST_CHECK( value->Get< int >() == 3 );
336
337   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
338   DALI_TEST_CHECK( value );
339
340   Property::Array* result = value->GetArray();
341   DALI_TEST_CHECK( result );
342
343   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
344   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
345
346   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
347   DALI_TEST_CHECK( value );
348   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::CURRENT_FRAME );
349
350   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
351   DALI_TEST_CHECK( value );
352   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::RESTART );
353
354   value = resultMap.Find( DevelImageVisual::Property::CONTENT_INFO, Property::MAP );
355   DALI_TEST_CHECK( value );
356
357   value = resultMap.Find( DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, Property::BOOLEAN );
358   DALI_TEST_CHECK( value );
359   DALI_TEST_CHECK( value->Get< bool >() == true );    // Check default value
360
361   value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4 );
362   DALI_TEST_CHECK( value );
363   DALI_TEST_EQUALS( value->Get< Vector4 >(), cornerRadius, TEST_LOCATION );
364
365   value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy" );
366   DALI_TEST_CHECK( value );
367   DALI_TEST_CHECK( value->Get< int >() == Visual::Transform::Policy::RELATIVE );
368
369   value = resultMap.Find( DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth" );
370   DALI_TEST_CHECK( value );
371   DALI_TEST_EQUALS( value->Get< float >(), borderlineWidth, TEST_LOCATION );
372
373   value = resultMap.Find( DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4 );
374   DALI_TEST_CHECK( value );
375   DALI_TEST_EQUALS( value->Get< Vector4 >(), borderlineColor, TEST_LOCATION );
376
377   value = resultMap.Find( DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT );
378   DALI_TEST_CHECK( value );
379   DALI_TEST_EQUALS( value->Get< float >(), borderlineOffset, TEST_LOCATION );
380
381   // request AnimatedVectorImageVisual with an URL
382   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
383
384   resultMap.Clear();
385   visual2.CreatePropertyMap( resultMap );
386
387   // check the property values from the returned map from a visual
388   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
389   DALI_TEST_CHECK( value );
390   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
391
392   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
393   DALI_TEST_CHECK( value );
394   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
395
396   END_TEST;
397 }
398
399 int UtcDaliAnimatedVectorImageVisualPlayback(void)
400 {
401   ToolkitTestApplication application;
402
403   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
404
405   {
406     // request AnimatedVectorImageVisual with a property map
407     VisualFactory factory = VisualFactory::Get();
408     Visual::Base visual = factory.CreateVisual(
409       Property::Map()
410       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
411       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
412
413     DummyControl dummyControl = DummyControl::New( true );
414     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
415     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
416     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
417
418     Property::Map attributes;
419     tet_infoline( "Test Play action" );
420     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
421
422     application.GetScene().Add( dummyControl );
423     application.SendNotification();
424     application.Render( 16 );
425
426     Property::Map map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
427     Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
428     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
429
430     tet_infoline( "Test Pause action" );
431     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
432
433     application.SendNotification();
434     application.Render(16);
435
436     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
437     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
438     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED );
439
440     tet_infoline( "Test Play action" );
441     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
442
443     application.SendNotification();
444     application.Render(16);
445
446     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
447     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
448     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
449
450     tet_infoline( "Test Stop action" );
451     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
452
453     application.SendNotification();
454     application.Render(16);
455
456     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
457     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
458     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
459
460     tet_infoline( "Test Stop action again" );
461     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
462
463     application.SendNotification();
464     application.Render(16);
465
466     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
467     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
468     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
469
470     tet_infoline( "Test Play action" );
471     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
472
473     application.SendNotification();
474     application.Render(16);
475
476     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
477     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
478     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
479
480     tet_infoline( "Off stage" );
481     dummyControl.Unparent();
482
483     application.SendNotification();
484     application.Render(16);
485
486     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
487     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
488     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
489
490     tet_infoline( "On stage again" );
491     application.GetScene().Add( dummyControl );
492
493     application.SendNotification();
494     application.Render(16);
495
496     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
497     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
498     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
499
500     tet_infoline( "Test Play action" );
501     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
502
503     application.SendNotification();
504     application.Render(16);
505
506     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
507     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
508     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
509
510     // Change Size
511     Vector3 newSize( 100.0f, 100.0f, 0.0f );
512     dummyControl.SetProperty( Actor::Property::SIZE, newSize );
513
514     application.SendNotification();
515     application.Render(16);
516
517     // Size should be changed
518     Vector3 naturalSize = dummyControl.GetNaturalSize();
519     DALI_TEST_CHECK( naturalSize == newSize );
520
521     dummyControl.Unparent();
522   }
523
524   END_TEST;
525 }
526
527 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
528 {
529   ToolkitTestApplication application;
530   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
531
532   VisualFactory factory = VisualFactory::Get();
533   Property::Map properties;
534   Property::Map shader;
535   const std::string vertexShader = "Foobar";
536   const std::string fragmentShader = "Foobar sampler2D Foobar";
537   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
538   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
539
540   properties[Visual::Property::TYPE] = Visual::IMAGE;
541   properties[Visual::Property::SHADER] = shader;
542   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
543
544   Visual::Base visual = factory.CreateVisual( properties );
545
546   // trigger creation through setting on stage
547   DummyControl dummy = DummyControl::New( true );
548   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
549   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
550
551   dummy.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
552   dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
553   application.GetScene().Add( dummy );
554
555   application.SendNotification();
556   application.Render();
557
558   Renderer renderer = dummy.GetRendererAt( 0 );
559   Shader shader2 = renderer.GetShader();
560   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
561   Property::Map* map = value.GetMap();
562   DALI_TEST_CHECK( map );
563
564   std::string resultFragmentShader, resultVertexShader;
565   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
566   fragment->Get( resultFragmentShader );
567   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
568
569   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
570   vertex->Get( resultVertexShader );
571   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
572
573   END_TEST;
574 }
575
576 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
577 {
578   ToolkitTestApplication application;
579   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
580
581   VisualFactory factory = VisualFactory::Get();
582   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
583   DALI_TEST_CHECK( visual );
584
585   DummyControl actor = DummyControl::New( true );
586   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
587   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
588
589   Vector2 controlSize( 20.f, 30.f );
590   Vector2 naturalSize;
591
592   application.GetScene().Add( actor );
593
594   application.SendNotification();
595   application.Render();
596
597   visual.GetNaturalSize( naturalSize );
598
599   DALI_TEST_EQUALS( naturalSize, Vector2( 100.0f, 100.0f ), TEST_LOCATION );    // 100x100 is the content default size.
600
601   actor.SetProperty( Actor::Property::SIZE, controlSize );
602
603   application.SendNotification();
604   application.Render();
605
606   visual.GetNaturalSize( naturalSize );
607
608   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
609
610   END_TEST;
611 }
612
613 int UtcDaliAnimatedVectorImageVisualLoopCount(void)
614 {
615   ToolkitTestApplication application;
616   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopCount" );
617
618   Property::Map propertyMap;
619   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
620              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
621              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
622
623   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
624   DALI_TEST_CHECK( visual );
625
626   DummyControl actor = DummyControl::New( true );
627   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
628   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
629
630   Vector2 controlSize( 20.f, 30.f );
631   actor.SetProperty( Actor::Property::SIZE, controlSize );
632
633   application.GetScene().Add( actor );
634
635   Property::Map attributes;
636   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
637
638   application.SendNotification();
639   application.Render();
640
641   // Trigger count is 1 - render a frame
642   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
643
644   // renderer is added to actor
645   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
646   Renderer renderer = actor.GetRendererAt( 0u );
647   DALI_TEST_CHECK( renderer );
648
649   END_TEST;
650 }
651
652 int UtcDaliAnimatedVectorImageVisualPlayRange(void)
653 {
654   ToolkitTestApplication application;
655   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" );
656
657   int startFrame = 1, endFrame = 3;
658   Property::Array array;
659   array.PushBack( endFrame );
660   array.PushBack( startFrame );
661
662   Property::Map propertyMap;
663   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
664              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
665              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
666
667   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
668   DALI_TEST_CHECK( visual );
669
670   DummyControl actor = DummyControl::New( true );
671   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
672   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
673
674   Vector2 controlSize( 20.f, 30.f );
675   actor.SetProperty( Actor::Property::SIZE, controlSize );
676
677   application.GetScene().Add( actor );
678
679   Property::Map attributes;
680   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
681
682   application.SendNotification();
683   application.Render();
684
685   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
686
687   // renderer is added to actor
688   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
689   Renderer renderer = actor.GetRendererAt( 0u );
690   DALI_TEST_CHECK( renderer );
691
692   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
693   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
694
695   int resultStartFrame, resultEndFrame;
696   Property::Array* result = value->GetArray();
697   result->GetElementAt( 0 ).Get( resultStartFrame );
698   result->GetElementAt( 1 ).Get( resultEndFrame );
699
700   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );
701   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
702
703   // Set invalid play range
704   array.Clear();
705   array.PushBack( 1 );
706   array.PushBack( 100 );
707
708   attributes.Clear();
709   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
710   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
711
712   application.SendNotification();
713   application.Render();
714
715   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
716
717   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
718   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
719
720   result = value->GetArray();
721   result->GetElementAt( 0 ).Get( resultStartFrame );
722   result->GetElementAt( 1 ).Get( resultEndFrame );
723
724   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );  // Should not be changed
725   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
726
727   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, Property::Map() );
728
729   application.SendNotification();
730   application.Render();
731
732   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
733
734   application.SendNotification();
735   application.Render();
736
737   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
738
739   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
740   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
741   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
742
743   array.Clear();
744   array.PushBack( 0 );
745   array.PushBack( 2 );
746
747   attributes.Clear();
748   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
749   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
750
751   application.SendNotification();
752   application.Render();
753
754   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
755
756   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
757   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
758
759   result = value->GetArray();
760   result->GetElementAt( 0 ).Get( resultStartFrame );
761   result->GetElementAt( 1 ).Get( resultEndFrame );
762
763   DALI_TEST_EQUALS( 0, resultStartFrame, TEST_LOCATION );
764   DALI_TEST_EQUALS( 2, resultEndFrame, TEST_LOCATION );
765
766   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
767   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );    // CURRENT_FRAME_NUMBER should be changed also.
768
769   END_TEST;
770 }
771
772 int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void)
773 {
774   ToolkitTestApplication application;
775   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRangeMarker" );
776
777   Property::Array array;
778   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
779
780   Property::Map propertyMap;
781   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
782              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
783              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
784
785   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
786   DALI_TEST_CHECK( visual );
787
788   DummyControl actor = DummyControl::New( true );
789   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
790   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
791
792   Vector2 controlSize( 20.f, 30.f );
793   actor.SetProperty( Actor::Property::SIZE, controlSize );
794
795   application.GetScene().Add( actor );
796
797   Property::Map attributes;
798   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
799
800   application.SendNotification();
801   application.Render();
802
803   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
804
805   // renderer is added to actor
806   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
807   Renderer renderer = actor.GetRendererAt( 0u );
808   DALI_TEST_CHECK( renderer );
809
810   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
811   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
812
813   int resultStartFrame, resultEndFrame;
814   Property::Array* result = value->GetArray();
815   result->GetElementAt( 0 ).Get( resultStartFrame );
816   result->GetElementAt( 1 ).Get( resultEndFrame );
817
818   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );
819   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_1, resultEndFrame, TEST_LOCATION );
820
821   // Set 2 markers
822   array.Clear();
823   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
824   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_2 );
825
826   attributes.Clear();
827   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
828   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
829
830   application.SendNotification();
831   application.Render();
832
833   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
834
835   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
836   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
837
838   result = value->GetArray();
839   result->GetElementAt( 0 ).Get( resultStartFrame );
840   result->GetElementAt( 1 ).Get( resultEndFrame );
841
842   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );
843   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION );
844
845   // Set invalid play range
846   array.Clear();
847   array.PushBack( 1 );
848   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
849
850   attributes.Clear();
851   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
852   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
853
854   application.SendNotification();
855   application.Render();
856
857   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
858
859   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
860   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
861
862   result = value->GetArray();
863   result->GetElementAt( 0 ).Get( resultStartFrame );
864   result->GetElementAt( 1 ).Get( resultEndFrame );
865
866   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );  // Should not be changed
867   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION );
868
869   END_TEST;
870 }
871
872 int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void)
873 {
874   ToolkitTestApplication application;
875   tet_infoline( "UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal" );
876
877   Property::Map propertyMap;
878   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
879              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
880              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
881
882   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
883   DALI_TEST_CHECK( visual );
884
885   DummyControl actor = DummyControl::New( true );
886   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
887   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
888
889   DevelControl::VisualEventSignal( actor ).Connect( &VisualEventSignal );
890
891   Vector2 controlSize( 20.f, 30.f );
892   actor.SetProperty( Actor::Property::SIZE, controlSize );
893
894   application.GetScene().Add( actor );
895
896   Property::Map attributes;
897   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
898
899   application.SendNotification();
900   application.Render();
901
902   // Wait for animation finish
903   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
904
905   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
906   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
907   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
908
909   DALI_TEST_EQUALS( gAnimationFinishedSignalFired, true, TEST_LOCATION );
910
911   END_TEST;
912 }
913
914 int UtcDaliAnimatedVectorImageVisualJumpTo(void)
915 {
916   ToolkitTestApplication application;
917   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpTo" );
918
919   Property::Map propertyMap;
920   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
921              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
922
923   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
924   DALI_TEST_CHECK( visual );
925
926   tet_printf( "1. Visual is created.\n" );
927
928   DummyControl actor = DummyControl::New( true );
929   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
930   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
931
932   Vector2 controlSize( 20.f, 30.f );
933   actor.SetProperty( Actor::Property::SIZE, controlSize );
934
935   application.GetScene().Add( actor );
936
937   application.SendNotification();
938   application.Render();
939
940   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2 );
941
942   application.SendNotification();
943   application.Render();
944
945   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
946
947   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
948   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
949   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
950
951   tet_printf( "2. The current frame number is [%d].\n", value->Get< int >() );
952
953   Property::Array array;
954   array.PushBack( 0 );
955   array.PushBack( 2 );
956
957   Property::Map attributes;
958   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
959   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
960
961   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
962
963   application.SendNotification();
964   application.Render();
965
966   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
967
968   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
969   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
970   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
971
972   tet_printf( "3. The current frame number is [%d].\n", value->Get< int >() );
973
974   // Change play range
975   attributes.Clear();
976   array.Clear();
977
978   array.PushBack( 0 );
979   array.PushBack( 4 );
980
981   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
982   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
983
984   attributes.Clear();
985   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
986
987   application.SendNotification();
988   application.Render();
989
990   // Stop and jump to 3
991   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
992
993   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
994
995   application.SendNotification();
996   application.Render();
997
998   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
999
1000   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1001   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1002   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
1003
1004   tet_printf( "4. The current frame number is [%d].\n", value->Get< int >() );
1005
1006   // Jump to the same position
1007   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
1008
1009   application.SendNotification();
1010   application.Render();
1011
1012   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1013
1014   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1015   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1016   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
1017
1018   tet_printf( "5. The current frame number is [%d].\n", value->Get< int >() );
1019
1020   END_TEST;
1021 }
1022
1023 int UtcDaliAnimatedVectorImageVisualUpdateProperty(void)
1024 {
1025   ToolkitTestApplication application;
1026   tet_infoline( "UtcDaliAnimatedVectorImageVisualUpdateProperty" );
1027
1028   int startFrame = 1, endFrame = 3;
1029   Property::Array playRange;
1030   playRange.PushBack( startFrame );
1031   playRange.PushBack( endFrame );
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::PLAY_RANGE, playRange  );
1038
1039   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1040   DALI_TEST_CHECK( visual );
1041
1042   DummyControl actor = DummyControl::New( true );
1043   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1044   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1045
1046   Vector2 controlSize( 20.f, 30.f );
1047   actor.SetProperty( Actor::Property::SIZE, controlSize );
1048
1049   application.GetScene().Add( actor );
1050
1051   application.SendNotification();
1052   application.Render();
1053
1054   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1055
1056   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1057   Property::Value* value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1058   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
1059
1060   value = map.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
1061   DALI_TEST_CHECK( value );
1062
1063   Property::Array* result = value->GetArray();
1064   DALI_TEST_CHECK( result );
1065
1066   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
1067   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
1068
1069   playRange.Clear();
1070   playRange.PushBack( 0 );
1071   playRange.PushBack( 2 );
1072
1073   Property::Map attributes;
1074   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
1075   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 5 );
1076
1077   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1078
1079   application.SendNotification();
1080   application.Render();
1081
1082   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1083
1084   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1085   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1086   DALI_TEST_EQUALS( value->Get< int >(), 5, TEST_LOCATION );
1087
1088   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
1089   result = value->GetArray();
1090   DALI_TEST_CHECK( result );
1091
1092   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == 0 );
1093   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == 2 );
1094
1095   attributes.Clear();
1096
1097   playRange.Clear();
1098   playRange.PushBack( startFrame );
1099   playRange.PushBack( endFrame );
1100
1101   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
1102
1103   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1104
1105   application.SendNotification();
1106   application.Render();
1107
1108   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1109
1110   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1111   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
1112
1113   result = value->GetArray();
1114   DALI_TEST_CHECK( result );
1115
1116   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
1117   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
1118
1119   // Play and update property
1120   attributes.Clear();
1121   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1122
1123   application.SendNotification();
1124   application.Render();
1125
1126   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 10 );
1127
1128   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1129
1130   application.SendNotification();
1131   application.Render();
1132
1133   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1134   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1135   DALI_TEST_EQUALS( value->Get< int >(), 10, TEST_LOCATION );
1136
1137   END_TEST;
1138 }
1139
1140 int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
1141 {
1142   ToolkitTestApplication application;
1143   tet_infoline( "UtcDaliAnimatedVectorImageVisualStopBehavior" );
1144
1145   Property::Map propertyMap;
1146   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1147              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
1148              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
1149              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME );
1150
1151   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1152   DALI_TEST_CHECK( visual );
1153
1154   DummyControl actor = DummyControl::New( true );
1155   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1156   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1157
1158   Vector2 controlSize( 20.f, 30.f );
1159   actor.SetProperty( Actor::Property::SIZE, controlSize );
1160
1161   application.GetScene().Add( actor );
1162
1163   Property::Map attributes;
1164   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1165
1166   application.SendNotification();
1167   application.Render();
1168
1169   // Trigger count is 1 - animation finished
1170   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1171
1172   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1173   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1174   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1175
1176   // Change stop behavior
1177   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
1178
1179   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1180
1181   attributes.Clear();
1182
1183   // Play again
1184   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1185
1186   application.SendNotification();
1187   application.Render();
1188
1189   // Trigger count is 1 - animation finished
1190   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1191
1192   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1193
1194   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1195   int totalFrameNumber = value1->Get< int >();
1196
1197   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1198   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1199
1200   // Change stop behavior
1201   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1202   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, -1 );
1203
1204   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1205
1206   attributes.Clear();
1207
1208   // Play again
1209   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1210
1211   application.SendNotification();
1212   application.Render();
1213
1214   // Pause
1215   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
1216
1217   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1218   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1219   int currentFrameNumber = value->Get< int >();
1220
1221   // Stop
1222   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
1223
1224   application.SendNotification();
1225   application.Render( 16 );
1226
1227   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1228   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1229   DALI_TEST_EQUALS( value->Get< int >(), currentFrameNumber, TEST_LOCATION );  // Should be same with currentFrameNumber
1230
1231   END_TEST;
1232 }
1233
1234 int UtcDaliAnimatedVectorImageVisualLoopingMode(void)
1235 {
1236   ToolkitTestApplication application;
1237   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopingMode" );
1238
1239   Property::Map propertyMap;
1240   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1241              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
1242              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
1243              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME )
1244              .Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::AUTO_REVERSE );
1245
1246   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1247   DALI_TEST_CHECK( visual );
1248
1249   DummyControl actor = DummyControl::New( true );
1250   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1251   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1252
1253   Vector2 controlSize( 20.f, 30.f );
1254   actor.SetProperty( Actor::Property::SIZE, controlSize );
1255
1256   application.GetScene().Add( actor );
1257
1258   Property::Map attributes;
1259   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1260
1261   application.SendNotification();
1262   application.Render();
1263
1264   // Trigger count is 1 - animation finished
1265   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1266
1267   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1268   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1269   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame because of auto reverse
1270
1271   // Change stop behavior
1272   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1273
1274   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1275
1276   // Play again
1277   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1278
1279   application.SendNotification();
1280   application.Render();
1281
1282   // Trigger count is 1 - animation finished
1283   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1284
1285   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1286   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1287   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1288
1289   // Change looping mode
1290   attributes.Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::RESTART );
1291
1292   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1293
1294   // Play again
1295   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1296
1297   application.SendNotification();
1298   application.Render();
1299
1300   // Trigger count is 1 - animation finished
1301   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1302
1303   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1304   int totalFrameNumber = value1->Get< int >();
1305
1306   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1307   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1308   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1309
1310   END_TEST;
1311 }
1312
1313 int UtcDaliAnimatedVectorImageVisualPropertyNotification(void)
1314 {
1315   ToolkitTestApplication application;
1316   tet_infoline( "UtcDaliAnimatedVectorImageVisualPropertyNotification" );
1317
1318   Property::Map propertyMap;
1319   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1320              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
1321
1322   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1323   DALI_TEST_CHECK( visual );
1324
1325   DummyControl actor = DummyControl::New( true );
1326   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1327   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1328
1329   Vector2 controlSize( 20.f, 30.f );
1330   Vector3 controlScale( 2.0f, 2.0f, 1.0f );
1331   actor.SetProperty( Actor::Property::SIZE, controlSize );
1332   actor.SetProperty( Actor::Property::SCALE, controlScale );
1333
1334   application.GetScene().Add( actor );
1335
1336   application.SendNotification();
1337   application.Render();
1338
1339   application.SendNotification();
1340   application.Render();
1341
1342   Renderer renderer = actor.GetRendererAt( 0u );
1343   DALI_TEST_CHECK( renderer );
1344
1345   auto textureSet = renderer.GetTextures();
1346   auto texture = textureSet.GetTexture(0);
1347
1348   DALI_TEST_EQUALS( controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION );
1349   DALI_TEST_EQUALS( controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION );
1350
1351   // Change scale and size
1352   controlSize = Vector2( 50.f, 40.f );
1353   controlScale= Vector3( 0.5f, 0.5f, 1.0f );
1354   actor.SetProperty( Actor::Property::SIZE, controlSize );
1355   actor.SetProperty( Actor::Property::SCALE, controlScale );
1356
1357   application.SendNotification();
1358   application.Render();
1359
1360   application.SendNotification();
1361   application.Render();
1362
1363   renderer = actor.GetRendererAt( 0u );
1364   DALI_TEST_CHECK( renderer );
1365
1366   textureSet = renderer.GetTextures();
1367   texture = textureSet.GetTexture(0);
1368
1369   DALI_TEST_EQUALS( controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION );
1370   DALI_TEST_EQUALS( controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION );
1371
1372   END_TEST;
1373 }
1374
1375 int UtcDaliAnimatedVectorImageVisualMultipleInstances(void)
1376 {
1377   ToolkitTestApplication application;
1378   tet_infoline( "UtcDaliAnimatedVectorImageVisualMultipleInstances" );
1379
1380   Property::Map propertyMap;
1381   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1382              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1383
1384   Visual::Base visual1 = VisualFactory::Get().CreateVisual( propertyMap );
1385   DALI_TEST_CHECK( visual1 );
1386
1387   DummyControl actor1 = DummyControl::New( true );
1388   DummyControlImpl& dummyImpl1 = static_cast< DummyControlImpl& >( actor1.GetImplementation() );
1389   dummyImpl1.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual1 );
1390
1391   Vector2 controlSize( 20.f, 30.f );
1392   actor1.SetProperty( Actor::Property::SIZE, controlSize );
1393
1394   application.GetScene().Add( actor1 );
1395
1396   propertyMap.Clear();
1397   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1398              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1399
1400   Visual::Base visual2 = VisualFactory::Get().CreateVisual( propertyMap );
1401   DALI_TEST_CHECK( visual2 );
1402
1403   DummyControl actor2 = DummyControl::New( true );
1404   DummyControlImpl& dummyImpl2 = static_cast< DummyControlImpl& >( actor2.GetImplementation() );
1405   dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual2 );
1406
1407   actor2.SetProperty( Actor::Property::SIZE, controlSize );
1408
1409   application.GetScene().Add( actor2 );
1410
1411   DevelControl::DoAction( actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map() );
1412
1413   application.SendNotification();
1414   application.Render();
1415
1416   std::this_thread::sleep_for( std::chrono::milliseconds( 200 ) );
1417
1418   Property::Map attributes;
1419   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
1420
1421   DevelControl::DoAction( actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1422   DevelControl::DoAction( actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1423
1424   DevelControl::DoAction( actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map() );
1425
1426   // renderer is added to actor
1427   DALI_TEST_CHECK( actor1.GetRendererCount() == 1u );
1428   Renderer renderer1 = actor1.GetRendererAt( 0u );
1429   DALI_TEST_CHECK( renderer1 );
1430
1431   // renderer is added to actor
1432   DALI_TEST_CHECK( actor2.GetRendererCount() == 1u );
1433   Renderer renderer2 = actor2.GetRendererAt( 0u );
1434   DALI_TEST_CHECK( renderer2 );
1435
1436   END_TEST;
1437 }
1438
1439 int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void)
1440 {
1441   ToolkitTestApplication application;
1442   tet_infoline( "UtcDaliAnimatedVectorImageVisualControlVisibilityChanged" );
1443
1444   Property::Map propertyMap;
1445   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1446              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1447
1448   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1449   DALI_TEST_CHECK( visual );
1450
1451   DummyControl actor = DummyControl::New( true );
1452   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1453   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1454
1455   Vector2 controlSize( 20.f, 30.f );
1456   actor.SetProperty( Actor::Property::SIZE, controlSize );
1457
1458   application.GetScene().Add( actor );
1459
1460   application.SendNotification();
1461   application.Render();
1462
1463   Property::Map attributes;
1464   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1465
1466   application.SendNotification();
1467   application.Render();
1468
1469   // Check rendering behavior
1470   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1471   Renderer renderer = actor.GetRendererAt( 0u );
1472   DALI_TEST_CHECK( renderer );
1473   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY );
1474
1475   actor.SetProperty( Actor::Property::VISIBLE, false );
1476
1477   application.SendNotification();
1478   application.Render();
1479
1480   // Check rendering behavior again
1481   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED );
1482
1483   END_TEST;
1484 }
1485
1486 int UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged(void)
1487 {
1488   ToolkitTestApplication application;
1489   tet_infoline( "UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged" );
1490
1491   Property::Map propertyMap;
1492   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1493              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1494
1495   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1496   DALI_TEST_CHECK( visual );
1497
1498   DummyControl actor = DummyControl::New( true );
1499   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1500   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1501
1502   Vector2 controlSize( 20.f, 30.f );
1503   actor.SetProperty( Actor::Property::SIZE, controlSize );
1504
1505   application.GetScene().Add( actor );
1506
1507   application.SendNotification();
1508   application.Render();
1509
1510   Property::Map attributes;
1511   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1512
1513   application.SendNotification();
1514   application.Render();
1515
1516   // Check rendering behavior
1517   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1518   Renderer renderer = actor.GetRendererAt( 0u );
1519   DALI_TEST_CHECK( renderer );
1520   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY );
1521
1522   Window window = DevelWindow::Get( actor );
1523   window.Hide();
1524
1525   application.SendNotification();
1526   application.Render();
1527
1528   // Check rendering behavior again
1529   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED );
1530
1531   END_TEST;
1532 }
1533
1534 int UtcDaliAnimatedVectorImageVisualInvalidFile(void)
1535 {
1536   ToolkitTestApplication application;
1537   tet_infoline("Request loading with invalid file - should draw broken image");
1538
1539   TestGlAbstraction& gl = application.GetGlAbstraction();
1540   TraceCallStack& textureTrace = gl.GetTextureTrace();
1541   textureTrace.Enable(true);
1542
1543   Property::Map propertyMap;
1544   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
1545              .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_FILE_NAME);
1546
1547   Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap);
1548   DALI_TEST_CHECK(visual);
1549
1550   DummyControl actor = DummyControl::New(true);
1551   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >(actor.GetImplementation());
1552   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1553
1554   actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f));
1555
1556   application.GetScene().Add(actor);
1557
1558   application.SendNotification();
1559   application.Render();
1560
1561   // Check resource status
1562   Visual::ResourceStatus status = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
1563   DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION);
1564
1565   // The broken image should be shown.
1566   DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
1567   DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
1568
1569   END_TEST;
1570 }
1571
1572 int UtcDaliAnimatedVectorImageVisualFrameDrops(void)
1573 {
1574   ToolkitTestApplication application;
1575   tet_infoline("UtcDaliAnimatedVectorImageVisualFrameDrops");
1576
1577   Property::Map propertyMap;
1578   propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
1579              .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME_FRAME_DROP);
1580
1581   Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap);
1582   DALI_TEST_CHECK(visual);
1583
1584   DummyControl actor = DummyControl::New(true);
1585   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1586   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1587
1588   Vector2 controlSize(20.f, 30.f);
1589   actor.SetProperty(Actor::Property::SIZE, controlSize);
1590
1591   application.GetScene().Add(actor);
1592
1593   application.SendNotification();
1594   application.Render();
1595
1596   Property::Map attributes;
1597   DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes);
1598
1599   // Make delay to drop frames
1600   Test::VectorAnimationRenderer::DelayRendering(170); // longer than 16.6 * 10frames
1601
1602   application.SendNotification();
1603   application.Render();
1604
1605   // Trigger count is 1 - render the first frame
1606   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1607
1608   // Wait for calculating frame drops
1609   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1610
1611   // Check dropped frame
1612   uint32_t frames = Test::VectorAnimationRenderer::GetDroppedFrames();
1613   DALI_TEST_CHECK(frames >= 9);
1614
1615   END_TEST;
1616 }