[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-Control.cpp
index bfb390c..8000f62 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
-#include <iostream>
 #include <stdlib.h>
+#include <iostream>
 
 // Need to override adaptor classes for toolkit test harness, so include
 // test harness headers before dali headers.
 #include <dali-toolkit-test-suite-utils.h>
 
-#include <dali.h>
 #include <dali-toolkit/dali-toolkit.h>
-#include <dali-toolkit/public-api/align-enumerations.h>
+#include <dali-toolkit/devel-api/controls/alignment/alignment.h>
 #include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
+#include <dali-toolkit/devel-api/visuals/image-visual-actions-devel.h>
+#include <dali-toolkit/public-api/align-enumerations.h>
+#include <dali.h>
+
 #include <toolkit-event-thread-callback.h>
 
 #include "dummy-control.h"
@@ -48,7 +51,6 @@ void utc_dali_toolkit_control_cleanup(void)
 
 namespace
 {
-
 bool gObjectCreatedCallBackCalled;
 
 void TestCallback(BaseHandle handle)
@@ -62,64 +64,89 @@ void TestVoidCallback()
 
 static bool gKeyInputFocusCallBackCalled;
 
-static void TestKeyInputFocusCallback( Control control )
+static void TestKeyInputFocusCallback(Control control)
 {
   tet_infoline(" TestKeyInputFocusCallback");
 
   gKeyInputFocusCallBackCalled = true;
 }
 
-const char* TEST_LARGE_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/tbcol.png";
-const char* TEST_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/gallery-small-1.jpg";
+const char* TEST_LARGE_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/tbcol.png";
+const char* TEST_IMAGE_FILE_NAME       = TEST_RESOURCE_DIR "/gallery-small-1.jpg";
+const char* TEST_SVG_FILE_NAME         = TEST_RESOURCE_DIR "/svg1.svg";
+
+Vector4 GetControlBackgroundColor(Control& control)
+{
+  Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  resultMap = propValue.GetMap();
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
+
+  Vector4 color;
+  resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get(color);
+
+  return color;
+}
+
+bool gResourceReadySignalFired = false;
+
+void ResourceReadySignal(Control control)
+{
+  if(control.GetVisualResourceStatus(Control::Property::BACKGROUND) == Visual::ResourceStatus::FAILED)
+  {
+    Property::Map propertyMap;
+    propertyMap.Insert(ImageVisual::Property::URL, TEST_SVG_FILE_NAME);
+    control.SetProperty(Control::Property::BACKGROUND, propertyMap);
+  }
+
+  gResourceReadySignalFired = true;
+}
 
 } // namespace
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-
 int UtcDaliControlConstructor(void)
 {
-  ToolkitTestApplication application;  // Exceptions require ToolkitTestApplication
+  ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
 
   DummyControl dummy;
 
-  DALI_TEST_CHECK( !Control::DownCast(dummy) );
+  DALI_TEST_CHECK(!Control::DownCast(dummy));
 
   dummy = DummyControl::New();
 
-  DALI_TEST_CHECK( Control::DownCast(dummy) );
+  DALI_TEST_CHECK(Control::DownCast(dummy));
   END_TEST;
 }
 
 int UtcDaliControlNew(void)
 {
-  ToolkitTestApplication application;  // Exceptions require ToolkitTestApplication
+  ToolkitTestApplication application; // Exceptions require ToolkitTestApplication
 
   Control control;
 
-  DALI_TEST_CHECK( !Control::DownCast(control) );
+  DALI_TEST_CHECK(!Control::DownCast(control));
 
   control = Control::New();
 
-  DALI_TEST_CHECK( Control::DownCast(control) );
+  DALI_TEST_CHECK(Control::DownCast(control));
   END_TEST;
 }
 
-
 int UtcDaliControlRegister(void)
 {
   ToolkitTestApplication application;
 
   // Ensure the object is registered after creation
-  ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
-  DALI_TEST_CHECK( registry );
+  ObjectRegistry registry = application.GetCore().GetObjectRegistry();
+  DALI_TEST_CHECK(registry);
 
   gObjectCreatedCallBackCalled = false;
-  registry.ObjectCreatedSignal().Connect( &TestCallback );
+  registry.ObjectCreatedSignal().Connect(&TestCallback);
   {
     Alignment alignment = Alignment::New();
   }
-  DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
+  DALI_TEST_CHECK(gObjectCreatedCallBackCalled);
   END_TEST;
 }
 
@@ -128,25 +155,62 @@ int UtcDaliControlCopyAndAssignment(void)
   ToolkitTestApplication application;
 
   DummyControl control = DummyControl::New();
-  Control emptyControl;
+  Control      emptyControl;
 
-  Control controlCopy( control );
-  DALI_TEST_CHECK( control == controlCopy );
+  Control controlCopy(control);
+  DALI_TEST_CHECK(control == controlCopy);
 
-  Control emptyControlCopy( emptyControl );
-  DALI_TEST_CHECK( emptyControl == emptyControlCopy );
+  Control emptyControlCopy(emptyControl);
+  DALI_TEST_CHECK(emptyControl == emptyControlCopy);
 
   Control controlEquals;
   controlEquals = control;
-  DALI_TEST_CHECK( control == controlEquals );
+  DALI_TEST_CHECK(control == controlEquals);
 
   Control emptyControlEquals;
   emptyControlEquals = emptyControl;
-  DALI_TEST_CHECK( emptyControl == emptyControlEquals );
+  DALI_TEST_CHECK(emptyControl == emptyControlEquals);
 
   // Self assignment
   control = control;
-  DALI_TEST_CHECK( control == controlCopy );
+  DALI_TEST_CHECK(control == controlCopy);
+  END_TEST;
+}
+
+int UtcDaliControlMoveConstructor(void)
+{
+  ToolkitTestApplication application;
+
+  Control control = Control::New();
+  DALI_TEST_EQUALS(1, control.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  control.SetProperty(Actor::Property::SENSITIVE, false);
+  DALI_TEST_CHECK(false == control.GetProperty<bool>(Actor::Property::SENSITIVE));
+
+  Control moved = std::move(control);
+  DALI_TEST_CHECK(moved);
+  DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
+  DALI_TEST_CHECK(!control);
+
+  END_TEST;
+}
+
+int UtcDaliControlMoveAssignment(void)
+{
+  ToolkitTestApplication application;
+
+  Control control = Control::New();
+  DALI_TEST_EQUALS(1, control.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  control.SetProperty(Actor::Property::SENSITIVE, false);
+  DALI_TEST_CHECK(false == control.GetProperty<bool>(Actor::Property::SENSITIVE));
+
+  Control moved;
+  moved = std::move(control);
+  DALI_TEST_CHECK(moved);
+  DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
+  DALI_TEST_CHECK(!control);
+
   END_TEST;
 }
 
@@ -156,19 +220,19 @@ int UtcDaliControlDownCast(void)
 
   DummyControl control;
 
-  DALI_TEST_CHECK( !Control::DownCast( control ) );
+  DALI_TEST_CHECK(!Control::DownCast(control));
 
   control = DummyControl::New();
 
-  DALI_TEST_CHECK( Control::DownCast( control ) );
+  DALI_TEST_CHECK(Control::DownCast(control));
 
   Actor actor;
 
-  DALI_TEST_CHECK( !Control::DownCast( actor ) );
+  DALI_TEST_CHECK(!Control::DownCast(actor));
 
   actor = Actor::New();
 
-  DALI_TEST_CHECK( !Control::DownCast( actor ) );
+  DALI_TEST_CHECK(!Control::DownCast(actor));
   END_TEST;
 }
 
@@ -178,19 +242,19 @@ int UtcDaliControlDownCastTemplate(void)
 
   DummyControl control;
 
-  DALI_TEST_CHECK( !DummyControl::DownCast( control ));
+  DALI_TEST_CHECK(!DummyControl::DownCast(control));
 
   control = DummyControl::New();
 
-  DALI_TEST_CHECK( DummyControl::DownCast( control ) );
+  DALI_TEST_CHECK(DummyControl::DownCast(control));
 
   Actor actor;
 
-  DALI_TEST_CHECK( !DummyControl::DownCast( actor ) );
+  DALI_TEST_CHECK(!DummyControl::DownCast(actor));
 
   actor = Actor::New();
 
-  DALI_TEST_CHECK( !DummyControl::DownCast( actor ) );
+  DALI_TEST_CHECK(!DummyControl::DownCast(actor));
   END_TEST;
 }
 
