2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
26 using namespace Dali::Toolkit;
28 void dali_page_turn_view_startup(void)
30 test_return_value = TET_UNDEF;
33 void dali_page_turn_view_cleanup(void)
35 test_return_value = TET_PASS;
42 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
43 const unsigned int TOTAL_PAGE_NUMBER = 20;
44 const Vector2 PAGE_SIZE( 300.f,400.f );
45 const unsigned int IMAGE_WIDTH = 30;
46 const unsigned int IMAGE_HEIGHT = 30;
47 const Vector2 IMAGE_SIZE( static_cast<float>( IMAGE_WIDTH ), static_cast<float>(IMAGE_HEIGHT) );
48 const Vector2 SPINE_SHADOW_PARAMETER( 60.0f, 30.0f );
50 static bool gObjectCreatedCallBackCalled;
51 static void TestCallback(BaseHandle handle)
53 gObjectCreatedCallBackCalled = true;
57 * Simulate time passed by.
59 * @note this will always process at least 1 frame (1/60 sec)
61 * @param application Test application instance
62 * @param duration Time to pass in milliseconds.
63 * @return The actual time passed in milliseconds
65 int Wait(ToolkitTestApplication& application, int duration = 0)
69 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
71 application.SendNotification();
72 application.Render(RENDER_FRAME_INTERVAL);
73 time += RENDER_FRAME_INTERVAL;
79 // Generate a PanGestureEvent to send to Core
80 Integration::PanGestureEvent GeneratePan(
82 const Vector2& previousPosition,
83 const Vector2& currentPosition,
84 unsigned long timeDelta,
85 unsigned int numberOfTouches = 1)
87 Integration::PanGestureEvent pan(state);
89 pan.previousPosition = previousPosition;
90 pan.currentPosition = currentPosition;
91 pan.timeDelta = timeDelta;
92 pan.numberOfTouches = numberOfTouches;
98 * Helper to generate PanGestureEvent
100 * @param[in] application Application instance
101 * @param[in] state The Gesture State
102 * @param[in] pos The current position of touch.
104 static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
108 if( (state == Gesture::Started) ||
109 (state == Gesture::Possible) )
115 application.ProcessEvent(GeneratePan(state, last, pos, RENDER_FRAME_INTERVAL));
121 static Vector2 PerformGestureDiagonalSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, bool toStart = true, bool toFinish = true)
123 // Now do a pan starting from (start) and heading (direction)
128 SendPan(application, Gesture::Possible, pos);
130 SendPan(application, Gesture::Started, pos);
134 for(int i = 0;i<frames;i++)
136 pos += direction; // Move in this direction
137 SendPan(application, Gesture::Continuing, pos);
143 pos += direction; // Move in this direction
144 SendPan(application, Gesture::Finished, pos);
152 //Functor to test whether PageTurnSignal / PagePanSignal is emitted
153 class PageSignalCallback : public Dali::ConnectionTracker
157 PageSignalCallback( bool& signalReceived, PageTurnView& view, unsigned int& pageIndex, bool& isForwards )
158 : mSignalVerified( signalReceived ),
160 mPageIndex( pageIndex ),
161 mIsTurningForwards( isForwards )
165 // callback to be connected to PageTurnSignal
166 void PageTurnSignalCallback( PageTurnView view, unsigned int pageIndex, bool isTurningForward )
168 tet_infoline( "Verifying PageTurnedSignal" );
170 if( mView == view && mPageIndex == pageIndex && mIsTurningForwards == isTurningForward )
172 mSignalVerified = true;
176 // callback to be connected to PagePanSignal
177 void PagePanSignalCallback( PageTurnView view )
179 tet_infoline( "Verifying PagePannedSignal" );
183 mSignalVerified = true;
189 mSignalVerified = false;
192 bool& mSignalVerified;
194 unsigned int& mPageIndex;
195 bool& mIsTurningForwards;
200 //Implementation of PageFactory for providing page actors to PageTurnView
201 class TestPageFactory : public PageFactory
205 TestPageFactory(ToolkitTestApplication& application)
206 : mApplication( application )
208 mSourceActors.resize(TOTAL_PAGE_NUMBER);
209 mTotalPageNumber = TOTAL_PAGE_NUMBER;
213 * Query the number of pages available from the factory.
214 * The maximum available page has an ID of GetNumberOfPages()-1.
216 virtual unsigned int GetNumberOfPages()
218 return mTotalPageNumber;
222 * Create an image actor to represent a page.
223 * @param[in] pageId The ID of the page to create.
224 * @return An image actor, or an uninitialized pointer if the ID is out of range.
226 virtual Actor NewPage( unsigned int pageId )
228 if(!mSourceActors[pageId])
230 Actor actor = CreateSolidColorImageActor(mApplication, Color::BLUE,IMAGE_WIDTH,IMAGE_HEIGHT);
231 actor.SetName( static_cast<std::ostringstream*>( &(std::ostringstream() << pageId) )->str() );
233 actor.SetParentOrigin( ParentOrigin::CENTER );
234 actor.SetAnchorPoint( AnchorPoint::CENTER );
236 SetActorHittability( actor, true );
238 mSourceActors[pageId] = actor;
241 return mSourceActors[pageId];
244 void DeletePage( unsigned int pageId )
246 mSourceActors.erase( mSourceActors.begin() + pageId );
251 ToolkitTestApplication& mApplication;
252 std::vector<Actor> mSourceActors;
253 unsigned int mTotalPageNumber;
259 int UtcDaliPageTurnPortraitViewNew(void)
261 ToolkitTestApplication application;
263 tet_infoline(" UtcDaliPageTurnViewNew ");
265 // Test default constructor
266 PageTurnView portraitView;
267 DALI_TEST_CHECK( !portraitView );
269 // Test object creation
270 TestPageFactory factory(application);
271 portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
272 DALI_TEST_CHECK( portraitView );
274 //Additional check to ensure object is created by checking if it's registered
275 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
276 DALI_TEST_CHECK( registry );
278 gObjectCreatedCallBackCalled = false;
279 registry.ObjectCreatedSignal().Connect( &TestCallback );
281 TestPageFactory factory(application);
282 PageTurnView PortraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
284 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
286 // Test copy constructor
287 PageTurnView viewCopy( portraitView );
288 DALI_TEST_CHECK( viewCopy );
292 handleView = portraitView;
293 PageTurnView downCastView = PageTurnView::DownCast( handleView );
294 DALI_TEST_CHECK( downCastView );
298 int UtcDaliPageTurnLandscapeViewNew(void)
300 ToolkitTestApplication application;
302 tet_infoline(" UtcDaliPageTurnViewNew ");
304 //Test default constructor
305 PageTurnView landscapeView;
306 DALI_TEST_CHECK( !landscapeView );
308 // Test object creation
309 TestPageFactory factory(application);
310 landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
311 DALI_TEST_CHECK( landscapeView );
313 //Additional check to ensure object is created by checking if it's registered
314 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
315 DALI_TEST_CHECK( registry );
317 gObjectCreatedCallBackCalled = false;
318 registry.ObjectCreatedSignal().Connect( &TestCallback );
320 TestPageFactory factory(application);
321 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
323 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
325 // Test copy constructor
326 PageTurnView viewCopy( landscapeView );
327 DALI_TEST_CHECK( viewCopy );
331 handleView = landscapeView;
332 PageTurnView downCastView = PageTurnView::DownCast( handleView );
333 DALI_TEST_CHECK( downCastView );
338 int UtcDaliPageTurnViewSetAndGetSpineShadowParameter(void)
340 ToolkitTestApplication application;
342 tet_infoline(" UtcDaliPageTurnViewSetAndGetSpineShadowParameter ");
344 TestPageFactory factory(application);
345 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
346 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() != SPINE_SHADOW_PARAMETER);
347 landscapeView.SetSpineShadowParameter(SPINE_SHADOW_PARAMETER);
348 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() == SPINE_SHADOW_PARAMETER);
352 int UtcDaliPageTurnViewGoToPageAndGetCurrentPage(void)
354 ToolkitTestApplication application;
356 tet_infoline(" UtcDaliPageTurnViewGoToPageAndGetCurrentPage ");
358 TestPageFactory factory(application);
359 PageTurnView portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
360 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0 );
362 portraitView.GoToPage( 10 );
363 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 10 );
365 portraitView.GoToPage( 5 );
366 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 5 );
370 int UtcDaliPageTurnViewEnterLeaveEditMode(void)
372 ToolkitTestApplication application;
374 tet_infoline( " UtcDaliPageTurnViewEnterLeaveEditMode " );
376 TestPageFactory factory(application);
377 factory.EnableOffscreenRendering( );
379 PageTurnView pageTurnView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
380 pageTurnView.SetPositionInheritanceMode( USE_PARENT_POSITION );
381 Stage::GetCurrent().Add( pageTurnView );
383 Vector2 size = Stage::GetCurrent().GetSize();
385 pageTurnView.GoToPage(5);
388 application.SendNotification();
389 application.Render(RENDER_FRAME_INTERVAL);
391 Actor actor = pageTurnView.EnterEditMode();
392 // Test that when entering edit mode, current page source actor is returned.
394 std::istringstream( actor.GetName() ) >> pageId;
395 DALI_TEST_CHECK( pageId == 5 );
398 PageTurnView currentView;
399 unsigned int pageIndex;
400 bool isTurningForwards;
401 PageSignalCallback callbackPanStarted( signalVerified, currentView, pageIndex, isTurningForwards );
402 pageTurnView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
404 currentView = pageTurnView;
406 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
408 // Test that the control does not receive pan gesture in edit-mode
409 PerformGestureDiagonalSwipe( application, Vector2(size*0.75f), Vector2(size*0.01f), 10, true, true);
410 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
412 pageTurnView.LeaveEditMode();
413 // Test that the control receives pan gesture after leaving edit-mode
414 PerformGestureDiagonalSwipe( application, Vector2(size*0.75f), Vector2(size*0.01f), 10, true, true);
415 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
419 int UtcDaliPageTurnViewGetHitActor(void)
421 ToolkitTestApplication application;
423 tet_infoline(" UtcDaliPageTurnViewGetHitActor ");
425 TestPageFactory factory(application);
426 factory.EnableOffscreenRendering( );
428 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
429 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
430 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
431 Stage::GetCurrent().Add( pageTurnView );
434 application.SendNotification();
435 application.Render(RENDER_FRAME_INTERVAL);
437 pageTurnView.GoToPage(3);
439 Vector2 localCoordinate = Vector2();
440 Vector2 screenCoordinate = PAGE_SIZE*0.5f+Vector2(7.f,8.f);
441 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
442 DALI_TEST_CHECK( hitActor );
444 std::istringstream( hitActor.GetName() ) >> pageId;
445 DALI_TEST_CHECK( pageId == 3 );
446 DALI_TEST_EQUALS( localCoordinate, IMAGE_SIZE*0.5f+Vector2(7.f,8.f), 0.1f, TEST_LOCATION );
448 screenCoordinate = PAGE_SIZE*0.5f+IMAGE_SIZE;
449 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
450 DALI_TEST_CHECK( !hitActor );
454 int UtcDaliPageTurnViewRefresh(void)
456 ToolkitTestApplication application;
458 tet_infoline(" UtcDaliPageTurnViewRefresh ");
460 TestPageFactory factory(application);
461 factory.EnableOffscreenRendering( );
462 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
463 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
464 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
465 Stage::GetCurrent().Add( pageTurnView );
468 application.SendNotification();
469 application.Render(RENDER_FRAME_INTERVAL);
470 application.Render(RENDER_FRAME_INTERVAL);
471 application.SendNotification();
473 factory.DeletePage( 0 );
475 pageTurnView.RefreshCurrentPage();
476 // simply calls the certain off screen render task to refresh
477 Vector2 localCoordinate = Vector2();
478 Vector2 screenCoordinate = PAGE_SIZE*0.5f;
479 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
481 std::istringstream( hitActor.GetName() ) >> pageId;
482 DALI_TEST_CHECK( pageId == 0 );
484 pageTurnView.RefreshAll();
485 // re-parent all the source actors and refresh
486 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
487 std::istringstream( hitActor.GetName() ) >> pageId;
488 DALI_TEST_CHECK( pageId == 1 );
492 int UtcDaliPageTurnViewSignals(void)
494 ToolkitTestApplication application;
496 tet_infoline(" UtcDaliPageTurnViewSignals ");
498 TestPageFactory factory(application);
499 Vector2 size = Stage::GetCurrent().GetSize();
500 PageTurnView portraitView = PageTurnPortraitView::New( factory, size );
501 portraitView.SetPositionInheritanceMode( USE_PARENT_POSITION );
502 Stage::GetCurrent().Add( portraitView );
505 application.SendNotification();
506 application.Render(RENDER_FRAME_INTERVAL);
508 // [0]: testing PageTurnStartedSignal; [1]: testing PageTurnFinishedSignal
509 // [2]: testing PagePanStartedSignal; [3]: testing PagePanFinishedSignal
510 bool signalVerified[4];
511 PageTurnView currentView;
512 unsigned int pageIndex;
513 bool isTurningForwards;
515 PageSignalCallback callbackTurnStarted( signalVerified[0], currentView, pageIndex, isTurningForwards );
516 portraitView.PageTurnStartedSignal().Connect( &callbackTurnStarted, &PageSignalCallback::PageTurnSignalCallback );
518 PageSignalCallback callbackTurnFinished( signalVerified[1], currentView, pageIndex, isTurningForwards );
519 portraitView.PageTurnFinishedSignal().Connect( &callbackTurnFinished, &PageSignalCallback::PageTurnSignalCallback );
521 PageSignalCallback callbackPanStarted( signalVerified[2], currentView, pageIndex, isTurningForwards );
522 portraitView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
524 PageSignalCallback callbackPanFinished( signalVerified[3], currentView, pageIndex, isTurningForwards );
525 portraitView.PagePanFinishedSignal().Connect( &callbackPanFinished, &PageSignalCallback::PagePanSignalCallback );
527 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
528 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
529 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
530 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
532 currentView = portraitView;
534 //-----Test 1: pan 10 frames from position(size * 0.75f) to position(size * 0.25f), page 0 will be turned forward----
536 isTurningForwards = true;
537 // Do a pan moving up diagonally.
538 Vector2 start = size * 0.75f;
539 Vector2 direction = -size*0.05f; //-size*0.5f/10.f;
541 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0);
542 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
543 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
544 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
545 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
546 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
548 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
549 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
550 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
552 Wait(application, 1000);
553 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
554 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex+1); // the page is turn over
556 //---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---
557 callbackTurnStarted.Reset();
558 callbackTurnFinished.Reset();
559 callbackPanStarted.Reset();
560 callbackPanFinished.Reset();
561 portraitView.GoToPage(5);
563 isTurningForwards = true;
565 //pan 10 frames from position( size.width, size.height*0.5f ) to position( size * 0.75f )
566 start = Vector2( size.width, size.height*0.5f );
567 direction = Vector2(-size.width*0.025f, size.height*0.025f);
568 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
569 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
570 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
571 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
572 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
574 signalVerified[0] = false;
575 isTurningForwards = false;
576 PerformGestureDiagonalSwipe( application, start + direction*2 , direction, 5, false, true);
577 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
578 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
579 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified ); // start the sliding back
581 Wait(application, 1000);
582 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
583 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex); // the page is not turned over
585 // ----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---
586 callbackTurnStarted.Reset();
587 callbackTurnFinished.Reset();
588 callbackPanStarted.Reset();
589 callbackPanFinished.Reset();
590 portraitView.GoToPage(10);
591 pageIndex = 9; // will turn the previous page back
592 isTurningForwards = false;
594 direction = Vector2(size.x*0.05f, 0.f);
595 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
596 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
597 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
598 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
599 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
601 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
602 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
603 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
604 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
606 Wait( application, 1000 );
608 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
609 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 9);