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.
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali/integration-api/events/pan-gesture-event.h>
25 #include <dali-toolkit/devel-api/controls/page-turn-view/page-factory.h>
26 #include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-landscape-view.h>
27 #include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-portrait-view.h>
28 #include <dali-toolkit/devel-api/controls/page-turn-view/page-turn-view.h>
33 using namespace Dali::Toolkit;
37 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
38 const unsigned int TOTAL_PAGE_NUMBER = 20;
39 const Vector2 PAGE_SIZE( 300.f,400.f );
40 const unsigned int IMAGE_WIDTH = 30;
41 const unsigned int IMAGE_HEIGHT = 30;
42 const Vector2 IMAGE_SIZE( static_cast<float>( IMAGE_WIDTH ), static_cast<float>(IMAGE_HEIGHT) );
43 const Vector2 SPINE_SHADOW_PARAMETER( 60.0f, 30.0f );
45 static bool gObjectCreatedCallBackCalled;
46 static void TestCallback(BaseHandle handle)
48 gObjectCreatedCallBackCalled = true;
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.
59 void Wait(ToolkitTestApplication& application, int duration = 0)
61 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
63 application.SendNotification();
64 application.Render(RENDER_FRAME_INTERVAL);
68 // Generate a PanGestureEvent to send to Core
69 Integration::PanGestureEvent GeneratePan(
71 const Vector2& previousPosition,
72 const Vector2& currentPosition,
73 unsigned long timeDelta,
74 unsigned int numberOfTouches = 1)
76 Integration::PanGestureEvent pan(state);
78 pan.previousPosition = previousPosition;
79 pan.currentPosition = currentPosition;
80 pan.timeDelta = timeDelta;
81 pan.numberOfTouches = numberOfTouches;
87 * Helper to generate PanGestureEvent
89 * @param[in] application Application instance
90 * @param[in] state The Gesture State
91 * @param[in] pos The current position of touch.
93 static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
97 if( (state == Gesture::Started) ||
98 (state == Gesture::Possible) )
104 application.ProcessEvent(GeneratePan(state, last, pos, RENDER_FRAME_INTERVAL));
110 static Vector2 PerformGestureDiagonalSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, bool toStart = true, bool toFinish = true)
112 // Now do a pan starting from (start) and heading (direction)
117 SendPan(application, Gesture::Possible, pos);
119 SendPan(application, Gesture::Started, pos);
123 for(int i = 0;i<frames;i++)
125 pos += direction; // Move in this direction
126 SendPan(application, Gesture::Continuing, pos);
132 pos += direction; // Move in this direction
133 SendPan(application, Gesture::Finished, pos);
141 //Functor to test whether PageTurnSignal / PagePanSignal is emitted
142 class PageSignalCallback : public Dali::ConnectionTracker
146 PageSignalCallback( bool& signalReceived, PageTurnView& view, unsigned int& pageIndex, bool& isForwards )
147 : mSignalVerified( signalReceived ),
149 mPageIndex( pageIndex ),
150 mIsTurningForwards( isForwards )
154 // callback to be connected to PageTurnSignal
155 void PageTurnSignalCallback( PageTurnView view, unsigned int pageIndex, bool isTurningForward )
157 tet_infoline( "Verifying PageTurnedSignal" );
159 if( mView == view && mPageIndex == pageIndex && mIsTurningForwards == isTurningForward )
161 mSignalVerified = true;
165 // callback to be connected to PagePanSignal
166 void PagePanSignalCallback( PageTurnView view )
168 tet_infoline( "Verifying PagePannedSignal" );
172 mSignalVerified = true;
178 mSignalVerified = false;
181 bool& mSignalVerified;
183 unsigned int& mPageIndex;
184 bool& mIsTurningForwards;
189 //Implementation of PageFactory for providing page actors to PageTurnView
190 class TestPageFactory : public PageFactory
194 TestPageFactory(ToolkitTestApplication& application)
195 : mApplication( application )
197 mSourceActors.resize(TOTAL_PAGE_NUMBER);
198 mTotalPageNumber = TOTAL_PAGE_NUMBER;
202 * Query the number of pages available from the factory.
203 * The maximum available page has an ID of GetNumberOfPages()-1.
205 virtual unsigned int GetNumberOfPages()
207 return mTotalPageNumber;
211 * Create an image actor to represent a page.
212 * @param[in] pageId The ID of the page to create.
213 * @return An image actor, or an uninitialized pointer if the ID is out of range.
215 virtual Actor NewPage( unsigned int pageId )
217 if(!mSourceActors[pageId])
219 Actor actor = CreateSolidColorImageActor(mApplication, Color::BLUE,IMAGE_WIDTH,IMAGE_HEIGHT);
220 actor.SetName( static_cast<std::ostringstream*>( &(std::ostringstream() << pageId) )->str() );
222 actor.SetParentOrigin( ParentOrigin::CENTER );
223 actor.SetAnchorPoint( AnchorPoint::CENTER );
225 SetActorHittability( actor, true );
227 mSourceActors[pageId] = actor;
230 return mSourceActors[pageId];
233 void DeletePage( unsigned int pageId )
235 mSourceActors.erase( mSourceActors.begin() + pageId );
240 ToolkitTestApplication& mApplication;
241 std::vector<Actor> mSourceActors;
242 unsigned int mTotalPageNumber;
247 void dali_page_turn_view_startup(void)
249 test_return_value = TET_UNDEF;
252 void dali_page_turn_view_cleanup(void)
254 test_return_value = TET_PASS;
257 int UtcDaliPageTurnPortraitViewNew(void)
259 ToolkitTestApplication application;
261 tet_infoline(" UtcDaliPageTurnViewNew ");
263 // Test default constructor
264 PageTurnView portraitView;
265 DALI_TEST_CHECK( !portraitView );
267 // Test object creation
268 TestPageFactory factory(application);
269 portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
270 DALI_TEST_CHECK( portraitView );
272 //Additional check to ensure object is created by checking if it's registered
273 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
274 DALI_TEST_CHECK( registry );
276 gObjectCreatedCallBackCalled = false;
277 registry.ObjectCreatedSignal().Connect( &TestCallback );
279 TestPageFactory factory(application);
280 PageTurnView PortraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
282 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
284 // Test copy constructor
285 PageTurnView viewCopy( portraitView );
286 DALI_TEST_CHECK( viewCopy );
290 handleView = portraitView;
291 PageTurnView downCastView = PageTurnView::DownCast( handleView );
292 DALI_TEST_CHECK( downCastView );
296 int UtcDaliPageTurnLandscapeViewNew(void)
298 ToolkitTestApplication application;
300 tet_infoline(" UtcDaliPageTurnViewNew ");
302 //Test default constructor
303 PageTurnView landscapeView;
304 DALI_TEST_CHECK( !landscapeView );
306 // Test object creation
307 TestPageFactory factory(application);
308 landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
309 DALI_TEST_CHECK( landscapeView );
311 //Additional check to ensure object is created by checking if it's registered
312 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
313 DALI_TEST_CHECK( registry );
315 gObjectCreatedCallBackCalled = false;
316 registry.ObjectCreatedSignal().Connect( &TestCallback );
318 TestPageFactory factory(application);
319 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
321 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
323 // Test copy constructor
324 PageTurnView viewCopy( landscapeView );
325 DALI_TEST_CHECK( viewCopy );
329 handleView = landscapeView;
330 PageTurnView downCastView = PageTurnView::DownCast( handleView );
331 DALI_TEST_CHECK( downCastView );
336 int UtcDaliPageTurnViewSetAndGetSpineShadowParameter(void)
338 ToolkitTestApplication application;
340 tet_infoline(" UtcDaliPageTurnViewSetAndGetSpineShadowParameter ");
342 TestPageFactory factory(application);
343 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
344 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() != SPINE_SHADOW_PARAMETER);
345 landscapeView.SetSpineShadowParameter(SPINE_SHADOW_PARAMETER);
346 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() == SPINE_SHADOW_PARAMETER);
350 int UtcDaliPageTurnViewGoToPageAndGetCurrentPage(void)
352 ToolkitTestApplication application;
354 tet_infoline(" UtcDaliPageTurnViewGoToPageAndGetCurrentPage ");
356 TestPageFactory factory(application);
357 PageTurnView portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
358 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0 );
360 portraitView.GoToPage( 10 );
361 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 10 );
363 portraitView.GoToPage( 5 );
364 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 5 );
368 int UtcDaliPageTurnViewEnterLeaveEditMode(void)
370 ToolkitTestApplication application;
372 tet_infoline( " UtcDaliPageTurnViewEnterLeaveEditMode " );
374 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
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 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
427 TestPageFactory factory(application);
428 factory.EnableOffscreenRendering( );
430 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
431 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
432 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
433 Stage::GetCurrent().Add( pageTurnView );
436 application.SendNotification();
437 application.Render(RENDER_FRAME_INTERVAL);
439 pageTurnView.GoToPage(3);
441 Vector2 localCoordinate = Vector2();
442 Vector2 screenCoordinate = PAGE_SIZE*0.5f+Vector2(7.f,8.f);
443 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
444 DALI_TEST_CHECK( hitActor );
446 std::istringstream( hitActor.GetName() ) >> pageId;
447 DALI_TEST_CHECK( pageId == 3 );
448 DALI_TEST_EQUALS( localCoordinate, IMAGE_SIZE*0.5f+Vector2(7.f,8.f), 0.1f, TEST_LOCATION );
450 screenCoordinate = PAGE_SIZE*0.5f+IMAGE_SIZE;
451 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
452 DALI_TEST_CHECK( !hitActor );
456 int UtcDaliPageTurnViewRefresh(void)
458 ToolkitTestApplication application;
460 tet_infoline(" UtcDaliPageTurnViewRefresh ");
462 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
464 TestPageFactory factory(application);
465 factory.EnableOffscreenRendering( );
466 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
467 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
468 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
469 Stage::GetCurrent().Add( pageTurnView );
472 application.SendNotification();
473 application.Render(RENDER_FRAME_INTERVAL);
474 application.Render(RENDER_FRAME_INTERVAL);
475 application.SendNotification();
477 factory.DeletePage( 0 );
479 pageTurnView.RefreshCurrentPage();
480 // simply calls the certain off screen render task to refresh
481 Vector2 localCoordinate = Vector2();
482 Vector2 screenCoordinate = PAGE_SIZE*0.5f;
483 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
485 std::istringstream( hitActor.GetName() ) >> pageId;
486 DALI_TEST_CHECK( pageId == 0 );
488 pageTurnView.RefreshAll();
489 // re-parent all the source actors and refresh
490 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
491 std::istringstream( hitActor.GetName() ) >> pageId;
492 DALI_TEST_CHECK( pageId == 1 );
496 int UtcDaliPageTurnViewSignals(void)
498 ToolkitTestApplication application;
500 tet_infoline(" UtcDaliPageTurnViewSignals ");
502 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
504 TestPageFactory factory(application);
505 Vector2 size = Stage::GetCurrent().GetSize();
506 PageTurnView portraitView = PageTurnPortraitView::New( factory, size );
507 portraitView.SetPositionInheritanceMode( USE_PARENT_POSITION );
508 Stage::GetCurrent().Add( portraitView );
511 application.SendNotification();
512 application.Render(RENDER_FRAME_INTERVAL);
514 // [0]: testing PageTurnStartedSignal; [1]: testing PageTurnFinishedSignal
515 // [2]: testing PagePanStartedSignal; [3]: testing PagePanFinishedSignal
516 bool signalVerified[4] = {false, false, false, false};
517 PageTurnView currentView;
518 unsigned int pageIndex;
519 bool isTurningForwards;
521 PageSignalCallback callbackTurnStarted( signalVerified[0], currentView, pageIndex, isTurningForwards );
522 portraitView.PageTurnStartedSignal().Connect( &callbackTurnStarted, &PageSignalCallback::PageTurnSignalCallback );
524 PageSignalCallback callbackTurnFinished( signalVerified[1], currentView, pageIndex, isTurningForwards );
525 portraitView.PageTurnFinishedSignal().Connect( &callbackTurnFinished, &PageSignalCallback::PageTurnSignalCallback );
527 PageSignalCallback callbackPanStarted( signalVerified[2], currentView, pageIndex, isTurningForwards );
528 portraitView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
530 PageSignalCallback callbackPanFinished( signalVerified[3], currentView, pageIndex, isTurningForwards );
531 portraitView.PagePanFinishedSignal().Connect( &callbackPanFinished, &PageSignalCallback::PagePanSignalCallback );
533 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
534 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
535 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
536 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
538 currentView = portraitView;
540 //-----Test 1: pan 10 frames from position(size * 0.75f) to position(size * 0.25f), page 0 will be turned forward----
542 isTurningForwards = true;
543 // Do a pan moving up diagonally.
544 Vector2 start = size * 0.75f;
545 Vector2 direction = -size*0.05f; //-size*0.5f/10.f;
547 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0);
548 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
549 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
550 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
551 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
552 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
554 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
555 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
556 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
558 Wait(application, 1000);
559 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
560 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex+1); // the page is turn over
562 //---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---
563 callbackTurnStarted.Reset();
564 callbackTurnFinished.Reset();
565 callbackPanStarted.Reset();
566 callbackPanFinished.Reset();
567 portraitView.GoToPage(5);
569 isTurningForwards = true;
571 //pan 10 frames from position( size.width, size.height*0.5f ) to position( size * 0.75f )
572 start = Vector2( size.width, size.height*0.5f );
573 direction = Vector2(-size.width*0.025f, size.height*0.025f);
574 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
575 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
576 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
577 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
578 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
580 signalVerified[0] = false;
581 isTurningForwards = false;
582 PerformGestureDiagonalSwipe( application, start + direction*2 , direction, 5, false, true);
583 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
584 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
585 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified ); // start the sliding back
587 Wait(application, 1000);
588 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
589 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex); // the page is not turned over
591 // ----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---
592 callbackTurnStarted.Reset();
593 callbackTurnFinished.Reset();
594 callbackPanStarted.Reset();
595 callbackPanFinished.Reset();
596 portraitView.GoToPage(10);
597 pageIndex = 9; // will turn the previous page back
598 isTurningForwards = false;
600 direction = Vector2(size.x*0.05f, 0.f);
601 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
602 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
603 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
604 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
605 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
607 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
608 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
609 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
610 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
612 Wait( application, 1000 );
614 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
615 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 9);