@@ -199,30 +263,36 @@ int UtcDaliControlNavigationProperties(void)
   ToolkitTestApplication application;
 
   Control control = Control::New();
-  Stage::GetCurrent().Add( control );
-
-  DALI_TEST_EQUALS( -1, control.GetProperty( DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  DALI_TEST_EQUALS( -1, control.GetProperty( DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  DALI_TEST_EQUALS( -1, control.GetProperty( DevelControl::Property::UP_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  DALI_TEST_EQUALS( -1, control.GetProperty( DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-
-  control.SetProperty( DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 1 );
-  DALI_TEST_EQUALS( 1, control.GetProperty( DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  control.SetProperty( DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 2 );
-  DALI_TEST_EQUALS( 2, control.GetProperty( DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  control.SetProperty( DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 3 );
-  DALI_TEST_EQUALS( 3, control.GetProperty( DevelControl::Property::UP_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  control.SetProperty( DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 4 );
-  DALI_TEST_EQUALS( 4, control.GetProperty( DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-
-  control.SetProperty( DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 15 );
-  DALI_TEST_EQUALS( 15, control.GetProperty( DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  control.SetProperty( DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 16 );
-  DALI_TEST_EQUALS( 16, control.GetProperty( DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  control.SetProperty( DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 17 );
-  DALI_TEST_EQUALS( 17, control.GetProperty( DevelControl::Property::UP_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
-  control.SetProperty( DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 18 );
-  DALI_TEST_EQUALS( 18, control.GetProperty( DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID ).Get< int >(), TEST_LOCATION );
+  application.GetScene().Add(control);
+
+  DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  DALI_TEST_EQUALS(-1, control.GetProperty(DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+
+  control.SetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 1);
+  DALI_TEST_EQUALS(1, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 2);
+  DALI_TEST_EQUALS(2, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 3);
+  DALI_TEST_EQUALS(3, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 4);
+  DALI_TEST_EQUALS(4, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+
+  control.SetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID, 15);
+  DALI_TEST_EQUALS(15, control.GetProperty(DevelControl::Property::LEFT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID, 16);
+  DALI_TEST_EQUALS(16, control.GetProperty(DevelControl::Property::RIGHT_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID, 17);
+  DALI_TEST_EQUALS(17, control.GetProperty(DevelControl::Property::UP_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID, 18);
+  DALI_TEST_EQUALS(18, control.GetProperty(DevelControl::Property::DOWN_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID, 19);
+  DALI_TEST_EQUALS(19, control.GetProperty(DevelControl::Property::CLOCKWISE_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
+  control.SetProperty(DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID, 20);
+  DALI_TEST_EQUALS(20, control.GetProperty(DevelControl::Property::COUNTER_CLOCKWISE_FOCUSABLE_ACTOR_ID).Get<int>(), TEST_LOCATION);
 
   END_TEST;
 }
@@ -230,35 +300,35 @@ int UtcDaliControlNavigationProperties(void)
 int UtcDaliControlKeyInputFocus(void)
 {
   ToolkitTestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene     stage = application.GetScene();
 
   DummyControl control;
 
   PushButton pushButton1 = PushButton::New();
-  stage.Add( pushButton1 );
+  stage.Add(pushButton1);
 
   pushButton1.SetKeyInputFocus();
-  DALI_TEST_CHECK( pushButton1.HasKeyInputFocus() );
+  DALI_TEST_CHECK(pushButton1.HasKeyInputFocus());
 
   pushButton1.ClearKeyInputFocus();
-  DALI_TEST_CHECK( !pushButton1.HasKeyInputFocus() );
+  DALI_TEST_CHECK(!pushButton1.HasKeyInputFocus());
   END_TEST;
 }
 
 int UtcDaliControlGetImplementationN(void)
 {
   ToolkitTestApplication application;
-  DummyControl control;
+  DummyControl           control;
 
   // Get Empty
   {
     try
     {
-      Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( control );
+      Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
       (void)controlImpl; // Avoid unused warning
       tet_result(TET_FAIL);
     }
-    catch (DaliException &exception)
+    catch(DaliException& exception)
     {
       tet_result(TET_PASS);
     }
@@ -269,18 +339,18 @@ int UtcDaliControlGetImplementationN(void)
 int UtcDaliControlGetImplementationConstN(void)
 {
   ToolkitTestApplication application;
-  DummyControl control;
+  DummyControl           control;
 
   // Get Const Empty
   {
     try
     {
-      const DummyControl constControl(control);
-      const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( constControl );
+      const DummyControl                constControl(control);
+      const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(constControl);
       (void)controlImpl; // Avoid unused warning
       tet_result(TET_FAIL);
     }
-    catch (DaliException &exception)
+    catch(DaliException& exception)
     {
       tet_result(TET_PASS);
     }
@@ -291,17 +361,17 @@ int UtcDaliControlGetImplementationConstN(void)
 int UtcDaliControlGetImplementationP(void)
 {
   ToolkitTestApplication application;
-  DummyControl control = DummyControl::New();
+  DummyControl           control = DummyControl::New();
 
   // Get
   {
     try
     {
-      Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( control );
+      Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
       (void)controlImpl; // Avoid unused warning
       tet_result(TET_PASS);
     }
-    catch (DaliException &exception)
+    catch(DaliException& exception)
     {
       tet_result(TET_FAIL);
     }
@@ -312,17 +382,17 @@ int UtcDaliControlGetImplementationP(void)
 int UtcDaliControlGetImplementationConstP(void)
 {
   ToolkitTestApplication application;
-  DummyControl control = DummyControl::New();
+  DummyControl           control = DummyControl::New();
   // Get Const
   {
     try
     {
-      const DummyControl constControl(control);
-      const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( constControl );
+      const DummyControl                constControl(control);
+      const Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(constControl);
       (void)controlImpl; // Avoid unused warning
       tet_result(TET_PASS);
     }
-    catch (DaliException &exception)
+    catch(DaliException& exception)
     {
       tet_result(TET_FAIL);
     }
@@ -338,29 +408,29 @@ int UtcDaliControlSignalConnectDisconnect(void)
     DummyControl dummy = DummyControlImpl::New();
 
     Actor actor = Actor::New();
-    DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
-    Toolkit::Internal::Control& control = Toolkit::Internal::GetImplementation( dummy );
-    DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
+    DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
+    Toolkit::Internal::Control& control   = Toolkit::Internal::GetImplementation(dummy);
+    DummyControlImpl*           dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
 
-    if( dummyImpl == NULL )
+    if(dummyImpl == NULL)
     {
-      tet_result( TET_FAIL );
+      tet_result(TET_FAIL);
       END_TEST;
     }
 
-    actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
-    DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
-    DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
+    actor.OnSceneSignal().Connect(dummyImpl, &DummyControlImpl::CustomSlot1);
+    DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 1u, TEST_LOCATION);
+    DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
 
-    Stage::GetCurrent().Add( actor );
-    DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, true, TEST_LOCATION );
+    application.GetScene().Add(actor);
+    DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, true, TEST_LOCATION);
 
     dummyImpl->mCustomSlot1Called = false;
-    actor.OnStageSignal().Disconnect( dummyImpl, &DummyControlImpl::CustomSlot1 );
-    DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
-    Stage::GetCurrent().Remove( actor );
-    Stage::GetCurrent().Add( actor );
-    DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
+    actor.OnSceneSignal().Disconnect(dummyImpl, &DummyControlImpl::CustomSlot1);
+    DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
+    application.GetScene().Remove(actor);
+    application.GetScene().Add(actor);
+    DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
   }
   END_TEST;
 }
@@ -372,55 +442,55 @@ int UtcDaliControlSignalAutomaticDisconnect(void)
   Actor actor = Actor::New();
 
   {
-    DummyControl dummy = DummyControlImpl::New();
-    Toolkit::Internal::Control& control = Toolkit::Internal::GetImplementation( dummy );
-    DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
+    DummyControl                dummy     = DummyControlImpl::New();
+    Toolkit::Internal::Control& control   = Toolkit::Internal::GetImplementation(dummy);
+    DummyControlImpl*           dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
 
-    if( dummyImpl == NULL )
+    if(dummyImpl == NULL)
     {
-      tet_result( TET_FAIL );
+      tet_result(TET_FAIL);
       END_TEST;
     }
 
-    actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
-    DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
-    DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, false, TEST_LOCATION );
+    actor.OnSceneSignal().Connect(dummyImpl, &DummyControlImpl::CustomSlot1);
+    DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 1u, TEST_LOCATION);
+    DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, false, TEST_LOCATION);
 
-    Stage::GetCurrent().Add( actor );
-    DALI_TEST_EQUALS( dummyImpl->mCustomSlot1Called, true, TEST_LOCATION );
-    Stage::GetCurrent().Remove( actor );
+    application.GetScene().Add(actor);
+    DALI_TEST_EQUALS(dummyImpl->mCustomSlot1Called, true, TEST_LOCATION);
+    application.GetScene().Remove(actor);
   }
   // dummyControl automatically disconnects
 
-  DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
+  DALI_TEST_EQUALS(actor.OnSceneSignal().GetConnectionCount(), 0u, TEST_LOCATION);
 
-  const Vector3 ignoredSize( 20, 20, 0 );
-  actor.SetSize( ignoredSize );
+  const Vector3 ignoredSize(20, 20, 0);
+  actor.SetProperty(Actor::Property::SIZE, ignoredSize);
   END_TEST;
 }
 
 int UtcDaliControlTestParameters(void)
 {
   ToolkitTestApplication application;
-  DummyControl test = DummyControl::New();
+  DummyControl           test = DummyControl::New();
 
-  test.SetSize( 0.7f, 0.7f, 0.7f );
+  test.SetProperty(Actor::Property::SIZE, Vector3(0.7f, 0.7f, 0.7f));
 
-  Stage::GetCurrent().Add( test );
+  application.GetScene().Add(test);
 
   application.SendNotification();
   application.Render();
 
-  float width = 640.0f;
-  float height = test.GetHeightForWidth( width );
-  DALI_TEST_EQUALS( 640.0f, height, TEST_LOCATION );
-  DALI_TEST_EQUALS( 640.0f, test.GetWidthForHeight( height ), TEST_LOCATION );
+  float width  = 640.0f;
+  float height = test.GetHeightForWidth(width);
+  DALI_TEST_EQUALS(640.0f, height, TEST_LOCATION);
+  DALI_TEST_EQUALS(640.0f, test.GetWidthForHeight(height), TEST_LOCATION);
 
   test.KeyEventSignal();
 
   // Provide coverage for pointer destructor
   Control* testControlPtr = new Control;
-  DALI_TEST_CHECK( testControlPtr );
+  DALI_TEST_CHECK(testControlPtr);
   delete testControlPtr;
   END_TEST;
 }
@@ -428,29 +498,111 @@ int UtcDaliControlTestParameters(void)
 int UtcDaliControlBackgroundColor(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
+  Control                control = Control::New();
 
-  DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
+  DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
 
-  control.SetBackgroundColor( Color::RED );
+  control.SetProperty(Control::Property::BACKGROUND, Color::RED);
 
-  Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND );
-  Property::Map* resultMap = propValue.GetMap();
-  DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE ) );
-  DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>() == Visual::COLOR );
-  DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
-  DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>() == Color::RED );
+  Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  resultMap = propValue.GetMap();
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>() == Visual::COLOR);
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>() == Color::RED);
 
-  DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::RED, TEST_LOCATION );
+  control.SetProperty(Control::Property::BACKGROUND, Color::YELLOW);
 
-  control.SetBackgroundColor( Color::YELLOW );
-
-  propValue = control.GetProperty( Control::Property::BACKGROUND );
+  propValue = control.GetProperty(Control::Property::BACKGROUND);
   resultMap = propValue.GetMap();
-  DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
-  DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>() == Color::YELLOW );
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>() == Color::YELLOW);
+
+  END_TEST;
+}
+
+int UtcDaliControlBackgroundColorRendererCount(void)
+{
+  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");
+
+  ToolkitTestApplication application;
+  Control                control = Control::New();
+  control[Actor::Property::SIZE] = Vector2(100.0f, 100.0f);
+  application.GetScene().Add(control);
+
+  tet_infoline("Set semi transparent alpha with positive RGB values, 1 renderer should be created, but returned color should reflect what we set");
+  const Vector4 semiTransparent(1.0f, 0.75f, 0.5f, 0.5f);
+  control.SetBackgroundColor(semiTransparent);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), semiTransparent, TEST_LOCATION);
+
+  Renderer renderer = control.GetRendererAt(0);
+  DALI_TEST_CHECK(renderer);
+
+  tet_infoline("Set semi transparent alpha with positive RGB values, renderer should not be changed");
+  const Vector4 newColor(1.0f, 1.0f, 0.5f, 0.5f);
+  control.SetBackgroundColor(newColor);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), newColor, TEST_LOCATION);
+  DALI_TEST_EQUALS(renderer, control.GetRendererAt(0), TEST_LOCATION);
+
+  TestGlAbstraction& gl        = application.GetGlAbstraction();
+  TraceCallStack&    drawTrace = gl.GetDrawTrace();
+  drawTrace.Enable(true);
+
+  tet_infoline("Set transparent, 1 renderer should be created, but ensure nothing is drawn");
+  control.SetBackgroundColor(Color::TRANSPARENT);
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
+  DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION);
+
+  drawTrace.Reset();
+
+  tet_infoline("Set control to clip its children, a renderer should be created which will be transparent");
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
+  DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION);
+
+  tet_infoline("Set a color, only 1 renderer should exist");
+  control.SetBackgroundColor(Color::RED);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::RED, TEST_LOCATION);
 
-  DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::YELLOW, TEST_LOCATION );
+  tet_infoline("Clear the background, no renderers");
+  control.ClearBackground();
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetRendererCount(), 0u, TEST_LOCATION);
+
+  tet_infoline("Set control to clip its children again, a renderer should be created which will be transparent");
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
+
+  drawTrace.Reset();
+
+  tet_infoline("Disable clipping, render nothing");
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::DISABLED);
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(GetControlBackgroundColor(control), Color::TRANSPARENT, TEST_LOCATION);
+  DALI_TEST_EQUALS(drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION);
 
   END_TEST;
 }
@@ -458,27 +610,25 @@ int UtcDaliControlBackgroundColor(void)
 int UtcDaliControlBackgroundImage(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
-
-  DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
+  Control                control = Control::New();
 
-  Image image = ResourceImage::New("TestImage");
-  control.SetBackgroundImage( image );
+  tet_infoline("Set first background image");
+  control.SetProperty(Control::Property::BACKGROUND, "TestImage");
 
-  Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND );
-  Property::Map* resultMap = propValue.GetMap();
-  DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE ) );
-  DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>() == Visual::IMAGE );
-  DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL ) );
-  DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>() == "TestImage" );
+  Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  resultMap = propValue.GetMap();
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>() == Visual::IMAGE);
+  DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
+  DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>() == "TestImage");
 
