[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ScrollView.cpp
index f8bded0..3c12af6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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 <dali-toolkit-test-suite-utils.h>
 #include <dali-toolkit/dali-toolkit.h>
 #include <dali/integration-api/events/touch-event-integ.h>
-#include <dali/integration-api/events/pan-gesture-event.h>
+#include <dali/integration-api/events/wheel-event-integ.h>
+#include <stdlib.h>
+#include <iostream>
 
 using namespace Dali;
 using namespace Toolkit;
@@ -44,78 +44,45 @@ static void TestCallback(BaseHandle handle)
   gObjectCreatedCallBackCalled = true;
 }
 
-
-const int MILLISECONDS_PER_SECOND = 1000;
-const int RENDER_FRAME_INTERVAL = 16;                           ///< Duration of each frame in ms. (at approx 60FPS)
-const int RENDER_ANIMATION_TEST_DURATION_MS = 1000;             ///< 1000ms to test animation
-const int RENDER_DELAY_SCROLL = 1000;                           ///< duration to wait for any scroll to complete.
-
-// For Clamp Signal testing...
-const float CLAMP_EXCESS_WIDTH = 200.0f;                        ///< Amount of width that can be panned outside scrollview
-const float CLAMP_EXCESS_HEIGHT = 200.0f;                       ///< Amount of height that can be panned outside scrollview
-const int CLAMP_STEP_0_CHECK_NOTCLAMPED = 0;                    ///< FSM: "First check that scrollview isn't clamped"
-const int CLAMP_STEP_1_CHECK_CLAMPED_WEST = 1;                  ///< FSM: "Next check that scrollview clamps against left side"
-const int CLAMP_STEP_2_CHECK_CLAMPED_SOUTH_WEST = 2;            ///< FSM: "Then check that scrollview clamps against bottom-left side"
-const int CLAMP_STEP_3_SUCCESS = 3;                             ///< FSM: "Finished (Success)"
-const Vector3 CLAMP_START_SCROLL_POSITION(30.0f, 100.0f, 0.0f); ///< Scroll start position for the Clamping tests.
-const Vector2 CLAMP_TOUCH_START( 100.0f, 100.0f );              ///< Start point to touch from for the Clamping tests.
-const Vector2 CLAMP_TOUCH_MOVEMENT( 5.0f, -5.0f );              ///< Amount to move touch for each frame for the Clamping tests.
-const int CLAMP_GESTURE_FRAMES = 100;                           ///< Number of Frames to synthesize a gesture for the Clamping tests.
-const Vector3 TEST_ACTOR_POSITION(100.0f, 100.0f, 0.0f);        ///< A Test actor position offset (arbitrary value)
-const Vector3 TEST_CONSTRAINT_OFFSET(1.0f, 2.0f, 0.0f);         ///< A Test constraint offset (arbitrary value to test effects)
-const float TEST_RATIO_TOLERANCE = 0.05;                        ///< +/-5% tolerance for ratio comparisons.
-
-const int MAX_FRAMES_TO_TEST_OVERSHOOT = 600;                         ///< 10 seconds (at 60 frames per second).
-const Vector3 OVERSHOOT_START_SCROLL_POSITION(100.0f, 100.0f, 0.0f);  ///< Scroll start position for the Overshoot tests.
-const float SCROLL_ANIMATION_DURATION(0.33f);                   ///< Duration of scroll animation in Overshoot tests (i.e. 100 pixels of overshoot in the speed of 500 pixels per 100 frames, 100/(500/(60/100)) = 0.33)
-const Vector3 SNAP_POSITION_WITH_DECELERATED_VELOCITY(74.0f, 74.0f, 0.0f);  ///< the snap position for Overshoot tests with the decelerated velocity (i.e. Decelerated from 500 pixels per 100 frames).
-const float TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION = 0.05f;             ///< a Test duration
-const float TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION = 1.5f;              ///< another Test duration
-const float TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION = TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * 0.5f; // Same as above, but different alpha function.
-const float TIME_TOLERANCE = 0.05f;                                   ///< Allow testing tolerance between a 10th of second (+/- 3 frames)
-
-
-// Generate a PanGestureEvent to send to Core
-Integration::PanGestureEvent GeneratePan(
-    Gesture::State state,
-    const Vector2& previousPosition,
-    const Vector2& currentPosition,
-    unsigned long timeDelta,
-    unsigned int numberOfTouches = 1)
-{
-  Integration::PanGestureEvent pan(state);
-
-  pan.previousPosition = previousPosition;
-  pan.currentPosition = currentPosition;
-  pan.timeDelta = timeDelta;
-  pan.numberOfTouches = numberOfTouches;
-
-  return pan;
-}
-
-/**
- * Helper to generate PanGestureEvent
- *
- * @param[in] application Application instance
- * @param[in] state The Gesture State
- * @param[in] pos The current position of touch.
- */
-static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
+struct CallbackFunctor
 {
-  static Vector2 last;
+  CallbackFunctor(bool* callbackFlag)
+  : mCallbackFlag(callbackFlag)
+  {
+  }
 
-  if( (state == Gesture::Started) ||
-      (state == Gesture::Possible) )
+  void operator()()
   {
-    last.x = pos.x;
-    last.y = pos.y;
+    *mCallbackFlag = true;
   }
+  bool* mCallbackFlag;
+};
 
-  application.ProcessEvent(GeneratePan(state, last, pos, RENDER_FRAME_INTERVAL));
+const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
 
-  last.x = pos.x;
-  last.y = pos.y;
-}
+const int RENDER_DELAY_SCROLL = 1000; ///< duration to wait for any scroll to complete.
+
+// For Clamp Signal testing...
+const float   CLAMP_EXCESS_WIDTH  = 200.0f;               ///< Amount of width that can be panned outside scrollview
+const float   CLAMP_EXCESS_HEIGHT = 200.0f;               ///< Amount of height that can be panned outside scrollview
+const Vector2 CLAMP_START_SCROLL_POSITION(30.0f, 100.0f); ///< Scroll start position for the Clamping tests.
+const Vector2 CLAMP_TOUCH_START(100.0f, 100.0f);          ///< Start point to touch from for the Clamping tests.
+const Vector2 CLAMP_TOUCH_MOVEMENT(5.0f, -5.0f);          ///< Amount to move touch for each frame for the Clamping tests.
+const int     CLAMP_GESTURE_FRAMES = 100;                 ///< Number of Frames to synthesize a gesture for the Clamping tests.
+const Vector3 TEST_ACTOR_POSITION(100.0f, 100.0f, 0.0f);  ///< A Test actor position offset (arbitrary value)
+const Vector3 TEST_CONSTRAINT_OFFSET(1.0f, 2.0f, 0.0f);   ///< A Test constraint offset (arbitrary value to test effects)
+
+const float DEFAULT_SNAP_OVERSHOOT_DURATION(0.5f); ///< Default overshoot snapping animation time.
+const float DEFAULT_MAX_OVERSHOOT(100.0f);         ///< Default maximum allowed overshoot in pixels
+
+const int     MAX_FRAMES_TO_TEST_OVERSHOOT = 600;                                                 ///< 10 seconds (at 60 frames per second).
+const Vector2 OVERSHOOT_START_SCROLL_POSITION(100.0f, 100.0f);                                    ///< Scroll start position for the Overshoot tests.
+const float   SCROLL_ANIMATION_DURATION(0.33f);                                                   ///< Duration of scroll animation in Overshoot tests (i.e. 100 pixels of overshoot in the speed of 500 pixels per 100 frames, 100/(500/(100/60)) = 0.33)
+const Vector2 SNAP_POSITION_WITH_DECELERATED_VELOCITY(74.0f, 74.0f);                              ///< the snap position for Overshoot tests with the decelerated velocity (i.e. Decelerated from 500 pixels per 100 frames).
+const float   TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION = 0.05f;                                       ///< a Test duration
+const float   TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION = 1.5f;                                        ///< another Test duration
+const float   TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION = TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * 0.5f; // Same as above, but different alpha function.
+const float   TIME_TOLERANCE                       = 0.05f;                                       ///< Allow testing tolerance between a 10th of second (+/- 3 frames)
 
 /*
  * Simulate time passed by.
@@ -130,7 +97,7 @@ int Wait(ToolkitTestApplication& application, int duration = 0)
 {
   int time = 0;
 
-  for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
+  for(int i = 0; i <= (duration / RENDER_FRAME_INTERVAL); i++)
   {
     application.SendNotification();
     application.Render(RENDER_FRAME_INTERVAL);
@@ -142,19 +109,20 @@ int Wait(ToolkitTestApplication& application, int duration = 0)
 
 // Callback probes.
 
-static bool gOnScrollStartCalled;                       ///< Whether the OnScrollStart signal was invoked.
-static bool gOnScrollUpdateCalled;                      ///< Whether the OnScrollUpdate signal was invoked.
-static bool gOnScrollCompleteCalled;                    ///< Whether the OnScrollComplete signal was invoked.
-static bool gOnSnapStartCalled;                         ///< Whether the OnSnapStart signal was invoked.
-static SnapType gLastSnapType;                          ///< Snaping information from SnapEvent.
-static Vector3 gConstraintResult;                       ///< Result from constraint.
+static bool     gOnScrollStartCalled;    ///< Whether the OnScrollStart signal was invoked.
+static bool     gOnScrollUpdateCalled;   ///< Whether the OnScrollUpdate signal was invoked.
+static bool     gOnScrollCompleteCalled; ///< Whether the OnScrollComplete signal was invoked.
+static bool     gOnSnapStartCalled;      ///< Whether the OnSnapStart signal was invoked.
+static bool     gOnWheelEventCalled;     ///< Whether the WheelEventSignal signal was invoked.
+static SnapType gLastSnapType;           ///< Snaping information from SnapEvent.
+static Vector3  gConstraintResult;       ///< Result from constraint.
 
 /**
  * Invoked when scrolling starts.
  *
  * @param[in] position The current scroll position.
  */
-static void OnScrollStart( const Vector3& position )
+static void OnScrollStart(const Vector2& position)
 {
   gOnScrollStartCalled = true;
 }
@@ -164,7 +132,7 @@ static void OnScrollStart( const Vector3& position )
  *
  * @param[in] position The current scroll position.
  */
-static void OnScrollUpdate( const Vector3& position )
+static void OnScrollUpdate(const Vector2& position)
 {
   gOnScrollUpdateCalled = true;
 }
@@ -174,7 +142,7 @@ static void OnScrollUpdate( const Vector3& position )
  *
  * @param[in] position The current scroll position.
  */
-static void OnScrollComplete( const Vector3& position )
+static void OnScrollComplete(const Vector2& position)
 {
   gOnScrollCompleteCalled = true;
 }
@@ -184,10 +152,23 @@ static void OnScrollComplete( const Vector3& position )
  *
  * @param[in] event The type of snap and the target position/scale/rotation.
  */
-static void OnSnapStart( const ScrollView::SnapEvent& event )
+static void OnSnapStart(const ScrollView::SnapEvent& event)
 {
   gOnSnapStartCalled = true;
-  gLastSnapType = event.type;
+  gLastSnapType      = event.type;
+}
+
+/**
+ * Invoked after a wheel-event is received
+ *
+ * @param[in] actor The owing actor
+ * @param[in] event The wheel event
+ * @return True if the event should be consumed
+ */
+static bool OnWheelEvent(Actor actor, const Dali::WheelEvent& wheelEvent)
+{
+  gOnWheelEventCalled = true;
+  return false;
 }
 
 /**
@@ -203,7 +184,7 @@ struct TestSumConstraint
    * @param[in] offset The offset to be added to current.
    */
   TestSumConstraint(const Vector3& offset)
-  :mOffset(offset)
+  : mOffset(offset)
   {
   }
 
@@ -212,14 +193,13 @@ struct TestSumConstraint
    * @param[in] inputs Contains the property to be added to current.
    * @return The new current Vector.
    */
-  void operator()( Vector3& current, const PropertyInputContainer& inputs )
+  void operator()(Vector3& current, const PropertyInputContainer& inputs)
   {
-    gConstraintResult = current + inputs[0]->GetVector3() + mOffset;
-    current = gConstraintResult;
+    gConstraintResult = current + Vector3(inputs[0]->GetVector2()) + mOffset;
+    current           = gConstraintResult;
   }
 
   Vector3 mOffset;
-
 };
 
 /**
@@ -227,13 +207,13 @@ struct TestSumConstraint
  * @param[in] scrollView The scrollView instance
  * @return The time taken for the overshoot to reach origin (zero)
  */
-static float TestOvershootSnapDuration(ToolkitTestApplication &application, ScrollView scrollView)
+static float TestOvershootSnapDuration(ToolkitTestApplicationapplication, ScrollView scrollView)
 {
   int timeToReachOrigin = -1;
-  for(int i = 0;i<MAX_FRAMES_TO_TEST_OVERSHOOT;i++)
+  for(int i = 0; i < MAX_FRAMES_TO_TEST_OVERSHOOT; i++)
   {
-    float overshootXValue = scrollView.GetProperty<float>(ScrollView::Property::OVERSHOOT_X);
-    float overshootYValue = scrollView.GetProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+    float overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+    float overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
     if(overshootXValue == 0.0f && overshootYValue == 0.0f)
     {
       break;
@@ -256,933 +236,2860 @@ static float TestOvershootSnapDuration(ToolkitTestApplication &application, Scro
  */
 float TestAlphaFunction(float progress)
 {
-  return std::min( progress * 2.0f, 1.0f );
+  return std::min(progress * 2.0f, 1.0f);
 }
 
-} // unnamed namespace
-
-
-int UtcDaliScrollViewNew(void)
+/**
+ * Generate a complete pan gesture
+ * Note: To initiate the gesture it will go from start, diagonally SE on the screen, then continue in the direction for frames touches
+ */
+static Vector2 PerformGestureSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, uint32_t& time, bool finish = true)
 {
-  ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewNew");
+  gOnScrollStartCalled    = false;
+  gOnScrollUpdateCalled   = false;
+  gOnScrollCompleteCalled = false;
+  gOnSnapStartCalled      = false;
 
-  ScrollView scrollView;
+  Vector2 pos(start);
 
-  DALI_TEST_CHECK( !scrollView );
+  // This is created to ensure a pan is started
+  Vector2 pos_start_jump(start + Vector2(11.0f, 11.0f));
+  TestStartPan(application, start, pos_start_jump, time);
+  pos = pos_start_jump;
 
-  scrollView = ScrollView::New();
+  Wait(application);
 
-  DALI_TEST_CHECK( scrollView );
+  for(int i = 0; i < frames; i++)
+  {
+    pos += direction; // Move in this direction
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
 
-  ScrollView scrollView2(scrollView);
+  if(finish)
+  {
+    pos += direction; // Move in this direction.
+    TestEndPan(application, pos, time);
+    time += Wait(application, RENDER_DELAY_SCROLL);
+  }
 
-  DALI_TEST_CHECK( scrollView2 == scrollView );
+  return pos;
+}
 
-  //Additional check to ensure object is created by checking if it's registered
-  ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
-  DALI_TEST_CHECK( registry );
+} // unnamed namespace
 
-  gObjectCreatedCallBackCalled = false;
-  registry.ObjectCreatedSignal().Connect( &TestCallback );
-  {
-    ScrollView scrollView = ScrollView::New();
-  }
-  DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
+int UtcDaliToolkitScrollViewConstructorP(void)
+{
+  ToolkitTestApplication application;
+
+  ScrollView scrollView;
+  DALI_TEST_CHECK(!scrollView);
   END_TEST;
 }
 
-int UtcDaliScrollViewDownCast(void)
+int UtcDaliToolkitScrollViewCopyConstructorP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewDownCast");
 
   ScrollView scrollView = ScrollView::New();
-  BaseHandle handle(scrollView);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_POSITION, Vector2(10.0f, 10.0f));
 
-  ScrollView newScrollView = ScrollView::DownCast( handle );
-  DALI_TEST_CHECK( scrollView );
-  DALI_TEST_CHECK( newScrollView == scrollView );
+  ScrollView copy(scrollView);
+  DALI_TEST_CHECK(copy);
+  DALI_TEST_CHECK(copy.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION) == scrollView.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION));
   END_TEST;
 }
 
-int UtcDaliScrollViewScrollToPosition(void)
+int UtcDaliScrollViewMoveConstructor(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewScrollToPosition");
 
-  // Create the ScrollView actor
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
+  DALI_TEST_EQUALS(1, scrollView.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_POSITION, Vector2(10.0f, 10.0f));
+  DALI_TEST_EQUALS(scrollView.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION), Vector2(10.0f, 10.0f), TEST_LOCATION);
 
-  const Vector3 target = Vector3(100.0f, 200.0f, 0.0f);
-  const Vector3 target2 = Vector3(300.0f, 100.0f, 0.0f);
-
-  scrollView.ScrollTo( target, 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION );
-  scrollView.ScrollTo( target2 );
-  Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION );
+  ScrollView moved = std::move(scrollView);
+  DALI_TEST_CHECK(moved);
+  DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  DALI_TEST_EQUALS(moved.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION), Vector2(10.0f, 10.0f), TEST_LOCATION);
+  DALI_TEST_CHECK(!scrollView);
 
