(Automated Tests) Use Scene instead of Stage where possible
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-CameraActor.cpp
index 0f700bf..0d4c8e5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 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.
@@ -20,7 +20,8 @@
 #include <stdlib.h>
 #include <cmath>
 #include <dali/public-api/dali-core.h>
-#include <dali/devel-api/object/handle-devel.h>
+#include <dali/devel-api/actors/actor-devel.h>
+#include <dali/devel-api/actors/camera-actor-devel.h>
 
 #include "dali-test-suite-utils/dali-test-suite-utils.h"
 
@@ -67,6 +68,16 @@ const char* const RENDER_SHADOW_FRAGMENT_SOURCE =
   "  gl_FragColor = vec4(uShadowColor.rgb, uShadowColor.a * alpha);\n"
   "}\n";
 
+struct PropertyDetails
+{
+  std::string name;           ///< The name of the property.
+  Property::Type type;        ///< The property type.
+  bool writable;              ///< Whether the property is writable
+  bool animatable;            ///< Whether the property is animatable.
+  bool constraintInput;       ///< Whether the property can be used as an input to a constraint.
+  Property::Index enumIndex;  ///< Used to check the index is correct within a debug build.
+};
+
 } // Anonymous namespace
 
 
@@ -166,6 +177,47 @@ int UtcDaliCameraActorNewP(void)
   END_TEST;
 }
 
