telutils/dialpad/tsrc/unit/mt_dialpad/mt_dialpad.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 14:07:16 +0300
changeset 27 7eb70891911c
parent 13 e32024264ebb
child 31 a2467631ae02
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*!
* 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:
*
*/

#include <QtGui>
#include <QtTest/QtTest>

#include <hbapplication.h>
#include <hbmainwindow.h>
#include <hbaction.h>
#include <hbtoolbar.h>
#include <hbview.h>
#include <hblineedit.h>
#include <hbmessagebox.h>

#include "dialpadtest.h"
#include "dialpad.h"

const int WAIT_TIME = 300;
const int LONGPRESS_DURATION = 1000;

// helper class
class KeyEventCatcher : public QObject
{
public:
    bool eventFilter(QObject* watched, QEvent * event)
    {
        Q_UNUSED(watched);

        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
            mKeyPresses.append(keyEvent->key());
            return false;
        } else if (event->type() == QEvent::KeyRelease) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
            mKeyReleases.append(keyEvent->key());
            return false;
        }
        return false;
    }

public:
    QList<int> mKeyPresses;
    QList<int> mKeyReleases;
};

// test cases
class mt_Dialpad : public QObject
{
    Q_OBJECT

public:
    enum MouseEventType
    {
        Press,
        Release,
        Click
    };

private slots:
    void initTestCase();
    void cleanupTestCase();
    void cleanup();

    void testNumericButtons();
    void testNumericButtonLongPress();
    void testBackspace();
    void testAsteriskMultitap();
    void testCallButton();
    void testCloseGesture();
    void testOpenDialogWhileButtonPressed();
    void testTapOutsideDismiss();

#ifndef Q_OS_SYMBIAN
    void testCloseGestureLandscape();
    void testCloseGestureLandscapeMirrored();
    void testOrientationChange();
#endif

private:
    QGraphicsWidget* getWidgetByName(const QString& name);
    void mouseClickDialpad(int key, MouseEventType type=Click,
                           bool pause=true);

private:
    HbMainWindow*  mMainWindow;
    Dialpad*       mDialpad;
    KeyEventCatcher* mKeyCatcher;
    QMap<int,QString> mKeyNames;
};

void mt_Dialpad::initTestCase()
{
    mMainWindow = new HbMainWindow;

    mKeyCatcher = new KeyEventCatcher;
    mMainWindow->installEventFilter(mKeyCatcher);

    mDialpad = new Dialpad(*mMainWindow);

    QRectF rect(mMainWindow->contentsRect());
    rect.setHeight(rect.height()*0.7);
    rect.moveTop((mMainWindow->contentsRect().height()-rect.height())/2);

    mDialpad->setPreferredSize(mMainWindow->layoutRect().width(),
                               mMainWindow->layoutRect().height()/2);
    mDialpad->setPos(0,mMainWindow->layoutRect().height()/4);

    mKeyNames.insert(Qt::Key_1,"49");
    mKeyNames.insert(Qt::Key_2,"50");
    mKeyNames.insert(Qt::Key_3,"51");
    mKeyNames.insert(Qt::Key_4,"52");
    mKeyNames.insert(Qt::Key_5,"53");
    mKeyNames.insert(Qt::Key_6,"54");
    mKeyNames.insert(Qt::Key_7,"55");
    mKeyNames.insert(Qt::Key_8,"56");
    mKeyNames.insert(Qt::Key_9,"57");
    mKeyNames.insert(Qt::Key_Asterisk,"42");
    mKeyNames.insert(Qt::Key_0,"48");
    mKeyNames.insert(Qt::Key_NumberSign,"35");
    mKeyNames.insert(Qt::Key_Backspace,"16777219");
    mKeyNames.insert(Qt::Key_Yes,"16842753");

    mMainWindow->show();
    mDialpad->show();
    mDialpad->hide();
}

void mt_Dialpad::cleanupTestCase()
{
    delete mDialpad;
    delete mMainWindow;
    delete mKeyCatcher;
}

void mt_Dialpad::cleanup()
{
    mKeyCatcher->mKeyPresses.clear();
    mKeyCatcher->mKeyReleases.clear();
    mDialpad->editor().setText(QString());
    QTest::qWait( WAIT_TIME ); // delay between tests
}

QGraphicsWidget* mt_Dialpad::getWidgetByName(const QString& name)
{
    Q_ASSERT(mMainWindow!=0);

    QGraphicsWidget* widget = 0;

    QList<QGraphicsItem*> items = mMainWindow->scene()->items();
    foreach (QGraphicsItem* item, items) {
        if (item->isWidget()) {
            QGraphicsWidget *w = static_cast<QGraphicsWidget*>(item);
            if (w->objectName()==name) {
                widget = w;
            }
        }
    }

    return widget;
}