-  Wait(application);
   END_TEST;
 }
 
-int UtcDaliScrollViewScrollToPage(void)
+int UtcDaliToolkitScrollViewAssignmentOperatorP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewScrollToPage");
 
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  RulerPtr rulerX = new FixedRuler( 100.0f );
-  rulerX->SetDomain( RulerDomain(0.0f, 800.0f, true) );
-  RulerPtr rulerY = new FixedRuler( 100.0f );
-  rulerY->SetDomain( RulerDomain(0.0f, 400.0f, true) );
-
-  scrollView.SetRulerX( rulerX );
-  scrollView.SetRulerY( rulerY );
-
-  scrollView.ScrollTo( 1, 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(100.0f, 0.0f, 0.0f), TEST_LOCATION );
-
-  scrollView.ScrollTo( 5, 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(500.0f, 0.0f, 0.0f), TEST_LOCATION );
+  scrollView.SetProperty(ScrollView::Property::SCROLL_POSITION, Vector2(10.0f, 10.0f));
 
-  scrollView.ScrollTo( 10, 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(200.0f, 100.0f, 0.0f), TEST_LOCATION );
+  ScrollView copy;
+  copy = scrollView;
+  DALI_TEST_CHECK(copy);
+  DALI_TEST_CHECK(copy.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION) == scrollView.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION));
+  END_TEST;
+}
 
-  scrollView.ScrollTo( 15, 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(700.0f, 100.0f, 0.0f), TEST_LOCATION );
-  DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 15, TEST_LOCATION );
+int UtcDaliScrollViewMoveAssignment(void)
+{
+  ToolkitTestApplication application;
 
-  scrollView.ScrollTo( 3 );
-  Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(300.0f, 0.0f, 0.0f), TEST_LOCATION );
-  DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 3, TEST_LOCATION );
+  ScrollView scrollView = ScrollView::New();
+  DALI_TEST_EQUALS(1, scrollView.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_POSITION, Vector2(10.0f, 10.0f));
+  DALI_TEST_EQUALS(scrollView.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION), Vector2(10.0f, 10.0f), TEST_LOCATION);
 
-  scrollView.ScrollTo( 9 );
-  Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(100.0f, 100.0f, 0.0f), TEST_LOCATION );
-  DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 9, TEST_LOCATION );
+  ScrollView moved;
+  moved = std::move(scrollView);
+  DALI_TEST_CHECK(moved);
+  DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+  DALI_TEST_EQUALS(moved.GetProperty<Vector2>(ScrollView::Property::SCROLL_POSITION), Vector2(10.0f, 10.0f), TEST_LOCATION);
+  DALI_TEST_CHECK(!scrollView);
 
-  // Apply DefaultRulers instead and see what happens.
-  rulerX = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, 800.0f, true) );
-  rulerY = new DefaultRuler();
-  rulerY->SetDomain( RulerDomain(0.0f, 400.0f, true) );
+  END_TEST;
+}
 
-  scrollView.SetRulerX( rulerX );
-  scrollView.SetRulerY( rulerY );
+int UtcDaliScrollViewDestructorP(void)
+{
+  ToolkitTestApplication application;
 
-  // This time should always scroll to origin (0.0f, 0.0f)
-  scrollView.ScrollTo( 1, 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(0.0f, 0.0f, 0.0f), TEST_LOCATION );
-  DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 0, TEST_LOCATION );
+  ScrollView* scrollView = new ScrollView();
+  delete scrollView;
 
-  Wait(application);
+  DALI_TEST_CHECK(true);
   END_TEST;
 }
 
-int UtcDaliScrollViewScrollToActor(void)
+int UtcDaliToolkitScrollViewNewP1(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewScrollToActor");
+  tet_infoline(" UtcDaliToolkitScrollViewNewP1");
 
-  ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
+  ScrollView scrollView;
 
-  Actor actorA = Actor::New();
-  const Vector3 positionA = Vector3(100.0f, 400.0f, 0.0f);
-  actorA.SetPosition(positionA);
-  scrollView.Add(actorA);
+  DALI_TEST_CHECK(!scrollView);
 
-  Actor actorB = Actor::New();
-  const Vector3 positionB = Vector3(500.0f, 200.0f, 0.0f);
-  actorB.SetPosition(positionB);
-  scrollView.Add(actorB);
+  scrollView = ScrollView::New();
 
-  Wait(application);
+  DALI_TEST_CHECK(scrollView);
 
-  scrollView.ScrollTo(actorA, 0.0f);
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionA, TEST_LOCATION );
+  ScrollView scrollView2(scrollView);
 
-  Wait(application);
-  scrollView.ScrollTo(actorB, 0.0f);
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionB, TEST_LOCATION );
+  DALI_TEST_CHECK(scrollView2 == scrollView);
 
-  scrollView.ScrollTo(actorA);
-  Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionA, TEST_LOCATION );
+  //Additional check to ensure object is created by checking if it's registered
+  ObjectRegistry registry = application.GetCore().GetObjectRegistry();
+  DALI_TEST_CHECK(registry);
 
-  scrollView.ScrollTo(actorB);
-  Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionB, TEST_LOCATION );
+  gObjectCreatedCallBackCalled = false;
+  registry.ObjectCreatedSignal().Connect(&TestCallback);
+  {
+    ScrollView scrollView = ScrollView::New();
+  }
+  DALI_TEST_CHECK(gObjectCreatedCallBackCalled);
   END_TEST;
 }
 
-int UtcDaliScrollViewScrollToSnapPoint(void)
+int UtcDaliToolkitScrollViewNewP2(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewScrollToSnapPoint");
-
-  ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  RulerPtr rulerX = new FixedRuler( 100.0f );
-  rulerX->SetDomain( RulerDomain(0.0f, 800.0f, true) );
-  RulerPtr rulerY = new FixedRuler( 100.0f );
-  rulerY->SetDomain( RulerDomain(0.0f, 400.0f, true) );
+  tet_infoline(" UtcDaliToolkitScrollViewNewP2 - create thru type registry");
 
-  scrollView.SetRulerX( rulerX );
-  scrollView.SetRulerY( rulerY );
+  ScrollView scrollView;
+  DALI_TEST_CHECK(!scrollView);
 
-  scrollView.ScrollTo( Vector3(120.0f, 190.0f, 0.0f), 0.0f );
-  Wait(application);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(120.0f, 190.0f, 0.0f), TEST_LOCATION );
+  TypeRegistry typeRegistry   = TypeRegistry::Get();
+  TypeInfo     scrollViewType = typeRegistry.GetTypeInfo("ScrollView");
+  BaseHandle   handle         = scrollViewType.CreateInstance();
+  DALI_TEST_CHECK(handle);
 
-  scrollView.ScrollToSnapPoint();
+  scrollView = ScrollView::DownCast(handle);
+  DALI_TEST_CHECK(scrollView);
 
-  Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(100.0f, 200.0f, 0.0f), TEST_LOCATION );
   END_TEST;
 }
 
-int UtcDaliScrollViewSetScrollUpdateDistance(void)
+int UtcDaliToolkitScrollViewDownCastP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewRefreshInterval");
+  tet_infoline(" UtcDaliToolkitScrollViewDownCastP");
 
   ScrollView scrollView = ScrollView::New();
+  BaseHandle handle(scrollView);
 
-  scrollView.SetScrollUpdateDistance(0);
-  DALI_TEST_EQUALS( scrollView.GetScrollUpdateDistance(), 0, TEST_LOCATION);
-  scrollView.SetScrollUpdateDistance(10);
-  DALI_TEST_EQUALS( scrollView.GetScrollUpdateDistance(), 10, TEST_LOCATION);
-  scrollView.SetScrollUpdateDistance(1000);
-  DALI_TEST_EQUALS( scrollView.GetScrollUpdateDistance(), 1000, TEST_LOCATION);
+  ScrollView newScrollView = ScrollView::DownCast(handle);
+  DALI_TEST_CHECK(scrollView);
+  DALI_TEST_CHECK(newScrollView == scrollView);
   END_TEST;
 }
 
-int UtcDaliScrollViewWrapMode(void)
+int UtcDaliToolkitScrollViewScrollToPositionP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewWrapMode");
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToPositionP");
 
+  // Create the ScrollView actor
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
+  application.GetScene().Add(scrollView);
 
-  // Position rulers. 4x4 grid.
-  RulerPtr rulerX = new FixedRuler(50.0f);
-  RulerPtr rulerY = new FixedRuler(50.0f);
-  rulerX->SetDomain( RulerDomain(0.0f, 200.0f, false) );
-  rulerY->SetDomain( RulerDomain(0.0f, 200.0f, false) );
-  scrollView.SetRulerX(rulerX);
-  scrollView.SetRulerY(rulerY);
+  const Vector2 target  = Vector2(100.0f, 200.0f);
+  const Vector2 target2 = Vector2(300.0f, 100.0f);
 
-  scrollView.SetWrapMode(false);
-  scrollView.ScrollTo(Vector3(225.0f, 125.0f, 0.0f), 0.0f); // 5th (1st) page across, and 3rd (3rd) page down. (wrapped)
+  scrollView.ScrollTo(target, 0.0f);
   Wait(application);
-  DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 17, TEST_LOCATION );
-  scrollView.SetWrapMode(true);
-  DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 13, TEST_LOCATION );
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
+  scrollView.ScrollTo(target2);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
+
   END_TEST;
 }
 
-int UtcDaliScrollViewActorAutoSnap(void)
+int UtcDaliToolkitScrollViewScrollToPositionWithDirectionBiasP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewActorAutoSnap");
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToPositionWithDirectionBiasP");
 
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 200.0f, true));
+  RulerPtr rulerY = new FixedRuler(100.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 200.0f, true));
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
-  rulerY->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
   scrollView.SetRulerX(rulerX);
   scrollView.SetRulerY(rulerY);
 
-  const Vector3 aPosition = Vector3(200.0f, 50.0f, 0.0f);
-  Actor a = Actor::New();
-  scrollView.Add(a);
-  a.SetPosition(aPosition);
+  scrollView.SetWrapMode(true);
 
-  const Vector3 bPosition = Vector3(600.0f, 600.0f, 0.0f);
-  Actor b = Actor::New();
-  scrollView.Add(b);
-  b.SetPosition(bPosition);
+  Property::Value wrapMode = scrollView.GetProperty(Toolkit::ScrollView::Property::WRAP_ENABLED);
+  DALI_TEST_EQUALS(wrapMode.Get<bool>(), true, TEST_LOCATION);
 
-  // Goto a random position, and execute snap (should not move)
-  Vector3 targetScroll = Vector3(500.0f, 500.0f, 0.0f);
-  scrollView.ScrollTo(targetScroll, 0.0f);
-  Wait(application);
-  scrollView.ScrollToSnapPoint();
+  const Vector2 target  = Vector2(50.0f, 50.0f);
+  const Vector2 target2 = Vector2(150.0f, 150.0f);
+
+  scrollView.ScrollTo(target, 0.0f);
   Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), targetScroll, TEST_LOCATION );
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
 
-  // Enable ActorAutoSnap, and now try snapping.
-  scrollView.SetActorAutoSnap(true);
-  scrollView.ScrollToSnapPoint();
+  scrollView.ScrollTo(target2, 0.25f, Dali::Toolkit::DIRECTION_BIAS_LEFT, Dali::Toolkit::DIRECTION_BIAS_LEFT);
   Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), bPosition, TEST_LOCATION );
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-  scrollView.ScrollTo(Vector3(0.0f, 0.0f, 0.0f), 0.0f);
-  Wait(application);
-  scrollView.ScrollToSnapPoint();
+  scrollView.ScrollTo(target, 0.0f);
   Wait(application, RENDER_DELAY_SCROLL);
-  DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), aPosition, TEST_LOCATION );
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
+
+  scrollView.ScrollTo(target2, 0.25f, Dali::Toolkit::DIRECTION_BIAS_RIGHT, Dali::Toolkit::DIRECTION_BIAS_RIGHT);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
+
   END_TEST;
 }
 
-int UtcDaliScrollViewSignalsStartComplete(void)
+int UtcDaliToolkitScrollViewScrollToPositionWithAlphaFunctionP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewSignalsStartComplete");
-
-  gOnScrollStartCalled = false;
-  gOnScrollCompleteCalled = false;
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToPositionWithAlphaFunctionP");
 
+  // Create the ScrollView actor
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
+  application.GetScene().Add(scrollView);
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
-  rulerY->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
-  scrollView.SetRulerX(rulerX);
-  scrollView.SetRulerY(rulerY);
-  scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
-  scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
-  scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
-  scrollView.ScrollTo( Vector3(100.0f, 100.0f, 0.0f) );
-  Wait(application, RENDER_DELAY_SCROLL);
+  const Vector2 target  = Vector2(100.0f, 200.0f);
+  const Vector2 target2 = Vector2(300.0f, 100.0f);
+
+  scrollView.ScrollTo(target, 0.5f, TestAlphaFunction);
+  Wait(application, 250);
+  // Check that the scroll animation should finish within just half of the specified duration with the above alpha function
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
+
+  scrollView.ScrollTo(target2, 0.5f, AlphaFunction::LINEAR);
+  Wait(application, 250);
+  // Check that the scroll animation has not finished within half of the specified duration with the linear alpha function
+  DALI_TEST_CHECK(scrollView.GetCurrentScrollPosition() != target2);
+
+  // Wait till the end of the specified duration
+  Wait(application, 250);
+  // Check that the scroll animation has finished
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-  DALI_TEST_CHECK(gOnScrollStartCalled);
-  DALI_TEST_CHECK(gOnScrollCompleteCalled);
   END_TEST;
 }
 
-int UtcDaliScrollViewSignalsUpdate(void)
+int UtcDaliToolkitScrollViewScrollToPositionWithAlphaFunctionAndDirectionBiasP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewSignalsUpdate");
-
-  gOnScrollStartCalled = false;
-  gOnScrollUpdateCalled = false;
-  gOnScrollCompleteCalled = false;
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToPositionWithAlphaFunctionAndDirectionBiasP");
 
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 200.0f, true));
+  RulerPtr rulerY = new FixedRuler(100.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 200.0f, true));
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
-  rulerY->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
   scrollView.SetRulerX(rulerX);
   scrollView.SetRulerY(rulerY);
-  scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
-  scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
-  scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
-
-  ImageActor image = CreateSolidColorActor( Color::RED );
-  image.SetSize(stageSize);
-  image.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  image.SetAnchorPoint(AnchorPoint::TOP_LEFT);
-  scrollView.Add(image);
-
-  Wait(application);
 
-  // Do a pan starting from 100,100 and moving down diagonally.
-  Vector2 pos(100.0f, 100.0f);
-  SendPan(application, Gesture::Possible, pos);
-  SendPan(application, Gesture::Started, pos);
-  pos.x += 5.0f;
-  pos.y += 5.0f;
-  Wait(application, 100);
+  scrollView.SetWrapMode(true);
 
-  for(int i = 0;i<20;i++)
-  {
-    SendPan(application, Gesture::Continuing, pos);
-    pos.x += 5.0f;
-    pos.y += 5.0f;
-    Wait(application);
-  }
+  const Vector2 target  = Vector2(50.0f, 50.0f);
+  const Vector2 target2 = Vector2(150.0f, 150.0f);
 
-  SendPan(application, Gesture::Finished, pos);
+  scrollView.ScrollTo(target, 0.0f);
   Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
 
-  DALI_TEST_CHECK(gOnScrollStartCalled);
-  DALI_TEST_CHECK(gOnScrollUpdateCalled);
-  DALI_TEST_CHECK(gOnScrollCompleteCalled);
-  END_TEST;
-}
+  scrollView.ScrollTo(target2, 0.25f, AlphaFunction::LINEAR, Dali::Toolkit::DIRECTION_BIAS_LEFT, Dali::Toolkit::DIRECTION_BIAS_LEFT);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-static Vector2 PerformGestureDiagonalSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, bool finish = true)
-{
-  gOnScrollStartCalled = false;
-  gOnScrollUpdateCalled = false;
-  gOnScrollCompleteCalled = false;
-  gOnSnapStartCalled = false;
+  scrollView.ScrollTo(target, 0.0f);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
 
-  // Now do a pan starting from (start) and heading (direction)
-  Vector2 pos(start);
-  SendPan(application, Gesture::Possible, pos);
-  SendPan(application, Gesture::Started, pos);
-  Wait(application);
+  scrollView.ScrollTo(target2, 0.25f, AlphaFunction::LINEAR, Dali::Toolkit::DIRECTION_BIAS_RIGHT, Dali::Toolkit::DIRECTION_BIAS_RIGHT);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-  for(int i = 0;i<frames;i++)
-  {
-    pos += direction; // Move in this direction
-    SendPan(application, Gesture::Continuing, pos);
-    Wait(application);
-  }
+  scrollView.ScrollTo(target, 0.0f);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
 
-  if(finish)
-  {
-    pos += direction; // Move in this direction.
-    SendPan(application, Gesture::Finished, pos);
-    Wait(application, RENDER_DELAY_SCROLL);
-  }
+  scrollView.ScrollTo(target2, 0.25f, TestAlphaFunction, Dali::Toolkit::DIRECTION_BIAS_RIGHT, Dali::Toolkit::DIRECTION_BIAS_RIGHT);
+  Wait(application, 125);
+  // Check that the scroll animation should finish within just half of the specified duration with the above alpha function
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-  return pos;
+  END_TEST;
 }
 
