[dali_2.1.25] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedImageVisual.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 <iostream>
19
20 #include <dali-toolkit-test-suite-utils.h>
21
22 #include <toolkit-event-thread-callback.h>
23 #include <toolkit-timer.h>
24
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/controls/control-devel.h>
27 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
28 #include <dali-toolkit/devel-api/visuals/animated-image-visual-actions-devel.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
30 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
31
32 #include "dummy-control.h"
33
34 using namespace Dali;
35 using namespace Dali::Toolkit;
36
37 void dali_animated_image_visual_startup(void)
38 {
39   test_return_value = TET_UNDEF;
40 }
41
42 void dali_animated_image_visual_cleanup(void)
43 {
44   test_return_value = TET_PASS;
45 }
46
47 namespace
48 {
49 const char* TEST_IMAGE_FILE_NAME      = TEST_RESOURCE_DIR "/application-icon-%02d.png";
50 const char* TEST_GIF_FILE_NAME        = TEST_RESOURCE_DIR "/anim.gif";
51 const char* TEST_MASK_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/mask.png";
52 } // namespace
53
54 void CopyUrlsIntoArray(Property::Array& urls, int startIndex = 0)
55 {
56   for(int i = 20 + startIndex; i <= 30; ++i)
57   {
58     char* url;
59     if(asprintf(&url, TEST_IMAGE_FILE_NAME, i) > 0)
60     {
61       Property::Value value(url);
62       urls.Add(value);
63       free(url);
64     }
65   }
66 }
67
68 int UtcDaliAnimatedImageVisualGetPropertyMap01(void)
69 {
70   ToolkitTestApplication application;
71   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap");
72
73   // request AnimatedImageVisual with a property map
74   VisualFactory factory             = VisualFactory::Get();
75   Visual::Base  animatedImageVisual = factory.CreateVisual(
76     Property::Map()
77       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
78       .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
79       .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
80       .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
81       .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
82       .Add(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME)
83       .Add(ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f)
84       .Add(ImageVisual::Property::CROP_TO_MASK, true)
85       .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
86       .Add(DevelVisual::Property::CORNER_RADIUS, 22.2f)
87       .Add(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE)
88       .Add(DevelVisual::Property::BORDERLINE_WIDTH, 33.3f)
89       .Add(DevelVisual::Property::BORDERLINE_COLOR, Color::RED)
90       .Add(DevelVisual::Property::BORDERLINE_OFFSET, 0.3f));
91
92   Property::Map resultMap;
93   animatedImageVisual.CreatePropertyMap(resultMap);
94   // check the property values from the returned map from a visual
95   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
96   DALI_TEST_CHECK(value);
97   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
98
99   value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
100   DALI_TEST_CHECK(value);
101   DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
102
103   value = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
104   DALI_TEST_CHECK(value);
105   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(22.2f, 22.2f, 22.2f, 22.2f), TEST_LOCATION);
106
107   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER);
108   DALI_TEST_CHECK(value);
109   DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::ABSOLUTE);
110
111   value = resultMap.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
112   DALI_TEST_CHECK(value);
113   DALI_TEST_EQUALS(value->Get<float>(), 33.3f, TEST_LOCATION);
114
115   value = resultMap.Find(DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4);
116   DALI_TEST_CHECK(value);
117   DALI_TEST_EQUALS(value->Get<Vector4>(), Color::RED, TEST_LOCATION);
118
119   value = resultMap.Find(DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT);
120   DALI_TEST_CHECK(value);
121   DALI_TEST_EQUALS(value->Get<float>(), 0.3f, TEST_LOCATION);
122
123   // Check mask properties
124   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, Property::STRING);
125   DALI_TEST_CHECK(value);
126   DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
127
128   value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, Property::FLOAT);
129   DALI_TEST_CHECK(value);
130   DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
131
132   value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, Property::BOOLEAN);
133   DALI_TEST_CHECK(value);
134   DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
135
136   value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
137   DALI_TEST_CHECK(value);
138   DALI_TEST_CHECK(value->Get<int>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
139
140   Vector2 naturalSize;
141   animatedImageVisual.GetNaturalSize(naturalSize);
142   DALI_TEST_EQUALS(naturalSize, Vector2(100, 100), TEST_LOCATION);
143
144   // request AnimatedImageVisual with an URL
145   Visual::Base animatedImageVisual2 = factory.CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions());
146   resultMap.Clear();
147   animatedImageVisual2.CreatePropertyMap(resultMap);
148   // check the property values from the returned map from a visual
149   value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
150   DALI_TEST_CHECK(value);
151   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
152
153   value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
154   DALI_TEST_CHECK(value);
155   DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
156
157   END_TEST;
158 }
159
160 int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
161 {
162   ToolkitTestApplication application;
163   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap for multi image with fixed cache");
164
165   // request AnimatedImageVisual with a property map
166   VisualFactory   factory = VisualFactory::Get();
167   Property::Array urls;
168   CopyUrlsIntoArray(urls);
169
170   Visual::Base animatedImageVisual = factory.CreateVisual(
171     Property::Map()
172       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
173       .Add("url", urls)
174       .Add("batchSize", 4)
175       .Add("cacheSize", 20)
176       .Add("loopCount", 10)
177       .Add("frameDelay", 200)
178       .Add("pixelArea", Vector4())
179       .Add("wrapModeU", WrapMode::REPEAT)
180       .Add("wrapModeV", WrapMode::DEFAULT)
181       .Add("alphaMaskUrl", TEST_MASK_IMAGE_FILE_NAME)
182       .Add("maskContentScale", 1.6f)
183       .Add("cropToMask", true)
184       .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
185       .Add("cornerRadius", Vector4(50.0f, 25.0f, 12.5f, 33.0f))
186       .Add("cornerRadiusPolicy", Visual::Transform::Policy::RELATIVE)
187       .Add("borderlineWidth", 20.0f)
188       .Add("borderlineColor", Vector4())
189       .Add("borderlineOffset", -1.0f));
190
191   Property::Map resultMap;
192   animatedImageVisual.CreatePropertyMap(resultMap);
193   // check the property values from the returned map from a visual
194   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
195   DALI_TEST_CHECK(value);
196   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
197
198   value = resultMap.Find(ImageVisual::Property::URL, "url");
199   DALI_TEST_CHECK(value);
200   Property::Array* resultUrls = value->GetArray();
201   DALI_TEST_CHECK(resultUrls);
202   DALI_TEST_EQUALS(resultUrls->Count(), urls.Count(), TEST_LOCATION);
203
204   value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
205   DALI_TEST_CHECK(value);
206   DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
207
208   value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
209   DALI_TEST_CHECK(value);
210   DALI_TEST_EQUALS(value->Get<int>(), 20, TEST_LOCATION);
211
212   value = resultMap.Find(Toolkit::DevelImageVisual::Property::LOOP_COUNT, "loopCount");
213   DALI_TEST_CHECK(value);
214   DALI_TEST_EQUALS(value->Get<int>(), 10, TEST_LOCATION);
215
216   value = resultMap.Find(ImageVisual::Property::FRAME_DELAY, "frameDelay");
217   DALI_TEST_CHECK(value);
218   DALI_TEST_EQUALS(value->Get<int>(), 200, TEST_LOCATION);
219
220   value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
221   DALI_TEST_CHECK(value);
222   DALI_TEST_EQUALS(value->Get<int>(), 11, TEST_LOCATION);
223
224   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius");
225   DALI_TEST_CHECK(value);
226   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(50.0f, 25.0f, 12.5f, 33.0f), TEST_LOCATION);
227
228   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy");
229   DALI_TEST_CHECK(value);
230   DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::RELATIVE);
231
232   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
233   DALI_TEST_CHECK(value);
234   DALI_TEST_EQUALS(value->Get<float>(), 20.0f, TEST_LOCATION);
235
236   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
237   DALI_TEST_CHECK(value);
238   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
239
240   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
241   DALI_TEST_CHECK(value);
242   DALI_TEST_EQUALS(value->Get<float>(), -1.0f, TEST_LOCATION);
243
244   // Check mask properties
245   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
246   DALI_TEST_CHECK(value);
247   DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
248
249   value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, "maskContentScale");
250   DALI_TEST_CHECK(value);
251   DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
252
253   value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, "cropToMask");
254   DALI_TEST_CHECK(value);
255   DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
256
257   value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
258   DALI_TEST_CHECK(value);
259   DALI_TEST_CHECK(value->Get<int>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
260
261   END_TEST;
262 }
263
264 int UtcDaliAnimatedImageVisualGetPropertyMap03(void)
265 {
266   ToolkitTestApplication application;
267   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap for multi image rolling cache");
268
269   // request AnimatedImageVisual with a property map
270   VisualFactory   factory = VisualFactory::Get();
271   Property::Array urls;
272   CopyUrlsIntoArray(urls);
273
274   Visual::Base animatedImageVisual = factory.CreateVisual(
275     Property::Map()
276       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
277       .Add("url", urls)
278       .Add("batchSize", 4)
279       .Add("cacheSize", 8)
280       .Add("loopCount", 10)
281       .Add("frameDelay", 200)
282       .Add("pixelArea", Vector4())
283       .Add("wrapModeU", WrapMode::REPEAT)
284       .Add("wrapModeV", WrapMode::DEFAULT)
285       .Add("alphaMaskUrl", TEST_MASK_IMAGE_FILE_NAME)
286       .Add("maskContentScale", 1.6f)
287       .Add("cropToMask", true)
288       .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
289       .Add("cornerRadius", 50.5f));
290
291   Property::Map resultMap;
292   animatedImageVisual.CreatePropertyMap(resultMap);
293   // check the property values from the returned map from a visual
294   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
295   DALI_TEST_CHECK(value);
296   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
297
298   value = resultMap.Find(ImageVisual::Property::URL, "url");
299   DALI_TEST_CHECK(value);
300   Property::Array* resultUrls = value->GetArray();
301   DALI_TEST_CHECK(resultUrls);
302   DALI_TEST_EQUALS(resultUrls->Count(), urls.Count(), TEST_LOCATION);
303
304   value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
305   DALI_TEST_CHECK(value);
306   DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
307
308   value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
309   DALI_TEST_CHECK(value);
310   DALI_TEST_EQUALS(value->Get<int>(), 8, TEST_LOCATION);
311
312   value = resultMap.Find(Toolkit::DevelImageVisual::Property::LOOP_COUNT, "loopCount");
313   DALI_TEST_CHECK(value);
314   DALI_TEST_EQUALS(value->Get<int>(), 10, TEST_LOCATION);
315
316   value = resultMap.Find(ImageVisual::Property::FRAME_DELAY, "frameDelay");
317   DALI_TEST_CHECK(value);
318   DALI_TEST_EQUALS(value->Get<int>(), 200, TEST_LOCATION);
319
320   value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
321   DALI_TEST_CHECK(value);
322   DALI_TEST_EQUALS(value->Get<int>(), 11, TEST_LOCATION);
323
324   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius");
325   DALI_TEST_CHECK(value);
326   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(50.5f, 50.5f, 50.5f, 50.5f), TEST_LOCATION);
327
328   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy");
329   DALI_TEST_CHECK(value);
330   DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::ABSOLUTE);
331
332   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
333   DALI_TEST_CHECK(value);
334   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
335
336   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
337   DALI_TEST_CHECK(value);
338   DALI_TEST_EQUALS(value->Get<Vector4>(), Color::BLACK, TEST_LOCATION);
339
340   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
341   DALI_TEST_CHECK(value);
342   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
343
344   // Check mask properties
345   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
346   DALI_TEST_CHECK(value);
347   DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
348
349   value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, "maskContentScale");
350   DALI_TEST_CHECK(value);
351   DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
352
353   value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, "cropToMask");
354   DALI_TEST_CHECK(value);
355   DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
356
357   value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
358   DALI_TEST_CHECK(value);
359   DALI_TEST_CHECK(value->Get<bool>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
360
361   END_TEST;
362 }
363
364 int UtcDaliAnimatedImageVisualGetPropertyMap04(void)
365 {
366   ToolkitTestApplication application;
367   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap");
368
369   // request AnimatedImageVisual with a property map
370   VisualFactory factory             = VisualFactory::Get();
371   Visual::Base  animatedImageVisual = factory.CreateVisual(
372     Property::Map()
373       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
374       .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
375       .Add(ImageVisual::Property::BATCH_SIZE, 1)
376       .Add(ImageVisual::Property::CACHE_SIZE, 1)
377       .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, true)
378       .Add(ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DETACHED)
379       .Add(ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED)
380       .Add(DevelVisual::Property::BORDERLINE_WIDTH, 0.4f));
381
382   Property::Map resultMap;
383   animatedImageVisual.CreatePropertyMap(resultMap);
384
385   // check the property values from the returned map from a visual
386   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
387   DALI_TEST_CHECK(value);
388   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
389
390   value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
391   DALI_TEST_CHECK(value);
392   DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
393
394   value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, Property::INTEGER);
395   DALI_TEST_CHECK(value);
396   DALI_TEST_CHECK(value->Get<int>() == 2);
397
398   value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, Property::INTEGER);
399   DALI_TEST_CHECK(value);
400   DALI_TEST_CHECK(value->Get<int>() == 2);
401
402   value = resultMap.Find(ImageVisual::Property::SYNCHRONOUS_LOADING, Property::BOOLEAN);
403   DALI_TEST_CHECK(value);
404   DALI_TEST_CHECK(value->Get<bool>() == true);
405
406   value = resultMap.Find(ImageVisual::Property::RELEASE_POLICY, Property::INTEGER);
407   DALI_TEST_CHECK(value);
408   DALI_TEST_CHECK(value->Get<int>() == ImageVisual::ReleasePolicy::DETACHED);
409
410   value = resultMap.Find(ImageVisual::Property::LOAD_POLICY, Property::INTEGER);
411   DALI_TEST_CHECK(value);
412   DALI_TEST_CHECK(value->Get<int>() == ImageVisual::LoadPolicy::ATTACHED);
413
414   value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
415   DALI_TEST_CHECK(value);
416   DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
417
418   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
419   DALI_TEST_CHECK(value);
420   DALI_TEST_EQUALS(value->Get<float>(), 0.4f, TEST_LOCATION);
421
422   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
423   DALI_TEST_CHECK(value);
424   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
425
426   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
427   DALI_TEST_CHECK(value);
428   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
429
430   END_TEST;
431 }
432
433 int UtcDaliAnimatedImageVisualImageLoadingFail01(void)
434 {
435   ToolkitTestApplication application;
436   TestGlAbstraction&     gl = application.GetGlAbstraction();
437
438   {
439     Property::Map propertyMap;
440     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
441     propertyMap.Insert(ImageVisual::Property::URL, "dummy.gif");
442     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
443     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
444     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
445     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
446     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
447     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
448
449     VisualFactory factory = VisualFactory::Get();
450     Visual::Base  visual  = factory.CreateVisual(propertyMap);
451
452     DummyControl        dummyControl = DummyControl::New(true);
453     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
454     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
455
456     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
457     application.GetScene().Add(dummyControl);
458
459     TraceCallStack& textureTrace = gl.GetTextureTrace();
460     textureTrace.Enable(true);
461
462     application.SendNotification();
463     application.Render(20);
464
465     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 1, TEST_LOCATION);
466
467     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6);
468
469     application.SendNotification();
470     application.Render(20);
471
472     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 1, TEST_LOCATION);
473
474     dummyControl.Unparent();
475   }
476
477   END_TEST;
478 }
479
480 int UtcDaliAnimatedImageVisualSynchronousLoading(void)
481 {
482   ToolkitTestApplication application;
483   TestGlAbstraction&     gl = application.GetGlAbstraction();
484
485   {
486     Property::Map propertyMap;
487     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
488     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
489     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
490     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
491     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
492     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
493     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
494     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
495
496     VisualFactory factory = VisualFactory::Get();
497     Visual::Base  visual  = factory.CreateVisual(propertyMap);
498
499     DummyControl        dummyControl = DummyControl::New(true);
500     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
501     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
502
503     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
504     application.GetScene().Add(dummyControl);
505
506     TraceCallStack& textureTrace = gl.GetTextureTrace();
507     textureTrace.Enable(true);
508
509     application.SendNotification();
510     application.Render(20);
511
512     // The first frame is loaded synchronously and load next batch.
513     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
514
515     application.SendNotification();
516     application.Render();
517
518     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
519     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
520
521     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 3);
522
523     application.SendNotification();
524     application.Render(20);
525
526     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
527
528     application.SendNotification();
529     application.Render();
530
531     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
532
533     dummyControl.Unparent();
534   }
535   tet_infoline("Test that removing the visual from stage deletes all textures");
536   application.SendNotification();
537   application.Render(16);
538   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
539
540   END_TEST;
541 }
542
543 int UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask01(void)
544 {
545   ToolkitTestApplication application;
546   tet_infoline("UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask01 for CPU Alpha Masking");
547   TestGlAbstraction& gl = application.GetGlAbstraction();
548
549   {
550     Property::Map propertyMap;
551     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
552     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
553     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
554     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
555     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
556     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
557     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
558     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
559     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
560
561     VisualFactory factory = VisualFactory::Get();
562     Visual::Base  visual  = factory.CreateVisual(propertyMap);
563
564     Property::Map testMap;
565     visual.CreatePropertyMap(testMap);
566     DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL), Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION);
567
568     DummyControl        dummyControl = DummyControl::New(true);
569     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
570     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
571
572     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
573     application.GetScene().Add(dummyControl);
574
575     TraceCallStack& textureTrace = gl.GetTextureTrace();
576     textureTrace.Enable(true);
577
578     application.SendNotification();
579     application.Render(20);
580
581     // The first frame is loaded synchronously and load next batch with masking
582     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
583
584     application.SendNotification();
585     application.Render();
586
587     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
588     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
589
590     dummyControl.Unparent();
591   }
592   tet_infoline("Test that removing the visual from stage deletes all textures");
593   application.SendNotification();
594   application.Render(16);
595   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
596
597   END_TEST;
598 }
599
600 int UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask02(void)
601 {
602   ToolkitTestApplication application;
603   tet_infoline("UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask02 for GPU Alpha Masking");
604   TestGlAbstraction& gl = application.GetGlAbstraction();
605
606   {
607     Property::Map propertyMap;
608     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
609     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
610     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
611     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
612     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
613     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
614     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
615     propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
616     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
617     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
618
619     VisualFactory factory = VisualFactory::Get();
620     Visual::Base  visual  = factory.CreateVisual(propertyMap);
621
622     Property::Map testMap;
623     visual.CreatePropertyMap(testMap);
624     DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL), Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION);
625
626     DummyControl        dummyControl = DummyControl::New(true);
627     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
628     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
629
630     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
631     application.GetScene().Add(dummyControl);
632
633     TraceCallStack& textureTrace = gl.GetTextureTrace();
634     textureTrace.Enable(true);
635
636     application.SendNotification();
637     application.Render(20);
638
639     // The first frame is loaded synchronously and load next batch with masking
640     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
641
642     application.SendNotification();
643     application.Render();
644
645     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
646     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
647
648     dummyControl.Unparent();
649   }
650   tet_infoline("Test that removing the visual from stage deletes all textures");
651   application.SendNotification();
652   application.Render(16);
653   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
654
655   END_TEST;
656 }
657
658 int UtcDaliAnimatedImageVisualJumpToAction(void)
659 {
660   ToolkitTestApplication application;
661   TestGlAbstraction&     gl = application.GetGlAbstraction();
662
663   Property::Array urls;
664   CopyUrlsIntoArray(urls);
665
666   {
667     Property::Map propertyMap;
668     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
669     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
670     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
671     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 12);
672     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
673
674     VisualFactory factory = VisualFactory::Get();
675     Visual::Base  visual  = factory.CreateVisual(propertyMap);
676
677     DummyControl        dummyControl = DummyControl::New(true);
678     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
679     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
680
681     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
682     application.GetScene().Add(dummyControl);
683     application.SendNotification();
684     application.Render(20);
685
686     tet_infoline("Ready the visual after the visual is on stage");
687     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
688
689     tet_infoline("Test that a timer has been started");
690     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
691
692     TraceCallStack& textureTrace = gl.GetTextureTrace();
693     textureTrace.Enable(true);
694
695     application.SendNotification();
696     application.Render(20);
697
698     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
699
700     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
701
702     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
703
704     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 20);
705
706     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
707
708     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6);
709
710     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION);
711     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
712
713     dummyControl.Unparent();
714   }
715   tet_infoline("Test that removing the visual from stage deletes all textures");
716   application.SendNotification();
717   application.Render(16);
718   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
719
720   END_TEST;
721 }
722
723 int UtcDaliAnimatedImageVisualStopBehavior(void)
724 {
725   ToolkitTestApplication application;
726   TestGlAbstraction&     gl = application.GetGlAbstraction();
727
728   Property::Array urls;
729   CopyUrlsIntoArray(urls);
730
731   {
732     Property::Map propertyMap;
733     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
734     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
735     propertyMap.Insert(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME);
736     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
737     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 8);
738     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
739
740     VisualFactory factory = VisualFactory::Get();
741     Visual::Base  visual  = factory.CreateVisual(propertyMap);
742
743     // Expect that a batch of 4 textures has been requested. These will be serially loaded
744     // below.
745
746     DummyControl        dummyControl = DummyControl::New(true);
747     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
748     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
749
750     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
751     application.GetScene().Add(dummyControl);
752     application.SendNotification();
753     application.Render(20);
754
755     tet_infoline("Ready the visual after the visual is on stage");
756     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
757
758     tet_infoline("Test that a timer has been started");
759     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
760
761     TraceCallStack& textureTrace = gl.GetTextureTrace();
762     textureTrace.Enable(true);
763
764     application.SendNotification();
765     application.Render(20);
766
767     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
768
769     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
770
771     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
772
773     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 1);
774
775     // Expect the second batch has been requested
776     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
777
778     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
779
780     dummyControl.Unparent();
781   }
782   tet_infoline("Test that removing the visual from stage deletes all textures");
783   application.SendNotification();
784   application.Render(16);
785   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
786
787   END_TEST;
788 }
789
790 int UtcDaliAnimatedImageVisualStopBehavior02(void)
791 {
792   ToolkitTestApplication application;
793   TestGlAbstraction&     gl = application.GetGlAbstraction();
794
795   Property::Array urls;
796   CopyUrlsIntoArray(urls);
797
798   {
799     Property::Map propertyMap;
800     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
801     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
802     propertyMap.Insert(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME);
803     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
804     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
805     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
806
807     VisualFactory factory = VisualFactory::Get();
808     Visual::Base  visual  = factory.CreateVisual(propertyMap);
809
810     // Expect that a batch of 4 textures has been requested. These will be serially loaded
811     // below.
812
813     DummyControl        dummyControl = DummyControl::New(true);
814     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
815     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
816
817     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
818     application.GetScene().Add(dummyControl);
819
820     tet_infoline("Ready the visual after the visual is on stage");
821     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
822
823     TraceCallStack& textureTrace = gl.GetTextureTrace();
824     textureTrace.Enable(true);
825
826     application.SendNotification();
827     application.Render(20);
828
829     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
830
831     Test::EmitGlobalTimerSignal();
832
833     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
834
835     application.SendNotification();
836     application.Render(20);
837
838     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
839
840     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
841
842     tet_infoline("Ready the visual after the visual is on stage");
843     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
844
845     application.SendNotification();
846     application.Render(20);
847
848     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
849
850     dummyControl.Unparent();
851   }
852   tet_infoline("Test that removing the visual from stage deletes all textures");
853   application.SendNotification();
854   application.Render(16);
855   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
856
857   END_TEST;
858 }
859
860 int UtcDaliAnimatedImageVisualAnimatedImage01(void)
861 {
862   ToolkitTestApplication application;
863   TestGlAbstraction&     gl = application.GetGlAbstraction();
864
865   tet_infoline("Set cache size same as GIF frame, and try to load same image at another ImageView");
866   {
867     Property::Map propertyMap;
868     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
869     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
870     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
871     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
872     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
873
874     VisualFactory factory = VisualFactory::Get();
875     Visual::Base  visual  = factory.CreateVisual(propertyMap);
876
877     // Expect that a batch of 4 textures has been requested. These will be serially loaded
878     // below.
879
880     DummyControl        dummyControl = DummyControl::New(true);
881     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
882     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
883
884     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
885     application.GetScene().Add(dummyControl);
886
887     application.SendNotification();
888     application.Render();
889
890     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
891
892     // Batch 2 frames. Now frame 0, 1 cached.
893     application.SendNotification();
894     application.Render(20);
895
896     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
897
898     tet_infoline("Test that a timer has been started");
899
900     TraceCallStack& textureTrace = gl.GetTextureTrace();
901     textureTrace.Enable(true);
902
903     Test::EmitGlobalTimerSignal();
904
905     application.SendNotification();
906     application.Render();
907
908     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
909
910     // 0 frame removed. and after, batch 2 frames. Now frame 1, 2, 3 cached.
911     application.SendNotification();
912     application.Render(20);
913
914     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
915
916     Visual::Base        visual2       = factory.CreateVisual(propertyMap);
917     DummyControl        dummyControl2 = DummyControl::New(true);
918     Impl::DummyControl& dummyImpl2    = static_cast<Impl::DummyControl&>(dummyControl2.GetImplementation());
919     dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual2);
920     application.GetScene().Add(dummyControl2);
921
922     tet_infoline("Add new view with same url");
923
924     application.SendNotification();
925     application.Render();
926
927     // Note that we only re-load 0 frame.
928     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
929
930     // To do: we need to fix caching bug in animated-visual
931     //tet_infoline("Test that we don't try to re-load new image cause it cached");
932     //DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
933
934     // Batch 2 frames. Now visual frame 1, 2, 3 cached and visual2 frame 0, 1 cached.
935     application.SendNotification();
936     application.Render(20);
937
938     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 5, TEST_LOCATION);
939
940     textureTrace.Reset();
941
942     tet_infoline("Load some many frames");
943
944     const int repeatCount = 10;
945     for(int repeat = 0; repeat < repeatCount; ++repeat)
946     {
947       Test::EmitGlobalTimerSignal();
948       application.SendNotification();
949       application.Render(2000);
950     }
951
952     DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION); // A new texture should NOT be generated.
953     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 5, TEST_LOCATION);
954
955     textureTrace.Reset();
956
957     dummyControl.Unparent();
958     dummyControl2.Unparent();
959   }
960   tet_infoline("Test that removing the visual from stage deletes all textures");
961   application.SendNotification();
962   application.Render(20);
963   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
964
965   END_TEST;
966 }
967
968 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask01(void)
969 {
970   ToolkitTestApplication application;
971   tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask01 for CPU Alpha Masking");
972   TestGlAbstraction& gl = application.GetGlAbstraction();
973
974   {
975     Property::Map propertyMap;
976     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
977     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
978     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
979     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
980     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
981     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
982
983     VisualFactory factory = VisualFactory::Get();
984     Visual::Base  visual  = factory.CreateVisual(propertyMap);
985
986     DummyControl        dummyControl = DummyControl::New(true);
987     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
988     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
989
990     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
991     application.GetScene().Add(dummyControl);
992
993     application.SendNotification();
994     application.Render();
995
996     // load two frame(batch size), load mask image, and request two masking
997     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(5), true, TEST_LOCATION);
998
999     application.SendNotification();
1000     application.Render(20);
1001
1002     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
1003
1004     dummyControl.Unparent();
1005   }
1006   tet_infoline("Test that removing the visual from stage deletes all textures");
1007   application.SendNotification();
1008   application.Render(20);
1009   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1010
1011   END_TEST;
1012 }
1013
1014 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask02(void)
1015 {
1016   ToolkitTestApplication application;
1017   tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask02 for GPU Alpha Masking");
1018   TestGlAbstraction& gl = application.GetGlAbstraction();
1019
1020   {
1021     Property::Map propertyMap;
1022     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1023     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1024     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1025     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1026     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1027     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
1028     propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
1029
1030     VisualFactory factory = VisualFactory::Get();
1031     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1032
1033     DummyControl        dummyControl = DummyControl::New(true);
1034     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1035     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1036
1037     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1038     application.GetScene().Add(dummyControl);
1039
1040     application.SendNotification();
1041     application.Render();
1042
1043     // load two frame(batch size), load mask image, and request two masking
1044     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1045
1046     application.SendNotification();
1047     application.Render(20);
1048
1049     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 3, TEST_LOCATION);
1050
1051     dummyControl.Unparent();
1052   }
1053   tet_infoline("Test that removing the visual from stage deletes all textures");
1054   application.SendNotification();
1055   application.Render(20);
1056   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1057
1058   END_TEST;
1059 }
1060
1061 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask03(void)
1062 {
1063   ToolkitTestApplication application;
1064   tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask03 for GPU Alpha Masking with broken mask texture");
1065   TestGlAbstraction& gl = application.GetGlAbstraction();
1066
1067   {
1068     Property::Map propertyMap;
1069     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1070     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1071     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1072     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1073     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1074     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, "");
1075     propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
1076
1077     VisualFactory factory = VisualFactory::Get();
1078     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1079
1080     DummyControl        dummyControl = DummyControl::New(true);
1081     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1082     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1083
1084     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1085     application.GetScene().Add(dummyControl);
1086
1087     application.SendNotification();
1088     application.Render();
1089
1090     // load two frame(batch size), load mask image, and request two masking
1091     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1092
1093     application.SendNotification();
1094     application.Render(20);
1095
1096     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 3, TEST_LOCATION);
1097
1098     dummyControl.Unparent();
1099   }
1100   tet_infoline("Test that removing the visual from stage deletes all textures");
1101   application.SendNotification();
1102   application.Render(20);
1103   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1104
1105   END_TEST;
1106 }
1107
1108 int UtcDaliAnimatedImageVisualMultiImage01(void)
1109 {
1110   ToolkitTestApplication application;
1111   TestGlAbstraction&     gl = application.GetGlAbstraction();
1112
1113   Property::Array urls;
1114   CopyUrlsIntoArray(urls);
1115
1116   {
1117     Property::Map propertyMap;
1118     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1119     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1120     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
1121     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 8);
1122     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1123
1124     VisualFactory factory = VisualFactory::Get();
1125     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1126
1127     // Expect that a batch of 4 textures has been requested. These will be serially loaded
1128     // below.
1129
1130     DummyControl        dummyControl = DummyControl::New(true);
1131     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1132     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1133
1134     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1135     application.GetScene().Add(dummyControl);
1136     application.SendNotification();
1137     application.Render(16);
1138
1139     tet_infoline("Ready the visual after the visual is on stage");
1140     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1141
1142     tet_infoline("Test that a timer has been started");
1143     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1144
1145     TraceCallStack& textureTrace = gl.GetTextureTrace();
1146     textureTrace.Enable(true);
1147
1148     application.SendNotification();
1149     application.Render(16);
1150
1151     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
1152     DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
1153
1154     tet_infoline("Test that after 1 tick, and file loads completed, that we have 7 textures");
1155     Test::EmitGlobalTimerSignal();
1156
1157     // Expect the second batch has been requested
1158     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1159
1160     application.SendNotification();
1161     application.Render(16);
1162     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1163
1164     tet_infoline("Test that after 2 ticks that we have 6 textures");
1165
1166     Test::EmitGlobalTimerSignal();
1167     application.SendNotification();
1168     application.Render(16);
1169     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 6, TEST_LOCATION);
1170
1171     tet_infoline("And that at least 2 textures were requested");
1172     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1173     application.SendNotification();
1174     application.Render(16);
1175     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 8, TEST_LOCATION);
1176
1177     tet_infoline("Test that after 3rd tick that we have 7 textures and 1 request");
1178     Test::EmitGlobalTimerSignal();
1179     application.SendNotification();
1180     application.Render(16);
1181     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1182
1183     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1184     application.SendNotification();
1185     application.Render(16);
1186     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 8, TEST_LOCATION);
1187
1188     dummyControl.Unparent();
1189   }
1190   tet_infoline("Test that removing the visual from stage deletes all textures");
1191   application.SendNotification();
1192   application.Render(16);
1193   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1194
1195   END_TEST;
1196 }
1197
1198 int UtcDaliAnimatedImageVisualMultiImage02(void)
1199 {
1200   ToolkitTestApplication application;
1201   TestGlAbstraction&     gl = application.GetGlAbstraction();
1202
1203   tet_infoline("Test that the animated visual has different batch and cache size.");
1204
1205   {
1206     Property::Array urls;
1207     CopyUrlsIntoArray(urls);
1208
1209     Property::Map propertyMap;
1210     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1211     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1212     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 0);
1213     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 0);
1214     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1215
1216     VisualFactory factory = VisualFactory::Get();
1217     Visual::Base  visual  = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1218
1219     // Check the batch size and cache size need to have minimum 2.
1220     Property::Map resultMap;
1221     visual.CreatePropertyMap(resultMap);
1222     Property::Value* value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
1223     DALI_TEST_CHECK(value);
1224     DALI_TEST_EQUALS(value->Get<int>(), 2, TEST_LOCATION);
1225     value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
1226     DALI_TEST_CHECK(value);
1227     DALI_TEST_EQUALS(value->Get<int>(), 2, TEST_LOCATION);
1228     visual.Reset();
1229
1230     // Batch size is 2 and cache size is 3
1231     propertyMap.Clear();
1232     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1233     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1234     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1235     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 3);
1236     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1237
1238     visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1239
1240     // Expect that each image is loaded each tick
1241     DummyControl        dummyControl = DummyControl::New(true);
1242     Impl::DummyControl& dummyImpl1   = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1243     dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1244     visual.Reset();
1245
1246     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1247     application.GetScene().Add(dummyControl);
1248     application.SendNotification();
1249     application.Render(16);
1250
1251     tet_infoline("Ready the visual after the visual is on window");
1252     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1253     application.SendNotification();
1254     application.Render(16); //glGenTextures 1 and 2
1255     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
1256
1257     tet_infoline("Test that each tick, a new image is requested");
1258     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:0
1259     application.SendNotification();
1260     application.Render(16);
1261     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1262     application.SendNotification();
1263     application.Render(16); //glGenTextures 3
1264     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1265
1266     tet_infoline("Test that each tick, a new image is requested");
1267     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:1
1268     application.SendNotification();
1269     application.Render(16);
1270     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1271     application.SendNotification();
1272     application.Render(16); //glGenTextures 4
1273     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1274
1275     dummyImpl1.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1276     dummyControl.Unparent();
1277
1278     // Batch size is 9 and cache size is 4
1279     propertyMap.Clear();
1280     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1281     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1282     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 3);
1283     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 7);
1284     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1285
1286     visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1287
1288     // Expect that each image is loaded each tick
1289     dummyControl                   = DummyControl::New(true);
1290     Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1291     dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1292     visual.Reset();
1293
1294     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1295     application.GetScene().Add(dummyControl);
1296     application.SendNotification();
1297     application.Render(16);
1298
1299     tet_infoline("Ready the visual after the visual is on window");
1300     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1301     application.SendNotification();
1302     application.Render(16); //glGenTextures 1, 2, and 3
1303     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1304
1305     tet_infoline("Test that each tick, a new image is requested");
1306     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:0
1307     application.SendNotification();
1308     application.Render(16);
1309     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1310     application.SendNotification();
1311     application.Render(16); //glGenTextures 4, 5, and 6
1312     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 5, TEST_LOCATION);
1313
1314     tet_infoline("Test that each tick, a new image is requested");
1315     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:1
1316     application.SendNotification();
1317     application.Render(16);
1318     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1319     application.SendNotification();
1320     application.Render(16); //glGenTextures 7, 1, and 2
1321     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1322
1323     tet_infoline("Test that each tick, a new image is requested");
1324     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:2
1325     application.SendNotification();
1326     application.Render(16);
1327     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1328     application.SendNotification();
1329     application.Render(16); //glGenTextures 3
1330     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1331
1332     dummyControl.Unparent();
1333   }
1334   tet_infoline("Test that removing the visual from window deletes all textures");
1335   application.SendNotification();
1336   application.Render(16);
1337   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1338
1339   END_TEST;
1340 }
1341
1342 int UtcDaliAnimatedImageVisualMultiImage03(void)
1343 {
1344   ToolkitTestApplication application;
1345   TestGlAbstraction&     gl = application.GetGlAbstraction();
1346
1347   {
1348     Property::Array urls1, urls2;
1349     CopyUrlsIntoArray(urls1);
1350     CopyUrlsIntoArray(urls2);
1351
1352     Property::Map animatedImageMap1;
1353     animatedImageMap1.Insert(Visual::Property::TYPE, Visual::IMAGE);
1354     animatedImageMap1.Insert(ImageVisual::Property::URL, Property::Value(urls1));
1355     animatedImageMap1.Insert(ImageVisual::Property::BATCH_SIZE, 3);
1356     animatedImageMap1.Insert(ImageVisual::Property::CACHE_SIZE, 3);
1357     animatedImageMap1.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1358
1359     Property::Map animatedImageMap2;
1360     animatedImageMap2.Insert(Visual::Property::TYPE, Visual::IMAGE);
1361     animatedImageMap2.Insert(ImageVisual::Property::URL, Property::Value(urls2));
1362     animatedImageMap2.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1363     animatedImageMap2.Insert(ImageVisual::Property::CACHE_SIZE, 2);
1364     animatedImageMap2.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1365
1366     VisualFactory factory              = VisualFactory::Get();
1367     Visual::Base  animatedImageVisual1 = factory.CreateVisual(animatedImageMap1);
1368
1369     tet_infoline("Create two image views with the same URLs, offset by 1 frame.");
1370
1371     DummyControl        dummyControl1 = DummyControl::New(true);
1372     Impl::DummyControl& dummyImpl1    = static_cast<Impl::DummyControl&>(dummyControl1.GetImplementation());
1373     dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual1);
1374     dummyControl1.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1375     application.GetScene().Add(dummyControl1);
1376
1377     application.SendNotification();
1378     application.Render(16);
1379
1380     tet_infoline("Ready the requested image after the first visual is on stage");
1381     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1382     application.SendNotification();
1383     application.Render(16);
1384     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1385
1386     Visual::Base        animatedImageVisual2 = factory.CreateVisual(animatedImageMap2);
1387     DummyControl        dummyControl2        = DummyControl::New(true);
1388     Impl::DummyControl& dummyImpl2           = static_cast<Impl::DummyControl&>(dummyControl2.GetImplementation());
1389     dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual2);
1390     dummyControl2.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1391     application.GetScene().Add(dummyControl2);
1392     application.SendNotification();
1393     application.Render(16);
1394
1395     tet_infoline("The texture cache should be holding the requested images; check that the renderer has a texture");
1396     TextureSet ts = dummyControl2.GetRendererAt(0).GetTextures();
1397     Texture    t1 = ts.GetTexture(0);
1398     DALI_TEST_EQUALS(ts.GetTextureCount(), 1, TEST_LOCATION);
1399
1400     tet_infoline("Test that on the first tick, 1 new image is requested");
1401     Test::EmitGlobalTimerSignal(); // Both visuals should tick
1402
1403     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1404     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1405
1406     ts         = dummyControl2.GetRendererAt(0).GetTextures();
1407     Texture t2 = ts.GetTexture(0);
1408     DALI_TEST_CHECK(t1 != t2);
1409
1410     dummyControl1.Unparent();
1411     dummyControl2.Unparent();
1412   }
1413   tet_infoline("Test that removing the visual from stage deletes all textures");
1414   application.SendNotification();
1415   application.Render(16);
1416   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1417
1418   END_TEST;
1419 }
1420
1421 int UtcDaliAnimatedImageVisualMultiImage04(void)
1422 {
1423   ToolkitTestApplication application;
1424   TestGlAbstraction&     gl           = application.GetGlAbstraction();
1425   TraceCallStack&        textureTrace = gl.GetTextureTrace();
1426   textureTrace.Enable(true);
1427
1428   tet_infoline("Test that if the cache size is the same as the number of urls, that once the cache is full, no new images are loaded");
1429
1430   Property::Array urls;
1431   CopyUrlsIntoArray(urls);
1432
1433   {
1434     Property::Map propertyMap;
1435     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1436     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1437     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 6);
1438     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 11);
1439     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1440
1441     VisualFactory factory = VisualFactory::Get();
1442     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1443
1444     tet_infoline("Expect that a batch of 7 textures has been requested.");
1445
1446     DummyControl        dummyControl = DummyControl::New(true);
1447     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1448     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1449
1450     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1451     application.GetScene().Add(dummyControl);
1452     application.SendNotification();
1453     application.Render(16);
1454
1455     tet_infoline("Wait for the first batch to complete");
1456     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION);
1457
1458     tet_infoline("Test that a timer has been started");
1459     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1460
1461     application.SendNotification();
1462     application.Render(16);
1463
1464     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 6, TEST_LOCATION);
1465     tet_infoline("Test that after 1 tick, and 5 file loads completed, that we have 11 textures");
1466     Test::EmitGlobalTimerSignal();
1467     application.SendNotification();
1468     application.Render(16);
1469
1470     // Expect the second batch has been requested
1471     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(5), true, TEST_LOCATION);
1472
1473     application.SendNotification();
1474     application.Render(16);
1475     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1476
1477     tet_infoline("Test that after 2 ticks that we have 11 textures and no requests");
1478
1479     Test::EmitGlobalTimerSignal();
1480     application.SendNotification();
1481     application.Render(16);
1482     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 5), false, TEST_LOCATION);
1483     application.SendNotification();
1484     application.Render(16);
1485     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1486
1487     tet_infoline("Test that after 3rd tick that we have 11 textures and no requests");
1488     Test::EmitGlobalTimerSignal();
1489     application.SendNotification();
1490     application.Render(16);
1491
1492     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 5), false, TEST_LOCATION);
1493     application.SendNotification();
1494     application.Render(16);
1495     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1496
1497     dummyControl.Unparent();
1498   }
1499
1500   tet_infoline("Test that removing the visual from stage deletes all textures");
1501   application.SendNotification();
1502   application.Render(16);
1503   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1504
1505   END_TEST;
1506 }
1507
1508 int UtcDaliAnimatedImageVisualMultiImage05(void)
1509 {
1510   ToolkitTestApplication application;
1511   TestGlAbstraction&     gl = application.GetGlAbstraction();
1512
1513   tet_infoline("Test that if the cache size is the same as the number of urls, that removing a partially loaded visual removes all textures");
1514
1515   Property::Array urls;
1516   CopyUrlsIntoArray(urls);
1517
1518   {
1519     Property::Map propertyMap;
1520     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1521     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1522     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
1523     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 11);
1524     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1525
1526     VisualFactory factory = VisualFactory::Get();
1527     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1528
1529     tet_infoline("Expect that a batch of 4 textures has been requested.");
1530
1531     DummyControl        dummyControl = DummyControl::New(true);
1532     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1533     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1534
1535     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1536     application.GetScene().Add(dummyControl);
1537     application.SendNotification();
1538     application.Render(16);
1539
1540     tet_infoline("Wait for the first batch to complete");
1541     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1542
1543     tet_infoline("Test that a timer has been started");
1544     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1545
1546     application.SendNotification();
1547     application.Render(16);
1548
1549     tet_infoline("Test that a timer has been started");
1550     Test::EmitGlobalTimerSignal();
1551     application.SendNotification();
1552     application.Render(16);
1553
1554     dummyControl.Unparent();
1555   }
1556
1557   application.SendNotification();
1558   application.Render(16);
1559   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1560
1561   tet_infoline("Test that pending batch of image loads are cancelled instead of uploaded");
1562   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1563   application.SendNotification();
1564   application.Render(16);
1565   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1566
1567   END_TEST;
1568 }
1569
1570 void TestLoopCount(ToolkitTestApplication& application, DummyControl& dummyControl, uint16_t frameCount, uint16_t loopCount, const char* location)
1571 {
1572   TestGlAbstraction& gl           = application.GetGlAbstraction();
1573   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1574
1575   textureTrace.Enable(true);
1576   application.GetScene().Add(dummyControl);
1577
1578   application.SendNotification();
1579   application.Render(16);
1580
1581   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_INNER_LOCATION(location));
1582
1583   application.SendNotification();
1584   application.Render();
1585
1586   tet_infoline("Test that a timer has been created");
1587   DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_INNER_LOCATION(location));
1588
1589   for(uint16_t i = 0; i < loopCount; i++)
1590   {
1591     for(uint16_t j = 0; j < frameCount; j++)
1592     {
1593       if(i == 0 && j == 0)
1594       {
1595         continue; // Because first frame is already showed and we call 2nd frame at the first time of timer animation.
1596       }
1597       tet_printf("Test that after %u ticks, and we have %u frame \n", j + 1u, j + 1u);
1598       Test::EmitGlobalTimerSignal();
1599       application.SendNotification();
1600       application.Render(16);
1601
1602       DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_INNER_LOCATION(location));
1603
1604       application.SendNotification();
1605       application.Render();
1606       DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_INNER_LOCATION(location));
1607       DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_INNER_LOCATION(location));
1608     }
1609     tet_printf("Test Loop %u \n\n", i + 1u);
1610   }
1611
1612   tet_printf("Test that after %u loops, and we have no frame. Timer should stop \n", loopCount);
1613   Test::EmitGlobalTimerSignal();
1614   application.SendNotification();
1615   application.Render(16);
1616   DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_INNER_LOCATION(location));
1617
1618   dummyControl.Unparent();
1619 }
1620
1621 int UtcDaliAnimatedImageVisualLoopCount(void)
1622 {
1623   ToolkitTestApplication application;
1624
1625   tet_infoline("UtcDaliAnimatedImageVisualLoopCount");
1626
1627   {
1628     // request AnimatedImageVisual with a property map
1629     // Test with no (0) loop count
1630     VisualFactory factory             = VisualFactory::Get();
1631     Visual::Base  animatedImageVisual = factory.CreateVisual(
1632       Property::Map()
1633         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1634         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1635         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1636         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1637         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1638         .Add(DevelImageVisual::Property::LOOP_COUNT, 0));
1639
1640     DummyControl        dummyControl = DummyControl::New(true);
1641     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1642     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1643     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1644
1645     TestLoopCount(application, dummyControl, 4, 0, TEST_LOCATION);
1646
1647     dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1648     animatedImageVisual.Reset();
1649
1650     application.SendNotification();
1651     application.Render(16);
1652
1653     // Test with no (1) loop count. Request AnimatedImageVisual with a property map
1654     animatedImageVisual = factory.CreateVisual(
1655       Property::Map()
1656         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1657         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1658         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1659         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1660         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1661         .Add(DevelImageVisual::Property::LOOP_COUNT, 1));
1662
1663     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1664
1665     TestLoopCount(application, dummyControl, 4, 1, TEST_LOCATION);
1666
1667     dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1668     animatedImageVisual.Reset();
1669
1670     application.SendNotification();
1671     application.Render(16);
1672
1673     // Test with no (100) loop count. Request AnimatedImageVisual with a property map
1674     animatedImageVisual = factory.CreateVisual(
1675       Property::Map()
1676         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1677         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1678         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1679         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1680         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1681         .Add(DevelImageVisual::Property::LOOP_COUNT, 100));
1682
1683     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1684
1685     TestLoopCount(application, dummyControl, 4, 100, TEST_LOCATION);
1686   }
1687   END_TEST;
1688 }
1689
1690 int UtcDaliAnimatedImageVisualPlayback(void)
1691 {
1692   ToolkitTestApplication application;
1693   TestGlAbstraction&     gl           = application.GetGlAbstraction();
1694   TraceCallStack&        textureTrace = gl.GetTextureTrace();
1695
1696   tet_infoline("UtcDaliAnimatedImageVisualPlayback");
1697
1698   {
1699     // request AnimatedImageVisual with a property map
1700     // Test with forever (-1) loop count
1701     VisualFactory factory             = VisualFactory::Get();
1702     Visual::Base  animatedImageVisual = factory.CreateVisual(
1703       Property::Map()
1704         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1705         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1706         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1707         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1708         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1709         .Add(DevelImageVisual::Property::LOOP_COUNT, -1));
1710
1711     DummyControl        dummyControl = DummyControl::New(true);
1712     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1713     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1714     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1715
1716     textureTrace.Enable(true);
1717     application.GetScene().Add(dummyControl);
1718     application.SendNotification();
1719     application.Render(16);
1720
1721     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1722
1723     application.SendNotification();
1724     application.Render();
1725
1726     tet_infoline("Test that a timer has been created");
1727     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1728
1729     Test::EmitGlobalTimerSignal();
1730     application.SendNotification();
1731     application.Render(16);
1732
1733     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1734
1735     application.SendNotification();
1736     application.Render();
1737     DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1738
1739     Property::Map attributes;
1740     tet_infoline("Test Pause action. Timer should stop after Pause action");
1741     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PAUSE, attributes);
1742     Test::EmitGlobalTimerSignal();
1743     application.SendNotification();
1744     application.Render(16);
1745     DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_LOCATION);
1746
1747     tet_infoline("Test Play action. Timer should Restart after Play action");
1748     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes);
1749     Test::EmitGlobalTimerSignal();
1750     application.SendNotification();
1751     application.Render(16);
1752
1753     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1754
1755     application.SendNotification();
1756     application.Render();
1757     DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1758
1759     tet_infoline("Test Stop action. Timer should stop after Stop action");
1760     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, attributes);
1761     Test::EmitGlobalTimerSignal();
1762     application.SendNotification();
1763     application.Render(16);
1764     DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_LOCATION);
1765
1766     tet_infoline("Test Play action. Timer should Restart after Play action");
1767     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes);
1768     Test::EmitGlobalTimerSignal();
1769     application.SendNotification();
1770     application.Render(16);
1771
1772     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1773
1774     application.SendNotification();
1775     application.Render();
1776     DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1777
1778     dummyControl.Unparent();
1779   }
1780
1781   END_TEST;
1782 }