void mt_Dialpad::mouseClickDialpad(int key, MouseEventType type, bool pause)
{
    QString name = mKeyNames.value(key);

    QGraphicsWidget* widget = getWidgetByName(name);

    if ( widget ) {
        QPointF widgetPos = widget->scenePos() +
                            widget->rect().center();

        QPoint windowPos = mMainWindow->mapFromScene( widgetPos );

        if (type==Press) {
            QTest::mousePress( mMainWindow->viewport(), Qt::LeftButton,
                               0, windowPos );
        } else if (type==Release) {
            QTest::mouseRelease( mMainWindow->viewport(), Qt::LeftButton,
                                 0, windowPos );
        } else {
            QTest::mouseClick( mMainWindow->viewport(), Qt::LeftButton,
                               0, windowPos );
        }

        if (pause) {
            QTest::qWait( WAIT_TIME );
        }
    } else {
        QFAIL( "Button could not be accessed!" );
    }
}

void mt_Dialpad::testNumericButtons()
{
    QSignalSpy aboutToOpenSpy( mDialpad, SIGNAL(aboutToOpen()));
    QSignalSpy aboutToCloseSpy( mDialpad, SIGNAL(aboutToClose()));

    QVERIFY(mDialpad->isOpen()==false);
    mDialpad->openDialpad();
    QVERIFY(mDialpad->isOpen()==true);
    QVERIFY(aboutToOpenSpy.count()==1);
    QTest::qWait( 2*WAIT_TIME );

    mouseClickDialpad(Qt::Key_1);
    mouseClickDialpad(Qt::Key_2);
    mouseClickDialpad(Qt::Key_3);
    mouseClickDialpad(Qt::Key_4);
    mouseClickDialpad(Qt::Key_5);
    mouseClickDialpad(Qt::Key_6);
    mouseClickDialpad(Qt::Key_7);
    mouseClickDialpad(Qt::Key_8);
    mouseClickDialpad(Qt::Key_9);
    mouseClickDialpad(Qt::Key_Asterisk);
    mouseClickDialpad(Qt::Key_0);
    mouseClickDialpad(Qt::Key_NumberSign);

    QVERIFY(mDialpad->editor().text()=="123456789*0#");

    QVERIFY(mKeyCatcher->mKeyPresses.count()==12);
    QVERIFY(mKeyCatcher->mKeyReleases.count()==12);
    QVERIFY(mKeyCatcher->mKeyPresses.at(0)==Qt::Key_1);
    QVERIFY(mKeyCatcher->mKeyReleases.at(0)==Qt::Key_1);
    QVERIFY(mKeyCatcher->mKeyPresses.at(11)==Qt::Key_NumberSign);
    QVERIFY(mKeyCatcher->mKeyReleases.at(11)==Qt::Key_NumberSign);
    mDialpad->closeDialpad();
    QVERIFY(mDialpad->isOpen()==false);
    QVERIFY(aboutToCloseSpy.count()==1);
}

void mt_Dialpad::testNumericButtonLongPress()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_1, Press);
    QTest::qWait( LONGPRESS_DURATION );
    mouseClickDialpad(Qt::Key_1, Release);
    QVERIFY(mDialpad->editor().text()=="1");
    mDialpad->closeDialpad();
}

void mt_Dialpad::testBackspace()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_1);
    QVERIFY(mDialpad->editor().text()=="1");
    mouseClickDialpad(Qt::Key_Backspace);
    QVERIFY(mDialpad->editor().text()=="");
    QVERIFY(mKeyCatcher->mKeyPresses.count()==2);
    QVERIFY(mKeyCatcher->mKeyReleases.count()==2);
    QVERIFY(mKeyCatcher->mKeyPresses.at(1)==Qt::Key_Backspace);
    QVERIFY(mKeyCatcher->mKeyReleases.at(1)==Qt::Key_Backspace);
    // test repeats
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_1);
    mouseClickDialpad(Qt::Key_2);
    mouseClickDialpad(Qt::Key_3);
    QVERIFY(mDialpad->editor().text()=="123");
    mouseClickDialpad(Qt::Key_Backspace,Press);
    QTest::qWait( 1500 );
    mouseClickDialpad(Qt::Key_Backspace,Release);
    QVERIFY(mDialpad->editor().text()=="");
    mDialpad->closeDialpad();
}

