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