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;
31 const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
32 const unsigned int TOTAL_PAGE_NUMBER = 20;
33 const Vector2 PAGE_SIZE( 300.f,400.f );
34 const unsigned int IMAGE_WIDTH = 30;
35 const unsigned int IMAGE_HEIGHT = 30;
36 const Vector2 IMAGE_SIZE( static_cast<float>( IMAGE_WIDTH ), static_cast<float>(IMAGE_HEIGHT) );
37 const Vector2 SPINE_SHADOW_PARAMETER( 60.0f, 30.0f );
39 static bool gObjectCreatedCallBackCalled;
40 static void TestCallback(BaseHandle handle)
42 gObjectCreatedCallBackCalled = true;
46 * Simulate time passed by.
48 * @note this will always process at least 1 frame (1/60 sec)
50 * @param application Test application instance
51 * @param duration Time to pass in milliseconds.
53 void Wait(ToolkitTestApplication& application, int duration = 0)
55 for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
57 application.SendNotification();
58 application.Render(RENDER_FRAME_INTERVAL);
62 // Generate a PanGestureEvent to send to Core
63 Integration::PanGestureEvent GeneratePan(
65 const Vector2& previousPosition,
66 const Vector2& currentPosition,
67 unsigned long timeDelta,
68 unsigned int numberOfTouches = 1)
70 Integration::PanGestureEvent pan(state);
72 pan.previousPosition = previousPosition;
73 pan.currentPosition = currentPosition;
74 pan.timeDelta = timeDelta;
75 pan.numberOfTouches = numberOfTouches;
81 * Helper to generate PanGestureEvent
83 * @param[in] application Application instance
84 * @param[in] state The Gesture State
85 * @param[in] pos The current position of touch.
87 static void SendPan(ToolkitTestApplication& application, Gesture::State state, const Vector2& pos)
91 if( (state == Gesture::Started) ||
92 (state == Gesture::Possible) )
98 application.ProcessEvent(GeneratePan(state, last, pos, RENDER_FRAME_INTERVAL));
104 static Vector2 PerformGestureDiagonalSwipe(ToolkitTestApplication& application, Vector2 start, Vector2 direction, int frames, bool toStart = true, bool toFinish = true)
106 // Now do a pan starting from (start) and heading (direction)
111 SendPan(application, Gesture::Possible, pos);
113 SendPan(application, Gesture::Started, pos);
117 for(int i = 0;i<frames;i++)
119 pos += direction; // Move in this direction
120 SendPan(application, Gesture::Continuing, pos);
126 pos += direction; // Move in this direction
127 SendPan(application, Gesture::Finished, pos);
135 //Functor to test whether PageTurnSignal / PagePanSignal is emitted
136 class PageSignalCallback : public Dali::ConnectionTracker
140 PageSignalCallback( bool& signalReceived, PageTurnView& view, unsigned int& pageIndex, bool& isForwards )
141 : mSignalVerified( signalReceived ),
143 mPageIndex( pageIndex ),
144 mIsTurningForwards( isForwards )
148 // callback to be connected to PageTurnSignal
149 void PageTurnSignalCallback( PageTurnView view, unsigned int pageIndex, bool isTurningForward )
151 tet_infoline( "Verifying PageTurnedSignal" );
153 if( mView == view && mPageIndex == pageIndex && mIsTurningForwards == isTurningForward )
155 mSignalVerified = true;
159 // callback to be connected to PagePanSignal
160 void PagePanSignalCallback( PageTurnView view )
162 tet_infoline( "Verifying PagePannedSignal" );
166 mSignalVerified = true;
172 mSignalVerified = false;
175 bool& mSignalVerified;
177 unsigned int& mPageIndex;
178 bool& mIsTurningForwards;
183 //Implementation of PageFactory for providing page actors to PageTurnView
184 class TestPageFactory : public PageFactory
188 TestPageFactory(ToolkitTestApplication& application)
189 : mApplication( application )
191 mSourceActors.resize(TOTAL_PAGE_NUMBER);
192 mTotalPageNumber = TOTAL_PAGE_NUMBER;
196 * Query the number of pages available from the factory.
197 * The maximum available page has an ID of GetNumberOfPages()-1.
199 virtual unsigned int GetNumberOfPages()
201 return mTotalPageNumber;
205 * Create an image actor to represent a page.
206 * @param[in] pageId The ID of the page to create.
207 * @return An image actor, or an uninitialized pointer if the ID is out of range.
209 virtual Actor NewPage( unsigned int pageId )
211 if(!mSourceActors[pageId])
213 Actor actor = CreateSolidColorImageActor(mApplication, Color::BLUE,IMAGE_WIDTH,IMAGE_HEIGHT);
214 actor.SetName( static_cast<std::ostringstream*>( &(std::ostringstream() << pageId) )->str() );
216 actor.SetParentOrigin( ParentOrigin::CENTER );
217 actor.SetAnchorPoint( AnchorPoint::CENTER );
219 SetActorHittability( actor, true );
221 mSourceActors[pageId] = actor;
224 return mSourceActors[pageId];
227 void DeletePage( unsigned int pageId )
229 mSourceActors.erase( mSourceActors.begin() + pageId );
234 ToolkitTestApplication& mApplication;
235 std::vector<Actor> mSourceActors;
236 unsigned int mTotalPageNumber;
241 void dali_page_turn_view_startup(void)
243 test_return_value = TET_UNDEF;
246 void dali_page_turn_view_cleanup(void)
248 test_return_value = TET_PASS;
251 int UtcDaliPageTurnPortraitViewNew(void)
253 ToolkitTestApplication application;
255 tet_infoline(" UtcDaliPageTurnViewNew ");
257 // Test default constructor
258 PageTurnView portraitView;
259 DALI_TEST_CHECK( !portraitView );
261 // Test object creation
262 TestPageFactory factory(application);
263 portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
264 DALI_TEST_CHECK( portraitView );
266 //Additional check to ensure object is created by checking if it's registered
267 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
268 DALI_TEST_CHECK( registry );
270 gObjectCreatedCallBackCalled = false;
271 registry.ObjectCreatedSignal().Connect( &TestCallback );
273 TestPageFactory factory(application);
274 PageTurnView PortraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
276 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
278 // Test copy constructor
279 PageTurnView viewCopy( portraitView );
280 DALI_TEST_CHECK( viewCopy );
284 handleView = portraitView;
285 PageTurnView downCastView = PageTurnView::DownCast( handleView );
286 DALI_TEST_CHECK( downCastView );
290 int UtcDaliPageTurnLandscapeViewNew(void)
292 ToolkitTestApplication application;
294 tet_infoline(" UtcDaliPageTurnViewNew ");
296 //Test default constructor
297 PageTurnView landscapeView;
298 DALI_TEST_CHECK( !landscapeView );
300 // Test object creation
301 TestPageFactory factory(application);
302 landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
303 DALI_TEST_CHECK( landscapeView );
305 //Additional check to ensure object is created by checking if it's registered
306 ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
307 DALI_TEST_CHECK( registry );
309 gObjectCreatedCallBackCalled = false;
310 registry.ObjectCreatedSignal().Connect( &TestCallback );
312 TestPageFactory factory(application);
313 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
315 DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
317 // Test copy constructor
318 PageTurnView viewCopy( landscapeView );
319 DALI_TEST_CHECK( viewCopy );
323 handleView = landscapeView;
324 PageTurnView downCastView = PageTurnView::DownCast( handleView );
325 DALI_TEST_CHECK( downCastView );
330 int UtcDaliPageTurnViewSetAndGetSpineShadowParameter(void)
332 ToolkitTestApplication application;
334 tet_infoline(" UtcDaliPageTurnViewSetAndGetSpineShadowParameter ");
336 TestPageFactory factory(application);
337 PageTurnView landscapeView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
338 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() != SPINE_SHADOW_PARAMETER);
339 landscapeView.SetSpineShadowParameter(SPINE_SHADOW_PARAMETER);
340 DALI_TEST_CHECK( landscapeView.GetSpineShadowParameter() == SPINE_SHADOW_PARAMETER);
344 int UtcDaliPageTurnViewGoToPageAndGetCurrentPage(void)
346 ToolkitTestApplication application;
348 tet_infoline(" UtcDaliPageTurnViewGoToPageAndGetCurrentPage ");
350 TestPageFactory factory(application);
351 PageTurnView portraitView = PageTurnPortraitView::New( factory, PAGE_SIZE );
352 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0 );
354 portraitView.GoToPage( 10 );
355 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 10 );
357 portraitView.GoToPage( 5 );
358 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 5 );
362 int UtcDaliPageTurnViewEnterLeaveEditMode(void)
364 ToolkitTestApplication application;
366 tet_infoline( " UtcDaliPageTurnViewEnterLeaveEditMode " );
368 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
370 TestPageFactory factory(application);
371 factory.EnableOffscreenRendering( );
373 PageTurnView pageTurnView = PageTurnLandscapeView::New( factory, PAGE_SIZE );
374 pageTurnView.SetRelayoutEnabled( false );
375 pageTurnView.SetPositionInheritanceMode( USE_PARENT_POSITION );
376 Stage::GetCurrent().Add( pageTurnView );
378 Vector2 size = Stage::GetCurrent().GetSize();
380 pageTurnView.GoToPage(5);
383 application.SendNotification();
384 application.Render(RENDER_FRAME_INTERVAL);
386 Actor actor = pageTurnView.EnterEditMode();
387 // Test that when entering edit mode, current page source actor is returned.
389 std::istringstream( actor.GetName() ) >> pageId;
390 DALI_TEST_CHECK( pageId == 5 );
393 PageTurnView currentView;
394 unsigned int pageIndex;
395 bool isTurningForwards;
396 PageSignalCallback callbackPanStarted( signalVerified, currentView, pageIndex, isTurningForwards );
397 pageTurnView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
399 currentView = pageTurnView;
401 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
403 // Test that the control does not receive pan gesture in edit-mode
404 PerformGestureDiagonalSwipe( application, Vector2(size*0.75f), Vector2(size*0.01f), 10, true, true);
405 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
407 pageTurnView.LeaveEditMode();
408 // Test that the control receives pan gesture after leaving edit-mode
409 PerformGestureDiagonalSwipe( application, Vector2(size*0.75f), Vector2(size*0.01f), 10, true, true);
410 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
414 int UtcDaliPageTurnViewGetHitActor(void)
416 ToolkitTestApplication application;
418 tet_infoline(" UtcDaliPageTurnViewGetHitActor ");
420 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
422 TestPageFactory factory(application);
423 factory.EnableOffscreenRendering( );
425 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
426 pageTurnView.SetRelayoutEnabled( false );
427 pageTurnView.SetParentOrigin( ParentOrigin::TOP_LEFT );
428 pageTurnView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
429 Stage::GetCurrent().Add( pageTurnView );
432 application.SendNotification();
433 application.Render(RENDER_FRAME_INTERVAL);
435 pageTurnView.GoToPage(3);
437 Vector2 localCoordinate = Vector2();
438 Vector2 screenCoordinate = PAGE_SIZE*0.5f+Vector2(7.f,8.f);
439 Actor hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
440 DALI_TEST_CHECK( hitActor );
442 std::istringstream( hitActor.GetName() ) >> pageId;
443 DALI_TEST_CHECK( pageId == 3 );
444 DALI_TEST_EQUALS( localCoordinate, IMAGE_SIZE*0.5f+Vector2(7.f,8.f), 0.1f, TEST_LOCATION );
446 screenCoordinate = PAGE_SIZE*0.5f+IMAGE_SIZE;
447 hitActor = pageTurnView.GetHitActor( screenCoordinate, localCoordinate );
448 DALI_TEST_CHECK( !hitActor );
452 int UtcDaliPageTurnViewRefresh(void)
454 ToolkitTestApplication application;
456 tet_infoline(" UtcDaliPageTurnViewRefresh ");
458 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
460 TestPageFactory factory(application);
461 factory.EnableOffscreenRendering( );
462 PageTurnView pageTurnView = PageTurnPortraitView::New( factory, PAGE_SIZE );
463 pageTurnView.SetRelayoutEnabled( false );
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 application.GetGlAbstraction().SetCheckFramebufferStatusResult(GL_FRAMEBUFFER_COMPLETE );
501 TestPageFactory factory(application);
502 Vector2 size = Stage::GetCurrent().GetSize();
503 PageTurnView portraitView = PageTurnPortraitView::New( factory, size );
504 portraitView.SetRelayoutEnabled( false );
505 portraitView.SetPositionInheritanceMode( USE_PARENT_POSITION );
506 Stage::GetCurrent().Add( portraitView );
509 application.SendNotification();
510 application.Render(RENDER_FRAME_INTERVAL);
512 // [0]: testing PageTurnStartedSignal; [1]: testing PageTurnFinishedSignal
513 // [2]: testing PagePanStartedSignal; [3]: testing PagePanFinishedSignal
514 bool signalVerified[4] = {false, false, false, false};
515 PageTurnView currentView;
516 unsigned int pageIndex;
517 bool isTurningForwards;
519 PageSignalCallback callbackTurnStarted( signalVerified[0], currentView, pageIndex, isTurningForwards );
520 portraitView.PageTurnStartedSignal().Connect( &callbackTurnStarted, &PageSignalCallback::PageTurnSignalCallback );
522 PageSignalCallback callbackTurnFinished( signalVerified[1], currentView, pageIndex, isTurningForwards );
523 portraitView.PageTurnFinishedSignal().Connect( &callbackTurnFinished, &PageSignalCallback::PageTurnSignalCallback );
525 PageSignalCallback callbackPanStarted( signalVerified[2], currentView, pageIndex, isTurningForwards );
526 portraitView.PagePanStartedSignal().Connect( &callbackPanStarted, &PageSignalCallback::PagePanSignalCallback );
528 PageSignalCallback callbackPanFinished( signalVerified[3], currentView, pageIndex, isTurningForwards );
529 portraitView.PagePanFinishedSignal().Connect( &callbackPanFinished, &PageSignalCallback::PagePanSignalCallback );
531 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
532 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
533 DALI_TEST_CHECK( !callbackPanStarted.mSignalVerified );
534 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
536 currentView = portraitView;
538 //-----Test 1: pan 10 frames from position(size * 0.75f) to position(size * 0.25f), page 0 will be turned forward----
540 isTurningForwards = true;
541 // Do a pan moving up diagonally.
542 Vector2 start = size * 0.75f;
543 Vector2 direction = -size*0.05f; //-size*0.5f/10.f;
545 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 0);
546 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
547 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
548 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
549 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
550 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
552 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
553 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
554 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
556 Wait(application, 1000);
557 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
558 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex+1); // the page is turn over
560 //---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---
561 callbackTurnStarted.Reset();
562 callbackTurnFinished.Reset();
563 callbackPanStarted.Reset();
564 callbackPanFinished.Reset();
565 portraitView.GoToPage(5);
567 isTurningForwards = true;
569 //pan 10 frames from position( size.width, size.height*0.5f ) to position( size * 0.75f )
570 start = Vector2( size.width, size.height*0.5f );
571 direction = Vector2(-size.width*0.025f, size.height*0.025f);
572 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
573 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
574 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
575 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
576 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
578 signalVerified[0] = false;
579 isTurningForwards = false;
580 PerformGestureDiagonalSwipe( application, start + direction*2 , direction, 5, false, true);
581 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
582 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
583 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified ); // start the sliding back
585 Wait(application, 1000);
586 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
587 DALI_TEST_CHECK( portraitView.GetCurrentPage() == pageIndex); // the page is not turned over
589 // ----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---
590 callbackTurnStarted.Reset();
591 callbackTurnFinished.Reset();
592 callbackPanStarted.Reset();
593 callbackPanFinished.Reset();
594 portraitView.GoToPage(10);
595 pageIndex = 9; // will turn the previous page back
596 isTurningForwards = false;
598 direction = Vector2(size.x*0.05f, 0.f);
599 PerformGestureDiagonalSwipe( application, start, direction, 5, true, false);
600 DALI_TEST_CHECK( callbackPanStarted.mSignalVerified );
601 DALI_TEST_CHECK( !callbackTurnStarted.mSignalVerified );
602 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
603 DALI_TEST_CHECK( !callbackPanFinished.mSignalVerified );
605 PerformGestureDiagonalSwipe( application, start+direction*5.f, direction, 5, false, true);
606 DALI_TEST_CHECK( callbackTurnStarted.mSignalVerified );
607 DALI_TEST_CHECK( callbackPanFinished.mSignalVerified );
608 DALI_TEST_CHECK( !callbackTurnFinished.mSignalVerified );
610 Wait( application, 1000 );
612 DALI_TEST_CHECK( callbackTurnFinished.mSignalVerified );
613 DALI_TEST_CHECK( portraitView.GetCurrentPage() == 9);