void mt_Dialpad::testAsteriskMultitap()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_Asterisk);
    QVERIFY(mDialpad->editor().text()=="*");
    mouseClickDialpad(Qt::Key_Asterisk);
    QVERIFY(mDialpad->editor().text()=="+");
    mouseClickDialpad(Qt::Key_Asterisk);
    QVERIFY(mDialpad->editor().text()=="p");
    mouseClickDialpad(Qt::Key_Asterisk);
    QVERIFY(mDialpad->editor().text()=="w");

    QVERIFY(mKeyCatcher->mKeyPresses.count()==4);
    QVERIFY(mKeyCatcher->mKeyReleases.count()==4);
    QVERIFY(mKeyCatcher->mKeyPresses.at(1)==Qt::Key_Asterisk);
    QVERIFY(mKeyCatcher->mKeyReleases.at(1)==Qt::Key_Asterisk);
    QVERIFY(mKeyCatcher->mKeyPresses.at(2)==Qt::Key_Asterisk);
    QVERIFY(mKeyCatcher->mKeyReleases.at(2)==Qt::Key_Asterisk);

    // Verify that the second char can't be +
    QTest::qWait(1000);
    mouseClickDialpad(Qt::Key_Asterisk);
    QCOMPARE(mDialpad->editor().text(), QString("w*"));
    mouseClickDialpad(Qt::Key_Asterisk);
    QCOMPARE(mDialpad->editor().text(), QString("wp"));
    mouseClickDialpad(Qt::Key_Asterisk);
    QCOMPARE(mDialpad->editor().text(), QString("ww"));
    mouseClickDialpad(Qt::Key_Asterisk);
    QCOMPARE(mDialpad->editor().text(), QString("w*"));

    // test entering two asterisk
    QTest::qWait(1000);
    mDialpad->editor().setText(QString());
    mouseClickDialpad(Qt::Key_Asterisk);
    QTest::qWait( 1000 ); // longer than short tap
    mouseClickDialpad(Qt::Key_Asterisk);
    QCOMPARE(mDialpad->editor().text(), QString("**"));

    mDialpad->closeDialpad();
}

void mt_Dialpad::testCallButton()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    mDialpad->setCallButtonEnabled(false);
    mouseClickDialpad(Qt::Key_Yes);
    QVERIFY(mKeyCatcher->mKeyPresses.count()==0);
    QVERIFY(mKeyCatcher->mKeyReleases.count()==0);
    mDialpad->setCallButtonEnabled(true);
    mouseClickDialpad(Qt::Key_Yes);
    QTest::qWait( WAIT_TIME );
    QVERIFY(mKeyCatcher->mKeyPresses.count()==1);
    QVERIFY(mKeyCatcher->mKeyReleases.count()==1);
    QVERIFY(mKeyCatcher->mKeyPresses.at(0)==Qt::Key_Yes);
    QVERIFY(mKeyCatcher->mKeyReleases.at(0)==Qt::Key_Yes);
    mDialpad->closeDialpad();
}

void mt_Dialpad::testCloseGesture()
{
    QSignalSpy aboutToCloseSpy( mDialpad, SIGNAL(aboutToClose()));

    mDialpad->openDialpad();

    // slow swipe
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_2, Press, false);
    QTest::qWait( 500 ); // longer than swipe
    mouseClickDialpad(Qt::Key_8, Release, false);
    QTest::qWait( 500 );
    QVERIFY(mDialpad->isVisible()==true);

    // short swipe
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_2, Press, false);
    QTest::qWait( 200 );
    mouseClickDialpad(Qt::Key_5, Release, false);
    QTest::qWait( 500 );
    QVERIFY(mDialpad->isVisible()==true);

    // ok swipe
    mDialpad->editor().setText(QString());
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_2, Press, false);
    QTest::qWait( 200 );
    mouseClickDialpad(Qt::Key_8, Release, false);
    QVERIFY(mDialpad->editor().text()=="");
    QTest::qWait( 1000 );
    QVERIFY(mDialpad->isVisible()==false);
    QVERIFY(aboutToCloseSpy.count()==1);
}

void mt_Dialpad::testOpenDialogWhileButtonPressed()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_5, Press);
    QTest::qWait( LONGPRESS_DURATION );

    HbMessageBox* box = new HbMessageBox("Test dialog!");
    box->show();
    QTest::qWait( 500 );

    mouseClickDialpad(Qt::Key_5, Release);
    QTest::qWait( 100 );
    delete box;

    QVERIFY(mDialpad->editor().text()=="5");
    QVERIFY(mKeyCatcher->mKeyPresses.at(0)==Qt::Key_5);
    QVERIFY(mKeyCatcher->mKeyReleases.at(0)==Qt::Key_5);
    mDialpad->closeDialpad();
}

