9f02d5f8347eccc176af93e19e11d7ed26ca0d5f
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-Control.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
18 #include <stdlib.h>
19 #include <iostream>
20
21 // Need to override adaptor classes for toolkit test harness, so include
22 // test harness headers before dali headers.
23 #include <dali-toolkit-test-suite-utils.h>
24
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/controls/alignment/alignment.h>
27 #include <dali-toolkit/devel-api/controls/control-devel.h>
28 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-actions-devel.h>
30 #include <dali-toolkit/public-api/align-enumerations.h>
31 #include <dali.h>
32
33 #include <toolkit-event-thread-callback.h>
34
35 #include "dummy-control.h"
36
37 using namespace Dali;
38 using namespace Dali::Toolkit;
39
40 void utc_dali_toolkit_control_startup(void)
41 {
42   test_return_value = TET_UNDEF;
43 }
44
45 void utc_dali_toolkit_control_cleanup(void)
46 {
47   test_return_value = TET_PASS;
48 }
49
50 ///////////////////////////////////////////////////////////////////////////////////////////////////
51
52 namespace
53 {
54 bool gObjectCreatedCallBackCalled;
55
56 void TestCallback(BaseHandle handle)
57 {
58   gObjectCreatedCallBackCalled = true;
59 }
60
61 void TestVoidCallback()
62 {
63 }
64
65 static bool gKeyInputFocusCallBackCalled;
66
67 static void TestKeyInputFocusCallback(Control control)
68 {
69   tet_infoline(" TestKeyInputFocusCallback");
70
71   gKeyInputFocusCallBackCalled = true;
72 }
73
74 const char* TEST_LARGE_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/tbcol.png";
75 const char* TEST_IMAGE_FILE_NAME       = TEST_RESOURCE_DIR "/gallery-small-1.jpg";
76 const char* TEST_SVG_FILE_NAME         = TEST_RESOURCE_DIR "/Kid1.svg";
77
78 Vector4 GetControlBackgroundColor(Control& control)
79 {
80   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
81   Property::Map*  resultMap = propValue.GetMap();
82   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
83
84   Vector4 color;
85   resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get(color);
86
87   return color;
88 }
89
90 bool gResourceReadySignalFired = false;
91
92 void ResourceReadySignal(Control control)
93 {
94   if(control.GetVisualResourceStatus(Control::Property::BACKGROUND) == Visual::ResourceStatus::FAILED)
95   {
96     Property::Map propertyMap;
97     propertyMap.Insert(ImageVisual::Property::URL, TEST_SVG_FILE_NAME);
98     control.SetProperty(Control::Property::BACKGROUND, propertyMap);
99   }
100
101   gResourceReadySignalFired = true;
102 }
103
104 } // namespace
105
106 ///////////////////////////////////////////////////////////////////////////////////////////////////
107
108 int UtcDaliControlConstructor(void)
109 {
110   ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
111
112   DummyControl dummy;
113
114   DALI_TEST_CHECK(!Control::DownCast(dummy));
115
116   dummy = DummyControl::New();
117
118   DALI_TEST_CHECK(Control::DownCast(dummy));
119   END_TEST;
120 }
121
122 int UtcDaliControlNew(void)
123 {
124   ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
125
126   Control control;
127
128   DALI_TEST_CHECK(!Control::DownCast(control));
129
130   control = Control::New();
131
132   DALI_TEST_CHECK(Control::DownCast(control));
133   END_TEST;
134 }
135
136 int UtcDaliControlRegister(void)
137 {
138   ToolkitTestApplication application;
139
140   // Ensure the object is registered after creation
141   ObjectRegistry registry = application.GetCore().GetObjectRegistry();
142   DALI_TEST_CHECK(registry);
143
144   gObjectCreatedCallBackCalled = false;
145   registry.ObjectCreatedSignal().Connect(&TestCallback);
146   {
147     Alignment alignment = Alignment::New();
148   }
149   DALI_TEST_CHECK(gObjectCreatedCallBackCalled);
150   END_TEST;
151 }
152
153 int UtcDaliControlCopyAndAssignment(void)
154 {
155   ToolkitTestApplication application;
156
157   DummyControl control = DummyControl::New();
158   Control      emptyControl;
159
160   Control controlCopy(control);
161   DALI_TEST_CHECK(control == controlCopy);
162
163   Control emptyControlCopy(emptyControl);
164   DALI_TEST_CHECK(emptyControl == emptyControlCopy);
165
166   Control controlEquals;
167   controlEquals = control;
168   DALI_TEST_CHECK(control == controlEquals);
169
170   Control emptyControlEquals;
171   emptyControlEquals = emptyControl;
172   DALI_TEST_CHECK(emptyControl == emptyControlEquals);
173
174   // Self assignment
175   control = control;
176   DALI_TEST_CHECK(control == controlCopy);
177   END_TEST;
178 }
179
180 int UtcDaliControlMoveConstructor(void)
181 {
182   ToolkitTestApplication application;
183
184   Control control = Control::New();
185   DALI_TEST_EQUALS(1, control.GetBaseObject().ReferenceCount(), TEST_LOCATION);
186   control.SetProperty(Actor::Property::SENSITIVE, false);
187   DALI_TEST_CHECK(false == control.GetProperty<bool>(Actor::Property::SENSITIVE));
188
189   Control moved = std::move(control);
190   DALI_TEST_CHECK(moved);
191   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
192   DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
193   DALI_TEST_CHECK(!control);
194
195   END_TEST;
196 }
197
198 int UtcDaliControlMoveAssignment(void)
199 {
200   ToolkitTestApplication application;
201
202   Control control = Control::New();
203   DALI_TEST_EQUALS(1, control.GetBaseObject().ReferenceCount(), TEST_LOCATION);
204   control.SetProperty(Actor::Property::SENSITIVE, false);
205   DALI_TEST_CHECK(false == control.GetProperty<bool>(Actor::Property::SENSITIVE));
206
207   Control moved;
208   moved = std::move(control);
209   DALI_TEST_CHECK(moved);
210   DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
211   DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
212   DALI_TEST_CHECK(!control);
213
214   END_TEST;
215 }
216
217 int UtcDaliControlDownCast(void)
218 {
219   ToolkitTestApplication application;
220
221   DummyControl control;
222
223   DALI_TEST_CHECK(!Control::DownCast(control));
224
225   control = DummyControl::New();
226
227   DALI_TEST_CHECK(Control::DownCast(control));
228
229   Actor actor;
230
231   DALI_TEST_CHECK(!Control::DownCast(actor));
232
233   actor = Actor::New();
234
235   DALI_TEST_CHECK(!Control::DownCast(actor));
236   END_TEST;
237 }
238
239 int UtcDaliControlDownCastTemplate(void)
240 {
241   ToolkitTestApplication application;
242
243   DummyControl control;
244
245   DALI_TEST_CHECK(!DummyControl::DownCast(control));
246
247   control = DummyControl::New();
248
249   DALI_TEST_CHECK(DummyControl::DownCast(control));
250
251   Actor actor;
252
253   DALI_TEST_CHECK(!DummyControl::DownCast(actor));
254
255   actor = Actor::New();
256
257   DALI_TEST_CHECK(!DummyControl::DownCast(actor));
258   END_TEST;
259 }
260
261 int UtcDaliControlNavigationProperties(void)
262 {
263   ToolkitTestApplication application;
264
265   Control control = Control::New();
266   application.GetScene().Add(control);
267
268   DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
269   DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
270   DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
271   DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
272
273   control.SetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 1);
274   DALI_TEST_EQUALS(1, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
275   control.SetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 2);
276   DALI_TEST_EQUALS(2, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
277   control.SetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 3);
278   DALI_TEST_EQUALS(3, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
279   control.SetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 4);
280   DALI_TEST_EQUALS(4, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
281
282   control.SetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 15);
283   DALI_TEST_EQUALS(15, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
284   control.SetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 16);
285   DALI_TEST_EQUALS(16, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
286   control.SetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 17);
287   DALI_TEST_EQUALS(17, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
288   control.SetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 18);
289   DALI_TEST_EQUALS(18, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
290
291   END_TEST;
292 }
293
294 int UtcDaliControlKeyInputFocus(void)
295 {
296   ToolkitTestApplication application;
297   Integration::Scene     stage = application.GetScene();
298
299   DummyControl control;
300
301   PushButton pushButton1 = PushButton::New();
302   stage.Add(pushButton1);
303
304   pushButton1.SetKeyInputFocus();
305   DALI_TEST_CHECK(pushButton1.HasKeyInputFocus());
306
307   pushButton1.ClearKeyInputFocus();
308   DALI_TEST_CHECK(!pushButton1.HasKeyInputFocus());
309   END_TEST;
310 }
311
312 int UtcDaliControlGetImplementationN(void)
313 {
314   ToolkitTestApplication application;
315   DummyControl           control;
316
317   // Get Empty
318   {
319     try
320     {
321       Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
322       (void)controlImpl; // Avoid unused warning
323       tet_result(TET_FAIL);
324     }
325     catch(DaliException& exception)
326     {
327       tet_result(TET_PASS);
328     }
329   }
330   END_TEST;
331 }
332
333 int UtcDaliControlGetImplementationConstN(void)
334 {
335   ToolkitTestApplication application;
336   DummyControl           control;
337
338   // Get Const Empty
339   {
340     try
341     {
342       const DummyControl                constControl(control);
343       const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(constControl);
344       (void)controlImpl; // Avoid unused warning
345       tet_result(TET_FAIL);
346     }
347     catch(DaliException& exception)
348     {
349       tet_result(TET_PASS);
350     }
351   }
352   END_TEST;
353 }
354
355 int UtcDaliControlGetImplementationP(void)
356 {
357   ToolkitTestApplication application;
358   DummyControl           control = DummyControl::New();
359
360   // Get
361   {
362     try
363     {
364       Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
365       (void)controlImpl; // Avoid unused warning
366       tet_result(TET_PASS);
367     }
368     catch(DaliException& exception)
369     {
370       tet_result(TET_FAIL);
371     }
372   }
373   END_TEST;
374 }
375
376 int UtcDaliControlGetImplementationConstP(void)
377 {
378   ToolkitTestApplication application;
379   DummyControl           control = DummyControl::New();
380   // Get Const
381   {
382     try
383     {
384       const DummyControl                constControl(control);
385       const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(constControl);
386       (void)controlImpl; // Avoid unused warning
387       tet_result(TET_PASS);
388     }
389     catch(DaliException& exception)
390     {
391       tet_result(TET_FAIL);
392     }
393   }
394   END_TEST;
395 }
396
397 int UtcDaliControlSignalConnectDisconnect(void)
398 {
399   ToolkitTestApplication application;
400
401   {
402     DummyControl dummy = DummyControlImpl::New();
403
404     Actor actor = Actor::New();
405     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
406     Toolkit::Internal::Control& control   = Toolkit::Internal::GetImplementation(dummy);
407     DummyControlImpl*           dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
408
409     if(dummyImpl == NULL)
410     {
411       tet_result(TET_FAIL);
412       END_TEST;
413     }
414
415     actor.OnSceneSignal().Connect(dummyImpl, &DummyControlImpl::CustomSlot1);
416     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 1u, TEST_LOCATION);
417     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
418
419     application.GetScene().Add(actor);
420     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, true, TEST_LOCATION);
421
422     dummyImpl->mCustomSlot1Called = false;
423     actor.OnSceneSignal().Disconnect(dummyImpl, &DummyControlImpl::CustomSlot1);
424     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
425     application.GetScene().Remove(actor);
426     application.GetScene().Add(actor);
427     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
428   }
429   END_TEST;
430 }
431
432 int UtcDaliControlSignalAutomaticDisconnect(void)
433 {
434   ToolkitTestApplication application;
435
436   Actor actor = Actor::New();
437
438   {
439     DummyControl                dummy     = DummyControlImpl::New();
440     Toolkit::Internal::Control& control   = Toolkit::Internal::GetImplementation(dummy);
441     DummyControlImpl*           dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
442
443     if(dummyImpl == NULL)
444     {
445       tet_result(TET_FAIL);
446       END_TEST;
447     }
448
449     actor.OnSceneSignal().Connect(dummyImpl, &DummyControlImpl::CustomSlot1);
450     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 1u, TEST_LOCATION);
451     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
452
453     application.GetScene().Add(actor);
454     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, true, TEST_LOCATION);
455     application.GetScene().Remove(actor);
456   }
457   // dummyControl automatically disconnects
458
459   DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
460
461   const Vector3 ignoredSize(20, 20, 0);
462   actor.SetProperty(Actor::Property::SIZE, ignoredSize);
463   END_TEST;
464 }
465
466 int UtcDaliControlTestParameters(void)
467 {
468   ToolkitTestApplication application;
469   DummyControl           test = DummyControl::New();
470
471   test.SetProperty(Actor::Property::SIZE, Vector3(0.7f, 0.7f, 0.7f));
472
473   application.GetScene().Add(test);
474
475   application.SendNotification();
476   application.Render();
477
478   float width  = 640.0f;
479   float height = test.GetHeightForWidth(width);
480   DALI_TEST_EQUALS(640.0f, height, TEST_LOCATION);
481   DALI_TEST_EQUALS(640.0f, test.GetWidthForHeight(height), TEST_LOCATION);
482
483   test.KeyEventSignal();
484
485   // Provide coverage for pointer destructor
486   Control* testControlPtr = new Control;
487   DALI_TEST_CHECK(testControlPtr);
488   delete testControlPtr;
489   END_TEST;
490 }
491
492 int UtcDaliControlBackgroundColor(void)
493 {
494   ToolkitTestApplication application;
495   Control                control = Control::New();
496
497   DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
498
499   control.SetProperty(Control::Property::BACKGROUND, Color::RED);
500
501   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
502   Property::Map*  resultMap = propValue.GetMap();
503   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
504   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>() == Visual::COLOR);
505   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
506   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>() == Color::RED);
507
508   control.SetProperty(Control::Property::BACKGROUND, Color::YELLOW);
509
510   propValue = control.GetProperty(Control::Property::BACKGROUND);
511   resultMap = propValue.GetMap();
512   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
513   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>() == Color::YELLOW);
514
515   END_TEST;
516 }
517
518 int UtcDaliControlBackgroundColorRendererCount(void)
519 {
520   tet_infoline("Test ensures we only create renderers when non-transparent color is requested or if we our clipping-mode is set to CLIP_CHILDREN");
521
522   ToolkitTestApplication application;
523   Control                control = Control::New();
524   control[Actor::Property::SIZE] = Vector2(100.0f, 100.0f);
525   application.GetScene().Add(control);
526
527   tet_infoline("Set semi transparent alpha with positive RGB values, 1 renderer should be created, but returned color should reflect what we set");
528   const Vector4 semiTransparent(1.0f, 0.75f, 0.5f, 0.5f);
529   control.SetBackgroundColor(semiTransparent);
530   application.SendNotification();
531   application.Render();
532   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
533   DALI_TEST_EQUALS(GetControlBackgroundColor(control), semiTransparent, TEST_LOCATION);
534
535   Renderer renderer = control.GetRendererAt(0);
536   DALI_TEST_CHECK(renderer);
537
538   tet_infoline("Set semi transparent alpha with positive RGB values, renderer should not be changed");
539   const Vector4 newColor(1.0f, 1.0f, 0.5f, 0.5f);
540   control.SetBackgroundColor(newColor);
541   application.SendNotification();
542   application.Render();
543   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
544   DALI_TEST_EQUALS(GetControlBackgroundColor(control), newColor, TEST_LOCATION);
545   DALI_TEST_EQUALS(renderer, control.GetRendererAt(0), TEST_LOCATION);
546
547   TestGlAbstraction& gl        = application.GetGlAbstraction();
548   TraceCallStack&    drawTrace = gl.GetDrawTrace();
549   drawTrace.Enable(true);
550
551   tet_infoline("Set transparent, 1 renderer should be created, but ensure nothing is drawn");
552   control.SetBackgroundColor(Color::TRANSPARENT);
553   application.SendNotification();
554   application.Render();
555
556   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
557   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
558   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION);
559
560   drawTrace.Reset();
561
562   tet_infoline("Set control to clip its children, a renderer should be created which will be transparent");
563   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
564   application.SendNotification();
565   application.Render();
566
567   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
568   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
569   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION);
570
571   tet_infoline("Set a color, only 1 renderer should exist");
572   control.SetBackgroundColor(Color::RED);
573   application.SendNotification();
574   application.Render();
575   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
576   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::RED, TEST_LOCATION);
577
578   tet_infoline("Clear the background, no renderers");
579   control.ClearBackground();
580   application.SendNotification();
581   application.Render();
582   DALI_TEST_EQUALS(control.GetRendererCount(), 0u, TEST_LOCATION);
583
584   tet_infoline("Set control to clip its children again, a renderer should be created which will be transparent");
585   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
586   application.SendNotification();
587   application.Render();
588   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
589   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
590
591   drawTrace.Reset();
592
593   tet_infoline("Disable clipping, render nothing");
594   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::DISABLED);
595   application.SendNotification();
596   application.Render();
597
598   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
599   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION);
600
601   END_TEST;
602 }
603
604 int UtcDaliControlBackgroundImage(void)
605 {
606   ToolkitTestApplication application;
607   Control                control = Control::New();
608
609   tet_infoline("Set first background image");
610   control.SetProperty(Control::Property::BACKGROUND, "TestImage");
611
612   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
613   Property::Map*  resultMap = propValue.GetMap();
614   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
615   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>() == Visual::IMAGE);
616   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
617   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>() == "TestImage");
618
619   tet_infoline("Set replacement background image");
620   control.SetProperty(Control::Property::BACKGROUND, "TestImage2");
621
622   propValue = control.GetProperty(Control::Property::BACKGROUND);
623   resultMap = propValue.GetMap();
624   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
625   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>() == "TestImage2");
626
627   END_TEST;
628 }
629
630 int UtcDaliControlBackgroundProperties(void)
631 {
632   ToolkitTestApplication application;
633   Control                control = Control::New();
634
635   DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
636
637   Property::Map imageMap;
638   imageMap[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
639   imageMap[ImageVisual::Property::URL]      = "TestImage";
640   control.SetProperty(Control::Property::BACKGROUND, imageMap);
641   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
642   Property::Map*  resultMap = propValue.GetMap();
643   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
644   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
645   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
646   DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "TestImage", TEST_LOCATION);
647
648   Property::Map rendererMap;
649   rendererMap[Visual::Property::TYPE]           = Visual::COLOR;
650   rendererMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
651   control.SetProperty(Control::Property::BACKGROUND, rendererMap);
652   propValue = control.GetProperty(Control::Property::BACKGROUND);
653   resultMap = propValue.GetMap();
654   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
655   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
656   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
657   DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::CYAN, TEST_LOCATION);
658
659   Property::Map emptyMap;
660   control.SetProperty(Control::Property::BACKGROUND, emptyMap);
661   DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
662
663   // set as URL
664   control.SetProperty(Control::Property::BACKGROUND, "Foobar.png");
665   propValue = control.GetProperty(Control::Property::BACKGROUND);
666   resultMap = propValue.GetMap();
667   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
668   DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "Foobar.png", TEST_LOCATION);
669
670   // set as Color
671   control.SetProperty(Control::Property::BACKGROUND, Color::RED);
672   propValue = control.GetProperty(Control::Property::BACKGROUND);
673   resultMap = propValue.GetMap();
674   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
675   DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::RED, TEST_LOCATION);
676
677   END_TEST;
678 }
679
680 int UtcDaliControlShadowProperties(void)
681 {
682   ToolkitTestApplication application;
683   Control                control = Control::New();
684
685   DALI_TEST_CHECK(control.GetProperty(DevelControl::Property::SHADOW).Get<Property::Map>().Empty());
686
687   Property::Map imageMap;
688   imageMap[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
689   imageMap[ImageVisual::Property::URL]      = "TestImage";
690   control.SetProperty(DevelControl::Property::SHADOW, imageMap);
691   Property::Value propValue = control.GetProperty(DevelControl::Property::SHADOW);
692   Property::Map*  resultMap = propValue.GetMap();
693   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
694   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
695   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
696   DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "TestImage", TEST_LOCATION);
697
698   Property::Map colorMap;
699   colorMap[Visual::Property::TYPE]           = Visual::COLOR;
700   colorMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
701   control.SetProperty(DevelControl::Property::SHADOW, colorMap);
702   propValue = control.GetProperty(DevelControl::Property::SHADOW);
703   resultMap = propValue.GetMap();
704   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
705   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
706   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
707   DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::CYAN, TEST_LOCATION);
708
709   Property::Map emptyMap;
710   control.SetProperty(DevelControl::Property::SHADOW, emptyMap);
711   DALI_TEST_CHECK(control.GetProperty(DevelControl::Property::SHADOW).Get<Property::Map>().Empty());
712
713   END_TEST;
714 }
715
716 int UtcDaliControlKeyProperties(void)
717 {
718   ToolkitTestApplication application;
719
720   Control control = Control::New();
721   application.GetScene().Add(control);
722
723   DALI_TEST_EQUALS(control.HasKeyInputFocus(), control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
724
725   control.SetKeyInputFocus();
726   DALI_TEST_EQUALS(true, control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
727
728   control.ClearKeyInputFocus();
729   DALI_TEST_EQUALS(false, control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
730
731   control.SetProperty(Control::Property::KEY_INPUT_FOCUS, true);
732   DALI_TEST_EQUALS(true, control.HasKeyInputFocus(), TEST_LOCATION);
733
734   END_TEST;
735 }
736
737 int UtcDaliControlGestureSignals(void)
738 {
739   ToolkitTestApplication application;
740   ConnectionTracker      connectionTracker;
741   Control                control = Control::New();
742
743   // Each gesture detector gets created when connecting to the gesture signals
744   DALI_TEST_CHECK(!control.GetTapGestureDetector());
745   control.ConnectSignal(&connectionTracker, "tapped", &TestVoidCallback);
746   DALI_TEST_CHECK(control.GetTapGestureDetector());
747
748   DALI_TEST_CHECK(!control.GetPanGestureDetector());
749   control.ConnectSignal(&connectionTracker, "panned", &TestVoidCallback);
750   DALI_TEST_CHECK(control.GetPanGestureDetector());
751
752   DALI_TEST_CHECK(!control.GetPinchGestureDetector());
753   control.ConnectSignal(&connectionTracker, "pinched", &TestVoidCallback);
754   DALI_TEST_CHECK(control.GetPinchGestureDetector());
755
756   DALI_TEST_CHECK(!control.GetLongPressGestureDetector());
757   control.ConnectSignal(&connectionTracker, "longPressed", &TestVoidCallback);
758   DALI_TEST_CHECK(control.GetLongPressGestureDetector());
759
760   END_TEST;
761 }
762
763 int UtcDaliControlImplKeyInputFocusGainedSignal(void)
764 {
765   ToolkitTestApplication application;
766
767   Control control = Control::New();
768   application.GetScene().Add(control);
769
770   gKeyInputFocusCallBackCalled = false;
771   control.KeyInputFocusGainedSignal().Connect(&TestKeyInputFocusCallback);
772
773   application.SendNotification();
774   application.Render();
775
776   control.SetKeyInputFocus();
777
778   DALI_TEST_CHECK(control.HasKeyInputFocus());
779
780   DALI_TEST_CHECK(gKeyInputFocusCallBackCalled);
781
782   END_TEST;
783 }
784
785 int UtcDaliControlImplKeyInputFocusLostSignal(void)
786 {
787   ToolkitTestApplication application;
788
789   Control control = Control::New();
790   application.GetScene().Add(control);
791
792   gKeyInputFocusCallBackCalled = false;
793   control.KeyInputFocusLostSignal().Connect(&TestKeyInputFocusCallback);
794
795   application.SendNotification();
796   application.Render();
797
798   control.SetKeyInputFocus();
799
800   DALI_TEST_CHECK(control.HasKeyInputFocus());
801
802   control.ClearKeyInputFocus();
803
804   DALI_TEST_CHECK(gKeyInputFocusCallBackCalled);
805
806   END_TEST;
807 }
808
809 int UtcDaliControlImplGetControlExtensionP(void)
810 {
811   ToolkitTestApplication application;
812   Control                control = Control::New();
813
814   Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
815
816   DALI_TEST_CHECK(NULL == controlImpl.GetControlExtension());
817
818   END_TEST;
819 }
820
821 int UtcDaliControlAutoClipping(void)
822 {
823   ToolkitTestApplication application;
824   Control                control = Control::New();
825
826   tet_infoline("Test to see if a renderer gets added when we are clipping children");
827
828   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
829
830   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
831
832   application.GetScene().Add(control);
833
834   application.SendNotification();
835   application.Render();
836
837   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
838
839   END_TEST;
840 }
841
842 int UtcDaliControlAutoClippingN(void)
843 {
844   ToolkitTestApplication application;
845   Control                control = Control::New();
846   control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(ColorVisual::Property::MIX_COLOR, Color::RED));
847
848   tet_infoline("Test to ensure that a renderer does NOT get added when we are clipping children and already have renderers/visuals");
849
850   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
851
852   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
853
854   application.GetScene().Add(control);
855
856   application.SendNotification();
857   application.Render();
858
859   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION); // Only 1, not 2
860
861   // Ensure the background color is still RED rather than what's set by the automatic clipping
862   Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
863   Property::Map*  map   = value.GetMap();
864   DALI_TEST_CHECK(map);
865   Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR);
866   DALI_TEST_CHECK(colorValue);
867   DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Color::RED, TEST_LOCATION);
868
869   END_TEST;
870 }
871
872 int UtcDaliControlAutoClippingWhenAlreadyOnStage(void)
873 {
874   ToolkitTestApplication application;
875   Control                control = Control::New();
876
877   tet_infoline("Test to see if a renderer gets added when we are clipping children and when already on stage");
878
879   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
880
881   application.GetScene().Add(control);
882
883   application.SendNotification();
884   application.Render();
885
886   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
887
888   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
889
890   application.SendNotification();
891   application.Render();
892
893   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
894
895   END_TEST;
896 }
897
898 int UtcDaliControlAutoClippingWhenAlreadyOnStageN(void)
899 {
900   ToolkitTestApplication application;
901   Control                control = Control::New();
902   control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(ColorVisual::Property::MIX_COLOR, Color::RED));
903
904   tet_infoline("Test to ensure that a renderer does NOT get added when we are clipping children and already have renderers/visuals and when already on stage");
905
906   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
907
908   application.GetScene().Add(control);
909
910   application.SendNotification();
911   application.Render();
912
913   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
914
915   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
916
917   application.SendNotification();
918   application.Render();
919
920   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION); // Still should be 1
921
922   // Ensure the background color is still RED rather than what's set by the automatic clipping
923   Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
924   Property::Map*  map   = value.GetMap();
925   DALI_TEST_CHECK(map);
926   Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR);
927   DALI_TEST_CHECK(colorValue);
928   DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Color::RED, TEST_LOCATION);
929
930   END_TEST;
931 }
932
933 int UtcDaliControlSetTransformSize(void)
934 {
935   ToolkitTestApplication application;
936   Control                control = Control::New();
937
938   Property::Map transformMap;
939   transformMap.Add(Visual::Transform::Property::OFFSET, Vector2(10, 10))
940     .Add(Visual::Transform::Property::ANCHOR_POINT, Align::BOTTOM_END)
941     .Add(Visual::Transform::Property::ORIGIN, Align::BOTTOM_END)
942     .Add(Visual::Transform::Property::SIZE, Vector2(10, 20));
943
944   control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(Visual::Property::TRANSFORM, transformMap));
945
946   tet_infoline("Test to ensure that the control background transform does not get overwritten when adding to the stage");
947
948   application.GetScene().Add(control);
949
950   application.SendNotification();
951   application.Render();
952
953   // Ensure the transform property still matches what we set
954   Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
955   Property::Map*  map   = value.GetMap();
956   DALI_TEST_CHECK(map);
957   Property::Value* transformValue = map->Find(Visual::Property::TRANSFORM);
958   DALI_TEST_CHECK(transformValue);
959
960   Property::Map* retMap = transformValue->GetMap();
961   DALI_TEST_CHECK(retMap);
962   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(10, 10), TEST_LOCATION);
963   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::ANCHOR_POINT)->Get<int>(), (int)Align::BOTTOM_END, TEST_LOCATION);
964   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::ORIGIN)->Get<int>(), (int)Align::BOTTOM_END, TEST_LOCATION);
965   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get<Vector2>(), Vector2(10, 20), TEST_LOCATION);
966
967   END_TEST;
968 }
969
970 int UtcDaliControlResourcesReady(void)
971 {
972   ToolkitTestApplication application;
973   tet_infoline("Register 2 visuals and check ResourceReady when a visual is disabled");
974
975   VisualFactory factory = VisualFactory::Get();
976   DALI_TEST_CHECK(factory);
977
978   Property::Map propertyMapLarge;
979   propertyMapLarge.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
980   propertyMapLarge.Insert(ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME);
981
982   Property::Map propertyMapSmall;
983   propertyMapSmall.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
984   propertyMapSmall.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
985
986   Visual::Base smallVisual = factory.CreateVisual(propertyMapSmall);
987   smallVisual.SetName("smallVisual");
988   DALI_TEST_CHECK(smallVisual);
989
990   DummyControl      actor     = DummyControl::New();
991   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
992
993   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, smallVisual);
994
995   actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
996
997   Toolkit::Visual::ResourceStatus resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
998   DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
999   DALI_TEST_EQUALS(actor.IsResourceReady(), false, TEST_LOCATION);
1000   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
1001
1002   application.GetScene().Add(actor);
1003   application.SendNotification();
1004   application.Render();
1005
1006   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1007
1008   application.SendNotification();
1009   application.Render();
1010
1011   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
1012   DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
1013   DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
1014   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
1015
1016   Visual::Base largeVisual = factory.CreateVisual(propertyMapLarge);
1017   largeVisual.SetName("largeVisual");
1018   DALI_TEST_CHECK(largeVisual);
1019
1020   tet_infoline("Register Visual but set disabled, IsResourceReady should be true");
1021
1022   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL2, largeVisual, false);
1023
1024   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
1025   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
1026
1027   application.SendNotification();
1028
1029   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
1030   DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
1031   DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
1032   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
1033
1034   dummyImpl.EnableVisual(DummyControl::Property::TEST_VISUAL2, true);
1035
1036   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1037
1038   application.SendNotification();
1039
1040   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
1041   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
1042
1043   END_TEST;
1044 }
1045
1046 int UtcDaliControlResourcesReady02(void)
1047 {
1048   ToolkitTestApplication application;
1049   tet_infoline("Change a resource during ResourceReady callback");
1050
1051   gResourceReadySignalFired = false;
1052
1053   Control control = Control::New();
1054   control.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1055   control.ResourceReadySignal().Connect(&ResourceReadySignal);
1056
1057   Property::Map propertyMap;
1058   propertyMap.Insert(ImageVisual::Property::URL, "invalid.jpg");
1059   control.SetProperty(Control::Property::BACKGROUND, propertyMap);
1060
1061   application.GetScene().Add(control);
1062
1063   application.SendNotification();
1064   application.Render();
1065
1066   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1067
1068   application.SendNotification();
1069   application.Render();
1070
1071   DALI_TEST_EQUALS(control.IsResourceReady(), true, TEST_LOCATION);
1072   DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1073   gResourceReadySignalFired = false;
1074
1075   END_TEST;
1076 }
1077
1078 int UtcDaliControlMarginProperty(void)
1079 {
1080   ToolkitTestApplication application;
1081
1082   Control control = Control::New();
1083   control.SetBackgroundColor(Color::BLUE);
1084
1085   control.SetProperty(Control::Property::MARGIN, Extents(20, 10, 0, 0));
1086
1087   application.GetScene().Add(control);
1088
1089   application.SendNotification();
1090   application.Render();
1091
1092   DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::MARGIN), Extents(20, 10, 0, 0), TEST_LOCATION);
1093
1094   // Parent control has one ImageView as a Child.
1095   ImageView image = ImageView::New();
1096   image.SetBackgroundColor(Color::RED);
1097   image.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1098   image.SetProperty(Control::Property::PADDING, Extents(10, 10, 10, 10));
1099   control.Add(image);
1100
1101   application.SendNotification();
1102   application.Render();
1103
1104   DALI_TEST_EQUALS(image.GetProperty<Extents>(Control::Property::PADDING), Extents(10, 10, 10, 10), TEST_LOCATION);
1105
1106   END_TEST;
1107 }
1108
1109 int UtcDaliControlPaddingProperty(void)
1110 {
1111   ToolkitTestApplication application;
1112
1113   Control control = Control::New();
1114   control.SetBackgroundColor(Color::BLUE);
1115
1116   control.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
1117
1118   application.GetScene().Add(control);
1119
1120   application.SendNotification();
1121   application.Render();
1122
1123   DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
1124
1125   Control child = Control::New();
1126   control.Add(child);
1127
1128   application.SendNotification();
1129   application.Render();
1130
1131   DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
1132
1133   control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT);
1134   application.SendNotification();
1135   application.Render();
1136   DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(10, 5, 0), TEST_LOCATION);
1137
1138   control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::LEFT_TO_RIGHT);
1139   application.SendNotification();
1140   application.Render();
1141
1142   DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
1143
1144   END_TEST;
1145 }
1146
1147 int UtcDaliControlDoAction(void)
1148 {
1149   ToolkitTestApplication application;
1150   tet_infoline("DoAction on a visual registered with a control");
1151
1152   // Set up trace debug
1153   TestGlAbstraction& gl           = application.GetGlAbstraction();
1154   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1155   textureTrace.Enable(true);
1156
1157   //Created AnimatedImageVisual
1158   VisualFactory factory     = VisualFactory::Get();
1159   Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
1160
1161   DummyControl        dummyControl = DummyControl::New(true);
1162   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1163
1164   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
1165   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1166   application.GetScene().Add(dummyControl);
1167
1168   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1169
1170   application.SendNotification();
1171   application.Render();
1172   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
1173   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
1174   textureTrace.Reset();
1175
1176   Property::Map attributes;
1177   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
1178
1179   tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
1180   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1181
1182   application.SendNotification();
1183   application.Render();
1184   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
1185   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
1186   END_TEST;
1187 }
1188
1189 int UtcDaliControlDoActionWhenNotStage(void)
1190 {
1191   ToolkitTestApplication application;
1192   tet_infoline("DoAction on a visual registered with a control but not staged");
1193
1194   // Set up trace debug
1195   TestGlAbstraction& gl           = application.GetGlAbstraction();
1196   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1197   textureTrace.Enable(true);
1198
1199   //Created AnimatedImageVisual
1200   VisualFactory factory     = VisualFactory::Get();
1201   Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
1202
1203   DummyControl        dummyControl = DummyControl::New(true);
1204   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1205
1206   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
1207   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1208
1209   application.SendNotification();
1210   application.Render();
1211   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
1212   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
1213   textureTrace.Reset();
1214
1215   Property::Map attributes;
1216   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
1217
1218   tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
1219   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1220
1221   application.SendNotification();
1222   application.Render();
1223   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
1224   textureTrace.Reset();
1225
1226   tet_infoline("Adding control to stage will in turn add the visual to the stage");
1227
1228   application.GetScene().Add(dummyControl);
1229   application.SendNotification();
1230   application.Render();
1231   tet_infoline("No change in textures could occurs as already loaded and cached texture will be used");
1232
1233   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
1234   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
1235   textureTrace.Reset();
1236
1237   END_TEST;
1238 }