-  image = ResourceImage::New("TestImage2");
-  control.SetBackgroundImage( image );
+  tet_infoline("Set replacement background image");
+  control.SetProperty(Control::Property::BACKGROUND, "TestImage2");
 
-  propValue = control.GetProperty( Control::Property::BACKGROUND );
+  propValue = control.GetProperty(Control::Property::BACKGROUND);
   resultMap = propValue.GetMap();
-  DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL ) );
-  DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>() == "TestImage2" );
+  DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
+  DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>() == "TestImage2");
 
   END_TEST;
 }
@@ -486,67 +636,85 @@ int UtcDaliControlBackgroundImage(void)
 int UtcDaliControlBackgroundProperties(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
+  Control                control = Control::New();
 
-  DALI_TEST_EQUALS( control.GetBackgroundColor(), Color::TRANSPARENT, TEST_LOCATION );
-  DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND ).Get< Property::Map >().Empty() );
+  DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
 
   Property::Map imageMap;
-  imageMap[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE;
-  imageMap[ ImageVisual::Property::URL ] = "TestImage";
-  control.SetProperty( Control::Property::BACKGROUND, imageMap );
-  Property::Value propValue = control.GetProperty( Control::Property::BACKGROUND );
-  Property::Map* resultMap = propValue.GetMap();
-  DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE ) );
-  DALI_TEST_EQUALS( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>(),(int)Visual::IMAGE, TEST_LOCATION );
-  DALI_TEST_CHECK( resultMap->Find( ImageVisual::Property::URL ) );
-  DALI_TEST_EQUALS( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>(), "TestImage", TEST_LOCATION );
+  imageMap[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
+  imageMap[ImageVisual::Property::URL]      = "TestImage";
+  control.SetProperty(Control::Property::BACKGROUND, imageMap);
+  Property::Value propValue = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  resultMap = propValue.GetMap();
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
+  DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
+  DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
+  DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "TestImage", TEST_LOCATION);
 
   Property::Map rendererMap;
