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