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.
23 #include <dali-toolkit-test-suite-utils.h>
24 #include <dali-toolkit/dali-toolkit.h>
27 using namespace Dali::Toolkit;
29 void dali_page_turn_view_startup(void)
31 test_return_value = TET_UNDEF;
34 void dali_page_turn_view_cleanup(void)
36 test_return_value = TET_PASS;
43 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
44 const unsigned int TOTAL_PAGE_NUMBER = 20;
45 const Vector2 PAGE_SIZE( 300.f,400.f );
46 const unsigned int IMAGE_WIDTH = 30;
47 const unsigned int IMAGE_HEIGHT = 30;
48 const Vector2 IMAGE_SIZE( static_cast<float>( IMAGE_WIDTH ), static_cast<float>(IMAGE_HEIGHT) );
49 const Vector2 SPINE_SHADOW_PARAMETER( 60.0f, 30.0f );
51 static bool gObjectCreatedCallBackCalled;
52 static void TestCallback(BaseHandle handle)
54 gObjectCreatedCallBackCalled = true;
58 * Simulate time passed by.
60 * @note this will always process at least 1 frame (1/60 sec)
62 * @param application Test application instance
63 * @param duration Time to pass in milliseconds.
64 * @return The actual time passed in milliseconds
66 int Wait(ToolkitTestApplication& application, int duration = 0)
70 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
72 application.SendNotification();
73 application.Render(RENDER_FRAME_INTERVAL);
74 time += RENDER_FRAME_INTERVAL;
80 // Generate a PanGestureEvent to send to Core
81 Integration::PanGestureEvent GeneratePan(
83 const Vector2& previousPosition,
84 const Vector2& currentPosition,
85 unsigned long timeDelta,
86 unsigned int numberOfTouches = 1)
88 Integration::PanGestureEvent pan(state);
90 pan.previousPosition = previousPosition;
91 pan.currentPosition = currentPosition;
92 pan.timeDelta = timeDelta;
93 pan.numberOfTouches = numberOfTouches;
99 * Helper to generate PanGestureEvent
101 * @param[in] application Application instance
102 * @param[in] state The Gesture State
103 * @param[in] pos The current position of touch.
105 static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
109 if( (state == Gesture::Started) ||
110 (state == Gesture::Possible) )
116 application.ProcessEvent(GeneratePan(state, last, pos, RENDER_FRAME_INTERVAL));
122 static Vector2 PerformGestureDiagonalSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, bool toStart = true, bool toFinish = true)
124 // Now do a pan starting from (start) and heading (direction)
129 SendPan(application, Gesture::Possible, pos);
131 SendPan(application, Gesture::Started, pos);
135 for(int i = 0;i<frames;i++)
137 pos += direction; // Move in this direction
138 SendPan(application, Gesture::Continuing, pos);
144 pos += direction; // Move in this direction
145 SendPan(application, Gesture::Finished, pos);
153 //Functor to test whether PageTurnSignal / PagePanSignal is emitted
154 class PageSignalCallback : public Dali::ConnectionTracker
158 PageSignalCallback( bool& signalReceived, PageTurnView& view, unsigned int& pageIndex, bool& isForwards )
159 : mSignalVerified( signalReceived ),
161 mPageIndex( pageIndex ),
162 mIsTurningForwards( isForwards )
166 // callback to be connected to PageTurnSignal
167 void PageTurnSignalCallback( PageTurnView view, unsigned int pageIndex, bool isTurningForward )
169 tet_infoline( "Verifying PageTurnedSignal" );
171 if( mView == view && mPageIndex == pageIndex && mIsTurningForwards == isTurningForward )
173 mSignalVerified = true;
177 // callback to be connected to PagePanSignal
178 void PagePanSignalCallback( PageTurnView view )
180 tet_infoline( "Verifying PagePannedSignal" );
184 mSignalVerified = true;
190 mSignalVerified = false;
193 bool& mSignalVerified;
195 unsigned int& mPageIndex;
196 bool& mIsTurningForwards;
201 //Implementation of PageFactory for providing page actors to PageTurnView
202 class TestPageFactory : public PageFactory
206 TestPageFactory(ToolkitTestApplication& application)
207 : mApplication( application )
209 mSourceActors.resize(TOTAL_PAGE_NUMBER);
210 mTotalPageNumber = TOTAL_PAGE_NUMBER;
214 * Query the number of pages available from the factory.
215 * The maximum available page has an ID of GetNumberOfPages()-1.
217 virtual unsigned int GetNumberOfPages()
219 return mTotalPageNumber;
223 * Create an image actor to represent a page.
224 * @param[in] pageId The ID of the page to create.
225 * @return An image actor, or an uninitialized pointer if the ID is out of range.
227 virtual Actor NewPage( unsigned int pageId )
229 if(!mSourceActors[pageId])
231 Actor actor = CreateSolidColorImageActor(mApplication, Color::BLUE,IMAGE_WIDTH,IMAGE_HEIGHT);
232 actor.SetName( static_cast<std::ostringstream*>( &(std::ostringstream() << pageId) )->str() );
234 actor.SetParentOrigin( ParentOrigin::CENTER );
235 actor.SetAnchorPoint( AnchorPoint::CENTER );
237 SetActorHittability( actor, true );
239 mSourceActors[pageId] = actor;
242 return mSourceActors[pageId];
245 void DeletePage( unsigned int pageId )
247 mSourceActors.erase( mSourceActors.begin() + pageId );
252 ToolkitTestApplication& mApplication;
253 std::vector<Actor> mSourceActors;
254 unsigned int mTotalPageNumber;
260 int UtcDaliPageTurnPortraitViewNew(void)
262 ToolkitTestApplication application;
264 tet_infoline(" UtcDaliPageTurnViewNew ");
266 // Test default constructor
267 PageTurnView portraitView;
268 DALI_TEST_CHECK( !portraitView );
270 // Test object creation
271 TestPageFactory factory(application);
272 portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
273 DALI_TEST_CHECK( portraitView );
275 //Additional check to ensure object is created by checking if it's registered
276 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
277 DALI_TEST_CHECK( registry );
279 gObjectCreatedCallBackCalled = false;
280 registry.ObjectCreatedSignal().Connect( &TestCallback );
282 TestPageFactory factory(application);
283 PageTurnView PortraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
285 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
287 // Test copy constructor
288 PageTurnView viewCopy( portraitView );
289 DALI_TEST_CHECK( viewCopy );
293 handleView = portraitView;
294 PageTurnView downCastView = PageTurnView::DownCast( handleView );
295 DALI_TEST_CHECK( downCastView );
299 int UtcDaliPageTurnLandscapeViewNew(void)
301 ToolkitTestApplication application;
303 tet_infoline(" UtcDaliPageTurnViewNew ");
305 //Test default constructor
306 PageTurnView landscapeView;
307 DALI_TEST_CHECK( !landscapeView );
309 // Test object creation
310 TestPageFactory factory(application);
311 landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
312 DALI_TEST_CHECK( landscapeView );
314 //Additional check to ensure object is created by checking if it's registered
315 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
316 DALI_TEST_CHECK( registry );
318 gObjectCreatedCallBackCalled = false;
319 registry.ObjectCreatedSignal().Connect( &TestCallback );
321 TestPageFactory factory(application);
322 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
324 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
326 // Test copy constructor
327 PageTurnView viewCopy( landscapeView );
328 DALI_TEST_CHECK( viewCopy );
332 handleView = landscapeView;
333 PageTurnView downCastView = PageTurnView::DownCast( handleView );
334 DALI_TEST_CHECK( downCastView );
339 int UtcDaliPageTurnViewSetAndGetSpineShadowParameter(void)
341 ToolkitTestApplication application;
343 tet_infoline(" UtcDaliPageTurnViewSetAndGetSpineShadowParameter ");
345 TestPageFactory factory(application);
346 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
347 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() != SPINE_SHADOW_PARAMETER);
348 landscapeView.SetSpineShadowParameter(SPINE_SHADOW_PARAMETER);
349 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() == SPINE_SHADOW_PARAMETER);
353 int UtcDaliPageTurnViewGoToPageAndGetCurrentPage(void)
355 ToolkitTestApplication application;
357 tet_infoline(" UtcDaliPageTurnViewGoToPageAndGetCurrentPage ");
359 TestPageFactory factory(application);
360 PageTurnView portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
361 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0 );
363 portraitView.GoToPage( 10 );
364 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 10 );
366 portraitView.GoToPage( 5 );
367 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 5 );
371 int UtcDaliPageTurnViewEnterLeaveEditMode(void)
373 ToolkitTestApplication application;
375 tet_infoline( " UtcDaliPageTurnViewEnterLeaveEditMode " );
377 TestPageFactory factory(application);
378 factory.EnableOffscreenRendering( );
380 PageTurnView pageTurnView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
381 pageTurnView.SetPositionInheritanceMode( USE_PARENT_POSITION );
382 Stage::GetCurrent().Add( pageTurnView );
384 Vector2 size = Stage::GetCurrent().GetSize();
386 pageTurnView.GoToPage(5);
389 application.SendNotification();
390 application.Render(RENDER_FRAME_INTERVAL);
392 Actor actor = pageTurnView.EnterEditMode();
393 // Test that when entering edit mode, current page source actor is returned.
395 std::istringstream( actor.GetName() ) >> pageId;
396 DALI_TEST_CHECK( pageId == 5 );
399 PageTurnView currentView;
400 unsigned int pageIndex;
401 bool isTurningForwards;
402 PageSignalCallback callbackPanStarted( signalVerified, currentView, pageIndex, isTurningForwards );
403 pageTurnView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
405 currentView = pageTurnView;
407 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
409 // Test that the control does not receive pan gesture in edit-mode
410 PerformGestureDiagonalSwipe( application, Vector2(size*0.75f), Vector2(size*0.01f), 10, true, true);
411 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
413 pageTurnView.LeaveEditMode();
414 // Test that the control receives pan gesture after leaving edit-mode
415 PerformGestureDiagonalSwipe( application, Vector2(size*0.75f), Vector2(size*0.01f), 10, true, true);
416 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
420 int UtcDaliPageTurnViewGetHitActor(void)
422 ToolkitTestApplication application;
424 tet_infoline(" UtcDaliPageTurnViewGetHitActor ");
426 TestPageFactory factory(application);
427 factory.EnableOffscreenRendering( );
429 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
430 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
431 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
432 Stage::GetCurrent().Add( pageTurnView );
435 application.SendNotification();
436 application.Render(RENDER_FRAME_INTERVAL);
438 pageTurnView.GoToPage(3);
440 Vector2 localCoordinate = Vector2();
441 Vector2 screenCoordinate = PAGE_SIZE*0.5f+Vector2(7.f,8.f);
442 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
443 DALI_TEST_CHECK( hitActor );
445 std::istringstream( hitActor.GetName() ) >> pageId;
446 DALI_TEST_CHECK( pageId == 3 );
447 DALI_TEST_EQUALS( localCoordinate, IMAGE_SIZE*0.5f+Vector2(7.f,8.f), 0.1f, TEST_LOCATION );
449 screenCoordinate = PAGE_SIZE*0.5f+IMAGE_SIZE;
450 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
451 DALI_TEST_CHECK( !hitActor );
455 int UtcDaliPageTurnViewRefresh(void)
457 ToolkitTestApplication application;
459 tet_infoline(" UtcDaliPageTurnViewRefresh ");
461 TestPageFactory factory(application);
462 factory.EnableOffscreenRendering( );
463 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
464 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
465 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
466 Stage::GetCurrent().Add( pageTurnView );
469 application.SendNotification();
470 application.Render(RENDER_FRAME_INTERVAL);
471 application.Render(RENDER_FRAME_INTERVAL);
472 application.SendNotification();
474 factory.DeletePage( 0 );
476 pageTurnView.RefreshCurrentPage();
477 // simply calls the certain off screen render task to refresh
478 Vector2 localCoordinate = Vector2();
479 Vector2 screenCoordinate = PAGE_SIZE*0.5f;
480 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
482 std::istringstream( hitActor.GetName() ) >> pageId;
483 DALI_TEST_CHECK( pageId == 0 );
485 pageTurnView.RefreshAll();
486 // re-parent all the source actors and refresh
487 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
488 std::istringstream( hitActor.GetName() ) >> pageId;
489 DALI_TEST_CHECK( pageId == 1 );
493 int UtcDaliPageTurnViewSignals(void)
495 ToolkitTestApplication application;
497 tet_infoline(" UtcDaliPageTurnViewSignals ");
499 TestPageFactory factory(application);
500 Vector2 size = Stage::GetCurrent().GetSize();
501 PageTurnView portraitView = PageTurnPortraitView::New( factory, size );
502 portraitView.SetPositionInheritanceMode( USE_PARENT_POSITION );
503 Stage::GetCurrent().Add( portraitView );
506 application.SendNotification();
507 application.Render(RENDER_FRAME_INTERVAL);
509 // [0]: testing PageTurnStartedSignal; [1]: testing PageTurnFinishedSignal
510 // [2]: testing PagePanStartedSignal; [3]: testing PagePanFinishedSignal
511 bool signalVerified[4];
512 PageTurnView currentView;
513 unsigned int pageIndex;
514 bool isTurningForwards;
516 PageSignalCallback callbackTurnStarted( signalVerified[0], currentView, pageIndex, isTurningForwards );
517 portraitView.PageTurnStartedSignal().Connect( &callbackTurnStarted, &PageSignalCallback::PageTurnSignalCallback );
519 PageSignalCallback callbackTurnFinished( signalVerified[1], currentView, pageIndex, isTurningForwards );
520 portraitView.PageTurnFinishedSignal().Connect( &callbackTurnFinished, &PageSignalCallback::PageTurnSignalCallback );
522 PageSignalCallback callbackPanStarted( signalVerified[2], currentView, pageIndex, isTurningForwards );
523 portraitView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
525 PageSignalCallback callbackPanFinished( signalVerified[3], currentView, pageIndex, isTurningForwards );
526 portraitView.PagePanFinishedSignal().Connect( &callbackPanFinished, &PageSignalCallback::PagePanSignalCallback );
528 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
529 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
530 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
531 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
533 currentView = portraitView;
535 //-----Test 1: pan 10 frames from position(size * 0.75f) to position(size * 0.25f), page 0 will be turned forward----
537 isTurningForwards = true;
538 // Do a pan moving up diagonally.
539 Vector2 start = size * 0.75f;
540 Vector2 direction = -size*0.05f; //-size*0.5f/10.f;
542 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0);
543 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
544 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
545 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
546 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
547 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
549 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
550 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
551 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
553 Wait(application, 1000);
554 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
555 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex+1); // the page is turn over
557 //---Test 2: pan from position( size*0.5f ) to position( size.width, size.height*0.5f ) to position( size * 0.75f ), page 1 will bent then slid back---
558 callbackTurnStarted.Reset();
559 callbackTurnFinished.Reset();
560 callbackPanStarted.Reset();
561 callbackPanFinished.Reset();
562 portraitView.GoToPage(5);
564 isTurningForwards = true;
566 //pan 10 frames from position( size.width, size.height*0.5f ) to position( size * 0.75f )
567 start = Vector2( size.width, size.height*0.5f );
568 direction = Vector2(-size.width*0.025f, size.height*0.025f);
569 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
570 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
571 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
572 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
573 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
575 signalVerified[0] = false;
576 isTurningForwards = false;
577 PerformGestureDiagonalSwipe( application, start + direction*2 , direction, 5, false, true);
578 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
579 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
580 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified ); // start the sliding back
582 Wait(application, 1000);
583 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
584 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex); // the page is not turned over
586 // ----Test 3: pan 10 frames from position( size*0.25f ) to position( size.width*0.75f, size.height*0.25f ), the previous page will be turned backwards---
587 callbackTurnStarted.Reset();
588 callbackTurnFinished.Reset();
589 callbackPanStarted.Reset();
590 callbackPanFinished.Reset();
591 portraitView.GoToPage(10);
592 pageIndex = 9; // will turn the previous page back
593 isTurningForwards = false;
595 direction = Vector2(size.x*0.05f, 0.f);
596 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
597 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
598 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
599 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
600 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
602 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
603 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
604 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
605 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
607 Wait( application, 1000 );
609 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
610 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 9);