-  rendererMap[Visual::Property::TYPE] = Visual::COLOR;
+  rendererMap[Visual::Property::TYPE]           = Visual::COLOR;
   rendererMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
-  control.SetProperty( Control::Property::BACKGROUND, rendererMap );
-  propValue = control.GetProperty( Control::Property::BACKGROUND );
+  control.SetProperty(Control::Property::BACKGROUND, rendererMap);
+  propValue = control.GetProperty(Control::Property::BACKGROUND);
   resultMap = propValue.GetMap();
-  DALI_TEST_CHECK( resultMap->Find( Toolkit::Visual::Property::TYPE ) );
-  DALI_TEST_EQUALS( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>(), (int)Visual::COLOR, TEST_LOCATION );
-  DALI_TEST_CHECK( resultMap->Find( ColorVisual::Property::MIX_COLOR ) );
-  DALI_TEST_EQUALS( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>(), Color::CYAN, TEST_LOCATION );
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
+  DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
+  DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::CYAN, TEST_LOCATION);
 
   Property::Map emptyMap;
-  control.SetProperty( Control::Property::BACKGROUND, emptyMap );
-  DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND ).Get< Property::Map >().Empty() );
+  control.SetProperty(Control::Property::BACKGROUND, emptyMap);
+  DALI_TEST_CHECK(control.GetProperty(Control::Property::BACKGROUND).Get<Property::Map>().Empty());
 
   // set as URL
-  control.SetProperty( Control::Property::BACKGROUND, "Foobar.png" );
-  propValue = control.GetProperty( Control::Property::BACKGROUND );
+  control.SetProperty(Control::Property::BACKGROUND, "Foobar.png");
+  propValue = control.GetProperty(Control::Property::BACKGROUND);
   resultMap = propValue.GetMap();
-  DALI_TEST_EQUALS( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION );
-  DALI_TEST_EQUALS( resultMap->Find( ImageVisual::Property::URL )->Get<std::string>(), "Foobar.png", TEST_LOCATION );
+  DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
+  DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "Foobar.png", TEST_LOCATION);
 
   // set as Color
-  control.SetProperty( Control::Property::BACKGROUND, Color::RED );
-  propValue = control.GetProperty( Control::Property::BACKGROUND );
+  control.SetProperty(Control::Property::BACKGROUND, Color::RED);
+  propValue = control.GetProperty(Control::Property::BACKGROUND);
   resultMap = propValue.GetMap();
-  DALI_TEST_EQUALS( resultMap->Find( Toolkit::Visual::Property::TYPE )->Get<int>(), (int)Visual::COLOR, TEST_LOCATION );
-  DALI_TEST_EQUALS( resultMap->Find( ColorVisual::Property::MIX_COLOR )->Get<Vector4>(), Color::RED, TEST_LOCATION );
+  DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
+  DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::RED, TEST_LOCATION);
 
-  // Deprecated Properties
-  control.SetProperty( Control::Property::BACKGROUND_COLOR, Color::YELLOW );
-  DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), Color::YELLOW, TEST_LOCATION );
-  DALI_TEST_EQUALS( control.GetProperty( Control::Property::BACKGROUND_COLOR ).Get< Vector4 >(), control.GetBackgroundColor(), TEST_LOCATION );
+  END_TEST;
+}
 
