6745fea8473b294e164bb4178007625b6b150760
[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   DALI_TEST_EQUALS(-1, control.GetProperty( DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION);
273   DALI_TEST_EQUALS(-1, control.GetProperty( DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION);
274
275   control.SetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 1);
276   DALI_TEST_EQUALS(1, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
277   control.SetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 2);
278   DALI_TEST_EQUALS(2, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
279   control.SetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 3);
280   DALI_TEST_EQUALS(3, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
281   control.SetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 4);
282   DALI_TEST_EQUALS(4, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
283
284   control.SetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 15);
285   DALI_TEST_EQUALS(15, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
286   control.SetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 16);
287   DALI_TEST_EQUALS(16, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
288   control.SetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 17);
289   DALI_TEST_EQUALS(17, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
290   control.SetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 18);
291   DALI_TEST_EQUALS(18, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
292   control.SetProperty(DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID, 19);
293   DALI_TEST_EQUALS(19, control.GetProperty( DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION);
294   control.SetProperty(DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID, 20);
295   DALI_TEST_EQUALS(20, control.GetProperty( DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION);
296
297   END_TEST;
298 }
299
300 int UtcDaliControlKeyInputFocus(void)
301 {
302   ToolkitTestApplication application;
303   Integration::Scene     stage = application.GetScene();
304
305   DummyControl control;
306
307   PushButton pushButton1 = PushButton::New();
308   stage.Add(pushButton1);
309
310   pushButton1.SetKeyInputFocus();
311   DALI_TEST_CHECK(pushButton1.HasKeyInputFocus());
312
313   pushButton1.ClearKeyInputFocus();
314   DALI_TEST_CHECK(!pushButton1.HasKeyInputFocus());
315   END_TEST;
316 }
317
318 int UtcDaliControlGetImplementationN(void)
319 {
320   ToolkitTestApplication application;
321   DummyControl           control;
322
323   // Get Empty
324   {
325     try
326     {
327       Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
328       (void)controlImpl; // Avoid unused warning
329       tet_result(TET_FAIL);
330     }
331     catch(DaliException& exception)
332     {
333       tet_result(TET_PASS);
334     }
335   }
336   END_TEST;
337 }
338
339 int UtcDaliControlGetImplementationConstN(void)
340 {
341   ToolkitTestApplication application;
342   DummyControl           control;
343
344   // Get Const Empty
345   {
346     try
347     {
348       const DummyControl                constControl(control);
349       const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(constControl);
350       (void)controlImpl; // Avoid unused warning
351       tet_result(TET_FAIL);
352     }
353     catch(DaliException& exception)
354     {
355       tet_result(TET_PASS);
356     }
357   }
358   END_TEST;
359 }
360
361 int UtcDaliControlGetImplementationP(void)
362 {
363   ToolkitTestApplication application;
364   DummyControl           control = DummyControl::New();
365
366   // Get
367   {
368     try
369     {
370       Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
371       (void)controlImpl; // Avoid unused warning
372       tet_result(TET_PASS);
373     }
374     catch(DaliException& exception)
375     {
376       tet_result(TET_FAIL);
377     }
378   }
379   END_TEST;
380 }
381
382 int UtcDaliControlGetImplementationConstP(void)
383 {
384   ToolkitTestApplication application;
385   DummyControl           control = DummyControl::New();
386   // Get Const
387   {
388     try
389     {
390       const DummyControl                constControl(control);
391       const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(constControl);
392       (void)controlImpl; // Avoid unused warning
393       tet_result(TET_PASS);
394     }
395     catch(DaliException& exception)
396     {
397       tet_result(TET_FAIL);
398     }
399   }
400   END_TEST;
401 }
402
403 int UtcDaliControlSignalConnectDisconnect(void)
404 {
405   ToolkitTestApplication application;
406
407   {
408     DummyControl dummy = DummyControlImpl::New();
409
410     Actor actor = Actor::New();
411     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
412     Toolkit::Internal::Control& control   = Toolkit::Internal::GetImplementation(dummy);
413     DummyControlImpl*           dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
414
415     if(dummyImpl == NULL)
416     {
417       tet_result(TET_FAIL);
418       END_TEST;
419     }
420
421     actor.OnSceneSignal().Connect(dummyImpl, &DummyControlImpl::CustomSlot1);
422     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 1u, TEST_LOCATION);
423     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
424
425     application.GetScene().Add(actor);
426     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, true, TEST_LOCATION);
427
428     dummyImpl->mCustomSlot1Called = false;
429     actor.OnSceneSignal().Disconnect(dummyImpl, &DummyControlImpl::CustomSlot1);
430     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
431     application.GetScene().Remove(actor);
432     application.GetScene().Add(actor);
433     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
434   }
435   END_TEST;
436 }
437
438 int UtcDaliControlSignalAutomaticDisconnect(void)
439 {
440   ToolkitTestApplication application;
441
442   Actor actor = Actor::New();
443
444   {
445     DummyControl                dummy     = DummyControlImpl::New();
446     Toolkit::Internal::Control& control   = Toolkit::Internal::GetImplementation(dummy);
447     DummyControlImpl*           dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
448
449     if(dummyImpl == NULL)
450     {
451       tet_result(TET_FAIL);
452       END_TEST;
453     }
454
455     actor.OnSceneSignal().Connect(dummyImpl, &DummyControlImpl::CustomSlot1);
456     DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 1u, TEST_LOCATION);
457     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
458
459     application.GetScene().Add(actor);
460     DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, true, TEST_LOCATION);
461     application.GetScene().Remove(actor);
462   }
463   // dummyControl automatically disconnects
464
465   DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
466
467   const Vector3 ignoredSize(20, 20, 0);
468   actor.SetProperty(Actor::Property::SIZE, ignoredSize);
469   END_TEST;
470 }
471
472 int UtcDaliControlTestParameters(void)
473 {
474   ToolkitTestApplication application;
475   DummyControl           test = DummyControl::New();
476
477   test.SetProperty(Actor::Property::SIZE, Vector3(0.7f, 0.7f, 0.7f));
478
479   application.GetScene().Add(test);
480
481   application.SendNotification();
482   application.Render();
483
484   float width  = 640.0f;
485   float height = test.GetHeightForWidth(width);
486   DALI_TEST_EQUALS(640.0f, height, TEST_LOCATION);
487   DALI_TEST_EQUALS(640.0f, test.GetWidthForHeight(height), TEST_LOCATION);
488
489   test.KeyEventSignal();
490
491   // Provide coverage for pointer destructor
492   Control* testControlPtr = new Control;
493   DALI_TEST_CHECK(testControlPtr);
494   delete testControlPtr;
495   END_TEST;
496 }
497
498 int UtcDaliControlBackgroundColor(void)
499 {
500   ToolkitTestApplication application;
501   Control                control = Control::New();
502
503   DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
504
505   control.SetProperty(Control::Property::BACKGROUND, Color::RED);
506
507   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
508   Property::Map*  resultMap = propValue.GetMap();
509   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
510   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>() == Visual::COLOR);
511   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
512   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>() == Color::RED);
513
514   control.SetProperty(Control::Property::BACKGROUND, Color::YELLOW);
515
516   propValue = control.GetProperty(Control::Property::BACKGROUND);
517   resultMap = propValue.GetMap();
518   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
519   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>() == Color::YELLOW);
520
521   END_TEST;
522 }
523
524 int UtcDaliControlBackgroundColorRendererCount(void)
525 {
526   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");
527
528   ToolkitTestApplication application;
529   Control                control = Control::New();
530   control[Actor::Property::SIZE] = Vector2(100.0f, 100.0f);
531   application.GetScene().Add(control);
532
533   tet_infoline("Set semi transparent alpha with positive RGB values, 1 renderer should be created, but returned color should reflect what we set");
534   const Vector4 semiTransparent(1.0f, 0.75f, 0.5f, 0.5f);
535   control.SetBackgroundColor(semiTransparent);
536   application.SendNotification();
537   application.Render();
538   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
539   DALI_TEST_EQUALS(GetControlBackgroundColor(control), semiTransparent, TEST_LOCATION);
540
541   Renderer renderer = control.GetRendererAt(0);
542   DALI_TEST_CHECK(renderer);
543
544   tet_infoline("Set semi transparent alpha with positive RGB values, renderer should not be changed");
545   const Vector4 newColor(1.0f, 1.0f, 0.5f, 0.5f);
546   control.SetBackgroundColor(newColor);
547   application.SendNotification();
548   application.Render();
549   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
550   DALI_TEST_EQUALS(GetControlBackgroundColor(control), newColor, TEST_LOCATION);
551   DALI_TEST_EQUALS(renderer, control.GetRendererAt(0), TEST_LOCATION);
552
553   TestGlAbstraction& gl        = application.GetGlAbstraction();
554   TraceCallStack&    drawTrace = gl.GetDrawTrace();
555   drawTrace.Enable(true);
556
557   tet_infoline("Set transparent, 1 renderer should be created, but ensure nothing is drawn");
558   control.SetBackgroundColor(Color::TRANSPARENT);
559   application.SendNotification();
560   application.Render();
561
562   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
563   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
564   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION);
565
566   drawTrace.Reset();
567
568   tet_infoline("Set control to clip its children, a renderer should be created which will be transparent");
569   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
570   application.SendNotification();
571   application.Render();
572
573   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
574   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
575   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION);
576
577   tet_infoline("Set a color, only 1 renderer should exist");
578   control.SetBackgroundColor(Color::RED);
579   application.SendNotification();
580   application.Render();
581   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
582   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::RED, TEST_LOCATION);
583
584   tet_infoline("Clear the background, no renderers");
585   control.ClearBackground();
586   application.SendNotification();
587   application.Render();
588   DALI_TEST_EQUALS(control.GetRendererCount(), 0u, TEST_LOCATION);
589
590   tet_infoline("Set control to clip its children again, a renderer should be created which will be transparent");
591   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
592   application.SendNotification();
593   application.Render();
594   DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
595   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
596
597   drawTrace.Reset();
598
599   tet_infoline("Disable clipping, render nothing");
600   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::DISABLED);
601   application.SendNotification();
602   application.Render();
603
604   DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
605   DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION);
606
607   END_TEST;
608 }
609
610 int UtcDaliControlBackgroundImage(void)
611 {
612   ToolkitTestApplication application;
613   Control                control = Control::New();
614
615   tet_infoline("Set first background image");
616   control.SetProperty(Control::Property::BACKGROUND, "TestImage");
617
618   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
619   Property::Map*  resultMap = propValue.GetMap();
620   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
621   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>() == Visual::IMAGE);
622   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
623   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>() == "TestImage");
624
625   tet_infoline("Set replacement background image");
626   control.SetProperty(Control::Property::BACKGROUND, "TestImage2");
627
628   propValue = control.GetProperty(Control::Property::BACKGROUND);
629   resultMap = propValue.GetMap();
630   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
631   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>() == "TestImage2");
632
633   END_TEST;
634 }
635
636 int UtcDaliControlBackgroundProperties(void)
637 {
638   ToolkitTestApplication application;
639   Control                control = Control::New();
640
641   DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
642
643   Property::Map imageMap;
644   imageMap[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
645   imageMap[ImageVisual::Property::URL]      = "TestImage";
646   control.SetProperty(Control::Property::BACKGROUND, imageMap);
647   Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
648   Property::Map*  resultMap = propValue.GetMap();
649   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
650   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
651   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
652   DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "TestImage", TEST_LOCATION);
653
654   Property::Map rendererMap;
655   rendererMap[Visual::Property::TYPE]           = Visual::COLOR;
656   rendererMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
657   control.SetProperty(Control::Property::BACKGROUND, rendererMap);
658   propValue = control.GetProperty(Control::Property::BACKGROUND);
659   resultMap = propValue.GetMap();
660   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
661   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
662   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
663   DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::CYAN, TEST_LOCATION);
664
665   Property::Map emptyMap;
666   control.SetProperty(Control::Property::BACKGROUND, emptyMap);
667   DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
668
669   // set as URL
670   control.SetProperty(Control::Property::BACKGROUND, "Foobar.png");
671   propValue = control.GetProperty(Control::Property::BACKGROUND);
672   resultMap = propValue.GetMap();
673   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
674   DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "Foobar.png", TEST_LOCATION);
675
676   // set as Color
677   control.SetProperty(Control::Property::BACKGROUND, Color::RED);
678   propValue = control.GetProperty(Control::Property::BACKGROUND);
679   resultMap = propValue.GetMap();
680   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
681   DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::RED, TEST_LOCATION);
682
683   END_TEST;
684 }
685
686 int UtcDaliControlShadowProperties(void)
687 {
688   ToolkitTestApplication application;
689   Control                control = Control::New();
690
691   DALI_TEST_CHECK(control.GetProperty(DevelControl::Property::SHADOW).Get<Property::Map>().Empty());
692
693   Property::Map imageMap;
694   imageMap[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
695   imageMap[ImageVisual::Property::URL]      = "TestImage";
696   control.SetProperty(DevelControl::Property::SHADOW, imageMap);
697   Property::Value propValue = control.GetProperty(DevelControl::Property::SHADOW);
698   Property::Map*  resultMap = propValue.GetMap();
699   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
700   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
701   DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
702   DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "TestImage", TEST_LOCATION);
703
704   Property::Map colorMap;
705   colorMap[Visual::Property::TYPE]           = Visual::COLOR;
706   colorMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
707   control.SetProperty(DevelControl::Property::SHADOW, colorMap);
708   propValue = control.GetProperty(DevelControl::Property::SHADOW);
709   resultMap = propValue.GetMap();
710   DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
711   DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
712   DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
713   DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::CYAN, TEST_LOCATION);
714
715   Property::Map emptyMap;
716   control.SetProperty(DevelControl::Property::SHADOW, emptyMap);
717   DALI_TEST_CHECK(control.GetProperty(DevelControl::Property::SHADOW).Get<Property::Map>().Empty());
718
719   END_TEST;
720 }
721
722 int UtcDaliControlKeyProperties(void)
723 {
724   ToolkitTestApplication application;
725
726   Control control = Control::New();
727   application.GetScene().Add(control);
728
729   DALI_TEST_EQUALS(control.HasKeyInputFocus(), control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
730
731   control.SetKeyInputFocus();
732   DALI_TEST_EQUALS(true, control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
733
734   control.ClearKeyInputFocus();
735   DALI_TEST_EQUALS(false, control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
736
737   control.SetProperty(Control::Property::KEY_INPUT_FOCUS, true);
738   DALI_TEST_EQUALS(true, control.HasKeyInputFocus(), TEST_LOCATION);
739
740   END_TEST;
741 }
742
743 int UtcDaliControlGestureSignals(void)
744 {
745   ToolkitTestApplication application;
746   ConnectionTracker      connectionTracker;
747   Control                control = Control::New();
748
749   // Each gesture detector gets created when connecting to the gesture signals
750   DALI_TEST_CHECK(!control.GetTapGestureDetector());
751   control.ConnectSignal(&connectionTracker, "tapped", &TestVoidCallback);
752   DALI_TEST_CHECK(control.GetTapGestureDetector());
753
754   DALI_TEST_CHECK(!control.GetPanGestureDetector());
755   control.ConnectSignal(&connectionTracker, "panned", &TestVoidCallback);
756   DALI_TEST_CHECK(control.GetPanGestureDetector());
757
758   DALI_TEST_CHECK(!control.GetPinchGestureDetector());
759   control.ConnectSignal(&connectionTracker, "pinched", &TestVoidCallback);
760   DALI_TEST_CHECK(control.GetPinchGestureDetector());
761
762   DALI_TEST_CHECK(!control.GetLongPressGestureDetector());
763   control.ConnectSignal(&connectionTracker, "longPressed", &TestVoidCallback);
764   DALI_TEST_CHECK(control.GetLongPressGestureDetector());
765
766   END_TEST;
767 }
768
769 int UtcDaliControlImplKeyInputFocusGainedSignal(void)
770 {
771   ToolkitTestApplication application;
772
773   Control control = Control::New();
774   application.GetScene().Add(control);
775
776   gKeyInputFocusCallBackCalled = false;
777   control.KeyInputFocusGainedSignal().Connect(&TestKeyInputFocusCallback);
778
779   application.SendNotification();
780   application.Render();
781
782   control.SetKeyInputFocus();
783
784   DALI_TEST_CHECK(control.HasKeyInputFocus());
785
786   DALI_TEST_CHECK(gKeyInputFocusCallBackCalled);
787
788   END_TEST;
789 }
790
791 int UtcDaliControlImplKeyInputFocusLostSignal(void)
792 {
793   ToolkitTestApplication application;
794
795   Control control = Control::New();
796   application.GetScene().Add(control);
797
798   gKeyInputFocusCallBackCalled = false;
799   control.KeyInputFocusLostSignal().Connect(&TestKeyInputFocusCallback);
800
801   application.SendNotification();
802   application.Render();
803
804   control.SetKeyInputFocus();
805
806   DALI_TEST_CHECK(control.HasKeyInputFocus());
807
808   control.ClearKeyInputFocus();
809
810   DALI_TEST_CHECK(gKeyInputFocusCallBackCalled);
811
812   END_TEST;
813 }
814
815 int UtcDaliControlImplGetControlExtensionP(void)
816 {
817   ToolkitTestApplication application;
818   Control                control = Control::New();
819
820   Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
821
822   DALI_TEST_CHECK(NULL == controlImpl.GetControlExtension());
823
824   END_TEST;
825 }
826
827 int UtcDaliControlAutoClipping(void)
828 {
829   ToolkitTestApplication application;
830   Control                control = Control::New();
831
832   tet_infoline("Test to see if a renderer gets added when we are clipping children");
833
834   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
835
836   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
837
838   application.GetScene().Add(control);
839
840   application.SendNotification();
841   application.Render();
842
843   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
844
845   END_TEST;
846 }
847
848 int UtcDaliControlAutoClippingN(void)
849 {
850   ToolkitTestApplication application;
851   Control                control = Control::New();
852   control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(ColorVisual::Property::MIX_COLOR, Color::RED));
853
854   tet_infoline("Test to ensure that a renderer does NOT get added when we are clipping children and already have renderers/visuals");
855
856   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
857
858   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
859
860   application.GetScene().Add(control);
861
862   application.SendNotification();
863   application.Render();
864
865   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION); // Only 1, not 2
866
867   // Ensure the background color is still RED rather than what's set by the automatic clipping
868   Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
869   Property::Map*  map   = value.GetMap();
870   DALI_TEST_CHECK(map);
871   Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR);
872   DALI_TEST_CHECK(colorValue);
873   DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Color::RED, TEST_LOCATION);
874
875   END_TEST;
876 }
877
878 int UtcDaliControlAutoClippingWhenAlreadyOnStage(void)
879 {
880   ToolkitTestApplication application;
881   Control                control = Control::New();
882
883   tet_infoline("Test to see if a renderer gets added when we are clipping children and when already on stage");
884
885   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
886
887   application.GetScene().Add(control);
888
889   application.SendNotification();
890   application.Render();
891
892   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
893
894   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
895
896   application.SendNotification();
897   application.Render();
898
899   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
900
901   END_TEST;
902 }
903
904 int UtcDaliControlAutoClippingWhenAlreadyOnStageN(void)
905 {
906   ToolkitTestApplication application;
907   Control                control = Control::New();
908   control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(ColorVisual::Property::MIX_COLOR, Color::RED));
909
910   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");
911
912   DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
913
914   application.GetScene().Add(control);
915
916   application.SendNotification();
917   application.Render();
918
919   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
920
921   control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
922
923   application.SendNotification();
924   application.Render();
925
926   DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION); // Still should be 1
927
928   // Ensure the background color is still RED rather than what's set by the automatic clipping
929   Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
930   Property::Map*  map   = value.GetMap();
931   DALI_TEST_CHECK(map);
932   Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR);
933   DALI_TEST_CHECK(colorValue);
934   DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Color::RED, TEST_LOCATION);
935
936   END_TEST;
937 }
938
939 int UtcDaliControlSetTransformSize(void)
940 {
941   ToolkitTestApplication application;
942   Control                control = Control::New();
943
944   Property::Map transformMap;
945   transformMap.Add(Visual::Transform::Property::OFFSET, Vector2(10, 10))
946     .Add(Visual::Transform::Property::ANCHOR_POINT, Align::BOTTOM_END)
947     .Add(Visual::Transform::Property::ORIGIN, Align::BOTTOM_END)
948     .Add(Visual::Transform::Property::SIZE, Vector2(10, 20));
949
950   control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(Visual::Property::TRANSFORM, transformMap));
951
952   tet_infoline("Test to ensure that the control background transform does not get overwritten when adding to the stage");
953
954   application.GetScene().Add(control);
955
956   application.SendNotification();
957   application.Render();
958
959   // Ensure the transform property still matches what we set
960   Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
961   Property::Map*  map   = value.GetMap();
962   DALI_TEST_CHECK(map);
963   Property::Value* transformValue = map->Find(Visual::Property::TRANSFORM);
964   DALI_TEST_CHECK(transformValue);
965
966   Property::Map* retMap = transformValue->GetMap();
967   DALI_TEST_CHECK(retMap);
968   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(10, 10), TEST_LOCATION);
969   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::ANCHOR_POINT)->Get<int>(), (int)Align::BOTTOM_END, TEST_LOCATION);
970   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::ORIGIN)->Get<int>(), (int)Align::BOTTOM_END, TEST_LOCATION);
971   DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get<Vector2>(), Vector2(10, 20), TEST_LOCATION);
972
973   END_TEST;
974 }
975
976 int UtcDaliControlResourcesReady(void)
977 {
978   ToolkitTestApplication application;
979   tet_infoline("Register 2 visuals and check ResourceReady when a visual is disabled");
980
981   VisualFactory factory = VisualFactory::Get();
982   DALI_TEST_CHECK(factory);
983
984   Property::Map propertyMapLarge;
985   propertyMapLarge.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
986   propertyMapLarge.Insert(ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME);
987
988   Property::Map propertyMapSmall;
989   propertyMapSmall.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
990   propertyMapSmall.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
991
992   Visual::Base smallVisual = factory.CreateVisual(propertyMapSmall);
993   smallVisual.SetName("smallVisual");
994   DALI_TEST_CHECK(smallVisual);
995
996   DummyControl      actor     = DummyControl::New();
997   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
998
999   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, smallVisual);
1000
1001   actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1002
1003   Toolkit::Visual::ResourceStatus resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
1004   DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
1005   DALI_TEST_EQUALS(actor.IsResourceReady(), false, TEST_LOCATION);
1006   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
1007
1008   application.GetScene().Add(actor);
1009   application.SendNotification();
1010   application.Render();
1011
1012   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1013
1014   application.SendNotification();
1015   application.Render();
1016
1017   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
1018   DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
1019   DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
1020   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
1021
1022   Visual::Base largeVisual = factory.CreateVisual(propertyMapLarge);
1023   largeVisual.SetName("largeVisual");
1024   DALI_TEST_CHECK(largeVisual);
1025
1026   tet_infoline("Register Visual but set disabled, IsResourceReady should be true");
1027
1028   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL2, largeVisual, false);
1029
1030   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
1031   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
1032
1033   application.SendNotification();
1034
1035   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
1036   DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
1037   DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
1038   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
1039
1040   dummyImpl.EnableVisual(DummyControl::Property::TEST_VISUAL2, true);
1041
1042   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1043
1044   application.SendNotification();
1045
1046   resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
1047   DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
1048
1049   END_TEST;
1050 }
1051
1052 int UtcDaliControlResourcesReady02(void)
1053 {
1054   ToolkitTestApplication application;
1055   tet_infoline("Change a resource during ResourceReady callback");
1056
1057   gResourceReadySignalFired = false;
1058
1059   Control control = Control::New();
1060   control.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1061   control.ResourceReadySignal().Connect(&ResourceReadySignal);
1062
1063   Property::Map propertyMap;
1064   propertyMap.Insert(ImageVisual::Property::URL, "invalid.jpg");
1065   control.SetProperty(Control::Property::BACKGROUND, propertyMap);
1066
1067   application.GetScene().Add(control);
1068
1069   application.SendNotification();
1070   application.Render();
1071
1072   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1073
1074   application.SendNotification();
1075   application.Render();
1076
1077   DALI_TEST_EQUALS(control.IsResourceReady(), true, TEST_LOCATION);
1078   DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1079   gResourceReadySignalFired = false;
1080
1081   END_TEST;
1082 }
1083
1084 int UtcDaliControlMarginProperty(void)
1085 {
1086   ToolkitTestApplication application;
1087
1088   Control control = Control::New();
1089   control.SetBackgroundColor(Color::BLUE);
1090
1091   control.SetProperty(Control::Property::MARGIN, Extents(20, 10, 0, 0));
1092
1093   application.GetScene().Add(control);
1094
1095   application.SendNotification();
1096   application.Render();
1097
1098   DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::MARGIN), Extents(20, 10, 0, 0), TEST_LOCATION);
1099
1100   // Parent control has one ImageView as a Child.
1101   ImageView image = ImageView::New();
1102   image.SetBackgroundColor(Color::RED);
1103   image.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1104   image.SetProperty(Control::Property::PADDING, Extents(10, 10, 10, 10));
1105   control.Add(image);
1106
1107   application.SendNotification();
1108   application.Render();
1109
1110   DALI_TEST_EQUALS(image.GetProperty<Extents>(Control::Property::PADDING), Extents(10, 10, 10, 10), TEST_LOCATION);
1111
1112   END_TEST;
1113 }
1114
1115 int UtcDaliControlPaddingProperty(void)
1116 {
1117   ToolkitTestApplication application;
1118
1119   Control control = Control::New();
1120   control.SetBackgroundColor(Color::BLUE);
1121
1122   control.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
1123
1124   application.GetScene().Add(control);
1125
1126   application.SendNotification();
1127   application.Render();
1128
1129   DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
1130
1131   Control child = Control::New();
1132   control.Add(child);
1133
1134   application.SendNotification();
1135   application.Render();
1136
1137   DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
1138
1139   control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT);
1140   application.SendNotification();
1141   application.Render();
1142   DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(10, 5, 0), TEST_LOCATION);
1143
1144   control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::LEFT_TO_RIGHT);
1145   application.SendNotification();
1146   application.Render();
1147
1148   DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
1149
1150   END_TEST;
1151 }
1152
1153 int UtcDaliControlDoAction(void)
1154 {
1155   ToolkitTestApplication application;
1156   tet_infoline("DoAction on a visual registered with a control");
1157
1158   // Set up trace debug
1159   TestGlAbstraction& gl           = application.GetGlAbstraction();
1160   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1161   textureTrace.Enable(true);
1162
1163   //Created AnimatedImageVisual
1164   VisualFactory factory     = VisualFactory::Get();
1165   Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
1166
1167   DummyControl        dummyControl = DummyControl::New(true);
1168   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1169
1170   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
1171   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1172   application.GetScene().Add(dummyControl);
1173
1174   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1175
1176   application.SendNotification();
1177   application.Render();
1178   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
1179   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
1180   textureTrace.Reset();
1181
1182   Property::Map attributes;
1183   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
1184
1185   tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
1186   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1187
1188   application.SendNotification();
1189   application.Render();
1190   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
1191   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
1192   END_TEST;
1193 }
1194
1195 int UtcDaliControlDoActionWhenNotStage(void)
1196 {
1197   ToolkitTestApplication application;
1198   tet_infoline("DoAction on a visual registered with a control but not staged");
1199
1200   // Set up trace debug
1201   TestGlAbstraction& gl           = application.GetGlAbstraction();
1202   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1203   textureTrace.Enable(true);
1204
1205   //Created AnimatedImageVisual
1206   VisualFactory factory     = VisualFactory::Get();
1207   Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
1208
1209   DummyControl        dummyControl = DummyControl::New(true);
1210   Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1211
1212   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
1213   dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
1214
1215   application.SendNotification();
1216   application.Render();
1217   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
1218   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
1219   textureTrace.Reset();
1220
1221   Property::Map attributes;
1222   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
1223
1224   tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
1225   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1226
1227   application.SendNotification();
1228   application.Render();
1229   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
1230   textureTrace.Reset();
1231
1232   tet_infoline("Adding control to stage will in turn add the visual to the stage");
1233
1234   application.GetScene().Add(dummyControl);
1235   application.SendNotification();
1236   application.Render();
1237   tet_infoline("No change in textures could occurs as already loaded and cached texture will be used");
1238
1239   DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
1240   DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
1241   textureTrace.Reset();
1242
1243   END_TEST;
1244 }