+int UtcDaliCameraActorNewDefaultPerspectiveProjection(void)
+{
+  TestApplication application;
+  tet_infoline( "Test the perspective projection of a camera actor is set appropriately when not passing in a size" );
+
+  CameraActor actor = CameraActor::New();
+  DALI_TEST_CHECK( actor );
+
+  // All the properties should still be the default values
+  // Defaults taken from scene-graph-camera.cpp
+  DALI_TEST_EQUALS( 4.0f/3.0f, actor.GetProperty( CameraActor::Property::ASPECT_RATIO ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 45.0f*(Math::PI/180.0f), actor.GetProperty( CameraActor::Property::FIELD_OF_VIEW ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 800.0f, actor.GetProperty( CameraActor::Property::NEAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 3.0f * 800.0f, actor.GetProperty( CameraActor::Property::FAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 0.0f, actor.GetProperty( Actor::Property::POSITION_Z ).Get< float >(), TEST_LOCATION );
+  DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
+
+  // Add it to the stage, then the values should be updated to reflect a 480.0f by 800.0f scene (default stage size)
+  application.GetScene().Add( actor );
+
+  DALI_TEST_EQUALS( 0.6f, actor.GetProperty( CameraActor::Property::ASPECT_RATIO ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 0.489957f, actor.GetProperty( CameraActor::Property::FIELD_OF_VIEW ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 800.0f, actor.GetProperty( CameraActor::Property::NEAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 4895.0f, actor.GetProperty( CameraActor::Property::FAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 1600.0f, actor.GetProperty( Actor::Property::POSITION_Z ).Get< float >(), TEST_LOCATION );
+  DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
+
+  // Ensure the values stay the same after update/render
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS( 0.6f, actor.GetProperty( CameraActor::Property::ASPECT_RATIO ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 0.489957f, actor.GetProperty( CameraActor::Property::FIELD_OF_VIEW ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 800.0f, actor.GetProperty( CameraActor::Property::NEAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 4895.0f, actor.GetProperty( CameraActor::Property::FAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 1600.0f, actor.GetProperty( Actor::Property::POSITION_Z ).Get< float >(), TEST_LOCATION );
+  DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
+
+  END_TEST;
+}
+
 // Note: No negative test for UtcDaliCameraActorNew.
 
 int UtcDaliCameraActorDownCastP(void)
@@ -225,7 +277,7 @@ int UtcDaliCameraActorSetGetTypeP(void)
   DALI_TEST_EQUALS( actor.GetType(), Dali::Camera::LOOK_AT_TARGET, TEST_LOCATION );
 
   DALI_TEST_EQUALS( "LOOK_AT_TARGET", actor.GetProperty< std::string >( CameraActor::Property::TYPE ), TEST_LOCATION );
-  DALI_TEST_EQUALS( "LOOK_AT_TARGET", DevelHandle::GetCurrentProperty< std::string >( actor, CameraActor::Property::TYPE ), TEST_LOCATION );
+  DALI_TEST_EQUALS( "LOOK_AT_TARGET", actor.GetCurrentProperty< std::string >( CameraActor::Property::TYPE ), TEST_LOCATION );
   END_TEST;
 }
 
@@ -271,7 +323,7 @@ int UtcDaliCameraActorSetFieldOfViewP(void)
   CameraActor defaultCamera = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   const float defaultFieldOfView = defaultCamera.GetFieldOfView();
 
-  CameraActor actor = CameraActor::New();
+  CameraActor actor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   DALI_TEST_EQUALS( actor.GetFieldOfView(), defaultFieldOfView, TEST_LOCATION );
 
   float fieldOfView = Math::PI / 3.0f;
@@ -292,7 +344,7 @@ int UtcDaliCameraActorSetFieldOfViewN(void)
   CameraActor defaultCamera = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   const float defaultFieldOfView = defaultCamera.GetFieldOfView();
 
-  CameraActor actor = CameraActor::New();
+  CameraActor actor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   DALI_TEST_EQUALS( actor.GetFieldOfView(), defaultFieldOfView, TEST_LOCATION );
 
   float fieldOfView = Math::PI / 3.0f;
@@ -316,7 +368,7 @@ int UtcDaliCameraActorGetFieldOfViewP(void)
   const float cameraZ = 2.0f * std::max( size.width, size.height );
   const float expectedFieldOfView = 2.0f * std::atan( size.height * 0.5f / cameraZ );
 
-  CameraActor actor = CameraActor::New();
+  CameraActor actor = CameraActor::New( size );
   DALI_TEST_EQUALS( actor.GetFieldOfView(), expectedFieldOfView, TEST_LOCATION );
 
   float value;
@@ -353,7 +405,7 @@ int UtcDaliCameraActorSetAspectRatioP(void)
   TestApplication application;
   tet_infoline( "Testing Dali::CameraActor Set Aspect Ratio (P)" );
 
-  CameraActor actor = CameraActor::New();
+  CameraActor actor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   DALI_TEST_EQUALS( actor.GetAspectRatio(), static_cast<float>( TestApplication::DEFAULT_SURFACE_WIDTH ) / static_cast<float>( TestApplication::DEFAULT_SURFACE_HEIGHT ), TEST_LOCATION );
 
   // Set an initial value to confirm a further set changes it.
@@ -396,7 +448,7 @@ int UtcDaliCameraActorGetAspectRatioP(void)
   TestApplication application;
   tet_infoline("Testing Dali::CameraActor Get Aspect Ratio");
 
-  CameraActor actor = CameraActor::New();
+  CameraActor actor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   float defaultAspect = static_cast<float>( TestApplication::DEFAULT_SURFACE_WIDTH ) / static_cast<float>( TestApplication::DEFAULT_SURFACE_HEIGHT );
 
   DALI_TEST_EQUALS( actor.GetAspectRatio(), defaultAspect, TEST_LOCATION );
@@ -565,7 +617,7 @@ int UtcDaliCameraActorGetFarClippingPlaneP(void)
   TestApplication application;
   tet_infoline( "Testing Dali::CameraActor Get Far clipping plane (P)" );
 
-  CameraActor actor = CameraActor::New();
+  CameraActor actor = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
   float defaultValue = 800.0f + ( 0xFFFF >> 4 );
   DALI_TEST_EQUALS( actor.GetFarClippingPlane(), defaultValue, TEST_LOCATION );
 
@@ -786,6 +838,30 @@ int UtcDaliCameraActorSetPerspectiveProjectionP(void)
 
   DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
 
+  // Ensure these values persist after adding to the stage and an update/render pass
+  application.GetScene().Add( actor );
+  application.SendNotification();
+  application.Render();
+
+  actor.GetProperty( CameraActor::Property::ASPECT_RATIO ).Get( value );
+  DALI_TEST_EQUALS( 0.666666f, value, FLOAT_EPSILON, TEST_LOCATION );
+  actor.GetProperty( CameraActor::Property::FIELD_OF_VIEW ).Get( value );
+  DALI_TEST_EQUALS( 0.489957f, value, FLOAT_EPSILON, TEST_LOCATION );
+  actor.GetProperty( CameraActor::Property::NEAR_PLANE_DISTANCE ).Get( value );
+  DALI_TEST_EQUALS( 150.f, value, FLOAT_EPSILON, TEST_LOCATION );
+  actor.GetProperty( CameraActor::Property::FAR_PLANE_DISTANCE ).Get( value );
+  DALI_TEST_EQUALS( 4245.f, value, FLOAT_EPSILON, TEST_LOCATION );
+
+  // Call method with a ZERO size, this should reset the perspective projection using the size of the scene we've been added to
+  actor.SetPerspectiveProjection( Vector2::ZERO );
+
+  DALI_TEST_EQUALS( 0.6f, actor.GetProperty( CameraActor::Property::ASPECT_RATIO ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 0.489957f, actor.GetProperty( CameraActor::Property::FIELD_OF_VIEW ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 800.0f, actor.GetProperty( CameraActor::Property::NEAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 4895.0f, actor.GetProperty( CameraActor::Property::FAR_PLANE_DISTANCE ).Get< float >(), FLOAT_EPSILON, TEST_LOCATION );
+  DALI_TEST_EQUALS( 1600.0f, actor.GetProperty( Actor::Property::POSITION_Z ).Get< float >(), TEST_LOCATION );
+  DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION );
+
   END_TEST;
 }
 
@@ -794,16 +870,14 @@ int UtcDaliCameraActorSetPerspectiveProjectionN(void)
   TestApplication application;
   tet_infoline( "Testing Dali::CameraActor::SetPerspectiveProjection (N)" );
 
-  Stage stage = Stage::GetCurrent();
-  Vector2 stageSize = stage.GetSize();
-
   CameraActor actor = CameraActor::New();
 
-  // Check that setting perspective projection without a size (using zero size) uses the stages size.
+  // Check that setting perspective projection without a size does not do anything.
   actor.SetPerspectiveProjection( Size::ZERO );
 
-  float nearClippingPlane = std::max( stageSize.width, stageSize.height );
-  float farClippingPlane = nearClippingPlane + static_cast<float>( 0xFFFF >> 4 );
+  // So the default values should be the same as defined in CameraActor
+  float nearClippingPlane = 800.0f;
+  float farClippingPlane = nearClippingPlane + 2.0f * nearClippingPlane;
 
   DALI_TEST_EQUALS( nearClippingPlane, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION );
   DALI_TEST_EQUALS( farClippingPlane, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION );
@@ -820,7 +894,7 @@ int UtcDaliCameraActorSetOrthographicProjectionP1(void)
   CameraActor actor = CameraActor::New( Size( 1080.0f, 1920.0f ) );
   DALI_TEST_CHECK( actor );
 
-  Stage::GetCurrent().Add( actor );
+  application.GetScene().Add( actor );
 
   actor.SetOrthographicProjection( Size( 1080.0f, 1920.0f ) );
   application.SendNotification();
@@ -836,7 +910,7 @@ int UtcDaliCameraActorSetOrthographicProjectionP1(void)
   actor.GetProperty( CameraActor::Property::FIELD_OF_VIEW ).Get( defaultFieldOfView );
   actor.GetProperty( CameraActor::Property::NEAR_PLANE_DISTANCE ).Get( defaultNearPlaneDistance );
   actor.GetProperty( CameraActor::Property::FAR_PLANE_DISTANCE ).Get( defaultFarPlaneDistance );
-  Vector3 defaultPos = actor.GetCurrentPosition();
+  Vector3 defaultPos = actor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION );
 
   actor.SetOrthographicProjection( Size( 1080.0f, 1920.0f ) );
 
@@ -864,7 +938,7 @@ int UtcDaliCameraActorSetOrthographicProjectionP1(void)
   actor.GetProperty( CameraActor::Property::BOTTOM_PLANE_DISTANCE ).Get( value );
   DALI_TEST_EQUALS( -960.0f, value, FLOAT_EPSILON, TEST_LOCATION );
 
-  Vector3 pos = actor.GetCurrentPosition();
+  Vector3 pos = actor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION );
   DALI_TEST_EQUALS( defaultPos.z, pos.z, 0.001f, TEST_LOCATION );
 
   DALI_TEST_EQUALS( actor.GetProjectionMode(), Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION );
@@ -1129,7 +1203,7 @@ int UtcDaliCameraActorSetCameraOnStage(void)
   tet_infoline( "Testing Dali::CameraActor::SetCamera()" );
 
   CameraActor actor = CameraActor::New();
-  Stage::GetCurrent().Add( actor );
+  application.GetScene().Add( actor );
   application.Render( 0 );
   application.SendNotification();
 
@@ -1205,12 +1279,12 @@ int UtcDaliCameraActorDefaultProperties(void)
   tet_infoline( "Testing Dali::CameraActor DefaultProperties" );
 
   CameraActor actor = CameraActor::New();
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene stage = application.GetScene();
   stage.Add(actor);
   stage.GetRenderTaskList().GetTask(0).SetCameraActor( actor );
 
   actor.SetAspectRatio( TEST_ASPECT_RATIO );
-  Stage::GetCurrent().Add( actor );
+  application.GetScene().Add( actor );
   application.Render( 0 );
   application.SendNotification();
   bool bValue;
@@ -1266,18 +1340,139 @@ int UtcDaliCameraActorDefaultProperties(void)
   END_TEST;
 }
 
+template< typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8>
+void TEST_CAMERA_PROPERTY( P1 camera, P2 stringName, P3 type, P4 isWriteable, P5 isAnimateable, P6 isConstraintInput, P7 enumName, P8 LOCATION )
+{
+  DALI_TEST_EQUALS( camera.GetPropertyName( enumName ), stringName, LOCATION );
+  DALI_TEST_EQUALS( camera.GetPropertyIndex( stringName ), static_cast<Property::Index>(enumName), LOCATION );
+  DALI_TEST_EQUALS( camera.GetPropertyType( enumName ), type, LOCATION );
+  DALI_TEST_EQUALS( camera.IsPropertyWritable( enumName ), isWriteable, LOCATION );
+  DALI_TEST_EQUALS( camera.IsPropertyAnimatable( enumName ), isAnimateable, LOCATION );
+  DALI_TEST_EQUALS( camera.IsPropertyAConstraintInput( enumName ), isConstraintInput, LOCATION );
+}
+int UtcDaliCameraActorDefaultPropertiesInherited(void)
+{
+  TestApplication application;
+
+  CameraActor actor = CameraActor::New();
+  Integration::Scene stage = application.GetScene();
+  stage.Add(actor);
+  stage.GetRenderTaskList().GetTask(0).SetCameraActor( actor );
+
+  application.GetScene().Add( actor );
+  application.Render( 0 );
+  application.SendNotification();
+
+  const PropertyDetails CAMERA_DEFAULT_PROPERTY[] =
+  {
+// actor
+    { "parentOrigin",           Property::VECTOR3,  true,  false, true,  Dali::Actor::Property::PARENT_ORIGIN },
+    { "parentOriginX",          Property::FLOAT,    true,  false, true,  Dali::Actor::Property::PARENT_ORIGIN_X },
+    { "parentOriginY",          Property::FLOAT,    true,  false, true,  Dali::Actor::Property::PARENT_ORIGIN_Y },
+    { "parentOriginZ",          Property::FLOAT,    true,  false, true,  Dali::Actor::Property::PARENT_ORIGIN_Z },
+    { "anchorPoint",            Property::VECTOR3,  true,  false, true,  Dali::Actor::Property::ANCHOR_POINT },
+    { "anchorPointX",           Property::FLOAT,    true,  false, true,  Dali::Actor::Property::ANCHOR_POINT_X },
+    { "anchorPointY",           Property::FLOAT,    true,  false, true,  Dali::Actor::Property::ANCHOR_POINT_Y },
+    { "anchorPointZ",           Property::FLOAT,    true,  false, true,  Dali::Actor::Property::ANCHOR_POINT_Z },
+    { "size",                   Property::VECTOR3,  true,  true,  true,  Dali::Actor::Property::SIZE },
+    { "sizeWidth",              Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::SIZE_WIDTH },
+    { "sizeHeight",             Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::SIZE_HEIGHT },
+    { "sizeDepth",              Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::SIZE_DEPTH },
+    { "position",               Property::VECTOR3,  true,  true,  true,  Dali::Actor::Property::POSITION },
+    { "positionX",              Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::POSITION_X },
+    { "positionY",              Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::POSITION_Y },
+    { "positionZ",              Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::POSITION_Z },
+    { "worldPosition",          Property::VECTOR3,  false, false, true,  Dali::Actor::Property::WORLD_POSITION },
+    { "worldPositionX",         Property::FLOAT,    false, false, true,  Dali::Actor::Property::WORLD_POSITION_X },
+    { "worldPositionY",         Property::FLOAT,    false, false, true,  Dali::Actor::Property::WORLD_POSITION_Y },
+    { "worldPositionZ",         Property::FLOAT,    false, false, true,  Dali::Actor::Property::WORLD_POSITION_Z },
+    { "orientation",            Property::ROTATION, true,  true,  true,  Dali::Actor::Property::ORIENTATION },
+    { "worldOrientation",       Property::ROTATION, false, false, true,  Dali::Actor::Property::WORLD_ORIENTATION },
+    { "scale",                  Property::VECTOR3,  true,  true,  true,  Dali::Actor::Property::SCALE },
+    { "scaleX",                 Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::SCALE_X },
+    { "scaleY",                 Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::SCALE_Y },
+    { "scaleZ",                 Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::SCALE_Z },
+    { "worldScale",             Property::VECTOR3,  false, false, true,  Dali::Actor::Property::WORLD_SCALE },
+    { "visible",                Property::BOOLEAN,  true,  true,  true,  Dali::Actor::Property::VISIBLE },
+    { "color",                  Property::VECTOR4,  true,  true,  true,  Dali::Actor::Property::COLOR },
+    { "colorRed",               Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::COLOR_RED },
+    { "colorGreen",             Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::COLOR_GREEN },
+    { "colorBlue",              Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::COLOR_BLUE },
+    { "colorAlpha",             Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::COLOR_ALPHA },
+    { "worldColor",             Property::VECTOR4,  false, false, true,  Dali::Actor::Property::WORLD_COLOR },
+    { "worldMatrix",            Property::MATRIX,   false, false, true,  Dali::Actor::Property::WORLD_MATRIX },
+    { "name",                   Property::STRING,   true,  false, false, Dali::Actor::Property::NAME },
+    { "sensitive",              Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::SENSITIVE },
+    { "leaveRequired",          Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::LEAVE_REQUIRED },
+    { "inheritOrientation",     Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::INHERIT_ORIENTATION },
+    { "inheritScale",           Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::INHERIT_SCALE },
+    { "colorMode",              Property::INTEGER,  true,  false, false, Dali::Actor::Property::COLOR_MODE },
+    { "drawMode",               Property::INTEGER,  true,  false, false, Dali::Actor::Property::DRAW_MODE },
+    { "sizeModeFactor",         Property::VECTOR3,  true,  false, false, Dali::Actor::Property::SIZE_MODE_FACTOR },
+    { "widthResizePolicy",      Property::STRING,   true,  false, false, Dali::Actor::Property::WIDTH_RESIZE_POLICY },
+    { "heightResizePolicy",     Property::STRING,   true,  false, false, Dali::Actor::Property::HEIGHT_RESIZE_POLICY },
+    { "sizeScalePolicy",        Property::INTEGER,  true,  false, false, Dali::Actor::Property::SIZE_SCALE_POLICY },
+    { "widthForHeight",         Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::WIDTH_FOR_HEIGHT },
+    { "heightForWidth",         Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::HEIGHT_FOR_WIDTH },
+    { "padding",                Property::VECTOR4,  true,  false, false, Dali::Actor::Property::PADDING },
+    { "minimumSize",            Property::VECTOR2,  true,  false, false, Dali::Actor::Property::MINIMUM_SIZE },
+    { "maximumSize",            Property::VECTOR2,  true,  false, false, Dali::Actor::Property::MAXIMUM_SIZE },
+    { "inheritPosition",        Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::INHERIT_POSITION },
+    { "clippingMode",           Property::STRING,   true,  false, false, Dali::Actor::Property::CLIPPING_MODE },
+    { "layoutDirection",        Property::STRING,   true,  false, false, Dali::Actor::Property::LAYOUT_DIRECTION },
+    { "inheritLayoutDirection", Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::INHERIT_LAYOUT_DIRECTION },
+    { "opacity",                Property::FLOAT,    true,  true,  true,  Dali::Actor::Property::OPACITY },
+    { "screenPosition",         Property::VECTOR2,  false, false, false, Dali::Actor::Property::SCREEN_POSITION },
+    { "positionUsesAnchorPoint",Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::POSITION_USES_ANCHOR_POINT },
+    { "culled",                 Property::BOOLEAN,  false, false, true,  Dali::Actor::Property::CULLED },
+    { "id",                     Property::INTEGER,  false, false, false, Dali::Actor::Property::ID },
+    { "hierarchyDepth",         Property::INTEGER,  false, false, false, Dali::Actor::Property::HIERARCHY_DEPTH },
+    { "isRoot",                 Property::BOOLEAN,  false, false, false, Dali::Actor::Property::IS_ROOT },
+    { "isLayer",                Property::BOOLEAN,  false, false, false, Dali::Actor::Property::IS_LAYER },
+    { "connectedToScene",       Property::BOOLEAN,  false, false, false, Dali::Actor::Property::CONNECTED_TO_SCENE },
+    { "keyboardFocusable",      Property::BOOLEAN,  true,  false, false, Dali::Actor::Property::KEYBOARD_FOCUSABLE },
+    { "siblingOrder",           Property::INTEGER,  true,  false, false, Dali::DevelActor::Property::SIBLING_ORDER },
+// camera own
+    { "type",                   Property::STRING,   true,    false,   true,   Dali::CameraActor::Property::TYPE                  },
+    { "projectionMode",         Property::STRING,   true,    false,   true,   Dali::CameraActor::Property::PROJECTION_MODE       },
+    { "fieldOfView",            Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::FIELD_OF_VIEW         },
+    { "aspectRatio",            Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::ASPECT_RATIO          },
+    { "nearPlaneDistance",      Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::NEAR_PLANE_DISTANCE   },
+    { "farPlaneDistance",       Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::FAR_PLANE_DISTANCE    },
+    { "leftPlaneDistance",      Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::LEFT_PLANE_DISTANCE   },
+    { "rightPlaneDistance",     Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::RIGHT_PLANE_DISTANCE  },
+    { "topPlaneDistance",       Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::TOP_PLANE_DISTANCE    },
+    { "bottomPlaneDistance",    Property::FLOAT,    true,    false,   true,   Dali::CameraActor::Property::BOTTOM_PLANE_DISTANCE },
+    { "targetPosition",         Property::VECTOR3,  true,    false,   true,   Dali::CameraActor::Property::TARGET_POSITION       },
+    { "projectionMatrix",       Property::MATRIX,   false,   false,   true,   Dali::CameraActor::Property::PROJECTION_MATRIX     },
+    { "viewMatrix",             Property::MATRIX,   false,   false,   true,   Dali::CameraActor::Property::VIEW_MATRIX           },
+    { "invertYAxis",            Property::BOOLEAN,  true,    false,   true,   Dali::CameraActor::Property::INVERT_Y_AXIS         }
+  };
+
+  for( uint32_t index = 0; index < (sizeof(CAMERA_DEFAULT_PROPERTY)/sizeof(PropertyDetails)); ++index )
+  {
+    TEST_CAMERA_PROPERTY( actor,
+                          CAMERA_DEFAULT_PROPERTY[ index ].name,
+                          CAMERA_DEFAULT_PROPERTY[ index ].type,
+                          CAMERA_DEFAULT_PROPERTY[ index ].writable,
+                          CAMERA_DEFAULT_PROPERTY[ index ].animatable,
+                          CAMERA_DEFAULT_PROPERTY[ index ].constraintInput,
+                          CAMERA_DEFAULT_PROPERTY[ index ].enumIndex,
+                          TEST_LOCATION );
+  }
+  END_TEST;
+}
+
 int UtcDaliCameraActorModelView(void)
 {
   TestApplication application;
   tet_infoline( "Testing Dali::CameraActor Test view application" );
 
-  BufferImage image = CreateBufferImage();
-
-  Actor actor = CreateRenderableActor(image);
-  actor.SetSize( 100.0f, 100.0f );
-  actor.SetPosition( 20.0f, 30.0f, 40.0f );
-  actor.SetParentOrigin( ParentOrigin::CENTER );
-  Stage::GetCurrent().Add( actor );
+  Actor actor = CreateRenderableActor();
+  actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
+  actor.SetProperty( Actor::Property::POSITION, Vector3( 20.0f, 30.0f, 40.0f ));
+  actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+  application.GetScene().Add( actor );
 
   application.SendNotification();
   application.Render( 0 );
@@ -1285,9 +1480,9 @@ int UtcDaliCameraActorModelView(void)
   application.SendNotification();
 
   Matrix resultMatrix( true );
-  resultMatrix.SetTransformComponents( Vector3::ONE, Quaternion::IDENTITY, actor.GetCurrentPosition() );
+  resultMatrix.SetTransformComponents( Vector3::ONE, Quaternion::IDENTITY, actor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ) );
 
-  RenderTask task = Stage::GetCurrent().GetRenderTaskList().GetTask( 0 );
+  RenderTask task = application.GetScene().GetRenderTaskList().GetTask( 0 );
   CameraActor cameraActor = task.GetCameraActor();
 
   Matrix viewMatrix( false );
@@ -1303,15 +1498,15 @@ int UtcDaliCameraActorReadProjectionMatrix(void)
   TestApplication application;
   tet_infoline( "Testing Dali::CameraActor::ReadProjectionMatrix()" );
 
-  CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask( 0u ).GetCameraActor();
+  CameraActor camera = application.GetScene().GetRenderTaskList().GetTask( 0u ).GetCameraActor();
   application.SendNotification();
   application.Render( 0 );
   application.Render();
   application.SendNotification();
-  Image image = CreateBufferImage();
+  Texture image = Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, 4u, 4u);
   Actor actor = CreateRenderableActor( image, RENDER_SHADOW_VERTEX_SOURCE, RENDER_SHADOW_FRAGMENT_SOURCE );
-  actor.SetSize( 100.0f, 100.0f );
-  Stage::GetCurrent().Add( actor );
+  actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
+  application.GetScene().Add( actor );
 
   Matrix projectionMatrix;
   Matrix viewMatrix;
@@ -1348,27 +1543,27 @@ int UtcDaliCameraActorAnimatedProperties(void)
   TestApplication application;
   tet_infoline( "Testing Dali::Internal::CameraActor::GetSceneObjectAnimatableProperty()" );
 
-  CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask( 0u ).GetCameraActor();
+  CameraActor camera = application.GetScene().GetRenderTaskList().GetTask( 0u ).GetCameraActor();
   Actor actor = Actor::New();
-  actor.SetSize( 100.0f, 100.0f );
-  Stage::GetCurrent().Add( actor );
+  actor.SetProperty( Actor::Property::SIZE, Vector2( 100.0f, 100.0f ) );
+  application.GetScene().Add( actor );
 
   Constraint constraint = Constraint::New<Dali::Vector3>( actor, Actor::Property::POSITION, EqualToConstraint() );
   constraint.AddSource( Source( camera, Actor::Property::POSITION ) );
   constraint.Apply();
 
-  camera.SetPosition( 100.0f, 200.0f, 300.0f );
+  camera.SetProperty( Actor::Property::POSITION, Vector3( 100.0f, 200.0f, 300.0f ));
   application.SendNotification();
   application.Render();
 
-  DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3( 100.0f, 200.0f, 300.0f ), TEST_LOCATION);
+  DALI_TEST_EQUALS( actor.GetCurrentProperty< Vector3 >( Actor::Property::POSITION ), Vector3( 100.0f, 200.0f, 300.0f ), TEST_LOCATION);
   END_TEST;
 }
 
 int UtcDaliCameraActorPropertyIndices(void)
 {
   TestApplication application;
-  CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask( 0u ).GetCameraActor();
+  CameraActor camera = application.GetScene().GetRenderTaskList().GetTask( 0u ).GetCameraActor();
 
   Actor basicActor = Actor::New();
   Property::IndexContainer indices;
@@ -1381,17 +1576,17 @@ int UtcDaliCameraActorPropertyIndices(void)
 int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void)
 {
   TestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene stage = application.GetScene();
   Vector2 stageSize = stage.GetSize();
 
   CameraActor freeLookCameraActor = CameraActor::New( stageSize );
-  freeLookCameraActor.SetParentOrigin( ParentOrigin::CENTER );
+  freeLookCameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
   freeLookCameraActor.SetType( Camera::FREE_LOOK );
 
   Vector3 targetPosition( 30.0f, 240.0f, -256.0f );
   Actor target = Actor::New();
-  target.SetParentOrigin( ParentOrigin::CENTER );
-  target.SetPosition( targetPosition );
+  target.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+  target.SetProperty( Actor::Property::POSITION, targetPosition );
 
   Constraint cameraOrientationConstraint = Constraint::New<Quaternion> ( freeLookCameraActor, Actor::Property::ORIENTATION, &LookAt );
   cameraOrientationConstraint.AddSource( Source( target, Actor::Property::WORLD_POSITION ) );
@@ -1402,7 +1597,7 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void)
   CameraActor lookAtCameraActor = CameraActor::New( stageSize );
   lookAtCameraActor.SetType( Camera::LOOK_AT_TARGET );
   lookAtCameraActor.SetTargetPosition( targetPosition );
-  lookAtCameraActor.SetParentOrigin( ParentOrigin::CENTER );
+  lookAtCameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
 
   stage.Add( target );
   stage.Add( freeLookCameraActor );
@@ -1419,8 +1614,8 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void)
         position.Normalize();
         position *= 200.0f;
 
-        freeLookCameraActor.SetPosition( position );
-        lookAtCameraActor.SetPosition( position );
+        freeLookCameraActor.SetProperty( Actor::Property::POSITION, position );
+        lookAtCameraActor.SetProperty( Actor::Property::POSITION, position );
 
         application.SendNotification();
         application.Render();
@@ -1441,17 +1636,17 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void)
 int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
 {
   TestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene stage = application.GetScene();
   Vector2 stageSize = stage.GetSize();
 
   CameraActor freeLookCameraActor = CameraActor::New( stageSize );
-  freeLookCameraActor.SetParentOrigin( ParentOrigin::CENTER );
+  freeLookCameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
   freeLookCameraActor.SetType( Camera::FREE_LOOK );
 
   Vector3 targetPosition( 30.0f, 240.0f, -256.0f );
   Actor target = Actor::New();
-  target.SetParentOrigin( ParentOrigin::CENTER );
-  target.SetPosition( targetPosition );
+  target.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+  target.SetProperty( Actor::Property::POSITION, targetPosition );
 
   Constraint cameraOrientationConstraint = Constraint::New<Quaternion> ( freeLookCameraActor, Actor::Property::ORIENTATION, &LookAt );
   cameraOrientationConstraint.AddSource( Source( target, Actor::Property::WORLD_POSITION ) );
@@ -1462,7 +1657,7 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
   CameraActor lookAtCameraActor = CameraActor::New( stageSize );
   lookAtCameraActor.SetType( Camera::LOOK_AT_TARGET );
   lookAtCameraActor.SetTargetPosition( targetPosition );
-  lookAtCameraActor.SetParentOrigin( ParentOrigin::CENTER );
+  lookAtCameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
 
   stage.Add( target );
   stage.Add( freeLookCameraActor );
@@ -1480,8 +1675,8 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
         position.Normalize();
         position *= 200.0f;
 
-        freeLookCameraActor.SetPosition( position );
-        lookAtCameraActor.SetPosition( position );
+        freeLookCameraActor.SetProperty( Actor::Property::POSITION, position );
+        lookAtCameraActor.SetProperty( Actor::Property::POSITION, position );
 
         application.SendNotification();
         application.Render();
@@ -1490,7 +1685,7 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
         Matrix freeLookViewMatrix;
         freeLookCameraActor.GetProperty( CameraActor::CameraActor::Property::VIEW_MATRIX ).Get( freeLookViewMatrix );
 
-        Matrix freeLookWorld = freeLookCameraActor.GetCurrentWorldMatrix();
+        Matrix freeLookWorld = freeLookCameraActor.GetCurrentProperty< Matrix >( Actor::Property::WORLD_MATRIX );
 
         Matrix freeLookTest( false );
         Matrix::Multiply( freeLookTest, freeLookViewMatrix, freeLookWorld );
@@ -1505,7 +1700,7 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
 int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
 {
   TestApplication application;
-  Stage stage = Stage::GetCurrent();
+  Integration::Scene stage = application.GetScene();
   Vector2 stageSize = stage.GetSize();
 
   Vector3 targetPosition( Vector3::ZERO );
@@ -1513,11 +1708,11 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
 
   CameraActor freeLookCameraActor = CameraActor::New( stageSize );
   freeLookCameraActor.SetType( Camera::FREE_LOOK );
-  freeLookCameraActor.SetParentOrigin( ParentOrigin::CENTER );
+  freeLookCameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
 
   Quaternion cameraOrientation( Radian( Degree( 180.0f ) ), Vector3::YAXIS );
-  freeLookCameraActor.SetPosition( cameraOffset );
-  freeLookCameraActor.SetOrientation( cameraOrientation );
+  freeLookCameraActor.SetProperty( Actor::Property::POSITION, cameraOffset );
+  freeLookCameraActor.SetProperty( Actor::Property::ORIENTATION, cameraOrientation );
 
   Actor cameraAnchor = Actor::New();
   cameraAnchor.Add( freeLookCameraActor );
@@ -1528,8 +1723,8 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
   {
     Quaternion rotation( Radian( Degree( angle ) ), Vector3::YAXIS );
 
-    freeLookCameraActor.SetPosition( rotation.Rotate( cameraOffset ) );
-    cameraAnchor.SetOrientation( rotation );
+    freeLookCameraActor.SetProperty( Actor::Property::POSITION, rotation.Rotate( cameraOffset ) );
+    cameraAnchor.SetProperty( Actor::Property::ORIENTATION, rotation );
 
     application.SendNotification();
     application.Render();
@@ -1539,7 +1734,7 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
     Matrix freeLookViewMatrix;
     freeLookCameraActor.GetProperty( CameraActor::CameraActor::Property::VIEW_MATRIX ).Get( freeLookViewMatrix );
 
-    Matrix freeLookWorld = freeLookCameraActor.GetCurrentWorldMatrix();
+    Matrix freeLookWorld = freeLookCameraActor.GetCurrentProperty< Matrix >( Actor::Property::WORLD_MATRIX );
 
     Matrix freeLookTest( false );
     Matrix::Multiply( freeLookTest,  freeLookViewMatrix,  freeLookWorld );
@@ -1547,3 +1742,61 @@ int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
   }
   END_TEST;
 }
+
+int UtcDaliCameraActorReflectionByPlane(void)
+{
+  TestApplication application;
+
+  Integration::Scene stage = application.GetScene();
+
+  Vector3 targetPosition( Vector3::ZERO );
+  Vector3 cameraOffset( 0.0f, 100.0f, 100.0f );
+
+  CameraActor freeLookCameraActor = stage.GetRenderTaskList().GetTask(0).GetCameraActor();
+  freeLookCameraActor.SetType(Camera::LOOK_AT_TARGET);
+  freeLookCameraActor.SetTargetPosition( targetPosition );
+  freeLookCameraActor.SetProperty( Actor::Property::POSITION, cameraOffset );
+
+  stage.GetRootLayer().SetProperty( Actor::Property::POSITION, Vector2( 1, 0 ));
+
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  Matrix matrixBefore, matrixAfter;
+  freeLookCameraActor.GetProperty( CameraActor::CameraActor::Property::VIEW_MATRIX ).Get( matrixBefore );
+  freeLookCameraActor.SetProperty( Dali::DevelCameraActor::Property::REFLECTION_PLANE, Vector4( 0.0f, 1.0f, 0.0f, 0.0f));
+  stage.GetRootLayer().SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  freeLookCameraActor.GetProperty( CameraActor::CameraActor::Property::VIEW_MATRIX ).Get( matrixAfter );
+
+  Vector3 position, scale;
+  Quaternion rotation;
+  matrixAfter.GetTransformComponents( position, rotation, scale );
+
+  Quaternion reflected( 0, 0, 1, 0 );
+
+  DALI_TEST_EQUALS( reflected, rotation, 0.01f, TEST_LOCATION );
+
+  // Test Free Look camera
+  freeLookCameraActor.SetType(Camera::FREE_LOOK);
+
+  // Make sure the recalculation will take place
+  freeLookCameraActor.SetProperty( Dali::DevelCameraActor::Property::REFLECTION_PLANE, Vector4( 0.0f, 1.0f, 0.0f, 0.0f));
+
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+  application.Render();
+
+  // Nothing should change despite of different camera type
+  matrixAfter.GetTransformComponents( position, rotation, scale );
+  DALI_TEST_EQUALS( reflected, rotation, 0.01f, TEST_LOCATION );
+
+  END_TEST;
+}