-int UtcDaliScrollViewScrollSensitive(void)
+int UtcDaliToolkitScrollViewScrollToPageP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewScrollSensitive");
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToPageP");
 
-  // Set up a scrollView...
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 800.0f, true));
+  RulerPtr rulerY = new FixedRuler(100.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 400.0f, true));
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
-  rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
   scrollView.SetRulerX(rulerX);
   scrollView.SetRulerY(rulerY);
-  scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
-  scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
-  scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
-  scrollView.SnapStartedSignal().Connect( &OnSnapStart );
 
-  scrollView.ScrollTo(CLAMP_START_SCROLL_POSITION, 0.0f); // move in a little.
+  scrollView.ScrollTo(1, 0.0f);
   Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(100.0f, 0.0f), TEST_LOCATION);
 
-  // First try insensitive swipe.
-  scrollView.SetScrollSensitive(false);
-  PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, CLAMP_TOUCH_MOVEMENT, CLAMP_GESTURE_FRAMES, true);
+  scrollView.ScrollTo(5, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(500.0f, 0.0f), TEST_LOCATION);
 
-  DALI_TEST_CHECK( !gOnScrollStartCalled );
-  DALI_TEST_CHECK( !gOnScrollCompleteCalled );
-  DALI_TEST_CHECK( !gOnSnapStartCalled );
+  scrollView.ScrollTo(10, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(200.0f, 100.0f), TEST_LOCATION);
 
-  // Second try sensitive swipe.
-  scrollView.SetScrollSensitive(true);
-  PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, CLAMP_TOUCH_MOVEMENT, CLAMP_GESTURE_FRAMES, true);
+  scrollView.ScrollTo(15, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(700.0f, 100.0f), TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 15, TEST_LOCATION);
+
+  scrollView.ScrollTo(3);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(300.0f, 0.0f), TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 3, TEST_LOCATION);
+
+  scrollView.ScrollTo(9);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(100.0f, 100.0f), TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 9, TEST_LOCATION);
+
+  // Apply DefaultRulers instead and see what happens.
+  rulerX = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, 800.0f, true));
+  rulerY = new DefaultRuler();
+  rulerY->SetDomain(RulerDomain(0.0f, 400.0f, true));
+
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  // This time should always scroll to origin (0.0f, 0.0f)
+  scrollView.ScrollTo(1, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(0.0f, 0.0f), TEST_LOCATION);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 0, TEST_LOCATION);
 
-  DALI_TEST_CHECK( gOnScrollStartCalled );
-  DALI_TEST_CHECK( gOnScrollCompleteCalled );
-  DALI_TEST_CHECK( gOnSnapStartCalled );
   END_TEST;
 }
 
-int UtcDaliScrollViewAxisAutoLock(void)
+int UtcDaliToolkitScrollModeP1(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewAxisAutoLock");
+  tet_infoline(" UtcDaliToolkitScrollView ScrollMode property");
 
-  // Set up a scrollView...
+  // Set up a scrollView.
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 viewPageSize(720.0f, 1280.0f);
+  scrollView.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
+  scrollView.SetProperty(Actor::Property::SIZE, viewPageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+  scrollView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
 
   // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
-  rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
-  scrollView.SetRulerX(rulerX);
-  scrollView.SetRulerY(rulerY);
-  scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
-  scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
-  scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
+  Property::Map rulerMap;
+  rulerMap.Add(ScrollMode::X_AXIS_SCROLL_ENABLED, true);
+  rulerMap.Add(ScrollMode::X_AXIS_SNAP_TO_INTERVAL, viewPageSize.width);
+  rulerMap.Add(ScrollMode::X_AXIS_SCROLL_BOUNDARY, viewPageSize.width * 3);
+  rulerMap.Add(ScrollMode::Y_AXIS_SCROLL_ENABLED, false);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_MODE, rulerMap);
 
-  // Normal
-  scrollView.ScrollTo(Vector3(100.0f, 100.0f, 0.0f), 0.0f); // move in a little.
-  Wait(application);
-  Vector3 startPosition = scrollView.GetCurrentScrollPosition();
-  PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(5.0f, 1.0f), 50, true); // mostly horizontal
-  const Vector3 positionAfterNormal = scrollView.GetCurrentScrollPosition();
+  scrollView.SetWrapMode(false);
+  scrollView.SetScrollSensitive(true);
 
-  // Autolock
-  scrollView.SetAxisAutoLock(true);
-  DALI_TEST_CHECK(scrollView.GetAxisAutoLock());
+  application.GetScene().Add(scrollView);
 
-  scrollView.ScrollTo(Vector3(100.0f, 100.0f, 0.0f), 0.0f); // move in a little.
-  Wait(application);
-  PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(5.0f, 1.0f), 50, true); // mostly horizontal
-  const Vector3 positionAfterAutoLock = scrollView.GetCurrentScrollPosition();
+  // Set up a gesture to perform.
+  Vector2  startPos(50.0f, 0.0f);
+  Vector2  direction(-5.0f, 0.0f);
+  int      frames = 200;
+  uint32_t time   = 0;
 
-  // compare how much the Y position has deviated for normal and autolock.
-  const float devianceNormal = fabsf(startPosition.y - positionAfterNormal.y);
-  const float devianceAutoLock = fabsf(startPosition.y - positionAfterAutoLock.y);
+  // Force starting position.
+  scrollView.ScrollTo(startPos, 0.0f);
+  time += Wait(application);
 
-  // in auto-lock it should be a mostly horizontal pan (thus deviance should be much lower)
-  DALI_TEST_CHECK(devianceAutoLock < devianceNormal);
+  // Deliberately skip the "Finished" part of the gesture, so we can read the coordinates before the snap begins.
+  Vector2 currentPos(PerformGestureSwipe(application, startPos, direction, frames - 1, time, false));
 
-  scrollView.SetAxisAutoLock(false);
-  DALI_TEST_CHECK(!scrollView.GetAxisAutoLock());
-  END_TEST;
-}
+  // Confirm the final X coord has not moved more than one page from the start X position.
+  DALI_TEST_GREATER((startPos.x + viewPageSize.width), scrollView.GetCurrentScrollPosition().x, TEST_LOCATION);
 
