X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-ScrollView.cpp;h=fd01efe3f6812bb17e4ab97aa0afd01985469191;hb=ded68bd82415ca96ae7ec9926cdd3cda8bc05707;hp=10d2e61700607272195e7544d3379a31cfd87f05;hpb=df89f9f230cadaac7be4007d1b1a7cf7dc893011;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ScrollView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ScrollView.cpp index 10d2e61..3c12af6 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ScrollView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ScrollView.cpp @@ -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. @@ -15,12 +15,12 @@ * */ -#include -#include #include #include #include -#include +#include +#include +#include using namespace Dali; using namespace Toolkit; @@ -44,81 +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 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 TEST_RATIO_TOLERANCE = 0.05; ///< +/-5% tolerance for ratio comparisons. - -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) - - -// 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. @@ -133,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); @@ -145,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 Vector2& position ) +static void OnScrollStart(const Vector2& position) { gOnScrollStartCalled = true; } @@ -167,7 +132,7 @@ static void OnScrollStart( const Vector2& position ) * * @param[in] position The current scroll position. */ -static void OnScrollUpdate( const Vector2& position ) +static void OnScrollUpdate(const Vector2& position) { gOnScrollUpdateCalled = true; } @@ -177,7 +142,7 @@ static void OnScrollUpdate( const Vector2& position ) * * @param[in] position The current scroll position. */ -static void OnScrollComplete( const Vector2& position ) +static void OnScrollComplete(const Vector2& position) { gOnScrollCompleteCalled = true; } @@ -187,10 +152,23 @@ static void OnScrollComplete( const Vector2& 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; } /** @@ -206,7 +184,7 @@ struct TestSumConstraint * @param[in] offset The offset to be added to current. */ TestSumConstraint(const Vector3& offset) - :mOffset(offset) + : mOffset(offset) { } @@ -215,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 + Vector3(inputs[0]->GetVector2()) + mOffset; - current = gConstraintResult; + current = gConstraintResult; } Vector3 mOffset; - }; /** @@ -230,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(ToolkitTestApplication& application, ScrollView scrollView) { int timeToReachOrigin = -1; - for(int i = 0;i(ScrollView::Property::OVERSHOOT_X); - float overshootYValue = scrollView.GetProperty(ScrollView::Property::OVERSHOOT_Y); + float overshootXValue = scrollView.GetCurrentProperty(ScrollView::Property::OVERSHOOT_X); + float overshootYValue = scrollView.GetCurrentProperty(ScrollView::Property::OVERSHOOT_Y); if(overshootXValue == 0.0f && overshootYValue == 0.0f) { break; @@ -259,932 +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(ScrollView::Property::SCROLL_POSITION) == scrollView.GetProperty(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 ); - - const Vector2 target = Vector2(100.0f, 200.0f); - const Vector2 target2 = Vector2(300.0f, 100.0f); + 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(ScrollView::Property::SCROLL_POSITION), Vector2(10.0f, 10.0f), TEST_LOCATION); - 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(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.SetProperty(ScrollView::Property::SCROLL_POSITION, Vector2(10.0f, 10.0f)); - scrollView.ScrollTo( 1, 0.0f ); - Wait(application); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector2(100.0f, 0.0f), TEST_LOCATION ); - - scrollView.ScrollTo( 5, 0.0f ); - Wait(application); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector2(500.0f, 0.0f), TEST_LOCATION ); - - scrollView.ScrollTo( 10, 0.0f ); - Wait(application); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector2(200.0f, 100.0f), TEST_LOCATION ); + ScrollView copy; + copy = scrollView; + DALI_TEST_CHECK(copy); + DALI_TEST_CHECK(copy.GetProperty(ScrollView::Property::SCROLL_POSITION) == scrollView.GetProperty(ScrollView::Property::SCROLL_POSITION)); + END_TEST; +} - scrollView.ScrollTo( 15, 0.0f ); - Wait(application); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector2(700.0f, 100.0f), TEST_LOCATION ); - DALI_TEST_EQUALS( static_cast(scrollView.GetCurrentPage()), 15, TEST_LOCATION ); +int UtcDaliScrollViewMoveAssignment(void) +{ + ToolkitTestApplication application; - 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(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(ScrollView::Property::SCROLL_POSITION), Vector2(10.0f, 10.0f), 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(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(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(), Vector2(0.0f, 0.0f), TEST_LOCATION ); - DALI_TEST_EQUALS( static_cast(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.GetVectorXY(), TEST_LOCATION ); + ScrollView scrollView2(scrollView); - Wait(application); - scrollView.ScrollTo(actorB, 0.0f); - Wait(application); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionB.GetVectorXY(), TEST_LOCATION ); + DALI_TEST_CHECK(scrollView2 == scrollView); - scrollView.ScrollTo(actorA); - Wait(application, RENDER_DELAY_SCROLL); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionA.GetVectorXY(), 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.GetVectorXY(), 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( Vector2(120.0f, 190.0f), 0.0f ); - Wait(application); - DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector2(120.0f, 190.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(), Vector2(100.0f, 200.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(Vector2(225.0f, 125.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(scrollView.GetCurrentPage()), 17, TEST_LOCATION ); - scrollView.SetWrapMode(true); - DALI_TEST_EQUALS( static_cast(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(), true, TEST_LOCATION); - // 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(); + 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.GetVectorXY(), TEST_LOCATION ); + DALI_TEST_EQUALS(scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION); - scrollView.ScrollTo(Vector2(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(), 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(), aPosition.GetVectorXY(), TEST_LOCATION ); + 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( Vector2(100.0f, 100.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;iSetDomain(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(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(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(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(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(Vector2(100.0f, 100.0f), 0.0f); // move in a little. - Wait(application); - Vector2 startPosition = scrollView.GetCurrentScrollPosition(); - PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(5.0f, 1.0f), 50, true); // mostly horizontal - const Vector2 positionAfterNormal = scrollView.GetCurrentScrollPosition(); + scrollView.SetWrapMode(false); + scrollView.SetScrollSensitive(true); - // Autolock - scrollView.SetAxisAutoLock(true); - DALI_TEST_CHECK(scrollView.GetAxisAutoLock()); + 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; + 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.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); + + // 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(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(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(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(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); - scrollView.ScrollTo(Vector2(100.0f, 100.0f), 0.0f); // move in a little. - Wait(application); - PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(5.0f, 1.0f), 50, true); // mostly horizontal 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); + // 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(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(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(), 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(ScrollView::Property::OVERSHOOT_X); + float overshootYValue = scrollView.GetCurrentProperty(ScrollView::Property::OVERSHOOT_Y); + Vector2 positionValue = scrollView.GetCurrentProperty(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(scrollView.GetCurrentPage()), 15, TEST_LOCATION); + + scrollView.ScrollTo(3); + Wait(application, RENDER_DELAY_SCROLL); + DALI_TEST_EQUALS(static_cast(scrollView.GetCurrentPage()), 3, TEST_LOCATION); + + scrollView.ScrollTo(9); + Wait(application, RENDER_DELAY_SCROLL); + DALI_TEST_EQUALS(static_cast(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(ScrollView::Property::OVERSHOOT_X); + float overshootYValue = scrollView.GetCurrentProperty(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(ScrollView::Property::OVERSHOOT_X); + overshootYValue = scrollView.GetCurrentProperty(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(ScrollView::Property::OVERSHOOT_X); + overshootYValue = scrollView.GetCurrentProperty(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(ScrollView::Property::OVERSHOOT_X); + overshootYValue = scrollView.GetCurrentProperty(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(ScrollView::Property::OVERSHOOT_X); + overshootYValue = scrollView.GetCurrentProperty(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(); + 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 UtcDaliToolkitScrollViewRulerDomainClampWithStateP(void) +{ + ToolkitTestApplication application; + + RulerDomain domainX = RulerDomain(0.0f, 200.0f, true); + + 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); + + 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); - // in auto-lock it should be a mostly horizontal pan (thus deviance should be much lower) - DALI_TEST_CHECK(devianceAutoLock < devianceNormal); + 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); - scrollView.SetAxisAutoLock(false); - DALI_TEST_CHECK(!scrollView.GetAxisAutoLock()); END_TEST; } -int UtcDaliScrollViewAxisAutoLockGradient(void) +int UtcDaliToolkitScrollViewDefaultRulerConstructorP(void) { ToolkitTestApplication application; - tet_infoline(" UtcDaliScrollViewAxisAutoLockGradient"); + tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerConstructorP"); + + RulerPtr defaultRuler = new DefaultRuler(); + DALI_TEST_CHECK(defaultRuler); - // 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 UtcDaliScrollViewConstraints(void) +int UtcDaliToolkitScrollViewDefaultRulerDestructorP(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); + tet_infoline(" UtcDaliToolkitScrollViewDefaultRulerDestructorP"); - // 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); + RulerPtr defaultRuler = new DefaultRuler(); - // 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); + DALI_TEST_CHECK(true); + END_TEST; +} - Constraint constraint = Constraint::New( 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); +int UtcDaliToolkitScrollViewFixedRulerConstructorP(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliToolkitScrollViewFixedRulerConstructorP"); - DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION ); + RulerPtr fixedRuler = new FixedRuler(100.0f); + DALI_TEST_CHECK(fixedRuler); - gConstraintResult = Vector3::ZERO; - scrollView.RemoveConstraintsFromChildren(); - Wait(application); + fixedRuler = new FixedRuler(0.0f); + DALI_TEST_CHECK(fixedRuler); - DALI_TEST_EQUALS( gConstraintResult, Vector3::ZERO, TEST_LOCATION ); END_TEST; } -int UtcDaliScrollViewBind(void) +int UtcDaliToolkitScrollViewFixedRulerDestructorP(void) { ToolkitTestApplication application; - tet_infoline(" UtcDaliScrollViewBind"); + tet_infoline(" UtcDaliToolkitScrollViewFixedRulerDestructorP"); - // 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 fixedRuler = new FixedRuler(100.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); + DALI_TEST_CHECK(true); + END_TEST; +} - // Add an Actor to ScrollView, - // Apply TestSumConstraint to ScrollView's children (includes this Actor) +int UtcDaliToolkitScrollViewRulerGetTypeP(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliToolkitScrollViewRulerGetTypeP"); - gConstraintResult = Vector3::ZERO; - Actor a = Actor::New(); - scrollView.Add(a); - a.SetPosition( TEST_ACTOR_POSITION ); - Wait(application); + RulerPtr defaultRuler = new DefaultRuler(); + DALI_TEST_CHECK(defaultRuler); + DALI_TEST_EQUALS(defaultRuler->GetType(), Dali::Toolkit::Ruler::FREE, TEST_LOCATION); - // apply this constraint to scrollview - Constraint constraint = Constraint::New( scrollView, Actor::Property::POSITION, TestSumConstraint( TEST_CONSTRAINT_OFFSET ) ); - constraint.AddSource( Source(scrollView, ScrollView::Property::SCROLL_POSITION) ); - constraint.SetRemoveAction(Constraint::Discard); - scrollView.ApplyConstraintToChildren(constraint); + RulerPtr fixedRuler = new FixedRuler(100.0f); + DALI_TEST_CHECK(fixedRuler); + DALI_TEST_EQUALS(fixedRuler->GetType(), Dali::Toolkit::Ruler::FIXED, TEST_LOCATION); - 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 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(ScrollView::Property::OVERSHOOT_X); - float overshootYValue = scrollView.GetProperty(ScrollView::Property::OVERSHOOT_Y); - Vector2 positionValue = scrollView.GetProperty(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); +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 + 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; +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 / 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; + 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 / 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; + 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 / 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; + 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( 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 ); + END_TEST; +} - scrollView.SetScrollFlickAlphaFunction( AlphaFunction::BOUNCE ); - DALI_TEST_CHECK( scrollView.GetScrollFlickAlphaFunction().GetBuiltinFunction() == AlphaFunction::BOUNCE ); +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); 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(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(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(), 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(), 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(), 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(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(), scrollView.IsOvershootEnabled(), TEST_LOCATION); + scrollView.SetProperty(Scrollable::Property::OVERSHOOT_ENABLED, false); + DALI_TEST_EQUALS(scrollView.GetProperty(Scrollable::Property::OVERSHOOT_ENABLED).Get(), 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(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(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(), 300.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_Y).Get(), 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(), 400.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_Y).Get(), 600.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION).Get(), 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(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(), 100.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y).Get(), 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(), 300.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX_Y).Get(), 400.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_PRE_POSITION_MAX).Get(), 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(), 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(), 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(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(), 200.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL_Y).Get(), 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(), 500.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL_Y).Get(), 600.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_FINAL).Get(), 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(), 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(), 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(), 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(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(), 1200.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_Y).Get(), 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(), 1500.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE_Y).Get(), 1600.0f, TEST_LOCATION); + DALI_TEST_EQUALS(scrollView.GetProperty(ScrollView::Property::SCROLL_DOMAIN_SIZE).Get(), 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(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(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(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; }