-  control.ClearBackground();
+int UtcDaliControlShadowProperties(void)
+{
+  ToolkitTestApplication application;
+  Control                control = Control::New();
+
+  DALI_TEST_CHECK(control.GetProperty(DevelControl::Property::SHADOW).Get<Property::Map>().Empty());
 
-  Property::Map deprecatedImageMap;
-  deprecatedImageMap[ "filename" ] = "TestImage";
-  control.SetProperty( Control::Property::BACKGROUND_IMAGE, deprecatedImageMap );
-  propValue = control.GetProperty( Control::Property::BACKGROUND_IMAGE );
+  Property::Map imageMap;
+  imageMap[Toolkit::Visual::Property::TYPE] = Visual::IMAGE;
+  imageMap[ImageVisual::Property::URL]      = "TestImage";
+  control.SetProperty(DevelControl::Property::SHADOW, imageMap);
+  Property::Value propValue = control.GetProperty(DevelControl::Property::SHADOW);
+  Property::Map*  resultMap = propValue.GetMap();
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
+  DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::IMAGE, TEST_LOCATION);
+  DALI_TEST_CHECK(resultMap->Find(ImageVisual::Property::URL));
+  DALI_TEST_EQUALS(resultMap->Find(ImageVisual::Property::URL)->Get<std::string>(), "TestImage", TEST_LOCATION);
+
+  Property::Map colorMap;
+  colorMap[Visual::Property::TYPE]           = Visual::COLOR;
+  colorMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN;
+  control.SetProperty(DevelControl::Property::SHADOW, colorMap);
+  propValue = control.GetProperty(DevelControl::Property::SHADOW);
   resultMap = propValue.GetMap();
-  DALI_TEST_EQUALS( resultMap->Find( ImageVisual::Property::URL )->Get< std::string >(), "TestImage" , TEST_LOCATION );
+  DALI_TEST_CHECK(resultMap->Find(Toolkit::Visual::Property::TYPE));
+  DALI_TEST_EQUALS(resultMap->Find(Toolkit::Visual::Property::TYPE)->Get<int>(), (int)Visual::COLOR, TEST_LOCATION);
+  DALI_TEST_CHECK(resultMap->Find(ColorVisual::Property::MIX_COLOR));
+  DALI_TEST_EQUALS(resultMap->Find(ColorVisual::Property::MIX_COLOR)->Get<Vector4>(), Color::CYAN, TEST_LOCATION);
 
-  control.SetProperty( Control::Property::BACKGROUND_IMAGE, emptyMap );
-  DALI_TEST_CHECK( control.GetProperty( Control::Property::BACKGROUND_IMAGE ).Get< Property::Map >().Empty() );
+  Property::Map emptyMap;
+  control.SetProperty(DevelControl::Property::SHADOW, emptyMap);
+  DALI_TEST_CHECK(control.GetProperty(DevelControl::Property::SHADOW).Get<Property::Map>().Empty());
 
   END_TEST;
 }
@@ -556,18 +724,18 @@ int UtcDaliControlKeyProperties(void)
   ToolkitTestApplication application;
 
   Control control = Control::New();
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
-  DALI_TEST_EQUALS( control.HasKeyInputFocus(), control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
+  DALI_TEST_EQUALS(control.HasKeyInputFocus(), control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
 
   control.SetKeyInputFocus();
-  DALI_TEST_EQUALS( true, control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
+  DALI_TEST_EQUALS(true, control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
 
   control.ClearKeyInputFocus();
-  DALI_TEST_EQUALS( false, control.GetProperty( Control::Property::KEY_INPUT_FOCUS ).Get< bool >(), TEST_LOCATION );
+  DALI_TEST_EQUALS(false, control.GetProperty(Control::Property::KEY_INPUT_FOCUS).Get<bool>(), TEST_LOCATION);
 
-  control.SetProperty( Control::Property::KEY_INPUT_FOCUS, true );
-  DALI_TEST_EQUALS( true, control.HasKeyInputFocus(), TEST_LOCATION );
+  control.SetProperty(Control::Property::KEY_INPUT_FOCUS, true);
+  DALI_TEST_EQUALS(true, control.HasKeyInputFocus(), TEST_LOCATION);
 
   END_TEST;
 }
@@ -575,25 +743,25 @@ int UtcDaliControlKeyProperties(void)
 int UtcDaliControlGestureSignals(void)
 {
   ToolkitTestApplication application;
-  ConnectionTracker connectionTracker;
-  Control control = Control::New();
+  ConnectionTracker      connectionTracker;
+  Control                control = Control::New();
 
   // Each gesture detector gets created when connecting to the gesture signals
-  DALI_TEST_CHECK( !control.GetTapGestureDetector() );
-  control.ConnectSignal( &connectionTracker, "tapped", &TestVoidCallback );
-  DALI_TEST_CHECK( control.GetTapGestureDetector() );
+  DALI_TEST_CHECK(!control.GetTapGestureDetector());
+  control.ConnectSignal(&connectionTracker, "tapped", &TestVoidCallback);
+  DALI_TEST_CHECK(control.GetTapGestureDetector());
 
-  DALI_TEST_CHECK( !control.GetPanGestureDetector() );
-  control.ConnectSignal( &connectionTracker, "panned", &TestVoidCallback );
-  DALI_TEST_CHECK( control.GetPanGestureDetector() );
+  DALI_TEST_CHECK(!control.GetPanGestureDetector());
+  control.ConnectSignal(&connectionTracker, "panned", &TestVoidCallback);
+  DALI_TEST_CHECK(control.GetPanGestureDetector());
 
-  DALI_TEST_CHECK( !control.GetPinchGestureDetector() );
-  control.ConnectSignal( &connectionTracker, "pinched", &TestVoidCallback );
-  DALI_TEST_CHECK( control.GetPinchGestureDetector() );
+  DALI_TEST_CHECK(!control.GetPinchGestureDetector());
+  control.ConnectSignal(&connectionTracker, "pinched", &TestVoidCallback);
+  DALI_TEST_CHECK(control.GetPinchGestureDetector());
 
-  DALI_TEST_CHECK( !control.GetLongPressGestureDetector() );
-  control.ConnectSignal( &connectionTracker, "longPressed",  &TestVoidCallback );
-  DALI_TEST_CHECK( control.GetLongPressGestureDetector() );
+  DALI_TEST_CHECK(!control.GetLongPressGestureDetector());
+  control.ConnectSignal(&connectionTracker, "longPressed", &TestVoidCallback);
+  DALI_TEST_CHECK(control.GetLongPressGestureDetector());
 
   END_TEST;
 }
@@ -603,7 +771,7 @@ int UtcDaliControlImplKeyInputFocusGainedSignal(void)
   ToolkitTestApplication application;
 
   Control control = Control::New();
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   gKeyInputFocusCallBackCalled = false;
   control.KeyInputFocusGainedSignal().Connect(&TestKeyInputFocusCallback);
@@ -613,9 +781,9 @@ int UtcDaliControlImplKeyInputFocusGainedSignal(void)
 
   control.SetKeyInputFocus();
 
-  DALI_TEST_CHECK( control.HasKeyInputFocus() );
+  DALI_TEST_CHECK(control.HasKeyInputFocus());
 
-  DALI_TEST_CHECK( gKeyInputFocusCallBackCalled );
+  DALI_TEST_CHECK(gKeyInputFocusCallBackCalled);
 
   END_TEST;
 }
@@ -625,7 +793,7 @@ int UtcDaliControlImplKeyInputFocusLostSignal(void)
   ToolkitTestApplication application;
 
   Control control = Control::New();
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   gKeyInputFocusCallBackCalled = false;
   control.KeyInputFocusLostSignal().Connect(&TestKeyInputFocusCallback);
@@ -635,11 +803,11 @@ int UtcDaliControlImplKeyInputFocusLostSignal(void)
 
   control.SetKeyInputFocus();
 
-  DALI_TEST_CHECK( control.HasKeyInputFocus() );
+  DALI_TEST_CHECK(control.HasKeyInputFocus());
 
   control.ClearKeyInputFocus();
 
-  DALI_TEST_CHECK( gKeyInputFocusCallBackCalled );
+  DALI_TEST_CHECK(gKeyInputFocusCallBackCalled);
 
   END_TEST;
 }
@@ -647,11 +815,11 @@ int UtcDaliControlImplKeyInputFocusLostSignal(void)
 int UtcDaliControlImplGetControlExtensionP(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
+  Control                control = Control::New();
 
-  Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( control );
+  Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
 
-  DALI_TEST_CHECK( NULL == controlImpl.GetControlExtension() );
+  DALI_TEST_CHECK(NULL == controlImpl.GetControlExtension());
 
   END_TEST;
 }
@@ -659,20 +827,20 @@ int UtcDaliControlImplGetControlExtensionP(void)
 int UtcDaliControlAutoClipping(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
+  Control                control = Control::New();
 
-  tet_infoline( "Test to see if a renderer gets added when we are clipping children" );
+  tet_infoline("Test to see if a renderer gets added when we are clipping children");
 
-  DALI_TEST_EQUALS( 0, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
 
-  control.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
 
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( 1, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
 
   END_TEST;
 }
@@ -680,30 +848,29 @@ int UtcDaliControlAutoClipping(void)
 int UtcDaliControlAutoClippingN(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
-  control.SetProperty( Control::Property::BACKGROUND, Property::Map().Add( Toolkit::Visual::Property::TYPE, Visual::COLOR )
-                                                                     .Add( ColorVisual::Property::MIX_COLOR, Color::RED ) );
+  Control                control = Control::New();
+  control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(ColorVisual::Property::MIX_COLOR, Color::RED));
 
-  tet_infoline( "Test to ensure that a renderer does NOT get added when we are clipping children and already have renderers/visuals" );
+  tet_infoline("Test to ensure that a renderer does NOT get added when we are clipping children and already have renderers/visuals");
 
-  DALI_TEST_EQUALS( 0, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
 
-  control.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
 
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( 1, control.GetRendererCount(), TEST_LOCATION ); // Only 1, not 2
+  DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION); // Only 1, not 2
 
   // Ensure the background color is still RED rather than what's set by the automatic clipping
-  Property::Value value = control.GetProperty( Control::Property::BACKGROUND );
-  Property::Map* map = value.GetMap();
-  DALI_TEST_CHECK( map );
-  Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR );
-  DALI_TEST_CHECK( colorValue );
-  DALI_TEST_EQUALS( colorValue->Get< Vector4 >(), Color::RED, TEST_LOCATION );
+  Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  map   = value.GetMap();
+  DALI_TEST_CHECK(map);
+  Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR);
+  DALI_TEST_CHECK(colorValue);
+  DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Color::RED, TEST_LOCATION);
 
   END_TEST;
 }