-int UtcDaliScrollViewAxisAutoLockGradient(void)
-{
-  ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewAxisAutoLockGradient");
+  // Finish the gesture and wait for the snap.
+  currentPos += direction;
+  TestEndPan(application, currentPos, time);
+  // We add RENDER_FRAME_INTERVAL on to wait for an extra frame (for the last "finished" gesture to complete first.
+  time += Wait(application, RENDER_DELAY_SCROLL + RENDER_FRAME_INTERVAL);
+
+  // Confirm the final X coord has snapped to exactly one page ahead of the start page.
+  DALI_TEST_EQUALS(viewPageSize.width, scrollView.GetCurrentScrollPosition().x, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+
+  // Change scroll mode during pan, should not crash
+  PerformGestureSwipe(application, startPos, direction, frames - 1, time, false);
+  try
+  {
+    scrollView.SetScrollSensitive(false);
+    DALI_TEST_CHECK(true);
+  }
+  catch(...)
+  {
+    DALI_TEST_CHECK(false);
+  }
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollModeP2(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollView ScrollMode property");
+
+  // Set up a scrollView.
+  ScrollView scrollView = ScrollView::New();
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 viewPageSize(720.0f, 1280.0f);
+  scrollView.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
+  scrollView.SetProperty(Actor::Property::SIZE, viewPageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+  scrollView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
+
+  // Position rulers.
+  Property::Map rulerMap;
+  rulerMap.Add(ScrollMode::X_AXIS_SCROLL_ENABLED, false);
+  rulerMap.Add(ScrollMode::Y_AXIS_SCROLL_ENABLED, true);
+  rulerMap.Add(ScrollMode::Y_AXIS_SNAP_TO_INTERVAL, viewPageSize.height);
+  rulerMap.Add(ScrollMode::Y_AXIS_SCROLL_BOUNDARY, viewPageSize.height * 3);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_MODE, rulerMap);
+
+  scrollView.SetWrapMode(false);
+  scrollView.SetScrollSensitive(true);
+
+  application.GetScene().Add(scrollView);
+
+  // Set up a gesture to perform.
+  Vector2  startPos(0.0f, 50.0f);
+  Vector2  direction(0.0f, -6.0f);
+  int      frames = 200;
+  uint32_t time   = 0;
+
+  // Force starting position.
+  scrollView.ScrollTo(startPos, 0.0f);
+  time += Wait(application);
+
+  // Deliberately skip the "Finished" part of the gesture, so we can read the coordinates before the snap begins.
+  Vector2 currentPos(PerformGestureSwipe(application, startPos, direction, frames - 1, time, false));
+
+  // Confirm the final X coord has not moved more than one page from the start X position.
+  DALI_TEST_GREATER((startPos.y + viewPageSize.height), scrollView.GetCurrentScrollPosition().y, TEST_LOCATION);
+
+  // Finish the gesture and wait for the snap.
+  currentPos += direction;
+  time += Wait(application);
+  TestEndPan(application, currentPos, time);
+  // We add RENDER_FRAME_INTERVAL on to wait for an extra frame (for the last "finished" gesture to complete first.
+  Wait(application, RENDER_DELAY_SCROLL + RENDER_FRAME_INTERVAL);
+
+  // Confirm the final Y coord has snapped to exactly one page ahead of the start page.
+  DALI_TEST_EQUALS(viewPageSize.height, scrollView.GetCurrentScrollPosition().y, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollModeP3(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollView ScrollMode property");
+
+  // Set up a scrollView.
+  ScrollView scrollView = ScrollView::New();
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 viewPageSize(720.0f, 1280.0f);
+  scrollView.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
+  scrollView.SetProperty(Actor::Property::SIZE, viewPageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+  scrollView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
+
+  // Position rulers.
+  Property::Map rulerMap;
+  rulerMap.Add(ScrollMode::X_AXIS_SCROLL_ENABLED, false);
+  rulerMap.Add(ScrollMode::Y_AXIS_SCROLL_ENABLED, true);
+  rulerMap.Add(ScrollMode::Y_AXIS_SNAP_TO_INTERVAL, viewPageSize.height);
+  rulerMap.Add(ScrollMode::Y_AXIS_SCROLL_BOUNDARY, viewPageSize.height * 3);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_MODE, rulerMap);
+
+  scrollView.SetWrapMode(false);
+  scrollView.SetScrollSensitive(true);
+
+  application.GetScene().Add(scrollView);
+
+  // Set up a gesture to perform.
+  Vector2  startPos(0.0f, 50.0f);
+  Vector2  direction(0.0f, -6.0f);
+  int      frames = 200;
+  uint32_t time   = 0;
+
+  // Force starting position.
+  scrollView.ScrollTo(startPos, 0.0f);
+  time += Wait(application);
+
+  // Deliberately skip the "Finished" part of the gesture, so we can read the coordinates before the snap begins.
+  Vector2 currentPos(PerformGestureSwipe(application, startPos, direction, frames - 1, time, false));
+
+  // Confirm the final X coord has not moved more than one page from the start X position.
+  DALI_TEST_GREATER((startPos.y + viewPageSize.height), scrollView.GetCurrentScrollPosition().y, TEST_LOCATION);
+
+  // Finish the gesture and wait for the snap.
+  currentPos += direction;
+  TestEndPan(application, currentPos, time);
+  // We add RENDER_FRAME_INTERVAL on to wait for an extra frame (for the last "finished" gesture to complete first.
+  Wait(application, RENDER_DELAY_SCROLL + RENDER_FRAME_INTERVAL);
+
+  // Confirm the final Y coord has snapped to exactly one page ahead of the start page.
+  DALI_TEST_EQUALS(viewPageSize.height, scrollView.GetCurrentScrollPosition().y, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollModeP4(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollView ScrollMode property, DefaultRulers");
+
+  // Set up a scrollView.
+  ScrollView scrollView = ScrollView::New();
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 viewPageSize(720.0f, 1280.0f);
+  scrollView.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
+  scrollView.SetProperty(Actor::Property::SIZE, viewPageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
+
+  // Position rulers - expect Default rulers to be used which don't snap
+  Property::Map rulerMap;
+  rulerMap.Add(ScrollMode::X_AXIS_SCROLL_ENABLED, true);
+  rulerMap.Add(ScrollMode::Y_AXIS_SCROLL_ENABLED, true);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_MODE, rulerMap);
+
+  scrollView.SetWrapMode(false);
+  scrollView.SetScrollSensitive(true);
+
+  application.GetScene().Add(scrollView);
+
+  Vector2 START_POSITION = Vector2(10.0f, 10.0f);
+
+  uint32_t time = 0;
+  scrollView.ScrollTo(START_POSITION, 0.0f);
+  time += Wait(application);
+
+  // Try a vertical swipe.
+  // PerformGestureSwipe not used as a different initial direction was required
+  Vector2 pos(START_POSITION + Vector2(0.0f, 15.0f));
+  Vector2 dir(0.0f, 1.0f);
+
+  TestStartPan(application, START_POSITION, pos, time);
+
+  Wait(application);
+
+  for(int i = 0; i < 45; i++)
+  {
+    pos += dir;
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
+
+  pos += dir;
+
+  TestEndPan(application, pos, time);
+  Wait(application, RENDER_DELAY_SCROLL);
+
+  // Take into account resampling done when prediction is off.
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition() - Vector2(0.0f, 0.5f), Vector2(10.0f, -50.0f), 0.25f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewScrollToPageWithDirectionBiasP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToPageWithDirectionBiasP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 200.0f, true));
+  RulerPtr rulerY = new FixedRuler(100.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 200.0f, true));
+
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.SetWrapMode(true);
+
+  scrollView.ScrollTo(0, 0.25, Dali::Toolkit::DIRECTION_BIAS_LEFT);
+
+  Wait(application, RENDER_FRAME_INTERVAL); // Wait for one frame
+  // Check that the scroll position remains the same
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(0.0f, 0.0f), TEST_LOCATION);
+
+  Wait(application, RENDER_DELAY_SCROLL); // Wait for one second
+  // Check that it stays at the same page (i.e. the same scroll position)
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(0.0f, 0.0f), TEST_LOCATION);
+
+  scrollView.ScrollTo(0, 0.25, Dali::Toolkit::DIRECTION_BIAS_RIGHT);
+
+  Wait(application, RENDER_FRAME_INTERVAL); // Wait for one frame
+  // Check that it scrolls towards the right
+  DALI_TEST_CHECK(scrollView.GetCurrentScrollPosition().x > 0.0f);
+
+  Wait(application, RENDER_DELAY_SCROLL); // Wait for one second
+  // Check that it scrolls back to the same page (i.e. the same scroll position)
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 0, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(0.0f, 0.0f), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewScrollToActorP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToActorP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+
+  Actor         actorA    = Actor::New();
+  const Vector3 positionA = Vector3(100.0f, 400.0f, 0.0f);
+  actorA.SetProperty(Actor::Property::POSITION, positionA);
+  scrollView.Add(actorA);
+
+  Actor         actorB    = Actor::New();
+  const Vector3 positionB = Vector3(500.0f, 200.0f, 0.0f);
+  actorB.SetProperty(Actor::Property::POSITION, positionB);
+  scrollView.Add(actorB);
+
+  Wait(application);
+
+  scrollView.ScrollTo(actorA, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), positionA.GetVectorXY(), TEST_LOCATION);
+
+  Wait(application);
+  scrollView.ScrollTo(actorB, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), positionB.GetVectorXY(), TEST_LOCATION);
+
+  scrollView.ScrollTo(actorA);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), positionA.GetVectorXY(), TEST_LOCATION);
+
+  scrollView.ScrollTo(actorB);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), positionB.GetVectorXY(), TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewScrollToSnapPointP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewScrollToSnapPointP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 800.0f, true));
+  RulerPtr rulerY = new FixedRuler(100.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 400.0f, true));
+
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.ScrollTo(Vector2(120.0f, 190.0f), 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(120.0f, 190.0f), TEST_LOCATION);
+
+  scrollView.ScrollToSnapPoint();
+
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(100.0f, 200.0f), TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetScrollUpdateDistanceP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetScrollUpdateDistanceP");
+
+  ScrollView scrollView = ScrollView::New();
+
+  scrollView.SetScrollUpdateDistance(0);
+  DALI_TEST_EQUALS(scrollView.GetScrollUpdateDistance(), 0, TEST_LOCATION);
+  scrollView.SetScrollUpdateDistance(10);
+  DALI_TEST_EQUALS(scrollView.GetScrollUpdateDistance(), 10, TEST_LOCATION);
+  scrollView.SetScrollUpdateDistance(1000);
+  DALI_TEST_EQUALS(scrollView.GetScrollUpdateDistance(), 1000, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetWrapModeP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetWrapModeP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+
+  Actor actor = Actor::New();
+  scrollView.Add(actor);
+
+  // Position rulers. 4x4 grid.
+  RulerPtr rulerX = new FixedRuler(50.0f);
+  RulerPtr rulerY = new FixedRuler(50.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 200.0f, false));
+  rulerY->SetDomain(RulerDomain(0.0f, 200.0f, false));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.SetWrapMode(false);
+  scrollView.ScrollTo(Vector2(225.0f, 125.0f), 0.0f); // 5th (1st) page across, and 3rd (3rd) page down. (wrapped)
+  Wait(application);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 17, TEST_LOCATION);
+
+  scrollView.SetWrapMode(true);
+  scrollView.ScrollTo(Vector2(230.0f, 130.0f), 0.0f); // 5th (1st) page across, and 3rd (3rd) page down. (wrapped)
+  Wait(application);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 13, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewActorAutoSnap(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewActorAutoSnap");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  rulerY->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  const Vector3 aPosition = Vector3(200.0f, 50.0f, 0.0f);
+  Actor         a         = Actor::New();
+  scrollView.Add(a);
+  a.SetProperty(Actor::Property::POSITION, aPosition);
+
+  const Vector3 bPosition = Vector3(600.0f, 600.0f, 0.0f);
+  Actor         b         = Actor::New();
+  scrollView.Add(b);
+  b.SetProperty(Actor::Property::POSITION, bPosition);
+
+  // Goto a random position, and execute snap (should not move)
+  Vector2 targetScroll = Vector2(500.0f, 500.0f);
+  scrollView.ScrollTo(targetScroll, 0.0f);
+  Wait(application);
+  scrollView.ScrollToSnapPoint();
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), targetScroll, TEST_LOCATION);
+
+  // Enable ActorAutoSnap, and now try snapping.
+  scrollView.SetActorAutoSnap(true);
+  scrollView.ScrollToSnapPoint();
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), bPosition.GetVectorXY(), TEST_LOCATION);
+
+  scrollView.ScrollTo(Vector2(0.0f, 0.0f), 0.0f);
+  Wait(application);
+  scrollView.ScrollToSnapPoint();
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), aPosition.GetVectorXY(), TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSignalsStartComplete(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSignalsStartComplete");
+
+  gOnScrollStartCalled    = false;
+  gOnScrollCompleteCalled = false;
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  rulerY->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  scrollView.ScrollStartedSignal().Connect(&OnScrollStart);
+  scrollView.ScrollUpdatedSignal().Connect(&OnScrollUpdate);
+  scrollView.ScrollCompletedSignal().Connect(&OnScrollComplete);
+  scrollView.ScrollTo(Vector2(100.0f, 100.0f));
+  Wait(application, RENDER_DELAY_SCROLL);
+
+  DALI_TEST_CHECK(gOnScrollStartCalled);
+  DALI_TEST_CHECK(gOnScrollCompleteCalled);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSignalsUpdate01(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSignalsUpdate");
+
+  gOnScrollStartCalled    = false;
+  gOnScrollUpdateCalled   = false;
+  gOnScrollCompleteCalled = false;
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  rulerY->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  scrollView.ScrollStartedSignal().Connect(&OnScrollStart);
+  scrollView.ScrollUpdatedSignal().Connect(&OnScrollUpdate);
+  scrollView.ScrollCompletedSignal().Connect(&OnScrollComplete);
+
+  Actor image = Actor::New();
+  image.SetProperty(Actor::Property::SIZE, stageSize);
+  image.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  image.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  scrollView.Add(image);
+
+  Wait(application);
+
+  // Do a pan starting from 100,100 and moving down diagonally.
+  Vector2  pos(100.0f, 100.0f);
+  uint32_t time = 100;
+  TestStartPan(application, pos, pos, time);
+  pos.x += 5.0f;
+  pos.y += 5.0f;
+  Wait(application, 100);
+
+  for(int i = 0; i < 20; i++)
+  {
+    time += RENDER_FRAME_INTERVAL;
+    TestMovePan(application, pos, time);
+    pos.x += 5.0f;
+    pos.y += 5.0f;
+    Wait(application);
+  }
+
+  time += RENDER_FRAME_INTERVAL;
+  TestEndPan(application, pos, time);
+  Wait(application, RENDER_DELAY_SCROLL);
+
+  DALI_TEST_CHECK(gOnScrollStartCalled);
+  DALI_TEST_CHECK(gOnScrollUpdateCalled);
+  DALI_TEST_CHECK(gOnScrollCompleteCalled);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSignalsUpdate02(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSignalsUpdate");
+
+  gOnScrollStartCalled    = false;
+  gOnScrollUpdateCalled   = false;
+  gOnScrollCompleteCalled = false;
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  rulerY->SetDomain(RulerDomain(0.0f, 1000.0f, false));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  Dali::ConnectionTracker tracker;
+  bool                    scrollStarted   = false;
+  bool                    scrollUpdated   = false;
+  bool                    scrollCompleted = false;
+  DALI_TEST_CHECK(scrollView.ConnectSignal(&tracker, "scrollStarted", CallbackFunctor(&scrollStarted)));
+  DALI_TEST_CHECK(scrollView.ConnectSignal(&tracker, "scrollUpdated", CallbackFunctor(&scrollUpdated)));
+  DALI_TEST_CHECK(scrollView.ConnectSignal(&tracker, "scrollCompleted", CallbackFunctor(&scrollCompleted)));
+
+  Actor image = Actor::New();
+  image.SetProperty(Actor::Property::SIZE, stageSize);
+  image.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  image.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  scrollView.Add(image);
+
+  Wait(application);
+
+  // Do a pan starting from 100,100 and moving down diagonally.
+  Vector2  pos(100.0f, 100.0f);
+  uint32_t time = 100;
+  TestStartPan(application, pos, pos, time);
+  pos.x += 5.0f;
+  pos.y += 5.0f;
+  Wait(application, 100);
+
+  for(int i = 0; i < 20; i++)
+  {
+    time += RENDER_FRAME_INTERVAL;
+    TestMovePan(application, pos, time);
+    pos.x += 5.0f;
+    pos.y += 5.0f;
+    Wait(application);
+  }
+
+  time += RENDER_FRAME_INTERVAL;
+  TestEndPan(application, pos, time);
+  Wait(application, RENDER_DELAY_SCROLL);
+
+  DALI_TEST_CHECK(scrollStarted);
+  DALI_TEST_CHECK(scrollUpdated);
+  DALI_TEST_CHECK(scrollCompleted);
+
+  application.GetScene().Remove(scrollView);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewScrollSensitive(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewScrollSensitive");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetOvershootEnabled(true);
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  scrollView.ScrollStartedSignal().Connect(&OnScrollStart);
+  scrollView.ScrollUpdatedSignal().Connect(&OnScrollUpdate);
+  scrollView.ScrollCompletedSignal().Connect(&OnScrollComplete);
+  scrollView.SnapStartedSignal().Connect(&OnSnapStart);
+
+  scrollView.ScrollTo(CLAMP_START_SCROLL_POSITION, 0.0f); // move in a little.
+  uint32_t time = 0;
+  time += Wait(application);
+
+  // First try insensitive swipe.
+  scrollView.SetScrollSensitive(false);
+  PerformGestureSwipe(application, CLAMP_TOUCH_START, CLAMP_TOUCH_MOVEMENT, CLAMP_GESTURE_FRAMES, time, true);
+
+  DALI_TEST_CHECK(!gOnScrollStartCalled);
+  DALI_TEST_CHECK(!gOnScrollCompleteCalled);
+  DALI_TEST_CHECK(!gOnSnapStartCalled);
+
+  // Second try sensitive swipe.
+  scrollView.SetScrollSensitive(true);
+  PerformGestureSwipe(application, CLAMP_TOUCH_START, CLAMP_TOUCH_MOVEMENT, CLAMP_GESTURE_FRAMES, time, true);
+
+  DALI_TEST_CHECK(gOnScrollStartCalled);
+  DALI_TEST_CHECK(gOnScrollCompleteCalled);
+  DALI_TEST_CHECK(gOnSnapStartCalled);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewAxisAutoLock(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewAxisAutoLock");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  scrollView.ScrollStartedSignal().Connect(&OnScrollStart);
+  scrollView.ScrollUpdatedSignal().Connect(&OnScrollUpdate);
+  scrollView.ScrollCompletedSignal().Connect(&OnScrollComplete);
+
+  // Normal
+  scrollView.ScrollTo(Vector2(100.0f, 100.0f), 0.0f); // move in a little.
+  uint32_t time = 0;
+  time += Wait(application);
+
+  Vector2 startPosition = scrollView.GetCurrentScrollPosition();
+  Vector2 dir(5.0f, 1.0f);
+
+  // PerformGestureSwipe not used as a different initial direction was required
+
+  Vector2 pos(CLAMP_TOUCH_START + Vector2(15.0f, 3.0f));
+
+  TestStartPan(application, CLAMP_TOUCH_START, pos, time);
+
+  time += Wait(application);
+
+  for(int i = 0; i < 47; i++)
+  {
+    pos += dir;
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
+
+  pos += dir;
+
+  TestEndPan(application, pos, time);
+
+  const Vector2 positionAfterNormal = scrollView.GetCurrentScrollPosition();
+
+  // Autolock
+  scrollView.SetAxisAutoLock(true);
+  DALI_TEST_CHECK(scrollView.GetAxisAutoLock());
+
+  scrollView.ScrollTo(Vector2(100.0f, 100.0f), 0.0f); // move in a little.
+  time += Wait(application);
+
+  Vector2 pos2(CLAMP_TOUCH_START + Vector2(15.0f, 3.0f));
+
+  TestStartPan(application, CLAMP_TOUCH_START, pos2, time);
+
+  time += Wait(application);
+
+  for(int i = 0; i < 47; i++)
+  {
+    pos2 += dir;
+    TestMovePan(application, pos2, time);
+    time += Wait(application);
+  }
+
+  pos2 += dir;
+
+  TestEndPan(application, pos2, time);
+
+  const Vector2 positionAfterAutoLock = scrollView.GetCurrentScrollPosition();
+
+  // compare how much the Y position has deviated for normal and autolock.
+  const float devianceNormal   = fabsf(startPosition.y - positionAfterNormal.y);
+  const float devianceAutoLock = fabsf(startPosition.y - positionAfterAutoLock.y);
+
+  // in auto-lock it should be a mostly horizontal pan (thus deviance should be much lower)
+  DALI_TEST_CHECK(devianceAutoLock < devianceNormal);
+
+  scrollView.SetAxisAutoLock(false);
+  DALI_TEST_CHECK(!scrollView.GetAxisAutoLock());
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewAxisAutoLockGradient(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewAxisAutoLockGradient");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetAxisAutoLockGradient(0.5f);
+  DALI_TEST_EQUALS(scrollView.GetAxisAutoLockGradient(), 0.5f, TEST_LOCATION);
+  scrollView.SetAxisAutoLockGradient(1.0f);
+  DALI_TEST_EQUALS(scrollView.GetAxisAutoLockGradient(), 1.0f, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewConstraints(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewConstraints");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  // Add an Actor to ScrollView,
+  // Apply TestSumConstraint to ScrollView's children (includes this Actor)
+  gConstraintResult = Vector3::ZERO;
+  Actor a           = Actor::New();
+  scrollView.Add(a);
+  a.SetProperty(Actor::Property::POSITION, TEST_ACTOR_POSITION);
+  Wait(application);
+
+  Constraint constraint = Constraint::New<Vector3>(scrollView, Actor::Property::POSITION, TestSumConstraint(TEST_CONSTRAINT_OFFSET));
+  constraint.AddSource(Source(scrollView, ScrollView::Property::SCROLL_POSITION));
+  constraint.SetRemoveAction(Constraint::DISCARD);
+  scrollView.ApplyConstraintToChildren(constraint);
+  Wait(application);
+
+  DALI_TEST_EQUALS(gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION);
+
+  gConstraintResult = Vector3::ZERO;
+  scrollView.RemoveConstraintsFromChildren();
+  Wait(application);
+
+  DALI_TEST_EQUALS(gConstraintResult, Vector3::ZERO, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewBind(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewBind");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  // Add an Actor to ScrollView,
+  // Apply TestSumConstraint to ScrollView's children (includes this Actor)
+
+  gConstraintResult = Vector3::ZERO;
+  Actor a           = Actor::New();
+  scrollView.Add(a);
+  a.SetProperty(Actor::Property::POSITION, TEST_ACTOR_POSITION);
+  Wait(application);
+
+  // apply this constraint to scrollview
+  Constraint constraint = Constraint::New<Vector3>(scrollView, Actor::Property::POSITION, TestSumConstraint(TEST_CONSTRAINT_OFFSET));
+  constraint.AddSource(Source(scrollView, ScrollView::Property::SCROLL_POSITION));
+  constraint.SetRemoveAction(Constraint::DISCARD);
+  scrollView.ApplyConstraintToChildren(constraint);
+
+  Wait(application);
+  // Defaulty Bound.
+  DALI_TEST_EQUALS(gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION);
+
+  // UnBind
+  gConstraintResult = Vector3::ZERO;
+  scrollView.UnbindActor(a);
+  Wait(application);
+  DALI_TEST_EQUALS(gConstraintResult, Vector3::ZERO, TEST_LOCATION);
+
+  // Bind
+  gConstraintResult = Vector3::ZERO;
+  scrollView.BindActor(a);
+  Wait(application);
+  DALI_TEST_EQUALS(gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewOvershoot(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewOvershoot");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetOvershootEnabled(true);
+
+  uint32_t time          = 0;
+  Vector2  overshootSize = Vector2(100.0f, 100.0f);
+  scrollView.SetProperty(Scrollable::Property::OVERSHOOT_SIZE, overshootSize);
+  DALI_TEST_EQUALS(scrollView.GetProperty(Scrollable::Property::OVERSHOOT_SIZE).Get<Vector2>(), overshootSize, TEST_LOCATION);
+
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  scrollView.ScrollStartedSignal().Connect(&OnScrollStart);
+  scrollView.ScrollUpdatedSignal().Connect(&OnScrollUpdate);
+  scrollView.ScrollCompletedSignal().Connect(&OnScrollComplete);
+
+  scrollView.ScrollTo(OVERSHOOT_START_SCROLL_POSITION, 0.0f); // move in a little.
+  time += Wait(application);
+
+  // 1. Scroll page in NW (-500,-500 pixels), then inspect overshoot. (don't release touch)
+  Vector2 currentPos      = Vector2(100.0f, 100.0f);
+  currentPos              = PerformGestureSwipe(application, currentPos, Vector2(5.0f, 5.0f), 100, time, false);
+  float   overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+  float   overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+  Vector2 positionValue   = scrollView.GetCurrentProperty<Vector2>(ScrollView::Property::SCROLL_POSITION);
+  DALI_TEST_EQUALS(overshootXValue, 1.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(overshootYValue, 1.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(positionValue, Vector2::ZERO, TEST_LOCATION);
+
+  float timeToReachOrigin;
+
+  // Now release touch. Overshoot should snap back to zero.
+  TestEndPan(application, currentPos, time);
+
+  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+
+  float minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + DEFAULT_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
+  float maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + DEFAULT_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+
+  DALI_TEST_CHECK((timeToReachOrigin > minTimeToReachOrigin) &&
+                  (timeToReachOrigin < maxTimeToReachOrigin));
+
+  // 2. Repeat Scroll, but this time change overshoot snap duration to shorter time
+  scrollView.SetSnapOvershootDuration(TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION);
+
+  currentPos = PerformGestureSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, time, false);
+  // Now release touch. Overshoot should snap back to zero.
+  TestEndPan(application, currentPos, time);
+  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+
+  minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
+  maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+
+  DALI_TEST_CHECK((timeToReachOrigin > minTimeToReachOrigin) &&
+                  (timeToReachOrigin < maxTimeToReachOrigin));
+
+  // 3. Repeat Scroll, but this time change overshoot snap duration to longer time.
+  scrollView.SetSnapOvershootDuration(TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION);
+
+  currentPos = PerformGestureSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, time, false);
+  // Now release touch. Overshoot should snap back to zero.
+  TestEndPan(application, currentPos, time);
+  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+
+  minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
+  maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+
+  DALI_TEST_CHECK((timeToReachOrigin > minTimeToReachOrigin) &&
+                  (timeToReachOrigin < maxTimeToReachOrigin));
+
+  // 4. Repeat Scroll, but this time change overshoot function.
+  scrollView.SetSnapOvershootDuration(TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION);
+  scrollView.SetSnapOvershootAlphaFunction(TestAlphaFunction);
+
+  currentPos = PerformGestureSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, time, false);
+  // Now release touch. Overshoot should snap back to zero.
+  TestEndPan(application, currentPos, time);
+  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+
+  minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
+  maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+
+  DALI_TEST_CHECK((timeToReachOrigin > minTimeToReachOrigin) &&
+                  (timeToReachOrigin < maxTimeToReachOrigin));
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSnapAlphaFunction(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSnapAlphaFunction");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetScrollSnapAlphaFunction(AlphaFunction::EASE_IN);
+  DALI_TEST_CHECK(scrollView.GetScrollSnapAlphaFunction().GetBuiltinFunction() == AlphaFunction::EASE_IN);
+  scrollView.SetScrollSnapAlphaFunction(AlphaFunction::EASE_OUT);
+  DALI_TEST_CHECK(scrollView.GetScrollSnapAlphaFunction().GetBuiltinFunction() == AlphaFunction::EASE_OUT);
+
+  scrollView.SetScrollFlickAlphaFunction(AlphaFunction::BOUNCE);
+  DALI_TEST_CHECK(scrollView.GetScrollFlickAlphaFunction().GetBuiltinFunction() == AlphaFunction::BOUNCE);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSnapDuration(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSnapDuration");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetScrollSnapDuration(1.0f);
+  DALI_TEST_EQUALS(scrollView.GetScrollSnapDuration(), 1.0f, TEST_LOCATION);
+  scrollView.SetScrollSnapDuration(0.5f);
+  DALI_TEST_EQUALS(scrollView.GetScrollSnapDuration(), 0.5f, TEST_LOCATION);
+
+  scrollView.SetScrollFlickDuration(2.0f);
+  DALI_TEST_EQUALS(scrollView.GetScrollFlickDuration(), 2.0f, TEST_LOCATION);
+  scrollView.SetScrollFlickDuration(1.5f);
+  DALI_TEST_EQUALS(scrollView.GetScrollFlickDuration(), 1.5f, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSnapStartedSignalP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSnapStartedSignalP");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+  scrollView.SnapStartedSignal().Connect(&OnSnapStart);
+
+  scrollView.ScrollTo(CLAMP_START_SCROLL_POSITION, 0.0f); // move in a little.
+  uint32_t time = 0;
+  time += Wait(application);
+
+  // First try a snap.
+  PerformGestureSwipe(application, CLAMP_TOUCH_START, Vector2(0.5f, 0.0f), 60, time, true);
+
+  DALI_TEST_CHECK(gOnSnapStartCalled);
+  DALI_TEST_CHECK(gLastSnapType == Toolkit::SNAP);
+
+  // Second try a swipe.
+  PerformGestureSwipe(application, CLAMP_TOUCH_START, Vector2(20.0f, 0.0f), 60, time, true);
+
+  DALI_TEST_CHECK(gOnSnapStartCalled);
+  DALI_TEST_CHECK(gLastSnapType == Toolkit::FLICK);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewGetCurrentPageP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewGetCurrentPageP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 800.0f, true));
+  RulerPtr rulerY = new FixedRuler(100.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 400.0f, true));
+
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.ScrollTo(15);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 15, TEST_LOCATION);
+
+  scrollView.ScrollTo(3);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 3, TEST_LOCATION);
+
+  scrollView.ScrollTo(9);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(static_cast<int>(scrollView.GetCurrentPage()), 9, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetMaxOvershootP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetMaxOvershootP");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  // Set the max overshoot to be 50 pixels in both X axis and Y axis
+  scrollView.SetMaxOvershoot(50.0f, 50.0f);
+
+  scrollView.ScrollTo(OVERSHOOT_START_SCROLL_POSITION, 0.0f); // move in a little.
+  uint32_t time = 0;
+  time += Wait(application);
+
+  // Scroll page in NW (-20,-20 pixels), then check that overshoot should be 0. (don't release touch)
+  Vector2 currentPos      = PerformGestureSwipe(application, OVERSHOOT_START_SCROLL_POSITION, Vector2(1.0f, 1.0f), 10, time, false);
+  float   overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+  float   overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+  DALI_TEST_EQUALS(overshootXValue, 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(overshootYValue, 0.0f, TEST_LOCATION);
+
+  time += Wait(application);
+  // Scroll page further in NW (-105,-105 pixels), then check that overshoot should be around 0.5. (don't release touch)
+  for(int i = 0; i < 106; i++)
+  {
+    TestMovePan(application, currentPos, time);
+    currentPos += Vector2(1.0f, 1.0f);
+    time += Wait(application);
+  }
+
+  overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+  overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+  // The overshoot value is a 0.0f - 1.0f ranged value of the amount overshot related to the maximum overshoot.
+  // EG. If we move 105, max overshoot is 50, then we overshot 50 / 105.
+  float correctOvershootValue = 0.508f; // This was measured and then set as the limit
+  DALI_TEST_EQUALS(overshootXValue, correctOvershootValue, 0.001f, TEST_LOCATION);
+  DALI_TEST_EQUALS(overshootYValue, correctOvershootValue, 0.001f, TEST_LOCATION);
+
+  // Scroll page further in NW (-25,-25 pixels), then check that overshoot should be now 1.0. (don't release touch)
+  for(int i = 0; i < 25; i++)
+  {
+    TestMovePan(application, currentPos, time);
+    currentPos += Vector2(1.0f, 1.0f); // Move in this direction
+    time += Wait(application);
+  }
+
+  overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+  overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+  DALI_TEST_EQUALS(overshootXValue, 1.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(overshootYValue, 1.0f, TEST_LOCATION);
+
+  // Change the max overshoot to be 250 pixels in both X axis and Y axis
+  scrollView.SetMaxOvershoot(250.0f, 250.0f);
+  time += Wait(application);
+
+  // Check that overshoot should be now around 0.8.
+  overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+  overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+  DALI_TEST_CHECK(overshootXValue > 0.79f && overshootXValue < 0.81f);
+  DALI_TEST_CHECK(overshootYValue > 0.79f && overshootYValue < 0.81f);
+
+  // Scroll page further in NW (-50,-50 pixels), then check that overshoot should be now 1.0. (don't release touch)
+  for(int i = 0; i < 50; i++)
+  {
+    TestMovePan(application, currentPos, time);
+    currentPos += Vector2(1.0f, 1.0f); // Move in this direction
+    time += Wait(application);
+  }
+
+  overshootXValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_X);
+  overshootYValue = scrollView.GetCurrentProperty<float>(ScrollView::Property::OVERSHOOT_Y);
+  DALI_TEST_EQUALS(overshootXValue, 1.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(overshootYValue, 1.0f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetScrollingDirectionP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetScrollingDirectionP");
 
   // Set up a scrollView...
   ScrollView scrollView = ScrollView::New();
-  scrollView.SetAxisAutoLockGradient(0.5f);
-  DALI_TEST_EQUALS(scrollView.GetAxisAutoLockGradient(), 0.5f, TEST_LOCATION);
-  scrollView.SetAxisAutoLockGradient(1.0f);
-  DALI_TEST_EQUALS(scrollView.GetAxisAutoLockGradient(), 1.0f, TEST_LOCATION);
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  Vector2 START_POSITION = Vector2(10.0f, 10.0f);
+
+  scrollView.ScrollTo(START_POSITION, 0.0f);
+  uint32_t time = 0;
+  time += Wait(application);
+
+  // Try a vertical swipe.
+  // PerformGestureSwipe not used as a different initial direction was required
+
+  Vector2 pos(START_POSITION + Vector2(0.0f, 15.0f));
+  TestStartPan(application, START_POSITION, pos, time);
+  time += Wait(application);
+  for(int i = 0; i < 45; i++)
+  {
+    pos += Vector2(0.0f, 1.0f);
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
+  pos += Vector2(0.0f, 1.0f);
+  TestEndPan(application, pos, time);
+  time += Wait(application);
+
+  // Take into account resampling done when prediction is off.
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition() - Vector2(0.0f, 0.5f), Vector2(10.0f, -50.0f), 0.25f, TEST_LOCATION);
+
+  scrollView.SetScrollingDirection(Dali::PanGestureDetector::DIRECTION_VERTICAL);
+
+  scrollView.ScrollTo(START_POSITION, 0.0f);
+  time += Wait(application);
+
+  // Try a vertical swipe.
+  // PerformGestureSwipe not used as a different initial direction was required
+  pos = (START_POSITION + Vector2(0.0f, 15.0f));
+  TestStartPan(application, START_POSITION, pos, time);
+  time += Wait(application);
+  for(int i = 0; i < 45; i++)
+  {
+    pos += Vector2(0.0f, 1.0f);
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
+  pos += Vector2(0.0f, 1.0f);
+  TestEndPan(application, pos, time);
+  time += Wait(application);
+
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition() - Vector2(0.0f, 0.5f), Vector2(10.0f, -50.0f), 0.25f, TEST_LOCATION);
+
+  scrollView.RemoveScrollingDirection(Dali::PanGestureDetector::DIRECTION_VERTICAL);
+
+  scrollView.ScrollTo(START_POSITION, 0.0f);
+
+  time += Wait(application);
+
+  // Try a vertical swipe.
+  // PerformGestureSwipe not used as a different initial direction was required
+  pos = (START_POSITION + Vector2(0.0f, 15.0f));
+  TestStartPan(application, START_POSITION, pos, time);
+  time += Wait(application);
+  for(int i = 0; i < 45; i++)
+  {
+    pos += Vector2(0.0f, 1.0f);
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
+  pos += Vector2(0.0f, 1.0f);
+  TestEndPan(application, pos, time);
+  time += Wait(application);
+
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition() - Vector2(0.0f, 0.5f), Vector2(10.0f, -50.0f), 0.25f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRemoveScrollingDirectionP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRemoveScrollingDirectionP");
+
+  // Set up a scrollView...
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  Vector2  START_POSITION = Vector2(10.0f, 10.0f);
+  uint32_t time           = 0;
+
+  scrollView.SetScrollingDirection(Dali::PanGestureDetector::DIRECTION_VERTICAL);
+
+  scrollView.ScrollTo(START_POSITION, 0.0f);
+
+  time += Wait(application);
+
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), START_POSITION, TEST_LOCATION);
+
+  // Try a vertical swipe.
+  // PerformGestureSwipe not used as a different initial direction was required
+  Vector2 pos(START_POSITION + Vector2(0.0f, 15.0f));
+  TestStartPan(application, START_POSITION, pos, time);
+  time += Wait(application);
+  for(int i = 0; i < 45; i++)
+  {
+    pos += Vector2(0.0f, 1.0f);
+    TestMovePan(application, pos, time);
+    time += Wait(application);
+  }
+  pos += Vector2(0.0f, 1.0f);
+  TestEndPan(application, pos, time);
+  time += Wait(application);
+
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition() - Vector2(0.0f, 0.5f), Vector2(10.0f, -50.0f), 0.25f, TEST_LOCATION);
+
+  scrollView.RemoveScrollingDirection(Dali::PanGestureDetector::DIRECTION_VERTICAL);
+  // When the horizontal direction is removed, there are no directions set and therefore all will work
+  scrollView.SetScrollingDirection(Dali::PanGestureDetector::DIRECTION_HORIZONTAL);
+
+  time += Wait(application);
+  // Try a vertical swipe.
+  Vector2 pos2(pos + Vector2(0.0f, 15.0f));
+  TestStartPan(application, pos, pos2, time);
+  time += Wait(application);
+  for(int i = 0; i < 45; i++)
+  {
+    pos2 += Vector2(0.0f, 1.0f);
+    TestMovePan(application, pos2, time);
+    time += Wait(application);
+  }
+  pos2 += Vector2(0.0f, 1.0f);
+  TestEndPan(application, pos2, time);
+
+  // The previous scroll should not have had any effect
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition() - Vector2(0.0f, 0.5f), Vector2(10.0f, -50.0f), 0.25f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetRulerXP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetRulerXP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+  RulerPtr rulerX = new FixedRuler(100.0f);
+  rulerX->SetDomain(RulerDomain(0.0f, 800.0f, true));
+
+  scrollView.SetRulerX(rulerX);
+
+  scrollView.ScrollTo(1, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(100.0f, 0.0f), TEST_LOCATION);
+
+  RulerPtr newRulerX = new FixedRuler(200.0f);
+  newRulerX->SetDomain(RulerDomain(0.0f, 800.0f, true));
+
+  scrollView.SetRulerX(newRulerX);
+
+  scrollView.ScrollTo(1, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(200.0f, 0.0f), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetRulerYP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetRulerYP");
+
+  ScrollView scrollView = ScrollView::New();
+  application.GetScene().Add(scrollView);
+
+  RulerPtr rulerY = new FixedRuler(200.0f);
+  rulerY->SetDomain(RulerDomain(0.0f, 400.0f, true));
+
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.ScrollTo(Vector2(0.0f, 350.0f), 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(0.0f, 350.0f), TEST_LOCATION);
+
+  RulerPtr newRulerY = new FixedRuler(100.0f);
+  newRulerY->SetDomain(RulerDomain(0.0f, 200.0f, true));
+  scrollView.SetRulerY(newRulerY);
+
+  scrollView.ScrollTo(Vector2(0.0f, 350.0f), 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), Vector2(0.0f, 200.0f), TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetMinimumSpeedForFlickP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetMinimumSpeedForFlickP");
+
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetMinimumSpeedForFlick(25.0f);
+  DALI_TEST_EQUALS(scrollView.GetMinimumSpeedForFlick(), 25.0f, TEST_LOCATION);
+  scrollView.SetMinimumSpeedForFlick(60.0f);
+  DALI_TEST_EQUALS(scrollView.GetMinimumSpeedForFlick(), 60.0f, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetMinimumDistanceForFlickP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetMinimumDistanceForFlick");
+
+  ScrollView scrollView = ScrollView::New();
+
+  scrollView.SetMinimumDistanceForFlick(Vector2(30.0f, 15.0f));
+  DALI_TEST_EQUALS(scrollView.GetMinimumDistanceForFlick(), Vector2(30.0f, 15.0f), TEST_LOCATION);
+  scrollView.SetMinimumDistanceForFlick(Vector2(60.0f, 30.0f));
+  DALI_TEST_EQUALS(scrollView.GetMinimumDistanceForFlick(), Vector2(60.0f, 30.0f), TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetWheelScrollDistanceStepP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetWheelScrollDistanceStepP");
+
+  ScrollView scrollView = ScrollView::New();
+  // Disable Refresh signal (TET environment cannot use adaptor's Timer)
+  scrollView.SetWheelScrollDistanceStep(Vector2(30.0f, 15.0f));
+  DALI_TEST_EQUALS(scrollView.GetWheelScrollDistanceStep(), Vector2(30.0f, 15.0f), TEST_LOCATION);
+  scrollView.SetWheelScrollDistanceStep(Vector2(60.0f, 30.0f));
+  DALI_TEST_EQUALS(scrollView.GetWheelScrollDistanceStep(), Vector2(60.0f, 30.0f), TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewApplyEffectP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewApplyEffectP");
+
+  // Create a ScrollView
+  ScrollView scrollView = ScrollView::New();
+
+  // Create two scroll view effects
+  Dali::Path       path      = Dali::Path::New();
+  ScrollViewEffect effect    = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 0.0f, 0.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(100.0f, 100.0f, 0.0f), 2);
+  ScrollViewEffect newEffect = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 1.0f, 1.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(200.0f, 150.0f, 0.0f), 5);
+
+  // Apply both effects
+  scrollView.ApplyEffect(effect);
+  scrollView.ApplyEffect(newEffect);
+
+  DALI_TEST_CHECK(true);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewApplyEffectN(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewApplyEffectN");
+
+  // Create a ScrollView
+  ScrollView scrollView = ScrollView::New();
+
+  // Create two scroll view effects
+  Dali::Path       path      = Dali::Path::New();
+  ScrollViewEffect effect    = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 0.0f, 0.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(100.0f, 100.0f, 0.0f), 2);
+  ScrollViewEffect newEffect = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 1.0f, 1.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(200.0f, 150.0f, 0.0f), 5);
+
+  // Apply both effects
+  scrollView.ApplyEffect(effect);
+  scrollView.ApplyEffect(newEffect);
+
+  // Attempt to apply the same effect again
+  try
+  {
+    scrollView.ApplyEffect(newEffect);
+    tet_result(TET_FAIL);
+  }
+  catch(DaliException& e)
+  {
+    DALI_TEST_ASSERT(e, "!effectAlreadyExistsInScrollView", TEST_LOCATION);
+  }
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRemoveEffectP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRemoveEffectP");
+
+  // Create a ScrollView
+  ScrollView scrollView = ScrollView::New();
+
+  // Create two scroll view effects
+  Dali::Path       path      = Dali::Path::New();
+  ScrollViewEffect effect    = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 0.0f, 0.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(100.0f, 100.0f, 0.0f), 2);
+  ScrollViewEffect newEffect = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 1.0f, 1.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(200.0f, 150.0f, 0.0f), 5);
+
+  // Apply both effects
+  scrollView.ApplyEffect(effect);
+  scrollView.ApplyEffect(newEffect);
+
+  // Remove both effects
+  scrollView.RemoveEffect(effect);
+  scrollView.RemoveEffect(newEffect);
+
+  DALI_TEST_CHECK(true);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRemoveEffectN(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRemoveEffectN");
+
+  // Create a ScrollView
+  ScrollView scrollView = ScrollView::New();
+
+  // Create two scroll view effects
+  Dali::Path       path      = Dali::Path::New();
+  ScrollViewEffect effect    = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 0.0f, 0.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(100.0f, 100.0f, 0.0f), 2);
+  ScrollViewEffect newEffect = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 1.0f, 1.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(200.0f, 150.0f, 0.0f), 5);
+
+  // Apply the first effect
+  scrollView.ApplyEffect(effect);
+
+  // Attempt to remove the second effect which has not been applied to scroll view
+  try
+  {
+    scrollView.RemoveEffect(newEffect);
+    tet_result(TET_FAIL);
+  }
+  catch(DaliException& e)
+  {
+    DALI_TEST_ASSERT(e, "effectExistedInScrollView", TEST_LOCATION);
+  }
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRemoveAllEffectsP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRemoveAllEffectsP");
+
+  // Create a ScrollView
+  ScrollView scrollView = ScrollView::New();
+
+  // Create two scroll view effects
+  Dali::Path       path      = Dali::Path::New();
+  ScrollViewEffect effect    = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 0.0f, 0.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(100.0f, 100.0f, 0.0f), 2);
+  ScrollViewEffect newEffect = ScrollViewPagePathEffect::New(path, Vector3(-1.0f, 1.0f, 1.0f), Toolkit::ScrollView::Property::SCROLL_FINAL_X, Vector3(200.0f, 150.0f, 0.0f), 5);
+
+  // Apply both effects
+  scrollView.ApplyEffect(effect);
+  scrollView.ApplyEffect(newEffect);
+
+  // Attempt to apply the same first effect again
+  try
+  {
+    scrollView.ApplyEffect(effect);
+    tet_result(TET_FAIL);
+  }
+  catch(DaliException& e)
+  {
+    DALI_TEST_ASSERT(e, "!effectAlreadyExistsInScrollView", TEST_LOCATION);
+  }
+
+  // Remove both effects
+  scrollView.RemoveAllEffects();
+
+  // Apply both effects again
+  scrollView.ApplyEffect(effect);
+  scrollView.ApplyEffect(newEffect);
+
+  DALI_TEST_CHECK(true);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRemoveAllEffectsN(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRemoveAllEffectsN");
+
+  // Create a ScrollView
+  ScrollView scrollView = ScrollView::New();
+
+  // Remove effects when there is no effect applied previously
+  scrollView.RemoveAllEffects();
+
+  DALI_TEST_CHECK(true);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetOvershootEnabledP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetOvershootEnabledP");
+
+  ScrollView scrollView = ScrollView::New();
+
+  scrollView.SetOvershootEnabled(true);
+  DALI_TEST_CHECK(scrollView.IsOvershootEnabled());
+
+  scrollView.SetOvershootEnabled(false);
+  DALI_TEST_CHECK(!scrollView.IsOvershootEnabled());
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetOvershootEffectColorP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetOvershootEffectColorP");
+
+  ScrollView scrollView = ScrollView::New();
+
+  scrollView.SetOvershootEffectColor(Dali::Color::RED);
+  DALI_TEST_EQUALS(scrollView.GetOvershootEffectColor(), Dali::Color::RED, TEST_LOCATION);
+
+  scrollView.SetOvershootEffectColor(Dali::Color::YELLOW);
+  DALI_TEST_EQUALS(scrollView.GetOvershootEffectColor(), Dali::Color::YELLOW, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewSetOvershootAnimationSpeedP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewSetOvershootAnimationSpeedP");
+
+  ScrollView scrollView = ScrollView::New();
+
+  scrollView.SetOvershootAnimationSpeed(55.0f);
+  DALI_TEST_EQUALS(scrollView.GetOvershootAnimationSpeed(), 55.0f, TEST_LOCATION);
+
+  scrollView.SetOvershootAnimationSpeed(120.0f);
+  DALI_TEST_EQUALS(scrollView.GetOvershootAnimationSpeed(), 120.0f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewGetSet(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewGetSet");
+  ScrollView scrollView = ScrollView::New();
+  scrollView.SetMaxFlickSpeed(0.5f);
+  DALI_TEST_EQUALS(scrollView.GetMaxFlickSpeed(), 0.5f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+  scrollView.SetFrictionCoefficient(0.6f);
+  DALI_TEST_EQUALS(scrollView.GetFrictionCoefficient(), 0.6f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+  scrollView.SetFlickSpeedCoefficient(0.7f);
+  DALI_TEST_EQUALS(scrollView.GetFlickSpeedCoefficient(), 0.7f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRulerDomainConstructorP(void)
+{
+  ToolkitTestApplication application;
+
+  RulerDomain domainX = RulerDomain(0.0f, 200.0f, true);
+  DALI_TEST_EQUALS(domainX.min, 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(domainX.max, 200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(domainX.enabled, true, TEST_LOCATION);
+
+  RulerDomain domainY = RulerDomain(100.0f, 500.0f, false);
+  DALI_TEST_EQUALS(domainY.min, 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(domainY.max, 500.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(domainY.enabled, false, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRulerDomainGetSizeP(void)
+{
+  ToolkitTestApplication application;
+
+  RulerDomain domainX = RulerDomain(0.0f, 200.0f, true);
+  DALI_TEST_EQUALS(domainX.GetSize(), 200.0f, TEST_LOCATION);
+
+  RulerDomain domainY = RulerDomain(100.0f, 500.0f, false);
+  DALI_TEST_EQUALS(domainY.GetSize(), 400.0f, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRulerDomainClampP(void)
+{
+  ToolkitTestApplication application;
+
+  RulerDomain domainX = RulerDomain(0.0f, 200.0f, true);
+
+  float value = domainX.Clamp(50.0f, 100.0f, 1.0f);
+  DALI_TEST_EQUALS(value, 50.0f, TEST_LOCATION);
+
+  value = domainX.Clamp(300.0f, 20.0f, 1.0f);
+  DALI_TEST_EQUALS(value, 180.0f, TEST_LOCATION);
+
+  value = domainX.Clamp(300.0f, 20.0f, 0.5f);
+  DALI_TEST_EQUALS(value, 80.0f, TEST_LOCATION);
+
+  value = domainX.Clamp(250.0f, 200.0f, 2.0f);
+  DALI_TEST_EQUALS(value, 200.0f, TEST_LOCATION);
+
   END_TEST;
 }
 
-int UtcDaliScrollViewConstraints(void)
+int UtcDaliToolkitScrollViewRulerDomainClampWithStateP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewConstraints");
 
-  // Set up a scrollView...
-  ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+  RulerDomain domainX = RulerDomain(0.0f, 200.0f, true);
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
-  rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
-  scrollView.SetRulerX(rulerX);
-  scrollView.SetRulerY(rulerY);
+  ClampState clamped;
+  float      value = domainX.Clamp(50.0f, 100.0f, 1.0f, clamped);
+  DALI_TEST_EQUALS(value, 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, Dali::Toolkit::NOT_CLAMPED, TEST_LOCATION);
 
-  // Add an Actor to ScrollView,
-  // Apply TestSumConstraint to ScrollView's children (includes this Actor)
-  gConstraintResult = Vector3::ZERO;
-  Actor a = Actor::New();
-  scrollView.Add(a);
-  a.SetPosition( TEST_ACTOR_POSITION );
-  Wait(application);
+  value = domainX.Clamp(-100.0f, 200.0f, 1.0f, clamped);
+  DALI_TEST_EQUALS(value, 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, Dali::Toolkit::CLAMPED_TO_MIN, TEST_LOCATION);
 
-  Constraint constraint = Constraint::New<Vector3>( scrollView, Actor::Property::POSITION, TestSumConstraint( TEST_CONSTRAINT_OFFSET ) );
-  constraint.AddSource( Source(scrollView, ScrollView::Property::SCROLL_POSITION) );
-  constraint.SetRemoveAction(Constraint::Discard);
-  scrollView.ApplyConstraintToChildren(constraint);
-  Wait(application);
+  value = domainX.Clamp(300.0f, 20.0f, 1.0f, clamped);
+  DALI_TEST_EQUALS(value, 180.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, Dali::Toolkit::CLAMPED_TO_MAX, TEST_LOCATION);
+
+  END_TEST;
+}
 
-  DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION );
+int UtcDaliToolkitScrollViewDefaultRulerConstructorP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerConstructorP");
 
-  gConstraintResult = Vector3::ZERO;
-  scrollView.RemoveConstraintsFromChildren();
-  Wait(application);
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
 
-  DALI_TEST_EQUALS( gConstraintResult, Vector3::ZERO, TEST_LOCATION );
   END_TEST;
 }
 
-int UtcDaliScrollViewBind(void)
+int UtcDaliToolkitScrollViewDefaultRulerDestructorP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewBind");
+  tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerDestructorP");
 
-  // Set up a scrollView...
-  ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+  RulerPtr defaultRuler = new DefaultRuler();
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
-  rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
-  scrollView.SetRulerX(rulerX);
-  scrollView.SetRulerY(rulerY);
+  DALI_TEST_CHECK(true);
+  END_TEST;
+}
 
-  // Add an Actor to ScrollView,
-  // Apply TestSumConstraint to ScrollView's children (includes this Actor)
+int UtcDaliToolkitScrollViewFixedRulerConstructorP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewFixedRulerConstructorP");
 
-  gConstraintResult = Vector3::ZERO;
-  Actor a = Actor::New();
-  scrollView.Add(a);
-  a.SetPosition( TEST_ACTOR_POSITION );
-  Wait(application);
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+  DALI_TEST_CHECK(fixedRuler);
 
-  // apply this constraint to scrollview
-  Constraint constraint = Constraint::New<Vector3>( scrollView, Actor::Property::POSITION, TestSumConstraint( TEST_CONSTRAINT_OFFSET ) );
-  constraint.AddSource( Source(scrollView, ScrollView::Property::SCROLL_POSITION) );
-  constraint.SetRemoveAction(Constraint::Discard);
-  scrollView.ApplyConstraintToChildren(constraint);
+  fixedRuler = new FixedRuler(0.0f);
+  DALI_TEST_CHECK(fixedRuler);
 
-  Wait(application);
-  // Defaulty Bound.
-  DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION );
+  END_TEST;
+}
 
-  // UnBind
-  gConstraintResult = Vector3::ZERO;
-  scrollView.UnbindActor( a );
-  Wait(application);
-  DALI_TEST_EQUALS( gConstraintResult, Vector3::ZERO, TEST_LOCATION );
+int UtcDaliToolkitScrollViewFixedRulerDestructorP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewFixedRulerDestructorP");
+
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+
+  DALI_TEST_CHECK(true);
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRulerGetTypeP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRulerGetTypeP");
+
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
+  DALI_TEST_EQUALS(defaultRuler->GetType(), Dali::Toolkit::Ruler::FREE, TEST_LOCATION);
+
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+  DALI_TEST_CHECK(fixedRuler);
+  DALI_TEST_EQUALS(fixedRuler->GetType(), Dali::Toolkit::Ruler::FIXED, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewRulerGetExtensionP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewRulerGetExtensionP");
+
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
+  DALI_TEST_CHECK(!defaultRuler->GetExtension());
+
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+  DALI_TEST_CHECK(fixedRuler);
+  DALI_TEST_CHECK(!fixedRuler->GetExtension());
 
-  // Bind
-  gConstraintResult = Vector3::ZERO;
-  scrollView.BindActor( a );
-  Wait(application);
-  DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION );
   END_TEST;
 }
 
-int UtcDaliRulerEnableDisable(void)
+int UtcDaliToolkitScrollViewRulerEnableDisable(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliRulerEnableDisable");
+  tet_infoline(" UtcDaliToolkitScrollViewRulerEnableDisable");
 
   RulerPtr ruler = new DefaultRuler();
 
-  DALI_TEST_CHECK( ruler->IsEnabled() );
+  DALI_TEST_CHECK(ruler->IsEnabled());
   ruler->Disable();
-  DALI_TEST_CHECK( !ruler->IsEnabled() );
+  DALI_TEST_CHECK(!ruler->IsEnabled());
   ruler->Enable();
-  DALI_TEST_CHECK( ruler->IsEnabled() );
+  DALI_TEST_CHECK(ruler->IsEnabled());
   END_TEST;
 }
 
-int UtcDaliRulerDomainEnableDisable(void)
+int UtcDaliToolkitScrollViewRulerDomainEnableDisable(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliRulerDomainEnableDisable");
+  tet_infoline(" UtcDaliToolkitScrollViewRulerDomainEnableDisable");
 
   RulerPtr ruler = new DefaultRuler();
-  DALI_TEST_EQUALS( ruler->GetDomain().GetSize(), 1.0f, TEST_LOCATION );
+  DALI_TEST_EQUALS(ruler->GetDomain().GetSize(), 1.0f, TEST_LOCATION);
 
-
-  ruler->SetDomain( RulerDomain(0.0f, 100.0f, true) );
-  DALI_TEST_EQUALS( ruler->GetDomain().GetSize(), 100.0f, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->Clamp(-200.0f), 0.0f, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->Clamp(200.0f), 100.0f, TEST_LOCATION );
+  ruler->SetDomain(RulerDomain(0.0f, 100.0f, true));
+  DALI_TEST_EQUALS(ruler->GetDomain().GetSize(), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->Clamp(-200.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->Clamp(200.0f), 100.0f, TEST_LOCATION);
 
   ruler->DisableDomain();
-  DALI_TEST_EQUALS( ruler->GetDomain().GetSize(), 1.0f, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->Clamp(-200.0f), -200.0f, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->Clamp(200.0f), 200.0f, TEST_LOCATION );
+  DALI_TEST_EQUALS(ruler->GetDomain().GetSize(), 1.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->Clamp(-200.0f), -200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->Clamp(200.0f), 200.0f, TEST_LOCATION);
   END_TEST;
 }
 
-int UtcDaliRulerSnapAndClamp(void)
+int UtcDaliToolkitScrollViewRulerSnapAndClamp(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliRulerSnapAndClamp");
+  tet_infoline(" UtcDaliToolkitScrollViewRulerSnapAndClamp");
 
-  RulerPtr ruler = new FixedRuler( 50.0f );
-  ruler->SetDomain( RulerDomain(0.0f, 400.0f, true) );
+  RulerPtr ruler = new FixedRuler(50.0f);
+  ruler->SetDomain(RulerDomain(0.0f, 400.0f, true));
 
   // default testing. (snap and clamp)
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(50.0f), 50.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(30.0f), 50.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(10.0f), 0.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(-40.0f), 0.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(390.0f), 400.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(430.0f), 400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(50.0f), 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(30.0f), 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(10.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(-40.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(390.0f), 400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(430.0f), 400.0f, TEST_LOCATION);
 
   // bias testing.
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(40.0f, 0.0f), 0.0f, TEST_LOCATION); // Flick Left
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(40.0f, 0.5f), 50.0f, TEST_LOCATION); // No Flick
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(40.0f, 1.0f), 50.0f, TEST_LOCATION); // Flick Right
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(40.0f, 0.0f), 0.0f, TEST_LOCATION);  // Flick Left
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(40.0f, 0.5f), 50.0f, TEST_LOCATION); // No Flick
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(40.0f, 1.0f), 50.0f, TEST_LOCATION); // Flick Right
 
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(20.0f, 0.0f), 0.0f, TEST_LOCATION); // Flick Left
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(20.0f, 0.5f), 0.0f, TEST_LOCATION); // No Flick
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(20.0f, 1.0f), 50.0f, TEST_LOCATION); // Flick Right
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(20.0f, 0.0f), 0.0f, TEST_LOCATION);  // Flick Left
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(20.0f, 0.5f), 0.0f, TEST_LOCATION);  // No Flick
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(20.0f, 1.0f), 50.0f, TEST_LOCATION); // Flick Right
 
   // length testing.
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(-10.0f, 0.5f, 10.0f), 0.0f, TEST_LOCATION); // 10 units long (over left boundary)
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(-5.0f, 0.5f, 10.0f), 0.0f, TEST_LOCATION); // 10 units long (slightly ovr left boundary)
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(300.0f, 0.5f, 10.0f), 300.0f, TEST_LOCATION); // 10 units long (not over a boundary)
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(395.0f, 0.5f, 10.0f), 390.0f, TEST_LOCATION); // 10 units long (slightly over right boundary)
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(500.0f, 0.5f, 10.0f), 390.0f, TEST_LOCATION); // 10 units long (over right boundary)
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(-10.0f, 0.5f, 10.0f), 0.0f, TEST_LOCATION);   // 10 units long (over left boundary)
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(-5.0f, 0.5f, 10.0f), 0.0f, TEST_LOCATION);    // 10 units long (slightly ovr left boundary)
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(300.0f, 0.5f, 10.0f), 300.0f, TEST_LOCATION); // 10 units long (not over a boundary)
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(395.0f, 0.5f, 10.0f), 390.0f, TEST_LOCATION); // 10 units long (slightly over right boundary)
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(500.0f, 0.5f, 10.0f), 390.0f, TEST_LOCATION); // 10 units long (over right boundary)
 
   // scale testing.
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(-100.0f, 0.5f, 0.0f, 2.0f), 0.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(50.0f, 0.5f, 0.0f, 2.0f), 50.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(700.0f, 0.5f, 0.0f, 2.0f), 700.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(850.0f, 0.5f, 0.0f, 2.0f), 800.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(-100.0f, 0.5f, 0.0f, 2.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(50.0f, 0.5f, 0.0f, 2.0f), 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(700.0f, 0.5f, 0.0f, 2.0f), 700.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(850.0f, 0.5f, 0.0f, 2.0f), 800.0f, TEST_LOCATION);
 
   // clamp state testing.
   ClampState clamped;
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(50.0f, 0.5f, 0.0f, 1.0f, clamped), 50.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(30.0f, 0.5f, 0.0f, 1.0f, clamped), 50.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(10.0f, 0.5f, 0.0f, 1.0f, clamped), 0.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(-40.0f, 0.5f, 0.0f, 1.0f, clamped), 0.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( clamped, ClampedToMin, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(390.0f, 0.5f, 0.0f, 1.0f, clamped), 400.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
-  DALI_TEST_EQUALS( ruler->SnapAndClamp(430.0f, 0.5f, 0.0f, 1.0f, clamped), 400.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS( clamped, ClampedToMax, TEST_LOCATION );
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(50.0f, 0.5f, 0.0f, 1.0f, clamped), 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, NOT_CLAMPED, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(30.0f, 0.5f, 0.0f, 1.0f, clamped), 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, NOT_CLAMPED, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(10.0f, 0.5f, 0.0f, 1.0f, clamped), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, NOT_CLAMPED, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(-40.0f, 0.5f, 0.0f, 1.0f, clamped), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, CLAMPED_TO_MIN, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(390.0f, 0.5f, 0.0f, 1.0f, clamped), 400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, NOT_CLAMPED, TEST_LOCATION);
+  DALI_TEST_EQUALS(ruler->SnapAndClamp(430.0f, 0.5f, 0.0f, 1.0f, clamped), 400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(clamped, CLAMPED_TO_MAX, TEST_LOCATION);
   END_TEST;
 }
 
-int UtcDaliRulerFixedRulerSpacing(void)
+int UtcDaliToolkitScrollViewFixedRulerGetPositionFromPageP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliRulerFixedRulerSpacing");
+  tet_infoline(" UtcDaliToolkitScrollViewFixedRulerGetPositionFromPageP");
 
-  RulerPtr rulerNormal = new FixedRuler( 25.0f );
-  rulerNormal->SetDomain( RulerDomain(10.0f, 90.0f, true) );
+  RulerPtr rulerNormal = new FixedRuler(25.0f);
+  rulerNormal->SetDomain(RulerDomain(10.0f, 90.0f, true));
 
   unsigned int volume;
-  float position;
+  float        position;
+
+  position = rulerNormal->GetPositionFromPage(1, volume, true);
+  DALI_TEST_EQUALS(position, 35.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(volume, 0u, TEST_LOCATION);
+
+  position = rulerNormal->GetPositionFromPage(2, volume, true);
+  DALI_TEST_EQUALS(position, 60.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(volume, 0u, TEST_LOCATION);
+
+  // Disable the ruler
+  rulerNormal->Disable();
 
   position = rulerNormal->GetPositionFromPage(1, volume, true);
-  DALI_TEST_EQUALS( position, 35.0f, TEST_LOCATION );
-  DALI_TEST_EQUALS( volume, 0u, TEST_LOCATION );
+  DALI_TEST_EQUALS(position, 10.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(volume, 1u, TEST_LOCATION);
 
   position = rulerNormal->GetPositionFromPage(2, volume, true);
-  DALI_TEST_EQUALS( position, 60.0f, TEST_LOCATION );
-  DALI_TEST_EQUALS( volume, 0u, TEST_LOCATION );
+  DALI_TEST_EQUALS(position, 10.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(volume, 2u, TEST_LOCATION);
+
   END_TEST;
 }
 
-int UtcDaliScrollViewOvershoot(void)
+int UtcDaliToolkitScrollViewDefaultRulerGetTotalPagesP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewOvershoot");
-
-  // Set up a scrollView...
-  ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+  tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerGetTotalPagesP");
 
-  // Position rulers.
-  RulerPtr rulerX = new DefaultRuler();
-  RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
-  rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
-  scrollView.SetRulerX(rulerX);
-  scrollView.SetRulerY(rulerY);
-  scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
-  scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
-  scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
+  DALI_TEST_EQUALS(defaultRuler->GetTotalPages(), 1u, TEST_LOCATION);
 
-  scrollView.ScrollTo(OVERSHOOT_START_SCROLL_POSITION, 0.0f); // move in a little.
-  Wait(application);
+  END_TEST;
+}
 
-  // 1. Scroll page in NW (-500,-500 pixels), then inspect overshoot. (don't release touch)
-  Vector2 currentPos = Vector2(100.0f, 100.0f);
-  currentPos = PerformGestureDiagonalSwipe(application, currentPos, Vector2(5.0f, 5.0f), 100, false);
-  float overshootXValue = scrollView.GetProperty<float>(ScrollView::Property::OVERSHOOT_X);
-  float overshootYValue = scrollView.GetProperty<float>(ScrollView::Property::OVERSHOOT_Y);
-  Vector3 positionValue = scrollView.GetProperty<Vector3>(ScrollView::Property::SCROLL_POSITION);
-  DALI_TEST_EQUALS(overshootXValue, 1.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS(overshootYValue, 1.0f, TEST_LOCATION);
-  DALI_TEST_EQUALS(positionValue, Vector3::ZERO, TEST_LOCATION);
+int UtcDaliToolkitScrollViewDefaultRulerGetPageFromPositionP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerGetPageFromPositionP");
 
-  float timeToReachOrigin;
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
+  DALI_TEST_EQUALS(defaultRuler->GetPageFromPosition(100.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(defaultRuler->GetPageFromPosition(-300.0f, false), 0u, TEST_LOCATION);
 
-  // Now release touch. Overshoot should snap back to zero.
-  SendPan(application, Gesture::Finished, currentPos);
-  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+  END_TEST;
+}
 
-  float minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + Toolkit::ScrollView::DEFAULT_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
-  float maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + Toolkit::ScrollView::DEFAULT_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+int UtcDaliToolkitScrollViewDefaultRulerGetPositionFromPageP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerGetPositionFromPageP");
 
-  DALI_TEST_CHECK( (timeToReachOrigin > minTimeToReachOrigin) &&
-                   (timeToReachOrigin < maxTimeToReachOrigin) );
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
 
-  // 2. Repeat Scroll, but this time change overshoot snap duration to shorter time
-  scrollView.SetSnapOvershootDuration(TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION);
+  unsigned int volume;
+  DALI_TEST_EQUALS(defaultRuler->GetPositionFromPage(0, volume, true), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(volume, 0u, TEST_LOCATION);
 
-  currentPos = PerformGestureDiagonalSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, false);
-  // Now release touch. Overshoot should snap back to zero.
-  SendPan(application, Gesture::Finished, currentPos);
-  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+  DALI_TEST_EQUALS(defaultRuler->GetPositionFromPage(3, volume, false), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(volume, 0u, TEST_LOCATION);
 
-  minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
-  maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+  END_TEST;
+}
 
-  DALI_TEST_CHECK( (timeToReachOrigin > minTimeToReachOrigin) &&
-                   (timeToReachOrigin < maxTimeToReachOrigin) );
+int UtcDaliToolkitScrollViewDefaultRulerSnapP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerSnapP");
 
-  // 3. Repeat Scroll, but this time change overshoot snap duration to longer time.
-  scrollView.SetSnapOvershootDuration(TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION);
+  RulerPtr defaultRuler = new DefaultRuler();
+  DALI_TEST_CHECK(defaultRuler);
 
-  currentPos = PerformGestureDiagonalSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, false);
-  // Now release touch. Overshoot should snap back to zero.
-  SendPan(application, Gesture::Finished, currentPos);
-  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+  DALI_TEST_EQUALS(defaultRuler->Snap(50.0f, 0.5f), 50.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(defaultRuler->Snap(-120.0f, 1.0f), -120.0f, TEST_LOCATION);
 
-  minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
-  maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+  END_TEST;
+}
 
-  DALI_TEST_CHECK( (timeToReachOrigin > minTimeToReachOrigin) &&
-                   (timeToReachOrigin < maxTimeToReachOrigin) );
+int UtcDaliToolkitScrollViewFixedRulerGetTotalPagesP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewFixedRulerGetTotalPagesP");
 
-  // 4. Repeat Scroll, but this time change overshoot function.
-  scrollView.SetSnapOvershootDuration(TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION);
-  scrollView.SetSnapOvershootAlphaFunction(TestAlphaFunction);
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+  fixedRuler->SetDomain(RulerDomain(0.0f, 400.0f, true));
 
-  currentPos = PerformGestureDiagonalSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, false);
-  // Now release touch. Overshoot should snap back to zero.
-  SendPan(application, Gesture::Finished, currentPos);
-  timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
+  fixedRuler->Enable();
+  DALI_TEST_EQUALS(fixedRuler->GetTotalPages(), 4u, TEST_LOCATION);
 
-  minTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) - TIME_TOLERANCE;
-  maxTimeToReachOrigin = SCROLL_ANIMATION_DURATION + TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION * (SNAP_POSITION_WITH_DECELERATED_VELOCITY.x / Toolkit::ScrollView::DEFAULT_MAX_OVERSHOOT) + TIME_TOLERANCE;
+  fixedRuler->Disable();
+  DALI_TEST_EQUALS(fixedRuler->GetTotalPages(), 1u, TEST_LOCATION);
 
-  DALI_TEST_CHECK( (timeToReachOrigin > minTimeToReachOrigin) &&
-                   (timeToReachOrigin < maxTimeToReachOrigin) );
   END_TEST;
 }
 
-int UtcDaliScrollViewSnapAlphaFunction(void)
+int UtcDaliToolkitScrollViewFixedRulerGetPageFromPositionP(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewSnapAlphaFunction");
+  tet_infoline(" UtcDaliToolkitScrollViewFixedRulerGetPageFromPositionP");
+
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+  fixedRuler->SetDomain(RulerDomain(0.0f, 400.0f, true));
+
+  fixedRuler->Enable();
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, true), 3u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, false), 3u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, true), 1u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, false), 0u, TEST_LOCATION);
+
+  fixedRuler->Disable();
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, false), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, false), 0u, TEST_LOCATION);
+
+  // Set domain size to be smaller than the ruler space
+  fixedRuler->SetDomain(RulerDomain(0.0f, 50.0f, true));
+
+  fixedRuler->Enable();
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, false), 3u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, false), 0u, TEST_LOCATION);
+
+  fixedRuler->Disable();
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(250.0f, false), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, true), 0u, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->GetPageFromPosition(-350.0f, false), 0u, TEST_LOCATION);
 
