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