@@ -711,25 +878,25 @@ int UtcDaliControlAutoClippingN(void)
 int UtcDaliControlAutoClippingWhenAlreadyOnStage(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
+  Control                control = Control::New();
 
-  tet_infoline( "Test to see if a renderer gets added when we are clipping children and when already on stage" );
+  tet_infoline("Test to see if a renderer gets added when we are clipping children and when already on stage");
 
-  DALI_TEST_EQUALS( 0, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
 
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( 0, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
 
-  control.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( 1, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
 
   END_TEST;
 }
@@ -737,35 +904,34 @@ int UtcDaliControlAutoClippingWhenAlreadyOnStage(void)
 int UtcDaliControlAutoClippingWhenAlreadyOnStageN(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
-  control.SetProperty( Control::Property::BACKGROUND, Property::Map().Add( Toolkit::Visual::Property::TYPE, Visual::COLOR )
-                                                                     .Add( ColorVisual::Property::MIX_COLOR, Color::RED ) );
+  Control                control = Control::New();
+  control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(ColorVisual::Property::MIX_COLOR, Color::RED));
 
-  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" );
+  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");
 
-  DALI_TEST_EQUALS( 0, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(0, control.GetRendererCount(), TEST_LOCATION);
 
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( 1, control.GetRendererCount(), TEST_LOCATION );
+  DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION);
 
-  control.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN );
+  control.SetProperty(Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( 1, control.GetRendererCount(), TEST_LOCATION ); // Still should be 1
+  DALI_TEST_EQUALS(1, control.GetRendererCount(), TEST_LOCATION); // Still should be 1
 
   // Ensure the background color is still RED rather than what's set by the automatic clipping
-  Property::Value value = control.GetProperty( Control::Property::BACKGROUND );
-  Property::Map* map = value.GetMap();
-  DALI_TEST_CHECK( map );
-  Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR );
-  DALI_TEST_CHECK( colorValue );
-  DALI_TEST_EQUALS( colorValue->Get< Vector4 >(), Color::RED, TEST_LOCATION );
+  Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  map   = value.GetMap();
+  DALI_TEST_CHECK(map);
+  Property::Value* colorValue = map->Find(ColorVisual::Property::MIX_COLOR);
+  DALI_TEST_CHECK(colorValue);
+  DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Color::RED, TEST_LOCATION);
 
   END_TEST;
 }
@@ -773,95 +939,147 @@ int UtcDaliControlAutoClippingWhenAlreadyOnStageN(void)
 int UtcDaliControlSetTransformSize(void)
 {
   ToolkitTestApplication application;
-  Control control = Control::New();
+  Control                control = Control::New();
 
   Property::Map transformMap;
-  transformMap.Add( Visual::Transform::Property::OFFSET, Vector2( 10, 10 ) )
-              .Add( Visual::Transform::Property::ANCHOR_POINT, Align::BOTTOM_END )
-              .Add( Visual::Transform::Property::ORIGIN, Align::BOTTOM_END )
-              .Add( Visual::Transform::Property::SIZE, Vector2( 10, 20 ) );
+  transformMap.Add(Visual::Transform::Property::OFFSET, Vector2(10, 10))
+    .Add(Visual::Transform::Property::ANCHOR_POINT, Align::BOTTOM_END)
+    .Add(Visual::Transform::Property::ORIGIN, Align::BOTTOM_END)
+    .Add(Visual::Transform::Property::SIZE, Vector2(10, 20));
 
-  control.SetProperty( Control::Property::BACKGROUND, Property::Map().Add( Toolkit::Visual::Property::TYPE, Visual::COLOR )
-                                                                     .Add( Visual::Property::TRANSFORM, transformMap ) );
+  control.SetProperty(Control::Property::BACKGROUND, Property::Map().Add(Toolkit::Visual::Property::TYPE, Visual::COLOR).Add(Visual::Property::TRANSFORM, transformMap));
 
-  tet_infoline( "Test to ensure that the control background transform does not get overwritten when adding to the stage" );
+  tet_infoline("Test to ensure that the control background transform does not get overwritten when adding to the stage");
 
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
   // Ensure the transform property still matches what we set
-  Property::Value value = control.GetProperty( Control::Property::BACKGROUND );
-  Property::Map* map = value.GetMap();
-  DALI_TEST_CHECK( map );
-  Property::Value* transformValue = map->Find( Visual::Property::TRANSFORM );
-  DALI_TEST_CHECK( transformValue );
+  Property::Value value = control.GetProperty(Control::Property::BACKGROUND);
+  Property::Map*  map   = value.GetMap();
+  DALI_TEST_CHECK(map);
+  Property::Value* transformValue = map->Find(Visual::Property::TRANSFORM);
+  DALI_TEST_CHECK(transformValue);
 
   Property::Map* retMap = transformValue->GetMap();
-  DALI_TEST_CHECK( retMap );
-  DALI_TEST_EQUALS( retMap->Find( Visual::Transform::Property::OFFSET )->Get< Vector2 >(), Vector2( 10, 10 ), TEST_LOCATION );
-  DALI_TEST_EQUALS( retMap->Find( Visual::Transform::Property::ANCHOR_POINT )->Get< int >(), (int)Align::BOTTOM_END, TEST_LOCATION );
-  DALI_TEST_EQUALS( retMap->Find( Visual::Transform::Property::ORIGIN )->Get< int >(), (int)Align::BOTTOM_END, TEST_LOCATION );
-  DALI_TEST_EQUALS( retMap->Find( Visual::Transform::Property::SIZE )->Get< Vector2 >(), Vector2( 10, 20 ), TEST_LOCATION );
+  DALI_TEST_CHECK(retMap);
+  DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(10, 10), TEST_LOCATION);
+  DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::ANCHOR_POINT)->Get<int>(), (int)Align::BOTTOM_END, TEST_LOCATION);
+  DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::ORIGIN)->Get<int>(), (int)Align::BOTTOM_END, TEST_LOCATION);
+  DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get<Vector2>(), Vector2(10, 20), TEST_LOCATION);
 
   END_TEST;
 }
 