-  // Set up a scrollView...
-  ScrollView scrollView = ScrollView::New();
-  scrollView.SetScrollSnapAlphaFunction( AlphaFunctions::EaseIn );
-  DALI_TEST_CHECK( scrollView.GetScrollSnapAlphaFunction() == AlphaFunctions::EaseIn );
-  scrollView.SetScrollSnapAlphaFunction( AlphaFunctions::EaseOut );
-  DALI_TEST_CHECK( scrollView.GetScrollSnapAlphaFunction() == AlphaFunctions::EaseOut );
+  END_TEST;
+}
+
+int UtcDaliToolkitScrollViewFixedRulerSnapP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewFixedRulerSnapP");
+
+  RulerPtr fixedRuler = new FixedRuler(100.0f);
+  fixedRuler->SetDomain(RulerDomain(0.0f, 400.0f, true));
+
+  DALI_TEST_EQUALS(fixedRuler->Snap(-30.0f, 0.0f), -100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-70.0f, 0.0f), -100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-120.0f, 0.0f), -200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-480.0f, 0.0f), -500.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(20.0f, 0.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(50.0f, 0.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(80.0f, 0.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(100.0f, 0.0f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(120.0f, 0.0f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(250.0f, 0.0f), 200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(620.0f, 0.0f), 600.0f, TEST_LOCATION);
+
+  DALI_TEST_EQUALS(fixedRuler->Snap(-30.0f, 0.5f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-70.0f, 0.5f), -100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-120.0f, 0.5f), -100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-480.0f, 0.5f), -500.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(20.0f, 0.5f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(50.0f, 0.5f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(80.0f, 0.5f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(100.0f, 0.5f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(120.0f, 0.5f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(250.0f, 0.5f), 300.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(620.0f, 0.5f), 600.0f, TEST_LOCATION);
+
+  DALI_TEST_EQUALS(fixedRuler->Snap(-30.0f, 1.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-70.0f, 1.0f), 0.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-120.0f, 1.0f), -100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(-480.0f, 1.0f), -400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(20.0f, 1.0f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(50.0f, 1.0f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(80.0f, 1.0f), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(100.0f, 1.0f), 200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(120.0f, 1.0f), 200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(250.0f, 1.0f), 300.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(fixedRuler->Snap(620.0f, 1.0f), 700.0f, TEST_LOCATION);
 
-  scrollView.SetScrollFlickAlphaFunction( AlphaFunctions::Bounce );
-  DALI_TEST_CHECK( scrollView.GetScrollFlickAlphaFunction() == AlphaFunctions::Bounce );
-  scrollView.SetScrollFlickAlphaFunction( AlphaFunctions::BounceBack );
-  DALI_TEST_CHECK( scrollView.GetScrollFlickAlphaFunction() == AlphaFunctions::BounceBack );
   END_TEST;
 }
 
-int UtcDaliScrollViewSnapDuration(void)
+int UtcDaliToolkitScrollViewConstraintsMove(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewSnapDuration");
+  tet_infoline(" UtcDaliToolkitScrollViewConstraintsMove");
 
   // Set up a scrollView...
   ScrollView scrollView = ScrollView::New();
-  scrollView.SetScrollSnapDuration( 1.0f );
-  DALI_TEST_EQUALS( scrollView.GetScrollSnapDuration(), 1.0f, TEST_LOCATION );
-  scrollView.SetScrollSnapDuration( 0.5f );
-  DALI_TEST_EQUALS( scrollView.GetScrollSnapDuration(), 0.5f, TEST_LOCATION );
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+
+  // Position rulers.
+  RulerPtr rulerX = new DefaultRuler();
+  RulerPtr rulerY = new DefaultRuler();
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  // Add an Actor to ScrollView,
+  Actor a = Actor::New();
+  scrollView.Add(a);
+  a.SetProperty(Actor::Property::POSITION, TEST_ACTOR_POSITION);
+  Wait(application);
+
+  const Vector2 target  = Vector2(100.0f, 100.0f);
+  const Vector2 target2 = Vector2(200.0f, 200.0f);
+
+  Constraint constraint = Constraint::New<Vector3>(scrollView, Actor::Property::POSITION, MoveActorConstraint);
+  constraint.AddSource(Source(scrollView, ScrollView::Property::SCROLL_POSITION));
+  constraint.SetRemoveAction(Constraint::DISCARD);
+  scrollView.ApplyConstraintToChildren(constraint);
+
+  scrollView.ScrollTo(target, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
+  scrollView.ScrollTo(target2);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-  scrollView.SetScrollFlickDuration( 2.0f );
-  DALI_TEST_EQUALS( scrollView.GetScrollFlickDuration(), 2.0f, TEST_LOCATION );
-  scrollView.SetScrollFlickDuration( 1.5f );
-  DALI_TEST_EQUALS( scrollView.GetScrollFlickDuration(), 1.5f, TEST_LOCATION );
   END_TEST;
 }
 
-int UtcDaliScrollViewSignalsSnapStart(void)
+int UtcDaliToolkitScrollViewConstraintsWrap(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewSignalsSnapStart");
+  tet_infoline(" UtcDaliToolkitScrollViewConstraintsWrap");
 
   // Set up a scrollView...
   ScrollView scrollView = ScrollView::New();
-  Stage::GetCurrent().Add( scrollView );
-  Vector2 stageSize = Stage::GetCurrent().GetSize();
-  scrollView.SetSize(stageSize);
-  scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
-  scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+  application.GetScene().Add(scrollView);
+  Vector2 stageSize = application.GetScene().GetSize();
+  scrollView.SetProperty(Actor::Property::SIZE, stageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
 
   // Position rulers.
   RulerPtr rulerX = new DefaultRuler();
   RulerPtr rulerY = new DefaultRuler();
-  rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
-  rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
+  rulerX->SetDomain(RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true));
+  rulerY->SetDomain(RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true));
   scrollView.SetRulerX(rulerX);
   scrollView.SetRulerY(rulerY);
-  scrollView.SnapStartedSignal().Connect( &OnSnapStart );
 
-  scrollView.ScrollTo(CLAMP_START_SCROLL_POSITION, 0.0f); // move in a little.
+  // Add an Actor to ScrollView,
+  Actor a = Actor::New();
+  scrollView.Add(a);
+  a.SetProperty(Actor::Property::POSITION, TEST_ACTOR_POSITION);
   Wait(application);
 
-  // First try a snap.
-  PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(0.5f, 0.0f), 60, true);
+  const Vector2 target  = Vector2(100.0f, 100.0f);
+  const Vector2 target2 = Vector2(200.0f, 200.0f);
+
+  Constraint constraint = Constraint::New<Vector3>(scrollView, Actor::Property::POSITION, WrapActorConstraint);
+  constraint.AddSource(LocalSource(Actor::Property::SCALE));
+  constraint.AddSource(LocalSource(Actor::Property::ANCHOR_POINT));
+  constraint.AddSource(LocalSource(Actor::Property::SIZE));
+  constraint.AddSource(Source(scrollView, Toolkit::Scrollable::Property::SCROLL_POSITION_MIN));
+  constraint.AddSource(Source(scrollView, Toolkit::Scrollable::Property::SCROLL_POSITION_MAX));
+  constraint.AddSource(Source(scrollView, Toolkit::ScrollView::Property::WRAP));
+  constraint.SetRemoveAction(Constraint::DISCARD);
+  scrollView.ApplyConstraintToChildren(constraint);
 
-  DALI_TEST_CHECK( gOnSnapStartCalled );
-  DALI_TEST_CHECK( gLastSnapType == Toolkit::Snap );
+  scrollView.ScrollTo(target, 0.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION);
+  scrollView.ScrollTo(target2);
+  Wait(application, RENDER_DELAY_SCROLL);
+  DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION);
 
-  // Second try a swipe.
-  PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(20.0f, 0.0f), 60, true);
+  scrollView.Remove(a);
+  Wait(application);
 
-  DALI_TEST_CHECK( gOnSnapStartCalled );
-  DALI_TEST_CHECK( gLastSnapType == Toolkit::Flick );
   END_TEST;
 }
 
+// Non-API test (so no P or N variant).
+int UtcDaliToolkitScrollViewGesturePageLimit(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitScrollViewGesturePageLimit");
+
+  // Set up a scrollView.
+  ScrollView scrollView = ScrollView::New();
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 viewPageSize(720.0f, 1280.0f);
+  scrollView.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
+  scrollView.SetProperty(Actor::Property::SIZE, viewPageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+  scrollView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
+
+  // Position rulers.
+  // We set the X ruler to fixed to give us pages to snap to.
+  Dali::Toolkit::FixedRuler* rulerX = new Dali::Toolkit::FixedRuler(viewPageSize.width);
+  // Note: The 3x page width is arbitary, but we need enough to show that we are
+  // capping page movement by the page limiter, and not the domain.
+  rulerX->SetDomain(Dali::Toolkit::RulerDomain(0.0f, viewPageSize.width * 3.0f, false));
+  Dali::Toolkit::RulerPtr rulerY = new Dali::Toolkit::DefaultRuler();
+  rulerY->Disable();
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.SetWrapMode(false);
+  scrollView.SetScrollSensitive(true);
+
+  application.GetScene().Add(scrollView);
+
+  // Set up a gesture to perform.
+  Vector2 startPos(50.0f, 0.0f);
+  Vector2 direction(-5.0f, 0.0f);
+  int     frames = 200;
+
+  // Force starting position.
+  scrollView.ScrollTo(startPos, 0.0f);
+  uint32_t time = 0;
+  time += Wait(application);
+
+  // Deliberately skip the "Finished" part of the gesture, so we can read the coordinates before the snap begins.
+  Vector2 currentPos(PerformGestureSwipe(application, startPos, direction, frames - 1, time, false));
+
+  // Confirm the final X coord has not moved more than one page from the start X position.
+  DALI_TEST_GREATER((startPos.x + viewPageSize.width), scrollView.GetCurrentScrollPosition().x, TEST_LOCATION);
+
+  // Finish the gesture and wait for the snap.
+  currentPos += direction;
+  TestEndPan(application, currentPos, time);
+  // We add RENDER_FRAME_INTERVAL on to wait for an extra frame (for the last "finished" gesture to complete first.
+  time += Wait(application, RENDER_DELAY_SCROLL + RENDER_FRAME_INTERVAL);
+
+  // Confirm the final X coord has snapped to exactly one page ahead of the start page.
+  DALI_TEST_EQUALS(viewPageSize.width, scrollView.GetCurrentScrollPosition().x, Math::MACHINE_EPSILON_0, TEST_LOCATION);
 
-int UtcDaliScrollViewSetMouseWheelScrollDistanceStep(void)
+  END_TEST;
+}
+
+int UtcDaliScrollViewSetGetProperty(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewSetMouseWheelScrollDistanceStep");
 
+  // Create the ScrollView actor
   ScrollView scrollView = ScrollView::New();
-  // Disable Refresh signal (TET environment cannot use adaptor's Timer)
-  scrollView.SetMouseWheelScrollDistanceStep(Vector2(30.0f, 15.0f));
-  DALI_TEST_EQUALS( scrollView.GetMouseWheelScrollDistanceStep(), Vector2(30.0f, 15.0f), TEST_LOCATION );
-  scrollView.SetMouseWheelScrollDistanceStep(Vector2(60.0f, 30.0f));
-  DALI_TEST_EQUALS( scrollView.GetMouseWheelScrollDistanceStep(), Vector2(60.0f, 30.0f), TEST_LOCATION);
+  DALI_TEST_CHECK(scrollView);
+
+  // Event side properties
+
+  // Test "wrapEnabled" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("wrapEnabled") == ScrollView::Property::WRAP_ENABLED);
+  scrollView.SetProperty(ScrollView::Property::WRAP_ENABLED, true);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::WRAP_ENABLED).Get<bool>(), true, TEST_LOCATION);
+
+  // Test "panningEnabled" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("panningEnabled") == ScrollView::Property::PANNING_ENABLED);
+  scrollView.SetProperty(ScrollView::Property::PANNING_ENABLED, false);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::PANNING_ENABLED).Get<bool>(), false, TEST_LOCATION);
+
+  // Test "axisAutoLockEnabled" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("axisAutoLockEnabled") == ScrollView::Property::AXIS_AUTO_LOCK_ENABLED);
+  scrollView.SetProperty(ScrollView::Property::AXIS_AUTO_LOCK_ENABLED, false);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::AXIS_AUTO_LOCK_ENABLED).Get<bool>(), false, TEST_LOCATION);
+
+  // Test "wheelScrollDistanceStep" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("wheelScrollDistanceStep") == ScrollView::Property::WHEEL_SCROLL_DISTANCE_STEP);
+  scrollView.SetProperty(ScrollView::Property::WHEEL_SCROLL_DISTANCE_STEP, Vector2(100.0f, 50.0f));
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::WHEEL_SCROLL_DISTANCE_STEP).Get<Vector2>(), Vector2(100.0f, 50.0f), TEST_LOCATION);
+
+  // Test "overshootEnabled" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("overshootEnabled") == Scrollable::Property::OVERSHOOT_ENABLED);
+  DALI_TEST_EQUALS(scrollView.GetProperty(Scrollable::Property::OVERSHOOT_ENABLED).Get<bool>(), scrollView.IsOvershootEnabled(), TEST_LOCATION);
+  scrollView.SetProperty(Scrollable::Property::OVERSHOOT_ENABLED, false);
+  DALI_TEST_EQUALS(scrollView.GetProperty(Scrollable::Property::OVERSHOOT_ENABLED).Get<bool>(), false, TEST_LOCATION);
+
+  // Animatable properties
+
+  // Test "scrollPosition" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPosition") == ScrollView::Property::SCROLL_POSITION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_POSITION, Vector2(320.0f, 550.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_POSITION).Get<Vector2>(), Vector2(320.0f, 550.0f), TEST_LOCATION);
+
+  // Test "scrollPrePosition", "scrollPrePositionX" and "scrollPrePositionY" properties
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPrePosition") == ScrollView::Property::SCROLL_PRE_POSITION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_PRE_POSITION, Vector2(300.0f, 500.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION).Get<Vector2>(), Vector2(300.0f, 500.0f), TEST_LOCATION);
+
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPrePositionX") == ScrollView::Property::SCROLL_PRE_POSITION_X);
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPrePositionY") == ScrollView::Property::SCROLL_PRE_POSITION_Y);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_X).Get<float>(), 300.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_Y).Get<float>(), 500.0f, TEST_LOCATION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_PRE_POSITION_X, 400.0f);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_PRE_POSITION_Y, 600.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_X).Get<float>(), 400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_Y).Get<float>(), 600.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION).Get<Vector2>(), Vector2(400.0f, 600.0f), TEST_LOCATION);
+
+  // Test "scrollPrePositionMax", "scrollPrePositionMaxX" and "scrollPrePositionMaxY" properties
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPrePositionMax") == ScrollView::Property::SCROLL_PRE_POSITION_MAX);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX, Vector2(100.0f, 200.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX).Get<Vector2>(), Vector2(100.0f, 200.0f), TEST_LOCATION);
+
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPrePositionMaxX") == ScrollView::Property::SCROLL_PRE_POSITION_MAX_X);
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPrePositionMaxY") == ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_X).Get<float>(), 100.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y).Get<float>(), 200.0f, TEST_LOCATION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_X, 300.0f);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y, 400.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_X).Get<float>(), 300.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y).Get<float>(), 400.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX).Get<Vector2>(), Vector2(300.0f, 400.0f), TEST_LOCATION);
+
+  // Test "overshootX" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("overshootX") == ScrollView::Property::OVERSHOOT_X);
+  scrollView.SetProperty(ScrollView::Property::OVERSHOOT_X, 0.8f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::OVERSHOOT_X).Get<float>(), 0.8f, TEST_LOCATION);
+
+  // Test "overshootY" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("overshootY") == ScrollView::Property::OVERSHOOT_Y);
+  scrollView.SetProperty(ScrollView::Property::OVERSHOOT_Y, 0.8f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::OVERSHOOT_Y).Get<float>(), 0.8f, TEST_LOCATION);
+
+  // Test "scrollFinal", "scrollFinalX" and "scrollFinalY" properties
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollFinal") == ScrollView::Property::SCROLL_FINAL);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_FINAL, Vector2(200.0f, 300.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL).Get<Vector2>(), Vector2(200.0f, 300.0f), TEST_LOCATION);
+
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollFinalX") == ScrollView::Property::SCROLL_FINAL_X);
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollFinalY") == ScrollView::Property::SCROLL_FINAL_Y);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL_X).Get<float>(), 200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL_Y).Get<float>(), 300.0f, TEST_LOCATION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_FINAL_X, 500.0f);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_FINAL_Y, 600.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL_X).Get<float>(), 500.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL_Y).Get<float>(), 600.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL).Get<Vector2>(), Vector2(500.0f, 600.0f), TEST_LOCATION);
+
+  // Test "wrap" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("wrap") == ScrollView::Property::WRAP);
+  scrollView.SetProperty(ScrollView::Property::WRAP, false);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::WRAP).Get<bool>(), false, TEST_LOCATION);
+
+  // Test "panning" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("panning") == ScrollView::Property::PANNING);
+  scrollView.SetProperty(ScrollView::Property::PANNING, true);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::PANNING).Get<bool>(), true, TEST_LOCATION);
+
+  // Test "scrolling" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrolling") == ScrollView::Property::SCROLLING);
+  scrollView.SetProperty(ScrollView::Property::SCROLLING, false);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLLING).Get<bool>(), false, TEST_LOCATION);
+
+  // Test "scrollDomainSize", "scrollDomainSizeX" and "scrollDomainSizeY" properties
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollDomainSize") == ScrollView::Property::SCROLL_DOMAIN_SIZE);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE, Vector2(1200.0f, 1300.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE).Get<Vector2>(), Vector2(1200.0f, 1300.0f), TEST_LOCATION);
+
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollDomainSizeX") == ScrollView::Property::SCROLL_DOMAIN_SIZE_X);
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollDomainSizeY") == ScrollView::Property::SCROLL_DOMAIN_SIZE_Y);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_X).Get<float>(), 1200.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_Y).Get<float>(), 1300.0f, TEST_LOCATION);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_X, 1500.0f);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_Y, 1600.0f);
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_X).Get<float>(), 1500.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_Y).Get<float>(), 1600.0f, TEST_LOCATION);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE).Get<Vector2>(), Vector2(1500.0f, 1600.0f), TEST_LOCATION);
+
+  // Test "scrollDomainOffset" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollDomainOffset") == ScrollView::Property::SCROLL_DOMAIN_OFFSET);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_DOMAIN_OFFSET, Vector2(500.0f, 200.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_OFFSET).Get<Vector2>(), Vector2(500.0f, 200.0f), TEST_LOCATION);
+
+  // Test "scrollPositionDelta" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("scrollPositionDelta") == ScrollView::Property::SCROLL_POSITION_DELTA);
+  scrollView.SetProperty(ScrollView::Property::SCROLL_POSITION_DELTA, Vector2(10.0f, 30.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_POSITION_DELTA).Get<Vector2>(), Vector2(10.0f, 30.0f), TEST_LOCATION);
+
+  // Test "startPagePosition" property
+  DALI_TEST_CHECK(scrollView.GetPropertyIndex("startPagePosition") == ScrollView::Property::START_PAGE_POSITION);
+  scrollView.SetProperty(ScrollView::Property::START_PAGE_POSITION, Vector3(50.0f, 100.0f, 20.0f));
+  Wait(application);
+  DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::START_PAGE_POSITION).Get<Vector3>(), Vector3(50.0f, 100.0f, 20.0f), TEST_LOCATION);
+
   END_TEST;
 }
 
