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