-
 int UtcDaliControlResourcesReady(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "Register 2 visuals and check ResourceReady when a visual is disabled" );
+  tet_infoline("Register 2 visuals and check ResourceReady when a visual is disabled");
 
   VisualFactory factory = VisualFactory::Get();
-  DALI_TEST_CHECK( factory );
+  DALI_TEST_CHECK(factory);
 
   Property::Map propertyMapLarge;
-  propertyMapLarge.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
-  propertyMapLarge.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
+  propertyMapLarge.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
+  propertyMapLarge.Insert(ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME);
 
   Property::Map propertyMapSmall;
-  propertyMapSmall.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
-  propertyMapSmall.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
+  propertyMapSmall.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
+  propertyMapSmall.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
 
-  Visual::Base smallVisual = factory.CreateVisual( propertyMapSmall );
+  Visual::Base smallVisual = factory.CreateVisual(propertyMapSmall);
   smallVisual.SetName("smallVisual");
-  DALI_TEST_CHECK( smallVisual );
+  DALI_TEST_CHECK(smallVisual);
 
-  DummyControl actor = DummyControl::New();
+  DummyControl      actor     = DummyControl::New();
   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
-  dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, smallVisual );
 
-  actor.SetSize( 200.f, 200.f );
-  DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
-  DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, smallVisual);
+
+  actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
 
-  Stage::GetCurrent().Add( actor );
+  Toolkit::Visual::ResourceStatus resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
+  DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(actor.IsResourceReady(), false, TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
+
+  application.GetScene().Add(actor);
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
-  DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
+  resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL);
+  DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
 
-  Visual::Base largeVisual = factory.CreateVisual( propertyMapLarge );
+  Visual::Base largeVisual = factory.CreateVisual(propertyMapLarge);
   largeVisual.SetName("largeVisual");
-  DALI_TEST_CHECK( largeVisual );
+  DALI_TEST_CHECK(largeVisual);
+
+  tet_infoline("Register Visual but set disabled, IsResourceReady should be true");
+
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL2, largeVisual, false);
+
+  resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
+  DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
+
+  application.SendNotification();
+
+  resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
+  DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::PREPARING), TEST_LOCATION);
+
+  dummyImpl.EnableVisual(DummyControl::Property::TEST_VISUAL2, true);
+
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+
+  resourceStatus = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL2);
+  DALI_TEST_EQUALS(static_cast<int>(resourceStatus), static_cast<int>(Toolkit::Visual::ResourceStatus::READY), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliControlResourcesReady02(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("Change a resource during ResourceReady callback");
 
-  tet_infoline( "Register Visual but set disabled, IsResourceReady should be true" );
+  gResourceReadySignalFired = false;
 
-  dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, largeVisual, false );
+  Control control = Control::New();
+  control.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+  control.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+  Property::Map propertyMap;
+  propertyMap.Insert(ImageVisual::Property::URL, "invalid.jpg");
+  control.SetProperty(Control::Property::BACKGROUND, propertyMap);
+
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
-  DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+
+  // Wait for loading & rasterization
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+  DALI_TEST_EQUALS(control.IsResourceReady(), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+  gResourceReadySignalFired = false;
 
   END_TEST;
 }
@@ -871,28 +1089,28 @@ int UtcDaliControlMarginProperty(void)
   ToolkitTestApplication application;
 
   Control control = Control::New();
-  control.SetBackgroundColor( Color::BLUE );
+  control.SetBackgroundColor(Color::BLUE);
 
-  control.SetProperty( Control::Property::MARGIN, Extents( 20, 10, 0, 0 ) );
+  control.SetProperty(Control::Property::MARGIN, Extents(20, 10, 0, 0));
 
-  Stage::GetCurrent().Add( control );
+  application.GetScene().Add(control);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( control.GetProperty<Extents>( Control::Property::MARGIN ), Extents( 20, 10, 0, 0 ), TEST_LOCATION );
+  DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::MARGIN), Extents(20, 10, 0, 0), TEST_LOCATION);
 
   // Parent control has one ImageView as a Child.
   ImageView image = ImageView::New();
-  image.SetBackgroundColor( Color::RED );
-  image.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
-  image.SetProperty( Control::Property::PADDING, Extents( 10, 10, 10, 10 ) );
-  control.Add( image );
+  image.SetBackgroundColor(Color::RED);
+  image.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
+  image.SetProperty(Control::Property::PADDING, Extents(10, 10, 10, 10));
+  control.Add(image);
 
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( image.GetProperty<Extents>( Control::Property::PADDING ), Extents( 10, 10, 10, 10 ), TEST_LOCATION );
+  DALI_TEST_EQUALS(image.GetProperty<Extents>(Control::Property::PADDING), Extents(10, 10, 10, 10), TEST_LOCATION);
 
   END_TEST;
 }
@@ -902,16 +1120,375 @@ int UtcDaliControlPaddingProperty(void)
   ToolkitTestApplication application;
 
   Control control = Control::New();
