diff -r 6727c5d0afc7 -r 458d8c8d9580 homescreenapp/stateplugins/hshomescreenstateplugin/tsrc/t_hshomescreenstateplugin/src/t_hsidlestate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hshomescreenstateplugin/tsrc/t_hshomescreenstateplugin/src/t_hsidlestate.cpp Mon Oct 04 00:07:25 2010 +0300 @@ -0,0 +1,772 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Tests for HsIdleState class. +* +*/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "t_hshomescreenstateplugin.h" +#include "hsscene.h" +#include "hsgui.h" +#include "hspage.h" +#include "hswidgethost.h" +#include "hswidgethostvisual.h" +#include "hstitleresolver.h" +#include "hsconfiguration.h" +#include "hsidlewidget.h" + +void HomeScreenStatePluginTest::testIdleStateConstruction() +{ + QState *parent = new QState; + HsIdleState *is = new HsIdleState(parent); + + QVERIFY(is->parent() == parent); + QVERIFY(!is->mNavigationAction); + + QVERIFY(!is->findChildren().isEmpty()); + + delete parent; +} + +void HomeScreenStatePluginTest::testIdleStateEntryAndExit() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + + QFinalState *fs = new QFinalState; + sm->addState(fs); + + is->addTransition(this, SIGNAL(finishStateMachine()), fs); + + sm->start(); + // QApplication::processEvents(); + QCoreApplication::sendPostedEvents(); + + emit finishStateMachine(); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStatePageLayerPos() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + QVERIFY(qFuzzyCompare(is->pageLayerXPos(0), qreal(0))); + + delete is; + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStatePageChangeAnimation() +{ + createSceneAndWindow(2, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + + QFinalState *fs = new QFinalState; + sm->addState(fs); + + is->addTransition(this, SIGNAL(finishStateMachine()), fs); + + sm->start(); + QCoreApplication::sendPostedEvents(); + is->startPageChangeAnimation(1, 10); + + // Start two anims in a row + is->startPageChangeAnimation(1, 10); + is->startPageChangeAnimation(2, 10); + + emit finishStateMachine(); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStatePageChangeZones() +{ + createSceneAndWindow(1, 0); + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + //Test left page change zone's left border + is->mWidgetHotSpot = QPointF(0, 0); + QVERIFY(is->isInLeftPageChangeZone()); + QVERIFY(!is->isInRightPageChangeZone()); + QVERIFY(is->isInPageChangeZone()); + + //Test left page change zone's right border + is->mWidgetHotSpot = QPointF(HSCONFIGURATION_GET(pageChangeZoneWidth) - 1, 0); + QVERIFY(is->isInLeftPageChangeZone()); + QVERIFY(!is->isInRightPageChangeZone()); + QVERIFY(is->isInPageChangeZone()); + + //Test not in either of the page change zones + is->mWidgetHotSpot = QPointF(HSCONFIGURATION_GET(pageChangeZoneWidth), 0); + QVERIFY(!is->isInLeftPageChangeZone()); + QVERIFY(!is->isInRightPageChangeZone()); + QVERIFY(!is->isInPageChangeZone()); + + //Test right page change zone's right border + HsScene *scene = HsScene::instance(); + + sm->stop(); + delete sm; + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateAddPage() +{ + createSceneAndWindow(2, 0, 3); //pagecount 2, default page 0, max pages 3 + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + QString menuaction; + bool found = false; + HbView *idleView = HsGui::instance()->idleView(); + for(int i=0; i < idleView->menu()->actions().count(); i++){ + menuaction = idleView->menu()->actions()[i]->text(); + if(menuaction.left(27) == "txt_homescreen_opt_add_page"){ + found = true; + } + } + if(!found){ + QFAIL("txt_homescreen_opt_add_page menu action not found!"); + } + + emit is->event_addPage(); + + HsScene *scene = HsScene::instance(); + QCOMPARE(scene->pages().count(), 3); + // Active page index 0, the new page is created to the right side of it. + QCOMPARE(scene->activePageIndex(), 1); + + found = false; + for(int i=0; i < idleView->menu()->actions().count(); i++){ + menuaction = idleView->menu()->actions()[i]->text(); + if(menuaction.left(27) == "txt_homescreen_opt_add_page"){ + found = true; + } + } + if(found){ + QFAIL("txt_homescreen_opt_add_page menu action should not be found!"); + } + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateRemoveActivePage() +{ + createSceneAndWindow(3, 2); + + HsIdleState *is = new HsIdleState; + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + HsScene *scene = HsScene::instance(); + int numOfPages = scene->pages().count(); + + emit is->event_preRemovePage(); + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(scene->pages().count() == numOfPages-1); + QVERIFY(scene->activePageIndex() == 1); + + sm->stop(); + + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateRemovePage() +{ + createSceneAndWindow(2, 0); + HsScene::instance()->setActivePageIndex(1); // default page 0 cannot be removed + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + + QCoreApplication::sendPostedEvents(); + + QString menuaction; + bool found = false; + HbView *idleView = HsGui::instance()->idleView(); + for(int i=0; i < idleView->menu()->actions().count(); i++){ + menuaction = idleView->menu()->actions()[i]->text(); + if(menuaction.left(30) == "txt_homescreen_opt_remove_page"){ + found = true; + } + } + if(!found){ + QFAIL("txt_homescreen_opt_remove_page menu action not found!"); + } + + emit is->event_preRemovePage(); + + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + + HsScene *scene = HsScene::instance(); + QCOMPARE(scene->pages().count(), 1); + QCOMPARE(scene->activePageIndex(), 0); + + found = false; + idleView = HsGui::instance()->idleView(); + for(int i=0; i < idleView->menu()->actions().count(); i++){ + menuaction = idleView->menu()->actions()[i]->text(); + if(menuaction.left(30) == "txt_homescreen_opt_remove_page"){ + found = true; + } + } + if(found){ // Se above comment. + QFAIL("txt_homescreen_opt_remove_page menu action shound not be found!"); + } + + sm->stop(); + + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateToggleConnection() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + HsScene *scene = HsScene::instance(); + + QVERIFY(scene->isOnline()); + emit is->event_toggleConnection(); + QVERIFY(!scene->isOnline()); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateTapPage() +{ + createSceneAndWindow(HSCONFIGURATION_GET(maximumPageCount), 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + HbTapAndHoldGesture *gesture = new HbTapAndHoldGesture; + gesture->setHotSpot(QPointF(10, 100)); + QList gestures; + gestures << gesture; + QGestureEvent *gestureEvent = new QGestureEvent(gestures); + + QVERIFY(!is->mSceneMenu); + is->onPageTapAndHoldFinished(gestureEvent); + QVERIFY(is->mSceneMenu); + QVERIFY(is->mSceneMenu->actions().count() == 2); //Add page action should not exist + + delete gestureEvent; + gestures.clear(); + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStatePanPage() +{ + createSceneAndWindow(2, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + HbPanGesture *gesture = new HbPanGesture; + gesture->setHotSpot(QPointF(10, 100)); + QList gestures; + gestures << gesture; + QGestureEvent *gestureEvent = new QGestureEvent(gestures); + + //Start Panning + QSignalSpy moveSceneSpy(is, SIGNAL(event_moveScene())); + is->onPagePanStarted(gestureEvent); + QCOMPARE(moveSceneSpy.count(), 1); + + //Continue Panning + gesture->setHotSpot(QPointF(50, 100)); + is->onPagePanUpdated(gestureEvent); + + //Finish Panning + gesture->setHotSpot(QPointF(150, 100)); + QSignalSpy waitInputSpy(is, SIGNAL(event_waitInput())); + is->onPagePanFinished(gestureEvent); + QCOMPARE(waitInputSpy.count(), 1); + + delete gestureEvent; + gestures.clear(); + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateTapWidget() +{ + createSceneAndWindow(2, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + is->onWidgetTapStarted(QPointF(0,0), widget); + // widget is not activated on tap, only on tap and hold + QVERIFY(!scene->activeWidget()); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateDragWidget() +{ + createSceneAndWindow(2, 0, 3); + QStateMachine *sm = new QStateMachine; + HsIdleState *is = new HsIdleState; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + // try to move widget left from page 1, which isn't possible + HbTapAndHoldGesture *gesture = new HbTapAndHoldGesture; + gesture->setHotSpot(QPointF(10, 100)); + QList gestures; + gestures << gesture; + QGestureEvent *gestureEvent = new QGestureEvent(gestures); + QSignalSpy moveWidgetSpy(is, SIGNAL(event_moveWidget())); + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + is->onWidgetTapAndHoldFinished(gestureEvent, widget); + QCOMPARE(moveWidgetSpy.count(), 1); + moveWidgetSpy.clear(); + + is->onWidgetMoveUpdated(QPointF(10, 150), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + QSignalSpy waitInputSpy(is, SIGNAL(event_MoveWidgetDelete())); + is->onWidgetMoveFinished(QPointF(150, 150), widget); + QCOMPARE(waitInputSpy.count(), 1); + waitInputSpy.clear(); + + // move widget to second page + gesture->setHotSpot(QPointF(150, 150)); + is->onWidgetTapAndHoldFinished(gestureEvent, widget); + QCOMPARE(moveWidgetSpy.count(), 1); + moveWidgetSpy.clear(); + is->onWidgetMoveUpdated(QPointF(355, 150), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + + // move widget back to first page + is->onWidgetMoveUpdated(QPointF(10, 150), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + + // move widget to second page + is->onWidgetMoveUpdated(QPointF(350, 150), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + + // try to add page without releasing mouse button + is->onWidgetMoveUpdated(QPointF(350, 150), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + is->onWidgetMoveFinished(QPointF(150, 150), widget); + QCOMPARE(waitInputSpy.count(), 1); + waitInputSpy.clear(); + + // add page 3 + gesture->setHotSpot(QPointF(150, 150)); + is->onWidgetTapAndHoldFinished(gestureEvent, widget); + QCOMPARE(moveWidgetSpy.count(), 1); + moveWidgetSpy.clear(); + is->onWidgetMoveUpdated(QPointF(350, 150), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + is->onWidgetMoveFinished(QPointF(150, 150), widget); + QCOMPARE(waitInputSpy.count(), 1); + waitInputSpy.clear(); + + // try to move widget over trash bin + gesture->setHotSpot(QPointF(150, 150)); + is->onWidgetTapAndHoldFinished(gestureEvent, widget); + QCOMPARE(moveWidgetSpy.count(), 1); + moveWidgetSpy.clear(); + is->onWidgetMoveUpdated(QPointF(180, 600), widget); + is->onWidgetMoveUpdated(QPointF(180, 605), widget); + is->onWidgetMoveUpdated(QPointF(180, 610), widget); + is->onWidgetMoveUpdated(QPointF(180, 615), widget); + is->onWidgetMoveUpdated(QPointF(180, 620), widget); + is->onWidgetMoveUpdated(QPointF(180, 625), widget); + is->onWidgetMoveUpdated(QPointF(180, 630), widget); + is->onWidgetMoveUpdated(QPointF(180, 635), widget); + is->onWidgetMoveUpdated(QPointF(150, 150), widget); + is->onWidgetMoveFinished(QPointF(150, 150), widget); + QCOMPARE(waitInputSpy.count(), 1); + waitInputSpy.clear(); + + is->pageChangeAnimationFinished(); + + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateDeleteWidget() +{ + createSceneAndWindow(2, 0, 3); + QStateMachine *sm = new QStateMachine; + HsIdleState *is = new HsIdleState; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + //QApplication::processEvents(); + QCoreApplication::sendPostedEvents(); + // try to move widget left from page 1, which isn't possible + HbTapAndHoldGesture *gesture = new HbTapAndHoldGesture; + gesture->setHotSpot(QPointF(10, 100)); + QList gestures; + gestures << gesture; + QGestureEvent *gestureEvent = new QGestureEvent(gestures); + QSignalSpy moveWidgetSpy(is, SIGNAL(event_moveWidget())); + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + is->onWidgetTapAndHoldFinished(gestureEvent, widget); + QCOMPARE(moveWidgetSpy.count(), 1); + moveWidgetSpy.clear(); + + // test cases where active widget is not set and stop widget drag (should not be possible in real life) + QSignalSpy waitDeleteSpy(is, SIGNAL(event_MoveWidgetDelete())); + QSignalSpy waitInputSpy(is, SIGNAL(event_waitInput())); + scene->setActiveWidget(0); + is->onWidgetMoveFinished(QPointF(150, 150), widget); + QCOMPARE(waitInputSpy.count(), 2); + QCOMPARE(waitDeleteSpy.count(), 1); + + is->pageChangeAnimationFinished(); + + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); + + +} + +void HomeScreenStatePluginTest::testIdleStateMisc() +{ + createSceneAndWindow(2, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + is->onAddContentFromOptionsMenuActionTriggered(); + is->onAddContentFromContextMenuActionTriggered(); + is->action_idle_orientationChanged(); + + HsScene *scene = HsScene::instance(); + scene->setActiveWidget(scene->activePage()->widgets().first()); + is->updateSnapAlgorithmParameters(); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateChromeBehaviour() +{ + createSceneAndWindow(1, 0); + QScopedPointer is(new HsIdleState()); + + is->action_idle_setupView(); + + QString newTitle("title"); + + is->action_idle_setupTitle(); + + is->mTitleResolver->metaObject()->invokeMethod(is->mTitleResolver, + "titleChanged", + Q_ARG(QString, newTitle)); + HbView *idleView = HsGui::instance()->idleView(); + + QCOMPARE(idleView->title(), newTitle); + + QString t2("new title"); + + is->action_idle_cleanupTitle(); + + is->mTitleResolver->metaObject()->invokeMethod(is->mTitleResolver, + "titleChanged", + Q_ARG(QString, t2)); + + QCOMPARE(idleView->title(), newTitle); + + is->action_idle_setupTitle(); + + is->mTitleResolver->metaObject()->invokeMethod(is->mTitleResolver, + "titleChanged", + Q_ARG(QString, t2)); + + QCOMPARE(idleView->title(), t2); + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testEventFilter() +{ + // Create with no active page + createSceneAndWindow(1, -1); + HsIdleState *is = new HsIdleState(); + QEvent e(QEvent::ApplicationActivate); + is->eventFilter(0, &e); + + HsScene *s = HsScene::instance(); + HsPage *page = new HsPage(); + HsWidgetHost *wh = new HsWidgetHost(1); + page->addNewWidget(wh); + s->addPage(page); + s->setActivePage(page); + + is->eventFilter(0, &e); + + is->action_idle_setupView(); + + QEvent ee(QEvent::ApplicationDeactivate); + QSignalSpy spy(is, SIGNAL(event_waitInput())); + is->eventFilter(0, &ee); + + QCOMPARE(1, spy.count()); + + deleteSceneAndWindow(); + delete is; +} + +void HomeScreenStatePluginTest::testIdleStateSnapToObject() +{ + createSceneAndWindow(2, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + //The page has one widget, remove the widget. + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + scene->activePage()->removeWidget(widget); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateSnapToObjectSnapEffectDisabled() +{ + createSceneAndWindow(2, 0); + + HSCONFIGURATION_SET(setSnapEffectsEnabled, false); + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + //The page has one widget, remove the widget + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + scene->activePage()->removeWidget(widget); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testIdleStateSnapToObjectSnappingDisabled() +{ + createSceneAndWindow(2, 0); + + HSCONFIGURATION_SET(setSnapEnabled, false); + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + + //The page has one widget, remove the widget + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + scene->activePage()->removeWidget(widget); + + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testOnVerticalSnapLineTimerTimeout() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + is->onVerticalSnapLineTimerTimeout(); + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testOnHorizontalSnapLineTimerTimeout() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + is->onHorizontalSnapLineTimerTimeout(); + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testShowHorizontalLine() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + + QStateMachine *sm = new QStateMachine; + sm->addState(is); + sm->setInitialState(is); + sm->start(); + QCoreApplication::sendPostedEvents(); + is->showHorizontalLine(); + sm->stop(); + delete sm; + + deleteSceneAndWindow(); +} + +void HomeScreenStatePluginTest::testEditorAndVKB() +{ + createSceneAndWindow(1, 0); + + HsIdleState *is = new HsIdleState; + + is->closeVirtualKeyboard(); + + HsScene *scene = HsScene::instance(); + HsWidgetHost *widget = scene->activePage()->widgets().first(); + + // scene is not set for the widgets yet. + QVERIFY(!is->isEditor(QPointF(0,0), widget)); + + delete is; + + deleteSceneAndWindow(); +}