-int UtcDaliScrollViewGetSet(void)
+int UtcDaliToolkitScrollViewWheelEvent(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliScrollViewGetSet");
+
+  // Set up a scrollView.
   ScrollView scrollView = ScrollView::New();
-  scrollView.SetMaxOvershoot(50.0f, 50.0f);
-  scrollView.SetMaxFlickSpeed(0.5f);
-  DALI_TEST_EQUALS(scrollView.GetMaxFlickSpeed(), 0.5f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
-  scrollView.SetFrictionCoefficient(0.6f);
-  DALI_TEST_EQUALS(scrollView.GetFrictionCoefficient(), 0.6f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
-  scrollView.SetFlickSpeedCoefficient(0.7f);
-  DALI_TEST_EQUALS(scrollView.GetFlickSpeedCoefficient(), 0.7f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 viewPageSize(720.0f, 1280.0f);
+  scrollView.SetResizePolicy(ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS);
+  scrollView.SetProperty(Actor::Property::SIZE, viewPageSize);
+  scrollView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+  scrollView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+  scrollView.SetProperty(Actor::Property::POSITION, Vector3(0.0f, 0.0f, 0.0f));
+
+  // Position rulers.
+  // We set the X ruler to fixed to give us pages to snap to.
+  Dali::Toolkit::FixedRuler* rulerX = new Dali::Toolkit::FixedRuler(viewPageSize.width);
+  // Note: The 3x page width is arbitary, but we need enough to show that we are
+  // capping page movement by the page limiter, and not the domain.
+  rulerX->SetDomain(Dali::Toolkit::RulerDomain(0.0f, viewPageSize.width * 3.0f, false));
+  Dali::Toolkit::RulerPtr rulerY = new Dali::Toolkit::DefaultRuler();
+  rulerY->Disable();
+  scrollView.SetRulerX(rulerX);
+  scrollView.SetRulerY(rulerY);
+
+  scrollView.SetWrapMode(false);
+
+  application.GetScene().Add(scrollView);
+
+  //Connect to wheel event signal
+  scrollView.WheelEventSignal().Connect(&OnWheelEvent);
+
+  DALI_TEST_CHECK(!gOnWheelEventCalled);
+
+  // Render and notify
+  application.Render();
+  application.SendNotification();
+  application.Render();
+  application.SendNotification();
+
+  // Perform a wheel event
+  Dali::Integration::WheelEvent wheelEvent(Dali::Integration::WheelEvent::MOUSE_WHEEL, 0, 0u, Vector2(10.0f, 10.0f), 1, 1000u);
+  application.ProcessEvent(wheelEvent);
+  DALI_TEST_CHECK(gOnWheelEventCalled);
+
+  // Set X ruler to free
+  Dali::Toolkit::DefaultRuler* defaultRuler = new Dali::Toolkit::DefaultRuler();
+  scrollView.SetRulerX(defaultRuler);
+
+  // Perform a wheel event
+  gOnWheelEventCalled = false;
+  application.ProcessEvent(wheelEvent);
+  DALI_TEST_CHECK(gOnWheelEventCalled);
+
+  // Enable Y ruler
+  rulerY->Enable();
+
+  // Perform a wheel event
+  gOnWheelEventCalled = false;
+  application.ProcessEvent(wheelEvent);
+  DALI_TEST_CHECK(gOnWheelEventCalled);
+
+  // Wait until it finishes scrolling
+  Wait(application, RENDER_DELAY_SCROLL);
+
+  // Set Y ruler to fixed
+  Dali::Toolkit::FixedRuler* fixedRulerY = new Dali::Toolkit::FixedRuler(viewPageSize.height);
+  scrollView.SetRulerY(fixedRulerY);
+
+  // Perform a wheel event
+  gOnWheelEventCalled = false;
+  application.ProcessEvent(wheelEvent);
+  DALI_TEST_CHECK(gOnWheelEventCalled);
+
   END_TEST;
 }