-  control.SetBackgroundColor( Color::BLUE );
+  control.SetBackgroundColor(Color::BLUE);
+
+  control.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
+
+  application.GetScene().Add(control);
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(control.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
+
+  Control child = Control::New();
+  control.Add(child);
+
+  application.SendNotification();
+  application.Render();
 
-  control.SetProperty( Control::Property::PADDING, Extents( 10, 10, 10, 10 ) );
+  DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
 
-  Stage::GetCurrent().Add( control );
+  control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(10, 5, 0), TEST_LOCATION);
+
+  control.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::LEFT_TO_RIGHT);
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS(child.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliControlDoAction(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("DoAction on a visual registered with a control");
+
+  // Set up trace debug
+  TestGlAbstraction& gl           = application.GetGlAbstraction();
+  TraceCallStack&    textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+
+  //Created AnimatedImageVisual
+  VisualFactory factory     = VisualFactory::Get();
+  Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+  DummyControl        dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+  dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+  application.GetScene().Add(dummyControl);
+
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+  textureTrace.Reset();
+
+  Property::Map attributes;
+  DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+
+  tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliControlDoActionWhenNotStage(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("DoAction on a visual registered with a control but not staged");
+
+  // Set up trace debug
+  TestGlAbstraction& gl           = application.GetGlAbstraction();
+  TraceCallStack&    textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+
+  //Created AnimatedImageVisual
+  VisualFactory factory     = VisualFactory::Get();
+  Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+  DummyControl        dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+  dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+  textureTrace.Reset();
+
+  Property::Map attributes;
+  DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+
+  tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+  textureTrace.Reset();
+
+  tet_infoline("Adding control to stage will in turn add the visual to the stage");
+
+  application.GetScene().Add(dummyControl);
+  application.SendNotification();
+  application.Render();
+  tet_infoline("No change in textures could occurs as already loaded and cached texture will be used");
+
+  DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+  textureTrace.Reset();
+
+  END_TEST;
+}
+
+int UtcDaliControlDoActionMultipleWhenNotStage01(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("DoAction on a visual registered with a control multiple times but not staged");
+
+  // Set up trace debug
+  TestGlAbstraction& gl           = application.GetGlAbstraction();
+  TraceCallStack&    textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+
+  //Created AnimatedImageVisual
+  VisualFactory factory     = VisualFactory::Get();
+  Visual::Base  imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+  DummyControl        dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+  dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+  textureTrace.Reset();
+
+  Property::Map  attributes;
+  const uint32_t repeatMax = 10u;
+  for(uint32_t repeatCnt = 0u; repeatCnt < repeatMax; ++repeatCnt)
+  {
+    // DoAction multiple times.
+    DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+  }
+
+  tet_infoline("Perform RELOAD action. should reload Image and generate a texture");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+  textureTrace.Reset();
+
+  tet_infoline("Do not load image on more time even we request reload multiple times.");
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
+
+  tet_infoline("Adding control to stage will in turn add the visual to the stage");
+
+  application.GetScene().Add(dummyControl);
+
+  application.SendNotification();
+  application.Render();
+  tet_infoline("No change in textures could occurs as already loaded and cached texture will be used");
 
+  DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+  textureTrace.Reset();
+
+  dummyControl.Unparent();
+  dummyControl.Reset();
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( control.GetProperty<Extents>( Control::Property::PADDING ), Extents( 10, 10, 10, 10 ), TEST_LOCATION );
+  END_TEST;
+}
+
+int UtcDaliControlDoActionMultipleWhenNotStage02(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("DoAction on a visual registered with a control multiple times but not staged");
+
+  // Set up trace debug
+  TestGlAbstraction& gl           = application.GetGlAbstraction();
+  TraceCallStack&    textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+
+  //Created AnimatedImageVisual
+  VisualFactory factory      = VisualFactory::Get();
+  Visual::Base  imageVisual  = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+  Visual::Base  imageVisual2 = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+  DummyControl        dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+  gResourceReadySignalFired = false;
+
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+  dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+  dummyControl.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+  application.SendNotification();
+  application.Render();
+
+  // Dummy control to keep cache
+  DummyControl        keepCacheControl = DummyControl::New(true);
+  Impl::DummyControl& keepCacheImpl    = static_cast<Impl::DummyControl&>(keepCacheControl.GetImplementation());
+
+  keepCacheImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+  keepCacheControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+  // Load request for keep cache control.
+  application.GetScene().Add(keepCacheControl);
+
+  Property::Map  attributes;
+  const uint32_t repeatMax = 10u;
+  for(uint32_t repeatCnt = 0u; repeatCnt < repeatMax; ++repeatCnt)
+  {
+    // DoAction multiple times.
+    DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+  }
+
+  application.SendNotification();
+  application.Render();
+
+  try
+  {
+    application.SendNotification();
+    application.Render();
+
+    tet_infoline("Async load completed. Sigabort should not be occured");
+    DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+    application.SendNotification();
+    application.Render();
+
+    tet_infoline("ResourceReady signal must be fired!");
+    DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+    tet_infoline("Texture generation occured");
+    DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+    DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+    textureTrace.Reset();
+
+    tet_result(TET_PASS);
+  }
+  catch(...)
+  {
+    // Must not be throw exception.
+    tet_infoline("Exception occured!");
+    tet_result(TET_FAIL);
+  }
 
   END_TEST;
 }
+
+int UtcDaliControlDoActionMultipleWhenNotStage03(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("DoAction on a visual registered with a control multiple times but not staged");
+
+  // Set up trace debug
+  TestGlAbstraction& gl           = application.GetGlAbstraction();
+  TraceCallStack&    textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+
+  //Created AnimatedImageVisual
+  VisualFactory factory      = VisualFactory::Get();
+  Visual::Base  imageVisual  = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+  Visual::Base  imageVisual2 = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+
+  DummyControl        dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+  gResourceReadySignalFired = false;
+
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+  dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+  dummyControl.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+  application.SendNotification();
+  application.Render();
+
+  // Dummy control to keep cache
+  DummyControl        keepCacheControl = DummyControl::New(true);
+  Impl::DummyControl& keepCacheImpl    = static_cast<Impl::DummyControl&>(keepCacheControl.GetImplementation());
+
+  keepCacheImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+  keepCacheControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+  // Load request for keep cache control.
+  application.GetScene().Add(keepCacheControl);
+
+  Property::Map  attributes;
+  const uint32_t repeatMax = 10u;
+  for(uint32_t repeatCnt = 0u; repeatCnt < repeatMax; ++repeatCnt)
+  {
+    // DoAction multiple times.
+    DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelImageVisual::Action::RELOAD, attributes);
+  }
+
+  application.SendNotification();
+  application.Render();
+
+  try
+  {
+    tet_infoline("Destroy control without stage on. And create new object that as same visual pointer as previous control");
+
+    const auto*    imageVisualObjectPtr = imageVisual.GetObjectPtr();
+    const uint32_t tryCountMax          = 100u;
+    uint32_t       tryCount             = 0u;
+    do
+    {
+      dummyControl.Reset();
+      imageVisual.Reset();
+
+      imageVisual  = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions());
+      dummyControl = DummyControl::New(true);
+
+      Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+
+      dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+      dummyControl.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+    } while(++tryCount < tryCountMax && imageVisualObjectPtr != imageVisual.GetObjectPtr());
+
+    tet_printf("Luck-trial count : %u. Success? %d\n", tryCount, imageVisualObjectPtr == imageVisual.GetObjectPtr());
+
+    // Connect signal
+    dummyControl.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+    application.SendNotification();
+    application.Render();
+
+    tet_infoline("Async load completed after control destroyed. Sigabort should not be occured");
+    DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+    application.SendNotification();
+    application.Render();
+
+    tet_infoline("ResourceReady signal must not be fired!");
+    DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
+
+    tet_infoline("Texture generation occured");
+    DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION);
+    DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+    textureTrace.Reset();
+
+    tet_result(TET_PASS);
+  }
+  catch(...)
+  {
+    // Must not be throw exception.
+    tet_infoline("Exception occured!");
+    tet_result(TET_FAIL);
+  }
+
+  END_TEST;
+}
\ No newline at end of file