Merge remote-tracking branch 'origin/tizen' into new_text
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ScrollView.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <iostream>
19 #include <stdlib.h>
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <dali-toolkit/dali-toolkit.h>
22 #include <dali/integration-api/events/touch-event-integ.h>
23 #include <dali/integration-api/events/pan-gesture-event.h>
24
25 using namespace Dali;
26 using namespace Toolkit;
27
28 void scroll_view_startup(void)
29 {
30   test_return_value = TET_UNDEF;
31 }
32
33 void scroll_view_cleanup(void)
34 {
35   test_return_value = TET_PASS;
36 }
37
38 namespace
39 {
40 static bool gObjectCreatedCallBackCalled;
41
42 static void TestCallback(BaseHandle handle)
43 {
44   gObjectCreatedCallBackCalled = true;
45 }
46
47
48 const int MILLISECONDS_PER_SECOND = 1000;
49 const int RENDER_FRAME_INTERVAL = 16;                           ///< Duration of each frame in ms. (at approx 60FPS)
50 const int RENDER_ANIMATION_TEST_DURATION_MS = 1000;             ///< 1000ms to test animation
51 const int RENDER_DELAY_SCROLL = 1000;                           ///< duration to wait for any scroll to complete.
52
53 // For Clamp Signal testing...
54 const float CLAMP_EXCESS_WIDTH = 200.0f;                        ///< Amount of width that can be panned outside scrollview
55 const float CLAMP_EXCESS_HEIGHT = 200.0f;                       ///< Amount of height that can be panned outside scrollview
56 const int CLAMP_STEP_0_CHECK_NOTCLAMPED = 0;                    ///< FSM: "First check that scrollview isn't clamped"
57 const int CLAMP_STEP_1_CHECK_CLAMPED_WEST = 1;                  ///< FSM: "Next check that scrollview clamps against left side"
58 const int CLAMP_STEP_2_CHECK_CLAMPED_SOUTH_WEST = 2;            ///< FSM: "Then check that scrollview clamps against bottom-left side"
59 const int CLAMP_STEP_3_SUCCESS = 3;                             ///< FSM: "Finished (Success)"
60 const Vector3 CLAMP_START_SCROLL_POSITION(30.0f, 100.0f, 0.0f); ///< Scroll start position for the Clamping tests.
61 const Vector2 CLAMP_TOUCH_START( 100.0f, 100.0f );              ///< Start point to touch from for the Clamping tests.
62 const Vector2 CLAMP_TOUCH_MOVEMENT( 5.0f, -5.0f );              ///< Amount to move touch for each frame for the Clamping tests.
63 const int CLAMP_GESTURE_FRAMES = 100;                           ///< Number of Frames to synthesize a gesture for the Clamping tests.
64 const Vector3 TEST_ACTOR_POSITION(100.0f, 100.0f, 0.0f);        ///< A Test actor position offset (arbitrary value)
65 const Vector3 TEST_CONSTRAINT_OFFSET(1.0f, 2.0f, 0.0f);         ///< A Test constraint offset (arbitrary value to test effects)
66 const float TEST_RATIO_TOLERANCE = 0.05;                        ///< +/-5% tolerance for ratio comparisons.
67
68 const int MAX_FRAMES_TO_TEST_OVERSHOOT = 600;                         ///< 10 seconds (at 60 frames per second).
69 const Vector3 OVERSHOOT_START_SCROLL_POSITION(100.0f, 100.0f, 0.0f);  ///< Scroll start position for the Overshoot tests.
70 const float TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION = 0.05f;             ///< a Test duration
71 const float TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION = 1.5f;              ///< another Test duration
72 const float TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION = TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION * 0.5f; // Same as above, but different alpha function.
73 const float TIME_TOLERANCE = 0.05f;                                   ///< Allow testing tolerance between a 10th of second (+/- 3 frames)
74
75
76 // Generate a PanGestureEvent to send to Core
77 Integration::PanGestureEvent GeneratePan(
78     Gesture::State state,
79     const Vector2& previousPosition,
80     const Vector2& currentPosition,
81     unsigned long timeDelta,
82     unsigned int numberOfTouches = 1)
83 {
84   Integration::PanGestureEvent pan(state);
85
86   pan.previousPosition = previousPosition;
87   pan.currentPosition = currentPosition;
88   pan.timeDelta = timeDelta;
89   pan.numberOfTouches = numberOfTouches;
90
91   return pan;
92 }
93
94 /**
95  * Helper to generate PanGestureEvent
96  *
97  * @param[in] application Application instance
98  * @param[in] state The Gesture State
99  * @param[in] pos The current position of touch.
100  */
101 static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
102 {
103   static Vector2 last;
104
105   if( (state == Gesture::Started) ||
106       (state == Gesture::Possible) )
107   {
108     last.x = pos.x;
109     last.y = pos.y;
110   }
111
112   application.ProcessEvent(GeneratePan(state, last, pos, RENDER_FRAME_INTERVAL));
113
114   last.x = pos.x;
115   last.y = pos.y;
116 }
117
118 /*
119  * Simulate time passed by.
120  *
121  * @note this will always process at least 1 frame (1/60 sec)
122  *
123  * @param application Test application instance
124  * @param duration Time to pass in milliseconds.
125  * @return The actual time passed in milliseconds
126  */
127 int Wait(ToolkitTestApplication& application, int duration = 0)
128 {
129   int time = 0;
130
131   for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
132   {
133     application.SendNotification();
134     application.Render(RENDER_FRAME_INTERVAL);
135     time += RENDER_FRAME_INTERVAL;
136   }
137
138   return time;
139 }
140
141 // Callback probes.
142
143 static bool gOnScrollStartCalled;                       ///< Whether the OnScrollStart signal was invoked.
144 static bool gOnScrollUpdateCalled;                      ///< Whether the OnScrollUpdate signal was invoked.
145 static bool gOnScrollCompleteCalled;                    ///< Whether the OnScrollComplete signal was invoked.
146 static bool gOnSnapStartCalled;                         ///< Whether the OnSnapStart signal was invoked.
147 static SnapType gLastSnapType;                          ///< Snaping information from SnapEvent.
148 static Vector3 gConstraintResult;                       ///< Result from constraint.
149
150 /**
151  * Invoked when scrolling starts.
152  *
153  * @param[in] position The current scroll position.
154  */
155 static void OnScrollStart( const Vector3& position )
156 {
157   gOnScrollStartCalled = true;
158 }
159
160 /**
161  * Invoked when scrolling updates (via dragging)
162  *
163  * @param[in] position The current scroll position.
164  */
165 static void OnScrollUpdate( const Vector3& position )
166 {
167   gOnScrollUpdateCalled = true;
168 }
169
170 /**
171  * Invoked when scrolling finishes
172  *
173  * @param[in] position The current scroll position.
174  */
175 static void OnScrollComplete( const Vector3& position )
176 {
177   gOnScrollCompleteCalled = true;
178 }
179
180 /**
181  * Invoked when a snap or flick started.
182  *
183  * @param[in] event The type of snap and the target position/scale/rotation.
184  */
185 static void OnSnapStart( const ScrollView::SnapEvent& event )
186 {
187   gOnSnapStartCalled = true;
188   gLastSnapType = event.type;
189 }
190
191 /**
192  * TestSumConstraint
193  *
194  * Summation of current value, property, and offset.
195  *
196  * current' = current + mOffset + property;
197  */
198 struct TestSumConstraint
199 {
200   /**
201    * @param[in] offset The offset to be added to current.
202    */
203   TestSumConstraint(const Vector3& offset)
204   :mOffset(offset)
205   {
206   }
207
208   /**
209    * @param[in] current The current base value
210    * @param[in] property The property to be added to current.
211    * @return The new current Vector.
212    */
213   Vector3 operator()(const Vector3& current)
214   {
215     gConstraintResult = current + mOffset;
216     return gConstraintResult;
217   }
218
219   /**
220    * @param[in] current The current base value
221    * @param[in] property The property to be added to current.
222    * @return The new current Vector.
223    */
224   Vector3 operator()(const Vector3&    current,
225                     const PropertyInput& property)
226   {
227     gConstraintResult = current + property.GetVector3() + mOffset;
228     return gConstraintResult;
229   }
230
231   Vector3 mOffset;
232
233 };
234
235 /**
236  * @param[in] application The application instance
237  * @param[in] scrollView The scrollView instance
238  * @return The time taken for the overshoot to reach origin (zero)
239  */
240 static float TestOvershootSnapDuration(ToolkitTestApplication &application, ScrollView scrollView)
241 {
242   Property::Index overshootPropertyX = scrollView.GetPropertyIndex(ScrollView::SCROLL_OVERSHOOT_X_PROPERTY_NAME);
243   Property::Index overshootPropertyY = scrollView.GetPropertyIndex(ScrollView::SCROLL_OVERSHOOT_Y_PROPERTY_NAME);
244
245   int timeToReachOrigin = -1;
246   for(int i = 0;i<MAX_FRAMES_TO_TEST_OVERSHOOT;i++)
247   {
248     float overshootXValue = scrollView.GetProperty<float>(overshootPropertyX);
249     float overshootYValue = scrollView.GetProperty<float>(overshootPropertyY);
250     if(overshootXValue == 0.0f && overshootYValue == 0.0f)
251     {
252       break;
253     }
254
255     timeToReachOrigin += Wait(application);
256   }
257
258   return static_cast<float>(timeToReachOrigin) * 0.001f; // return in seconds not ms.
259 }
260
261 /**
262  * y = 2x alpha function, which is clamped between 0.0f - 1.0f
263  *
264  * Animations should appear to finish (reach 100% point)
265  * at just half the time of a regular Linear AlphaFunction.
266  *
267  * @param[in] progress value (ranges from 0.0f - 1.0f)
268  * @return interpolation value (ranges from 0.0f - 1.0f)
269  */
270 float TestAlphaFunction(float progress)
271 {
272   return std::min( progress * 2.0f, 1.0f );
273 }
274
275 } // unnamed namespace
276
277
278 int UtcDaliScrollViewNew(void)
279 {
280   ToolkitTestApplication application;
281   tet_infoline(" UtcDaliScrollViewNew");
282
283   ScrollView scrollView;
284
285   DALI_TEST_CHECK( !scrollView );
286
287   scrollView = ScrollView::New();
288
289   DALI_TEST_CHECK( scrollView );
290
291   ScrollView scrollView2(scrollView);
292
293   DALI_TEST_CHECK( scrollView2 == scrollView );
294
295   //Additional check to ensure object is created by checking if it's registered
296   ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
297   DALI_TEST_CHECK( registry );
298
299   gObjectCreatedCallBackCalled = false;
300   registry.ObjectCreatedSignal().Connect( &TestCallback );
301   {
302     ScrollView scrollView = ScrollView::New();
303   }
304   DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
305   END_TEST;
306 }
307
308 int UtcDaliScrollViewDownCast(void)
309 {
310   ToolkitTestApplication application;
311   tet_infoline(" UtcDaliScrollViewDownCast");
312
313   ScrollView scrollView = ScrollView::New();
314   BaseHandle handle(scrollView);
315
316   ScrollView newScrollView = ScrollView::DownCast( handle );
317   DALI_TEST_CHECK( scrollView );
318   DALI_TEST_CHECK( newScrollView == scrollView );
319   END_TEST;
320 }
321
322 int UtcDaliScrollViewScrollToPosition(void)
323 {
324   ToolkitTestApplication application;
325   tet_infoline(" UtcDaliScrollViewScrollToPosition");
326
327   // Create the ScrollView actor
328   ScrollView scrollView = ScrollView::New();
329   Stage::GetCurrent().Add( scrollView );
330
331   const Vector3 target = Vector3(100.0f, 200.0f, 0.0f);
332   const Vector3 target2 = Vector3(300.0f, 100.0f, 0.0f);
333
334   scrollView.ScrollTo( target, 0.0f );
335   Wait(application);
336   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), target, TEST_LOCATION );
337   scrollView.ScrollTo( target2 );
338   Wait(application, RENDER_DELAY_SCROLL);
339   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), target2, TEST_LOCATION );
340
341   Wait(application);
342   END_TEST;
343 }
344
345 int UtcDaliScrollViewScrollToPage(void)
346 {
347   ToolkitTestApplication application;
348   tet_infoline(" UtcDaliScrollViewScrollToPage");
349
350   ScrollView scrollView = ScrollView::New();
351   Stage::GetCurrent().Add( scrollView );
352   RulerPtr rulerX = new FixedRuler( 100.0f );
353   rulerX->SetDomain( RulerDomain(0.0f, 800.0f, true) );
354   RulerPtr rulerY = new FixedRuler( 100.0f );
355   rulerY->SetDomain( RulerDomain(0.0f, 400.0f, true) );
356
357   scrollView.SetRulerX( rulerX );
358   scrollView.SetRulerY( rulerY );
359
360   scrollView.ScrollTo( 1, 0.0f );
361   Wait(application);
362   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(100.0f, 0.0f, 0.0f), TEST_LOCATION );
363
364   scrollView.ScrollTo( 5, 0.0f );
365   Wait(application);
366   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(500.0f, 0.0f, 0.0f), TEST_LOCATION );
367
368   scrollView.ScrollTo( 10, 0.0f );
369   Wait(application);
370   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(200.0f, 100.0f, 0.0f), TEST_LOCATION );
371
372   scrollView.ScrollTo( 15, 0.0f );
373   Wait(application);
374   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(700.0f, 100.0f, 0.0f), TEST_LOCATION );
375   DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 15, TEST_LOCATION );
376
377   scrollView.ScrollTo( 3 );
378   Wait(application, RENDER_DELAY_SCROLL);
379   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(300.0f, 0.0f, 0.0f), TEST_LOCATION );
380   DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 3, TEST_LOCATION );
381
382   scrollView.ScrollTo( 9 );
383   Wait(application, RENDER_DELAY_SCROLL);
384   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(100.0f, 100.0f, 0.0f), TEST_LOCATION );
385   DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 9, TEST_LOCATION );
386
387   // Apply DefaultRulers instead and see what happens.
388   rulerX = new DefaultRuler();
389   rulerX->SetDomain( RulerDomain(0.0f, 800.0f, true) );
390   rulerY = new DefaultRuler();
391   rulerY->SetDomain( RulerDomain(0.0f, 400.0f, true) );
392
393   scrollView.SetRulerX( rulerX );
394   scrollView.SetRulerY( rulerY );
395
396   // This time should always scroll to origin (0.0f, 0.0f)
397   scrollView.ScrollTo( 1, 0.0f );
398   Wait(application);
399   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(0.0f, 0.0f, 0.0f), TEST_LOCATION );
400   DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 0, TEST_LOCATION );
401
402   Wait(application);
403   END_TEST;
404 }
405
406 int UtcDaliScrollViewScrollToActor(void)
407 {
408   ToolkitTestApplication application;
409   tet_infoline(" UtcDaliScrollViewScrollToActor");
410
411   ScrollView scrollView = ScrollView::New();
412   Stage::GetCurrent().Add( scrollView );
413
414   Actor actorA = Actor::New();
415   const Vector3 positionA = Vector3(100.0f, 400.0f, 0.0f);
416   actorA.SetPosition(positionA);
417   scrollView.Add(actorA);
418
419   Actor actorB = Actor::New();
420   const Vector3 positionB = Vector3(500.0f, 200.0f, 0.0f);
421   actorB.SetPosition(positionB);
422   scrollView.Add(actorB);
423
424   Wait(application);
425
426   scrollView.ScrollTo(actorA, 0.0f);
427   Wait(application);
428   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionA, TEST_LOCATION );
429
430   Wait(application);
431   scrollView.ScrollTo(actorB, 0.0f);
432   Wait(application);
433   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionB, TEST_LOCATION );
434
435   scrollView.ScrollTo(actorA);
436   Wait(application, RENDER_DELAY_SCROLL);
437   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionA, TEST_LOCATION );
438
439   scrollView.ScrollTo(actorB);
440   Wait(application, RENDER_DELAY_SCROLL);
441   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), positionB, TEST_LOCATION );
442   END_TEST;
443 }
444
445 int UtcDaliScrollViewScrollToSnapPoint(void)
446 {
447   ToolkitTestApplication application;
448   tet_infoline(" UtcDaliScrollViewScrollToSnapPoint");
449
450   ScrollView scrollView = ScrollView::New();
451   Stage::GetCurrent().Add( scrollView );
452   RulerPtr rulerX = new FixedRuler( 100.0f );
453   rulerX->SetDomain( RulerDomain(0.0f, 800.0f, true) );
454   RulerPtr rulerY = new FixedRuler( 100.0f );
455   rulerY->SetDomain( RulerDomain(0.0f, 400.0f, true) );
456
457   scrollView.SetRulerX( rulerX );
458   scrollView.SetRulerY( rulerY );
459
460   scrollView.ScrollTo( Vector3(120.0f, 190.0f, 0.0f), 0.0f );
461   Wait(application);
462   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(120.0f, 190.0f, 0.0f), TEST_LOCATION );
463
464   scrollView.ScrollToSnapPoint();
465
466   Wait(application, RENDER_DELAY_SCROLL);
467   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), Vector3(100.0f, 200.0f, 0.0f), TEST_LOCATION );
468   END_TEST;
469 }
470
471 int UtcDaliScrollViewSetScrollUpdateDistance(void)
472 {
473   ToolkitTestApplication application;
474   tet_infoline(" UtcDaliScrollViewRefreshInterval");
475
476   ScrollView scrollView = ScrollView::New();
477
478   scrollView.SetScrollUpdateDistance(0);
479   DALI_TEST_EQUALS( scrollView.GetScrollUpdateDistance(), 0, TEST_LOCATION);
480   scrollView.SetScrollUpdateDistance(10);
481   DALI_TEST_EQUALS( scrollView.GetScrollUpdateDistance(), 10, TEST_LOCATION);
482   scrollView.SetScrollUpdateDistance(1000);
483   DALI_TEST_EQUALS( scrollView.GetScrollUpdateDistance(), 1000, TEST_LOCATION);
484   END_TEST;
485 }
486
487 int UtcDaliScrollViewWrapMode(void)
488 {
489   ToolkitTestApplication application;
490   tet_infoline(" UtcDaliScrollViewWrapMode");
491
492   ScrollView scrollView = ScrollView::New();
493   Stage::GetCurrent().Add( scrollView );
494
495   // Position rulers. 4x4 grid.
496   RulerPtr rulerX = new FixedRuler(50.0f);
497   RulerPtr rulerY = new FixedRuler(50.0f);
498   rulerX->SetDomain( RulerDomain(0.0f, 200.0f, false) );
499   rulerY->SetDomain( RulerDomain(0.0f, 200.0f, false) );
500   scrollView.SetRulerX(rulerX);
501   scrollView.SetRulerY(rulerY);
502
503   scrollView.SetWrapMode(false);
504   scrollView.ScrollTo(Vector3(225.0f, 125.0f, 0.0f), 0.0f); // 5th (1st) page across, and 3rd (3rd) page down. (wrapped)
505   Wait(application);
506   DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 17, TEST_LOCATION );
507   scrollView.SetWrapMode(true);
508   DALI_TEST_EQUALS( static_cast<int>(scrollView.GetCurrentPage()), 13, TEST_LOCATION );
509   END_TEST;
510 }
511
512 int UtcDaliScrollViewActorAutoSnap(void)
513 {
514   ToolkitTestApplication application;
515   tet_infoline(" UtcDaliScrollViewActorAutoSnap");
516
517   ScrollView scrollView = ScrollView::New();
518   Stage::GetCurrent().Add( scrollView );
519
520   // Position rulers.
521   RulerPtr rulerX = new DefaultRuler();
522   RulerPtr rulerY = new DefaultRuler();
523   rulerX->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
524   rulerY->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
525   scrollView.SetRulerX(rulerX);
526   scrollView.SetRulerY(rulerY);
527
528   const Vector3 aPosition = Vector3(200.0f, 50.0f, 0.0f);
529   Actor a = Actor::New();
530   scrollView.Add(a);
531   a.SetPosition(aPosition);
532
533   const Vector3 bPosition = Vector3(600.0f, 600.0f, 0.0f);
534   Actor b = Actor::New();
535   scrollView.Add(b);
536   b.SetPosition(bPosition);
537
538   // Goto a random position, and execute snap (should not move)
539   Vector3 targetScroll = Vector3(500.0f, 500.0f, 0.0f);
540   scrollView.ScrollTo(targetScroll, 0.0f);
541   Wait(application);
542   scrollView.ScrollToSnapPoint();
543   Wait(application, RENDER_DELAY_SCROLL);
544   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), targetScroll, TEST_LOCATION );
545
546   // Enable ActorAutoSnap, and now try snapping.
547   scrollView.SetActorAutoSnap(true);
548   scrollView.ScrollToSnapPoint();
549   Wait(application, RENDER_DELAY_SCROLL);
550   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), bPosition, TEST_LOCATION );
551
552   scrollView.ScrollTo(Vector3(0.0f, 0.0f, 0.0f), 0.0f);
553   Wait(application);
554   scrollView.ScrollToSnapPoint();
555   Wait(application, RENDER_DELAY_SCROLL);
556   DALI_TEST_EQUALS( scrollView.GetCurrentScrollPosition(), aPosition, TEST_LOCATION );
557   END_TEST;
558 }
559
560 int UtcDaliScrollViewSignalsStartComplete(void)
561 {
562   ToolkitTestApplication application;
563   tet_infoline(" UtcDaliScrollViewSignalsStartComplete");
564
565   gOnScrollStartCalled = false;
566   gOnScrollCompleteCalled = false;
567
568   ScrollView scrollView = ScrollView::New();
569   Stage::GetCurrent().Add( scrollView );
570
571   // Position rulers.
572   RulerPtr rulerX = new DefaultRuler();
573   RulerPtr rulerY = new DefaultRuler();
574   rulerX->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
575   rulerY->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
576   scrollView.SetRulerX(rulerX);
577   scrollView.SetRulerY(rulerY);
578   scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
579   scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
580   scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
581   scrollView.ScrollTo( Vector3(100.0f, 100.0f, 0.0f) );
582   Wait(application, RENDER_DELAY_SCROLL);
583
584   DALI_TEST_CHECK(gOnScrollStartCalled);
585   DALI_TEST_CHECK(gOnScrollCompleteCalled);
586   END_TEST;
587 }
588
589 int UtcDaliScrollViewSignalsUpdate(void)
590 {
591   ToolkitTestApplication application;
592   tet_infoline(" UtcDaliScrollViewSignalsUpdate");
593
594   gOnScrollStartCalled = false;
595   gOnScrollUpdateCalled = false;
596   gOnScrollCompleteCalled = false;
597
598   ScrollView scrollView = ScrollView::New();
599   Stage::GetCurrent().Add( scrollView );
600   Vector2 stageSize = Stage::GetCurrent().GetSize();
601   scrollView.SetSize(stageSize);
602   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
603   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
604
605   // Position rulers.
606   RulerPtr rulerX = new DefaultRuler();
607   RulerPtr rulerY = new DefaultRuler();
608   rulerX->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
609   rulerY->SetDomain( RulerDomain(0.0f, 1000.0f, false) );
610   scrollView.SetRulerX(rulerX);
611   scrollView.SetRulerY(rulerY);
612   scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
613   scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
614   scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
615
616   ImageActor image = CreateSolidColorActor( Color::RED );
617   image.SetSize(stageSize);
618   image.SetParentOrigin(ParentOrigin::TOP_LEFT);
619   image.SetAnchorPoint(AnchorPoint::TOP_LEFT);
620   scrollView.Add(image);
621
622   Wait(application);
623
624   // Do a pan starting from 100,100 and moving down diagonally.
625   Vector2 pos(100.0f, 100.0f);
626   SendPan(application, Gesture::Possible, pos);
627   SendPan(application, Gesture::Started, pos);
628   pos.x += 5.0f;
629   pos.y += 5.0f;
630   Wait(application, 100);
631
632   for(int i = 0;i<20;i++)
633   {
634     SendPan(application, Gesture::Continuing, pos);
635     pos.x += 5.0f;
636     pos.y += 5.0f;
637     Wait(application);
638   }
639
640   SendPan(application, Gesture::Finished, pos);
641   Wait(application, RENDER_DELAY_SCROLL);
642
643   DALI_TEST_CHECK(gOnScrollStartCalled);
644   DALI_TEST_CHECK(gOnScrollUpdateCalled);
645   DALI_TEST_CHECK(gOnScrollCompleteCalled);
646   END_TEST;
647 }
648
649 static Vector2 PerformGestureDiagonalSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, bool finish = true)
650 {
651   gOnScrollStartCalled = false;
652   gOnScrollUpdateCalled = false;
653   gOnScrollCompleteCalled = false;
654   gOnSnapStartCalled = false;
655
656   // Now do a pan starting from (start) and heading (direction)
657   Vector2 pos(start);
658   SendPan(application, Gesture::Possible, pos);
659   SendPan(application, Gesture::Started, pos);
660   Wait(application);
661
662   for(int i = 0;i<frames;i++)
663   {
664     pos += direction; // Move in this direction
665     SendPan(application, Gesture::Continuing, pos);
666     Wait(application);
667   }
668
669   if(finish)
670   {
671     pos += direction; // Move in this direction.
672     SendPan(application, Gesture::Finished, pos);
673     Wait(application, RENDER_DELAY_SCROLL);
674   }
675
676   return pos;
677 }
678
679 int UtcDaliScrollViewScrollSensitive(void)
680 {
681   ToolkitTestApplication application;
682   tet_infoline(" UtcDaliScrollViewScrollSensitive");
683
684   // Set up a scrollView...
685   ScrollView scrollView = ScrollView::New();
686   Stage::GetCurrent().Add( scrollView );
687   Vector2 stageSize = Stage::GetCurrent().GetSize();
688   scrollView.SetSize(stageSize);
689   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
690   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
691
692   // Position rulers.
693   RulerPtr rulerX = new DefaultRuler();
694   RulerPtr rulerY = new DefaultRuler();
695   rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
696   rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
697   scrollView.SetRulerX(rulerX);
698   scrollView.SetRulerY(rulerY);
699   scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
700   scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
701   scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
702   scrollView.SnapStartedSignal().Connect( &OnSnapStart );
703
704   scrollView.ScrollTo(CLAMP_START_SCROLL_POSITION, 0.0f); // move in a little.
705   Wait(application);
706
707   // First try insensitive swipe.
708   scrollView.SetScrollSensitive(false);
709   PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, CLAMP_TOUCH_MOVEMENT, CLAMP_GESTURE_FRAMES, true);
710
711   DALI_TEST_CHECK( !gOnScrollStartCalled );
712   DALI_TEST_CHECK( !gOnScrollCompleteCalled );
713   DALI_TEST_CHECK( !gOnSnapStartCalled );
714
715   // Second try sensitive swipe.
716   scrollView.SetScrollSensitive(true);
717   PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, CLAMP_TOUCH_MOVEMENT, CLAMP_GESTURE_FRAMES, true);
718
719   DALI_TEST_CHECK( gOnScrollStartCalled );
720   DALI_TEST_CHECK( gOnScrollCompleteCalled );
721   DALI_TEST_CHECK( gOnSnapStartCalled );
722   END_TEST;
723 }
724
725 int UtcDaliScrollViewAxisAutoLock(void)
726 {
727   ToolkitTestApplication application;
728   tet_infoline(" UtcDaliScrollViewAxisAutoLock");
729
730   // Set up a scrollView...
731   ScrollView scrollView = ScrollView::New();
732   Stage::GetCurrent().Add( scrollView );
733   Vector2 stageSize = Stage::GetCurrent().GetSize();
734   scrollView.SetSize(stageSize);
735   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
736   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
737
738   // Position rulers.
739   RulerPtr rulerX = new DefaultRuler();
740   RulerPtr rulerY = new DefaultRuler();
741   rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
742   rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
743   scrollView.SetRulerX(rulerX);
744   scrollView.SetRulerY(rulerY);
745   scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
746   scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
747   scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
748
749   // Normal
750   scrollView.ScrollTo(Vector3(100.0f, 100.0f, 0.0f), 0.0f); // move in a little.
751   Wait(application);
752   Vector3 startPosition = scrollView.GetCurrentScrollPosition();
753   PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(5.0f, 1.0f), 50, true); // mostly horizontal
754   const Vector3 positionAfterNormal = scrollView.GetCurrentScrollPosition();
755
756   // Autolock
757   scrollView.SetAxisAutoLock(true);
758   DALI_TEST_CHECK(scrollView.GetAxisAutoLock());
759
760   scrollView.ScrollTo(Vector3(100.0f, 100.0f, 0.0f), 0.0f); // move in a little.
761   Wait(application);
762   PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(5.0f, 1.0f), 50, true); // mostly horizontal
763   const Vector3 positionAfterAutoLock = scrollView.GetCurrentScrollPosition();
764
765   // compare how much the Y position has deviated for normal and autolock.
766   const float devianceNormal = fabsf(startPosition.y - positionAfterNormal.y);
767   const float devianceAutoLock = fabsf(startPosition.y - positionAfterAutoLock.y);
768
769   // in auto-lock it should be a mostly horizontal pan (thus deviance should be much lower)
770   DALI_TEST_CHECK(devianceAutoLock < devianceNormal);
771
772   scrollView.SetAxisAutoLock(false);
773   DALI_TEST_CHECK(!scrollView.GetAxisAutoLock());
774   END_TEST;
775 }
776
777 int UtcDaliScrollViewAxisAutoLockGradient(void)
778 {
779   ToolkitTestApplication application;
780   tet_infoline(" UtcDaliScrollViewAxisAutoLockGradient");
781
782   // Set up a scrollView...
783   ScrollView scrollView = ScrollView::New();
784   scrollView.SetAxisAutoLockGradient(0.5f);
785   DALI_TEST_EQUALS(scrollView.GetAxisAutoLockGradient(), 0.5f, TEST_LOCATION);
786   scrollView.SetAxisAutoLockGradient(1.0f);
787   DALI_TEST_EQUALS(scrollView.GetAxisAutoLockGradient(), 1.0f, TEST_LOCATION);
788   END_TEST;
789 }
790
791 int UtcDaliScrollViewConstraints(void)
792 {
793   ToolkitTestApplication application;
794   tet_infoline(" UtcDaliScrollViewConstraints");
795
796   // Set up a scrollView...
797   ScrollView scrollView = ScrollView::New();
798   Stage::GetCurrent().Add( scrollView );
799   Vector2 stageSize = Stage::GetCurrent().GetSize();
800   scrollView.SetSize(stageSize);
801   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
802   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
803
804   // Position rulers.
805   RulerPtr rulerX = new DefaultRuler();
806   RulerPtr rulerY = new DefaultRuler();
807   rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
808   rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
809   scrollView.SetRulerX(rulerX);
810   scrollView.SetRulerY(rulerY);
811
812   // Add an Actor to ScrollView,
813   // Apply TestSumConstraint to ScrollView's children (includes this Actor)
814   gConstraintResult = Vector3::ZERO;
815   Actor a = Actor::New();
816   scrollView.Add(a);
817   a.SetPosition( TEST_ACTOR_POSITION );
818   Wait(application);
819
820   Property::Index scrollPositionProperty = scrollView.GetPropertyIndex(ScrollView::SCROLL_POSITION_PROPERTY_NAME);
821   Constraint constraint = Constraint::New<Vector3>( Actor::Property::POSITION,
822                                                        Source(scrollView, scrollPositionProperty),
823                                                        TestSumConstraint( TEST_CONSTRAINT_OFFSET ) );
824   constraint.SetRemoveAction(Constraint::Discard);
825   scrollView.ApplyConstraintToChildren(constraint);
826   Wait(application);
827
828   DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION );
829
830   gConstraintResult = Vector3::ZERO;
831   scrollView.RemoveConstraintsFromChildren();
832   Wait(application);
833
834   DALI_TEST_EQUALS( gConstraintResult, Vector3::ZERO, TEST_LOCATION );
835   END_TEST;
836 }
837
838 int UtcDaliScrollViewBind(void)
839 {
840   ToolkitTestApplication application;
841   tet_infoline(" UtcDaliScrollViewBind");
842
843   // Set up a scrollView...
844   ScrollView scrollView = ScrollView::New();
845   Stage::GetCurrent().Add( scrollView );
846   Vector2 stageSize = Stage::GetCurrent().GetSize();
847   scrollView.SetSize(stageSize);
848   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
849   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
850
851   // Position rulers.
852   RulerPtr rulerX = new DefaultRuler();
853   RulerPtr rulerY = new DefaultRuler();
854   rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
855   rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
856   scrollView.SetRulerX(rulerX);
857   scrollView.SetRulerY(rulerY);
858
859   // Add an Actor to ScrollView,
860   // Apply TestSumConstraint to ScrollView's children (includes this Actor)
861
862   gConstraintResult = Vector3::ZERO;
863   Actor a = Actor::New();
864   scrollView.Add(a);
865   a.SetPosition( TEST_ACTOR_POSITION );
866   Wait(application);
867
868   Property::Index scrollPositionProperty = scrollView.GetPropertyIndex(ScrollView::SCROLL_POSITION_PROPERTY_NAME);
869   // apply this constraint to scrollview
870   Constraint constraint = Constraint::New<Vector3>( Actor::Property::POSITION,
871                                                        Source(scrollView, scrollPositionProperty),
872                                                        TestSumConstraint( TEST_CONSTRAINT_OFFSET ) );
873
874   constraint.SetRemoveAction(Constraint::Discard);
875   scrollView.ApplyConstraintToChildren(constraint);
876
877   Wait(application);
878   // Defaulty Bound.
879   DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION );
880
881   // UnBind
882   gConstraintResult = Vector3::ZERO;
883   scrollView.UnbindActor( a );
884   Wait(application);
885   DALI_TEST_EQUALS( gConstraintResult, Vector3::ZERO, TEST_LOCATION );
886
887   // Bind
888   gConstraintResult = Vector3::ZERO;
889   scrollView.BindActor( a );
890   Wait(application);
891   DALI_TEST_EQUALS( gConstraintResult, TEST_ACTOR_POSITION + TEST_CONSTRAINT_OFFSET, TEST_LOCATION );
892   END_TEST;
893 }
894
895 int UtcDaliRulerEnableDisable(void)
896 {
897   ToolkitTestApplication application;
898   tet_infoline(" UtcDaliRulerEnableDisable");
899
900   RulerPtr ruler = new DefaultRuler();
901
902   DALI_TEST_CHECK( ruler->IsEnabled() );
903   ruler->Disable();
904   DALI_TEST_CHECK( !ruler->IsEnabled() );
905   ruler->Enable();
906   DALI_TEST_CHECK( ruler->IsEnabled() );
907   END_TEST;
908 }
909
910 int UtcDaliRulerDomainEnableDisable(void)
911 {
912   ToolkitTestApplication application;
913   tet_infoline(" UtcDaliRulerDomainEnableDisable");
914
915   RulerPtr ruler = new DefaultRuler();
916   DALI_TEST_EQUALS( ruler->GetDomain().GetSize(), 1.0f, TEST_LOCATION );
917
918
919   ruler->SetDomain( RulerDomain(0.0f, 100.0f, true) );
920   DALI_TEST_EQUALS( ruler->GetDomain().GetSize(), 100.0f, TEST_LOCATION );
921   DALI_TEST_EQUALS( ruler->Clamp(-200.0f), 0.0f, TEST_LOCATION );
922   DALI_TEST_EQUALS( ruler->Clamp(200.0f), 100.0f, TEST_LOCATION );
923
924   ruler->DisableDomain();
925   DALI_TEST_EQUALS( ruler->GetDomain().GetSize(), 1.0f, TEST_LOCATION );
926   DALI_TEST_EQUALS( ruler->Clamp(-200.0f), -200.0f, TEST_LOCATION );
927   DALI_TEST_EQUALS( ruler->Clamp(200.0f), 200.0f, TEST_LOCATION );
928   END_TEST;
929 }
930
931 int UtcDaliRulerSnapAndClamp(void)
932 {
933   ToolkitTestApplication application;
934   tet_infoline(" UtcDaliRulerSnapAndClamp");
935
936   RulerPtr ruler = new FixedRuler( 50.0f );
937   ruler->SetDomain( RulerDomain(0.0f, 400.0f, true) );
938
939   // default testing. (snap and clamp)
940   DALI_TEST_EQUALS( ruler->SnapAndClamp(50.0f), 50.0f, TEST_LOCATION);
941   DALI_TEST_EQUALS( ruler->SnapAndClamp(30.0f), 50.0f, TEST_LOCATION);
942   DALI_TEST_EQUALS( ruler->SnapAndClamp(10.0f), 0.0f, TEST_LOCATION);
943   DALI_TEST_EQUALS( ruler->SnapAndClamp(-40.0f), 0.0f, TEST_LOCATION);
944   DALI_TEST_EQUALS( ruler->SnapAndClamp(390.0f), 400.0f, TEST_LOCATION);
945   DALI_TEST_EQUALS( ruler->SnapAndClamp(430.0f), 400.0f, TEST_LOCATION);
946
947   // bias testing.
948   DALI_TEST_EQUALS( ruler->SnapAndClamp(40.0f, 0.0f), 0.0f, TEST_LOCATION); // Flick Left
949   DALI_TEST_EQUALS( ruler->SnapAndClamp(40.0f, 0.5f), 50.0f, TEST_LOCATION); // No Flick
950   DALI_TEST_EQUALS( ruler->SnapAndClamp(40.0f, 1.0f), 50.0f, TEST_LOCATION); // Flick Right
951
952   DALI_TEST_EQUALS( ruler->SnapAndClamp(20.0f, 0.0f), 0.0f, TEST_LOCATION); // Flick Left
953   DALI_TEST_EQUALS( ruler->SnapAndClamp(20.0f, 0.5f), 0.0f, TEST_LOCATION); // No Flick
954   DALI_TEST_EQUALS( ruler->SnapAndClamp(20.0f, 1.0f), 50.0f, TEST_LOCATION); // Flick Right
955
956   // length testing.
957   DALI_TEST_EQUALS( ruler->SnapAndClamp(-10.0f, 0.5f, 10.0f), 0.0f, TEST_LOCATION); // 10 units long (over left boundary)
958   DALI_TEST_EQUALS( ruler->SnapAndClamp(-5.0f, 0.5f, 10.0f), 0.0f, TEST_LOCATION); // 10 units long (slightly ovr left boundary)
959   DALI_TEST_EQUALS( ruler->SnapAndClamp(300.0f, 0.5f, 10.0f), 300.0f, TEST_LOCATION); // 10 units long (not over a boundary)
960   DALI_TEST_EQUALS( ruler->SnapAndClamp(395.0f, 0.5f, 10.0f), 390.0f, TEST_LOCATION); // 10 units long (slightly over right boundary)
961   DALI_TEST_EQUALS( ruler->SnapAndClamp(500.0f, 0.5f, 10.0f), 390.0f, TEST_LOCATION); // 10 units long (over right boundary)
962
963   // scale testing.
964   DALI_TEST_EQUALS( ruler->SnapAndClamp(-100.0f, 0.5f, 0.0f, 2.0f), 0.0f, TEST_LOCATION);
965   DALI_TEST_EQUALS( ruler->SnapAndClamp(50.0f, 0.5f, 0.0f, 2.0f), 50.0f, TEST_LOCATION);
966   DALI_TEST_EQUALS( ruler->SnapAndClamp(700.0f, 0.5f, 0.0f, 2.0f), 700.0f, TEST_LOCATION);
967   DALI_TEST_EQUALS( ruler->SnapAndClamp(850.0f, 0.5f, 0.0f, 2.0f), 800.0f, TEST_LOCATION);
968
969   // clamp state testing.
970   ClampState clamped;
971   DALI_TEST_EQUALS( ruler->SnapAndClamp(50.0f, 0.5f, 0.0f, 1.0f, clamped), 50.0f, TEST_LOCATION);
972   DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
973   DALI_TEST_EQUALS( ruler->SnapAndClamp(30.0f, 0.5f, 0.0f, 1.0f, clamped), 50.0f, TEST_LOCATION);
974   DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
975   DALI_TEST_EQUALS( ruler->SnapAndClamp(10.0f, 0.5f, 0.0f, 1.0f, clamped), 0.0f, TEST_LOCATION);
976   DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
977   DALI_TEST_EQUALS( ruler->SnapAndClamp(-40.0f, 0.5f, 0.0f, 1.0f, clamped), 0.0f, TEST_LOCATION);
978   DALI_TEST_EQUALS( clamped, ClampedToMin, TEST_LOCATION );
979   DALI_TEST_EQUALS( ruler->SnapAndClamp(390.0f, 0.5f, 0.0f, 1.0f, clamped), 400.0f, TEST_LOCATION);
980   DALI_TEST_EQUALS( clamped, NotClamped, TEST_LOCATION );
981   DALI_TEST_EQUALS( ruler->SnapAndClamp(430.0f, 0.5f, 0.0f, 1.0f, clamped), 400.0f, TEST_LOCATION);
982   DALI_TEST_EQUALS( clamped, ClampedToMax, TEST_LOCATION );
983   END_TEST;
984 }
985
986 int UtcDaliRulerFixedRulerSpacing(void)
987 {
988   ToolkitTestApplication application;
989   tet_infoline(" UtcDaliRulerFixedRulerSpacing");
990
991   RulerPtr rulerNormal = new FixedRuler( 25.0f );
992   rulerNormal->SetDomain( RulerDomain(10.0f, 90.0f, true) );
993
994   unsigned int volume;
995   float position;
996
997   position = rulerNormal->GetPositionFromPage(1, volume, true);
998   DALI_TEST_EQUALS( position, 35.0f, TEST_LOCATION );
999   DALI_TEST_EQUALS( volume, 0u, TEST_LOCATION );
1000
1001   position = rulerNormal->GetPositionFromPage(2, volume, true);
1002   DALI_TEST_EQUALS( position, 60.0f, TEST_LOCATION );
1003   DALI_TEST_EQUALS( volume, 0u, TEST_LOCATION );
1004   END_TEST;
1005 }
1006
1007 int UtcDaliScrollViewOvershoot(void)
1008 {
1009   ToolkitTestApplication application;
1010   tet_infoline(" UtcDaliScrollViewOvershoot");
1011
1012   // Set up a scrollView...
1013   ScrollView scrollView = ScrollView::New();
1014   Stage::GetCurrent().Add( scrollView );
1015   Vector2 stageSize = Stage::GetCurrent().GetSize();
1016   scrollView.SetSize(stageSize);
1017   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
1018   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1019
1020   // Position rulers.
1021   RulerPtr rulerX = new DefaultRuler();
1022   RulerPtr rulerY = new DefaultRuler();
1023   rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
1024   rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
1025   scrollView.SetRulerX(rulerX);
1026   scrollView.SetRulerY(rulerY);
1027   scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
1028   scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
1029   scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
1030
1031   scrollView.ScrollTo(OVERSHOOT_START_SCROLL_POSITION, 0.0f); // move in a little.
1032   Wait(application);
1033
1034   // 1. Scroll page in NW (-500,-500 pixels), then inspect overshoot. (don't release touch)
1035   Vector2 currentPos = Vector2(100.0f, 100.0f);
1036   currentPos = PerformGestureDiagonalSwipe(application, currentPos, Vector2(5.0f, 5.0f), 100, false);
1037   Property::Index overshootXProperty = scrollView.GetPropertyIndex(ScrollView::SCROLL_OVERSHOOT_X_PROPERTY_NAME);
1038   Property::Index overshootYProperty = scrollView.GetPropertyIndex(ScrollView::SCROLL_OVERSHOOT_Y_PROPERTY_NAME);
1039   Property::Index scrollPositionProperty = scrollView.GetPropertyIndex(ScrollView::SCROLL_POSITION_PROPERTY_NAME);
1040   float overshootXValue = scrollView.GetProperty<float>(overshootXProperty);
1041   float overshootYValue = scrollView.GetProperty<float>(overshootYProperty);
1042   Vector3 positionValue = scrollView.GetProperty<Vector3>(scrollPositionProperty);
1043   DALI_TEST_EQUALS(overshootXValue, 1.0f, TEST_LOCATION);
1044   DALI_TEST_EQUALS(overshootYValue, 1.0f, TEST_LOCATION);
1045   DALI_TEST_EQUALS(positionValue, Vector3::ZERO, TEST_LOCATION);
1046
1047   float timeToReachOrigin;
1048
1049   // Now release touch. Overshoot should snap back to zero.
1050   SendPan(application, Gesture::Finished, currentPos);
1051   timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
1052
1053   DALI_TEST_CHECK( (timeToReachOrigin > Toolkit::ScrollView::DEFAULT_SNAP_OVERSHOOT_DURATION - TIME_TOLERANCE) &&
1054                    (timeToReachOrigin < Toolkit::ScrollView::DEFAULT_SNAP_OVERSHOOT_DURATION + TIME_TOLERANCE) );
1055
1056   // 2. Repeat Scroll, but this time change overshoot snap duration to shorter time
1057   scrollView.SetSnapOvershootDuration(TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION);
1058
1059   currentPos = PerformGestureDiagonalSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, false);
1060   // Now release touch. Overshoot should snap back to zero.
1061   SendPan(application, Gesture::Finished, currentPos);
1062   timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
1063
1064   DALI_TEST_CHECK( (timeToReachOrigin > TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION - TIME_TOLERANCE) &&
1065                    (timeToReachOrigin < TEST_CUSTOM1_SNAP_OVERSHOOT_DURATION + TIME_TOLERANCE) );
1066
1067   // 3. Repeat Scroll, but this time change overshoot snap duration to longer time.
1068   scrollView.SetSnapOvershootDuration(TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION);
1069
1070   currentPos = PerformGestureDiagonalSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, false);
1071   // Now release touch. Overshoot should snap back to zero.
1072   SendPan(application, Gesture::Finished, currentPos);
1073   timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
1074
1075   DALI_TEST_CHECK( (timeToReachOrigin > TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION - TIME_TOLERANCE) &&
1076                    (timeToReachOrigin < TEST_CUSTOM2_SNAP_OVERSHOOT_DURATION + TIME_TOLERANCE) );
1077
1078   // 4. Repeat Scroll, but this time change overshoot function.
1079   scrollView.SetSnapOvershootDuration(TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION);
1080   scrollView.SetSnapOvershootAlphaFunction(TestAlphaFunction);
1081
1082   currentPos = PerformGestureDiagonalSwipe(application, Vector2(100.0f, 100.0f), Vector2(5.0f, 5.0f), 100, false);
1083   // Now release touch. Overshoot should snap back to zero.
1084   SendPan(application, Gesture::Finished, currentPos);
1085   timeToReachOrigin = TestOvershootSnapDuration(application, scrollView);
1086
1087   DALI_TEST_CHECK( (timeToReachOrigin > TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION - TIME_TOLERANCE) &&
1088                    (timeToReachOrigin < TEST_CUSTOM3_SNAP_OVERSHOOT_DURATION + TIME_TOLERANCE) );
1089   END_TEST;
1090 }
1091
1092 int UtcDaliScrollViewSnapAlphaFunction(void)
1093 {
1094   ToolkitTestApplication application;
1095   tet_infoline(" UtcDaliScrollViewSnapAlphaFunction");
1096
1097   // Set up a scrollView...
1098   ScrollView scrollView = ScrollView::New();
1099   scrollView.SetScrollSnapAlphaFunction( AlphaFunctions::EaseIn );
1100   DALI_TEST_CHECK( scrollView.GetScrollSnapAlphaFunction() == AlphaFunctions::EaseIn );
1101   scrollView.SetScrollSnapAlphaFunction( AlphaFunctions::EaseOut );
1102   DALI_TEST_CHECK( scrollView.GetScrollSnapAlphaFunction() == AlphaFunctions::EaseOut );
1103
1104   scrollView.SetScrollFlickAlphaFunction( AlphaFunctions::Bounce );
1105   DALI_TEST_CHECK( scrollView.GetScrollFlickAlphaFunction() == AlphaFunctions::Bounce );
1106   scrollView.SetScrollFlickAlphaFunction( AlphaFunctions::BounceBack );
1107   DALI_TEST_CHECK( scrollView.GetScrollFlickAlphaFunction() == AlphaFunctions::BounceBack );
1108   END_TEST;
1109 }
1110
1111 int UtcDaliScrollViewSnapDuration(void)
1112 {
1113   ToolkitTestApplication application;
1114   tet_infoline(" UtcDaliScrollViewSnapDuration");
1115
1116   // Set up a scrollView...
1117   ScrollView scrollView = ScrollView::New();
1118   scrollView.SetScrollSnapDuration( 1.0f );
1119   DALI_TEST_EQUALS( scrollView.GetScrollSnapDuration(), 1.0f, TEST_LOCATION );
1120   scrollView.SetScrollSnapDuration( 0.5f );
1121   DALI_TEST_EQUALS( scrollView.GetScrollSnapDuration(), 0.5f, TEST_LOCATION );
1122
1123   scrollView.SetScrollFlickDuration( 2.0f );
1124   DALI_TEST_EQUALS( scrollView.GetScrollFlickDuration(), 2.0f, TEST_LOCATION );
1125   scrollView.SetScrollFlickDuration( 1.5f );
1126   DALI_TEST_EQUALS( scrollView.GetScrollFlickDuration(), 1.5f, TEST_LOCATION );
1127   END_TEST;
1128 }
1129
1130 int UtcDaliScrollViewSignalsSnapStart(void)
1131 {
1132   ToolkitTestApplication application;
1133   tet_infoline(" UtcDaliScrollViewSignalsSnapStart");
1134
1135   // Set up a scrollView...
1136   ScrollView scrollView = ScrollView::New();
1137   Stage::GetCurrent().Add( scrollView );
1138   Vector2 stageSize = Stage::GetCurrent().GetSize();
1139   scrollView.SetSize(stageSize);
1140   scrollView.SetParentOrigin(ParentOrigin::TOP_LEFT);
1141   scrollView.SetAnchorPoint(AnchorPoint::TOP_LEFT);
1142
1143   // Position rulers.
1144   RulerPtr rulerX = new DefaultRuler();
1145   RulerPtr rulerY = new DefaultRuler();
1146   rulerX->SetDomain( RulerDomain(0.0f, stageSize.width + CLAMP_EXCESS_WIDTH, true) );
1147   rulerY->SetDomain( RulerDomain(0.0f, stageSize.height + CLAMP_EXCESS_HEIGHT, true) );
1148   scrollView.SetRulerX(rulerX);
1149   scrollView.SetRulerY(rulerY);
1150   scrollView.SnapStartedSignal().Connect( &OnSnapStart );
1151
1152   scrollView.ScrollTo(CLAMP_START_SCROLL_POSITION, 0.0f); // move in a little.
1153   Wait(application);
1154
1155   // First try a snap.
1156   PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(0.5f, 0.0f), 60, true);
1157
1158   DALI_TEST_CHECK( gOnSnapStartCalled );
1159   DALI_TEST_CHECK( gLastSnapType == Toolkit::Snap );
1160
1161   // Second try a swipe.
1162   PerformGestureDiagonalSwipe(application, CLAMP_TOUCH_START, Vector2(20.0f, 0.0f), 60, true);
1163
1164   DALI_TEST_CHECK( gOnSnapStartCalled );
1165   DALI_TEST_CHECK( gLastSnapType == Toolkit::Flick );
1166   END_TEST;
1167 }
1168
1169
1170 int UtcDaliScrollViewSetMouseWheelScrollDistanceStep(void)
1171 {
1172   ToolkitTestApplication application;
1173   tet_infoline(" UtcDaliScrollViewSetMouseWheelScrollDistanceStep");
1174
1175   ScrollView scrollView = ScrollView::New();
1176   // Disable Refresh signal (TET environment cannot use adaptor's Timer)
1177   scrollView.SetMouseWheelScrollDistanceStep(Vector2(30.0f, 15.0f));
1178   DALI_TEST_EQUALS( scrollView.GetMouseWheelScrollDistanceStep(), Vector2(30.0f, 15.0f), TEST_LOCATION );
1179   scrollView.SetMouseWheelScrollDistanceStep(Vector2(60.0f, 30.0f));
1180   DALI_TEST_EQUALS( scrollView.GetMouseWheelScrollDistanceStep(), Vector2(60.0f, 30.0f), TEST_LOCATION);
1181   END_TEST;
1182 }
1183
1184 int UtcDaliScrollViewGetSet(void)
1185 {
1186   ToolkitTestApplication application;
1187   tet_infoline(" UtcDaliScrollViewGetSet");
1188   ScrollView scrollView = ScrollView::New();
1189   scrollView.SetMaxOvershoot(50.0f, 50.0f);
1190   scrollView.SetMaxFlickSpeed(0.5f);
1191   DALI_TEST_EQUALS(scrollView.GetMaxFlickSpeed(), 0.5f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
1192   scrollView.SetFrictionCoefficient(0.6f);
1193   DALI_TEST_EQUALS(scrollView.GetFrictionCoefficient(), 0.6f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
1194   scrollView.SetFlickSpeedCoefficient(0.7f);
1195   DALI_TEST_EQUALS(scrollView.GetFlickSpeedCoefficient(), 0.7f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
1196   END_TEST;
1197 }