2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 // Need to override adaptor classes for toolkit test harness, so include
22 // test harness headers before dali headers.
23 #include <dali-toolkit-test-suite-utils.h>
26 #include <dali-toolkit/dali-toolkit.h>
27 #include <dali/integration-api/events/touch-event-integ.h>
28 #include <dali/integration-api/events/pan-gesture-event.h>
31 using namespace Toolkit;
33 void utc_dali_toolkit_scroll_view_effect_startup(void)
35 test_return_value = TET_UNDEF;
38 void utc_dali_toolkit_scroll_view_effect_cleanup(void)
40 test_return_value = TET_PASS;
46 const int MILLISECONDS_PER_SECOND = 1000;
47 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
48 const int RENDER_ANIMATION_TEST_DURATION_MS = 1000; ///< 1000ms to test animation
49 const int RENDER_DELAY_SCROLL = 1000; ///< duration to wait for any scroll to complete.
52 * Simulate time passed by.
54 * @note this will always process at least 1 frame (1/60 sec)
56 * @param application Test application instance
57 * @param duration Time to pass in milliseconds.
58 * @return The actual time passed in milliseconds
60 int Wait(ToolkitTestApplication& application, int duration = 0)
64 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
66 application.SendNotification();
67 application.Render(RENDER_FRAME_INTERVAL);
68 time += RENDER_FRAME_INTERVAL;
75 * Creates a Ruler that snaps to a specified grid size.
76 * If that grid size is 0.0 then this ruler does not
79 * @param[in] gridSize (optional) The grid size for the ruler,
80 * (Default = 0.0 i.e. no snapping)
81 * @return The ruler is returned.
83 RulerPtr CreateRuler(float gridSize = 0.0f)
85 if(gridSize <= Math::MACHINE_EPSILON_0)
87 return new DefaultRuler();
89 return new FixedRuler(gridSize);
94 static bool gOnScrollStartCalled; ///< Whether the OnScrollStart signal was invoked.
95 static bool gOnScrollUpdateCalled; ///< Whether the OnScrollUpdate signal was invoked.
96 static bool gOnScrollCompleteCalled; ///< Whether the OnScrollComplete signal was invoked.
97 static Vector3 gConstraintResult; ///< Result from constraint.
99 static ActorContainer gPages; ///< Keeps track of all the pages for applying effects.
101 static void ResetScrollCallbackResults()
103 gOnScrollStartCalled = false;
104 gOnScrollUpdateCalled = false;
105 gOnScrollCompleteCalled = false;
109 * Invoked when scrolling starts.
111 * @param[in] position The current scroll position.
113 static void OnScrollStart( const Vector3& position )
115 gOnScrollStartCalled = true;
119 * Invoked when scrolling updates (via dragging)
121 * @param[in] position The current scroll position.
123 static void OnScrollUpdate( const Vector3& position )
125 gOnScrollUpdateCalled = true;
129 * Invoked when scrolling finishes
131 * @param[in] position The current scroll position.
133 static void OnScrollComplete( const Vector3& position )
135 gOnScrollCompleteCalled = true;
138 ScrollView SetupTestScrollView(int rows, int columns, Vector2 size)
140 ScrollView scrollView = ScrollView::New();
141 scrollView.SetSize(size);
142 scrollView.SetAnchorPoint(AnchorPoint::CENTER);
143 scrollView.SetParentOrigin(ParentOrigin::CENTER);
144 scrollView.ApplyConstraint( Constraint::New<Dali::Vector3>( Dali::Actor::SIZE, Dali::ParentSource( Dali::Actor::SIZE ), Dali::EqualToConstraint() ) );
145 scrollView.SetWrapMode(false);
146 scrollView.ScrollStartedSignal().Connect( &OnScrollStart );
147 scrollView.ScrollUpdatedSignal().Connect( &OnScrollUpdate );
148 scrollView.ScrollCompletedSignal().Connect( &OnScrollComplete );
149 Stage::GetCurrent().Add( scrollView );
150 RulerPtr rulerX = CreateRuler(size.width);
151 RulerPtr rulerY = CreateRuler(size.height);
154 rulerX->SetDomain(RulerDomain(0.0f, size.width * columns));
162 rulerY->SetDomain(RulerDomain(0.0f, size.width * rows));
169 scrollView.SetRulerX( rulerX );
170 scrollView.SetRulerY( rulerY );
171 Stage::GetCurrent().Add( scrollView );
173 Actor container = Actor::New();
174 container.SetParentOrigin(ParentOrigin::CENTER);
175 container.SetAnchorPoint(AnchorPoint::CENTER);
176 container.SetSize( size );
177 scrollView.Add( container );
178 container.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
181 for(int row = 0;row<rows;row++)
183 for(int column = 0;column<columns;column++)
185 Actor page = Actor::New();
186 page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
187 page.SetParentOrigin( ParentOrigin::CENTER );
188 page.SetAnchorPoint( AnchorPoint::CENTER );
189 page.SetPosition( column * size.x, row * size.y );
192 gPages.push_back(page);
196 ResetScrollCallbackResults();
203 ResetScrollCallbackResults();
206 Actor AddActorToPage(Actor page, float x, float y, float cols, float rows)
208 Stage stage = Stage::GetCurrent();
209 Vector2 stageSize = stage.GetSize();
211 const float margin = 10.0f;
212 const Vector2 actorSize((stageSize.x / cols) - margin, (stageSize.y / rows) - margin);
214 Actor actor = Actor::New();
215 actor.SetParentOrigin( ParentOrigin::CENTER );
216 actor.SetAnchorPoint( AnchorPoint::CENTER );
218 Vector3 position( margin * 0.5f + (actorSize.x + margin) * x - stageSize.width * 0.5f,
219 margin * 0.5f + (actorSize.y + margin) * y - stageSize.height * 0.5f,
221 Vector3 positionEnd( margin * 0.5f + (actorSize.x + margin) * (x + cols) - stageSize.width * 0.5f - margin,
222 margin * 0.5f + (actorSize.y + margin) * (y + rows) - stageSize.height * 0.5f - margin,
224 Vector3 size(positionEnd - position);
225 actor.SetPosition( position + size * 0.5f);
226 actor.SetSize( positionEnd - position );
231 } // unnamed namespace
234 int UtcDaliScrollViewCustomEffectSetup(void)
236 tet_infoline(" UtcDaliScrollViewCustomEffectSetup");
238 ScrollViewCustomEffect effect;
240 DALI_TEST_CHECK( !effect );
242 BaseHandle handle = ScrollViewCustomEffect::New();
244 DALI_TEST_CHECK( handle );
246 effect = ScrollViewCustomEffect::DownCast(handle);
248 DALI_TEST_CHECK( effect );
253 int UtcDaliScrollViewCubeEffectSetup(void)
255 tet_infoline(" UtcDaliScrollViewCubeEffectSetup");
257 ScrollViewCubeEffect effect;
259 DALI_TEST_CHECK( !effect );
261 BaseHandle handle = ScrollViewCubeEffect::New();
263 DALI_TEST_CHECK( handle );
265 effect = ScrollViewCubeEffect::DownCast(handle);
267 DALI_TEST_CHECK( effect );
271 int UtcDaliScrollViewSpiralEffectSetup(void)
273 tet_infoline(" UtcDaliScrollViewSpiralEffectSetup");
275 ScrollViewPageSpiralEffect effect;
277 DALI_TEST_CHECK( !effect );
279 BaseHandle handle = ScrollViewPageSpiralEffect::New();
281 DALI_TEST_CHECK( handle );
283 effect = ScrollViewPageSpiralEffect::DownCast(handle);
285 DALI_TEST_CHECK( effect );
292 int UtcDaliScrollViewSlideEffectSetup(void)
294 tet_infoline(" UtcDaliScrollViewSlideEffectSetup");
296 ScrollViewSlideEffect effect;
298 DALI_TEST_CHECK( !effect );
300 BaseHandle handle = ScrollViewSlideEffect::New();
302 DALI_TEST_CHECK( handle );
304 effect = ScrollViewSlideEffect::DownCast(handle);
306 DALI_TEST_CHECK( effect );
310 int UtcDaliScrollViewCubeEffectTest(void)
312 ToolkitTestApplication application;
313 tet_infoline(" UtcDaliScrollViewCubeEffectTest");
315 Vector2 size = Stage::GetCurrent().GetSize();
317 ScrollView scrollView = SetupTestScrollView(1, 3, size);
318 Actor page = gPages[1];
319 Wait(application, 500);
321 ScrollViewCubeEffect effect = ScrollViewCubeEffect::New();
322 scrollView.ApplyEffect(effect);
324 Actor actor = AddActorToPage(page, 0.5f, 0.5f, 3, 3);
326 Vector3 actorPrePosition = actor.GetCurrentPosition();
328 effect.ApplyToActor(actor, page, Vector3(-105.0f, 30.0f, -240.0f), Vector2(Math::PI * 0.5f, Math::PI * 0.5f), Vector2(0.25f, 0.25f) * size);
330 Actor actor2 = AddActorToPage(page, 0.5f, 0.5f, 3, 3);
331 effect.ApplyToActor(actor2, Vector3(-105.0f, 30.0f, -240.0f), Vector2(Math::PI * 0.5f, Math::PI * 0.5f), Vector2(0.25f, 0.25f) * size);
333 scrollView.ScrollTo(1);
334 while(!gOnScrollCompleteCalled)
338 // test that the first page has reached centre of screen
339 Vector3 actorPostPosition = actor.GetCurrentPosition();
340 // just check the actor has moved
341 DALI_TEST_CHECK((actorPostPosition - actorPrePosition).Length() > Math::MACHINE_EPSILON_1);
347 int UtcDaliScrollViewSpiralEffectTest(void)
349 ToolkitTestApplication application;
350 tet_infoline(" UtcDaliScrollViewSpiralEffectTest");
352 Vector2 size = Stage::GetCurrent().GetSize();
354 ScrollView scrollView = SetupTestScrollView(1, 3, size);
355 Actor testPage = gPages[1];
356 Wait(application, 500);
358 ScrollViewPageSpiralEffect effect = ScrollViewPageSpiralEffect::New();
359 scrollView.ApplyEffect(effect);
361 for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
363 Actor page = *pageIter;
364 page.RemoveConstraints();
365 page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
366 effect.ApplyToPage(page, Vector2(Math::PI_2, 0.0f));
370 scrollView.ScrollTo(1);
371 while(!gOnScrollCompleteCalled)
375 // test that the first page has reached centre of screen
376 Vector3 pagePos = testPage.GetCurrentPosition();
377 DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);
384 int UtcDaliScrollViewSlideEffectTest(void)
386 ToolkitTestApplication application;
387 tet_infoline(" UtcDaliScrollViewSlideEffectTest");
389 Vector2 size = Stage::GetCurrent().GetSize();
390 Vector3 pageSize(size.x, size.y, 0.0f);
392 ScrollView scrollView = SetupTestScrollView(1, 3, size);
393 Actor testPage = gPages[1];
394 Wait(application, 500);
396 ScrollViewSlideEffect effect = ScrollViewSlideEffect::New();
397 effect.SetDelayReferenceOffset(pageSize * 0.25);
398 DALI_TEST_EQUALS(effect.GetDelayReferenceOffset(), pageSize * 0.25, Math::MACHINE_EPSILON_0, TEST_LOCATION);
399 effect.SetMaxDelayDuration(0.5f);
400 DALI_TEST_EQUALS(effect.GetMaxDelayDuration(), 0.5f, Math::MACHINE_EPSILON_0, TEST_LOCATION);
401 effect.SetSlideDirection(false);
402 DALI_TEST_CHECK(!effect.GetSlideDirection());
404 scrollView.ApplyEffect(effect);
406 Actor actor = AddActorToPage(testPage, 0.5f, 0.5f, 3, 3);
408 Vector3 actorPrePosition = actor.GetCurrentPosition();
410 effect.ApplyToActor(actor, 0.0f, 0.5f);
412 scrollView.ScrollTo(1);
413 while(!gOnScrollCompleteCalled)
417 // test that the first page has reached centre of screen
418 Vector3 actorPostPosition = actor.GetCurrentPosition();
419 // just check the actor has moved
420 DALI_TEST_CHECK((actorPostPosition - actorPrePosition).Length() > Math::MACHINE_EPSILON_1);
425 int UtcDaliScrollViewCustomEffectTest(void)
427 ToolkitTestApplication application;
428 tet_infoline(" UtcDaliScrollViewCustomEffectTest");
430 Vector2 size = Stage::GetCurrent().GetSize();
431 Vector3 pageSize(size.x, size.y, 0.0f);
433 ScrollView scrollView = SetupTestScrollView(1, 3, size);
434 Actor testPage = gPages[1];
435 Wait(application, 500);
436 Vector3 pageStartPos, pagePos;
437 pageStartPos = pagePos = testPage.GetCurrentPosition();
438 //scrollView.RemoveConstraintsFromChildren();
440 ScrollViewCustomEffect effect = ScrollViewCustomEffect::DownCast(scrollView.ApplyEffect(ScrollView::PageEffectCarousel));
442 for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
444 Actor page = *pageIter;
445 page.RemoveConstraints();
446 page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
447 effect.ApplyToPage(page, pageSize);
450 pagePos = testPage.GetCurrentPosition();
451 DALI_TEST_EQUALS(pagePos, pageStartPos, Math::MACHINE_EPSILON_0, TEST_LOCATION);
453 scrollView.ScrollTo(1);
454 while(!gOnScrollCompleteCalled)
458 ResetScrollCallbackResults();
459 // test that the first page has reached centre of screen
460 pagePos = testPage.GetCurrentPosition();
461 DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);
463 // scroll back to page 0
464 scrollView.ScrollTo(0);
465 while(!gOnScrollCompleteCalled)
469 ResetScrollCallbackResults();
470 pagePos = testPage.GetCurrentPosition();
471 DALI_TEST_EQUALS(pagePos, pageStartPos, Math::MACHINE_EPSILON_0, TEST_LOCATION);
473 scrollView.RemoveEffect(effect);
475 effect = ScrollViewCustomEffect::New();
476 effect.SetPageTranslation(Vector3(20.0f, 20.0f, 5.0f));
477 effect.SetPageTranslation(Vector3(20.0f, 20.0f, 5.0f), Vector3(20.0f, 20.0f, -5.0f));
478 effect.SetPageTranslationIn(Vector3(20.0f, 20.0f, 5.0f));
479 effect.SetPageTranslationOut(Vector3(20.0f, 20.0f, -5.0f));
480 effect.SetPageTranslation(Vector3(20.0f, 0.0f, 0.0f));
481 effect.SetSwingAngle(Math::PI, Vector3::YAXIS);
482 effect.SetPageSpacing(Vector2(20.0f, 20.0f));
483 scrollView.ApplyEffect(effect);
485 for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
487 Actor page = *pageIter;
488 page.RemoveConstraints();
489 page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
490 effect.ApplyToPage(page, pageSize);
493 pagePos = testPage.GetCurrentPosition();
494 DALI_TEST_EQUALS(pagePos, pageStartPos, Math::MACHINE_EPSILON_0, TEST_LOCATION);
496 scrollView.ScrollTo(1);
497 while(!gOnScrollCompleteCalled)
501 ResetScrollCallbackResults();
502 // test that the first page has reached centre of screen
503 pagePos = testPage.GetCurrentPosition();
504 DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);
506 // scroll back to page 0
507 scrollView.ScrollTo(0);
508 while(!gOnScrollCompleteCalled)
512 ResetScrollCallbackResults();
513 pagePos = testPage.GetCurrentPosition();
514 DALI_TEST_EQUALS(pagePos, pageStartPos, Math::MACHINE_EPSILON_0, TEST_LOCATION);
516 scrollView.RemoveEffect(effect);
517 effect = ScrollViewCustomEffect::New();
518 effect.SetSwingAngle(Math::PI, Vector3::YAXIS);
519 effect.SetSwingAnchor(AnchorPoint::CENTER_LEFT);
520 effect.SetPageTranslation(Vector3(size.x, size.y, 0));
521 effect.SetOpacityThreshold(0.66f);
522 scrollView.ApplyEffect(effect);
524 for(ActorIter pageIter = gPages.begin(); pageIter != gPages.end(); ++pageIter)
526 Actor page = *pageIter;
527 page.RemoveConstraints();
528 page.ApplyConstraint( Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() ) );
529 effect.ApplyToPage(page, pageSize);
533 scrollView.ScrollTo(1);
534 while(!gOnScrollCompleteCalled)
538 ResetScrollCallbackResults();
539 // test that the first page has reached centre of screen
540 pagePos = testPage.GetCurrentPosition();
541 DALI_TEST_EQUALS(pagePos, Vector3::ZERO, Math::MACHINE_EPSILON_0, TEST_LOCATION);
543 // scroll back to page 0
544 scrollView.ScrollTo(0);
545 while(!gOnScrollCompleteCalled)
549 ResetScrollCallbackResults();
550 pagePos = testPage.GetCurrentPosition();
551 DALI_TEST_EQUALS(pagePos, pageStartPos, Math::MACHINE_EPSILON_0, TEST_LOCATION);
552 scrollView.RemoveEffect(effect);
555 effect.SetPageTranslateAlphaFunction(AlphaFunctions::Linear);
556 effect.SetPageTranslateAlphaFunction(AlphaFunctions::Linear, AlphaFunctions::Linear);
557 effect.SetPageTranslateAlphaFunctionIn(AlphaFunctions::Linear);
558 effect.SetPageTranslateAlphaFunctionOut(AlphaFunctions::Linear);
559 effect.SetGlobalPageRotation(Math::PI, Vector3::YAXIS);
560 effect.SetAngledOriginPageRotation(Vector3(Math::PI, Math::PI, 0.0f));
561 effect.SetGlobalPageRotation(Math::PI, Vector3::YAXIS, Math::PI, Vector3::YAXIS);
562 effect.SetGlobalPageRotationIn(Math::PI, Vector3::YAXIS);
563 effect.SetGlobalPageRotationOut(Math::PI, Vector3::YAXIS);
564 effect.SetGlobalPageRotationOrigin(Vector3::ZERO);
565 effect.SetGlobalPageRotationOrigin(Vector3::ZERO, Vector3::ZERO);
566 effect.SetGlobalPageRotationOriginIn(Vector3::ZERO);
567 effect.SetGlobalPageRotationOriginOut(Vector3::ZERO);
568 effect.SetSwingAngle(Math::PI, Vector3::YAXIS);
569 effect.SetSwingAngle(Math::PI, Vector3::YAXIS, Math::PI, Vector3::YAXIS);
570 effect.SetSwingAngleIn(Math::PI, Vector3::YAXIS);
571 effect.SetSwingAngleOut(Math::PI, Vector3::YAXIS);
572 effect.SetSwingAngleAlphaFunction(AlphaFunctions::Linear);
573 effect.SetSwingAngleAlphaFunction(AlphaFunctions::Linear, AlphaFunctions::Linear);
574 effect.SetSwingAngleAlphaFunctionIn(AlphaFunctions::Linear);
575 effect.SetSwingAngleAlphaFunctionOut(AlphaFunctions::Linear);
576 effect.SetSwingAnchor(AnchorPoint::CENTER, AnchorPoint::CENTER_LEFT);
577 effect.SetSwingAnchorIn(AnchorPoint::CENTER);
578 effect.SetSwingAnchorOut(AnchorPoint::CENTER);
579 effect.SetSwingAnchorAlphaFunction(AlphaFunctions::Linear);
580 effect.SetSwingAnchorAlphaFunction(AlphaFunctions::Linear, AlphaFunctions::Linear);
581 effect.SetSwingAnchorAlphaFunctionIn(AlphaFunctions::Linear);
582 effect.SetSwingAnchorAlphaFunctionOut(AlphaFunctions::Linear);
583 effect.SetOpacityThreshold(0.5f);
584 effect.SetOpacityThreshold(0.5f, 0.5f);
585 effect.SetOpacityThresholdIn(0.5f);
586 effect.SetOpacityThresholdOut(0.5f);
587 effect.SetOpacityAlphaFunction(AlphaFunctions::Linear);
588 effect.SetOpacityAlphaFunction(AlphaFunctions::Linear, AlphaFunctions::Linear);
589 effect.SetOpacityAlphaFunctionIn(AlphaFunctions::Linear);
590 effect.SetOpacityAlphaFunctionOut(AlphaFunctions::Linear);