void mt_Dialpad::testTapOutsideDismiss()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );

    QPointF aboveTop = mDialpad->scenePos();
    aboveTop.setY(aboveTop.y()-10);
    aboveTop.setX(aboveTop.x()+mDialpad->rect().center().x());
    QPoint windowPos = mMainWindow->mapFromScene( aboveTop );

    // test tap outside dismiss is OFF (default)
    QTest::mouseClick( mMainWindow->viewport(), Qt::LeftButton,
                       0, windowPos );
    QTest::qWait( 500 );
    QVERIFY(mDialpad->isVisible());
    mDialpad->closeDialpad();

    // test tap outside dismiss is ON    
    mDialpad->setTapOutsideDismiss(true);
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    QTest::mouseClick( mMainWindow->viewport(), Qt::LeftButton,
                       0, windowPos );
    QTest::qWait( 500 );
    QVERIFY(!mDialpad->isVisible());
}

#ifndef Q_OS_SYMBIAN
void mt_Dialpad::testCloseGestureLandscape()
{
    // switch to landscape
    mMainWindow->setOrientation(Qt::Horizontal);
    mMainWindow->resize(640,360);
    QTest::qWait( 1000 );

    mDialpad->setPreferredSize(mMainWindow->layoutRect().width()/2,
                               mMainWindow->layoutRect().height());
    mDialpad->setPos(mMainWindow->layoutRect().width()/2,0);

    mDialpad->openDialpad();

    // slow swipe
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_4, Press, false);
    QTest::qWait( 500 ); // longer than swipe
    mouseClickDialpad(Qt::Key_6, Release, false);
    QTest::qWait( 500 );
    QVERIFY(mDialpad->isVisible()==true);

    // short swipe
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_4, Press, false);
    QTest::qWait( 200 );
    mouseClickDialpad(Qt::Key_5, Release, false);
    QTest::qWait( 500 );
    QVERIFY(mDialpad->isVisible()==true);

    // ok swipe
    mDialpad->editor().setText(QString());
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_4, Press, false);
    QTest::qWait( 200 );
    mouseClickDialpad(Qt::Key_6, Release, false);
    QVERIFY(mDialpad->editor().text()=="");
    QTest::qWait( 1000 );
    QVERIFY(mDialpad->isVisible()==false);
}

void mt_Dialpad::testCloseGestureLandscapeMirrored()
{
    // switch to mirrored landscape
    mMainWindow->setOrientation(Qt::Horizontal);
    mMainWindow->resize(640,360);
    mMainWindow->setLayoutDirection(Qt::RightToLeft);
    QTest::qWait( 1000 );

    mDialpad->setPos(0,0);

    mDialpad->openDialpad();

    // slow swipe
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_4, Press, false);
    QTest::qWait( 500 ); // longer than swipe
    mouseClickDialpad(Qt::Key_6, Release, false);
    QTest::qWait( WAIT_TIME );
    QVERIFY(mDialpad->isVisible()==true);

    // short swipe
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_4, Press, false);
    QTest::qWait( 200 );
    mouseClickDialpad(Qt::Key_5, Release, false);
    QTest::qWait( 1000 );
    QVERIFY(mDialpad->isVisible()==true);

    // ok swipe
    mDialpad->editor().setText(QString());
    QTest::qWait( WAIT_TIME );
    mouseClickDialpad(Qt::Key_4, Press, false);
    QTest::qWait( 200 );
    mouseClickDialpad(Qt::Key_6, Release, false);
    QVERIFY(mDialpad->editor().text()=="");
    QTest::qWait( 1000 );
    QVERIFY(mDialpad->isVisible()==false);
}

void mt_Dialpad::testOrientationChange()
{
    mDialpad->openDialpad();
    QTest::qWait( WAIT_TIME );
    mMainWindow->setLayoutDirection(Qt::LeftToRight);
    mMainWindow->setOrientation(Qt::Vertical);
    mMainWindow->resize(360,640);
    QTest::qWait( 1000 );
    mDialpad->setPreferredSize(mMainWindow->layoutRect().width(),
                               mMainWindow->layoutRect().height()/2);
    mDialpad->setPos(0,mMainWindow->layoutRect().height()/4);
    QTest::qWait( 1000 );
    QVERIFY(mDialpad->isVisible()==true);
    mDialpad->closeDialpad();
    QTest::qWait( 500 );
    QVERIFY(mDialpad->isVisible()==false);
}

#endif //Q_OS_SYMBIAN

DIALPAD_TEST_MAIN(mt_Dialpad)
#include "mt_dialpad.moc"