cmmanager/cmapplsettingsui/tsrc/ut/testcmapplsettingsui.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:35:44 +0300
branchRCL_3
changeset 57 05bc53fe583b
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2010 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:
* CM Application Settings UI unit testing.
*/

#include <QSharedPointer>

#include <HbApplication>
#include <HbMainWindow>
#include <HbDialog>
#include <HbRadioButtonList>
#include <HbAction>
#include <QtTest/QtTest>

#include "cmapplsettingsui_p.h"
#include "cmradiodialog.h"

#include "hbautotest.h"
#include "testcmapplsettingsui.h"

// -----------------------------------------------------------------------------
// STATIC TEST DATA
// -----------------------------------------------------------------------------

// Time to wait before continuing after an UI step
static const int waitTime = 10;

// Destination list item for Connection Method selection
static const QString dedicatedAccessPoint = "Dedicated access point";

static const QStringList allDestinations = QStringList() <<
    "Internet" <<
    "My Snap" <<
    dedicatedAccessPoint;

static const QStringList allConnectionMethods = QStringList()
    << "Home WLAN"
    << "packet data 1"
    << "packet data 2"
    << "packet data 3"
    << "Streaming"
    << "WLAN IAP 1"
    << "WLAN IAP 2"
    << "WLAN IAP 3";

static const QStringList gprsConnectionMethods = QStringList()
    << "packet data 1"
    << "packet data 2"
    << "packet data 3"
    << "Streaming";

static const QStringList wlanConnectionMethods = QStringList()
    << "Home WLAN"
    << "WLAN IAP 1"
    << "WLAN IAP 2"
    << "WLAN IAP 3";

// -----------------------------------------------------------------------------
// FRAMEWORK FUNCTIONS
// -----------------------------------------------------------------------------

/**
 * Test main function. Runs all test cases.
 */
#ifndef TESTCMAPPLSETTINGSUI_NO_OUTPUT_REDIRECT
int main(int argc, char *argv[])
{
    HbApplication app(argc, argv);
    app.setApplicationName("TestCmApplSettingsUi");
    
    char *pass[3];  
    pass[0] = argv[0];
    pass[1] = "-o"; 
    pass[2] = "c:\\data\\TestCmApplSettingsUi.txt";
 
    TestCmApplSettingsUi tc;
    int res = QTest::qExec(&tc, 3, pass);
 
    return res;
}
#else
QTEST_MAIN(TestCmApplSettingsUi)
#endif

/**
 * This function is be called before the first test case is executed.
 */
void TestCmApplSettingsUi::initTestCase()
{
    mMainWindow = new HbAutoTestMainWindow;
    //mMainWindow = new HbMainWindow;
    mMainWindow->show();
    mSelection.result = CmApplSettingsUi::SelectionTypeDestination;
    mSelection.id = 0;
    mSignalFinished = NULL;
}

/**
 * This function is be called after the last test case was executed.
 */
void TestCmApplSettingsUi::cleanupTestCase()
{
    delete mMainWindow;
    mMainWindow = 0;
}

/**
 * This function is be called before each test case is executed.
 */
void TestCmApplSettingsUi::init()
{
    // Initialize the CmApplSettingsUI object
    mApplSettUi = new CmApplSettingsUi;

    // Initialize code references
    mApplSettingsPriv = mApplSettUi->d_ptr;
    QVERIFY(mApplSettingsPriv != NULL);

    // CmApplSettingsUI finished(uint) signal watcher
    mSignalFinished = new QSignalSpy(mApplSettUi, SIGNAL(finished(uint)));
    QVERIFY(mSignalFinished->isValid() == true);
}

/**
 * This function is be called after each test case is executed.
 */
void TestCmApplSettingsUi::cleanup()
{
    delete mApplSettUi;
    mApplSettUi = NULL;
    
    mApplSettingsPriv = NULL;
    
    QCOMPARE(mSignalFinished->count(), 0);
    delete mSignalFinished;
    mSignalFinished = NULL;
}

// -----------------------------------------------------------------------------
// TEST CASES
// -----------------------------------------------------------------------------

void TestCmApplSettingsUi::tcConfigAndDelete()
{
    // Form the configuration parameters
    mSelection.result = CmApplSettingsUi::SelectionTypeDestination;
    mSelection.id = 0;
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowDestinations;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
        
    // Configure the dialog
    mApplSettUi->setOptions(listItems, filter);
    mApplSettUi->setSelection(mSelection);
    
    // Skip execution, to test premature deletion
}

void TestCmApplSettingsUi::tcNoContentToShow()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    mApplSettUi->setOptions(listItems, filter);

    // Run the dialog
    mApplSettUi->open();
    
    // The dialog should fail to no content error code,
    // since no selection dialog items were selected.
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNoContent);
}

void TestCmApplSettingsUi::tcDestinationSelect()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowDestinations;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    mApplSettUi->setOptions(listItems, filter);
    
    // Run the dialog
    mApplSettUi->open();
    
    // Validate the dialog content
    QStringList destinations;
    destinations
        << "Internet"
        << "My Snap";
    subCheckDialog(
        mApplSettingsPriv->mDestinationDialog,
        destinations,
        0);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mDestinationDialog->mDialog, true);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNone);

    // Selection should be Internet Destination
    mSelection.result = CmApplSettingsUi::SelectionTypeDestination;
    mSelection.id = 4099;
    subVerifySelection(mSelection);
}

void TestCmApplSettingsUi::tcDestinationCancel()
{
    // Run the dialog with default parameters
    mApplSettUi->open();

    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mDestinationDialog,
        allDestinations,
        0);

    // Click "Cancel"
    subDismissDialog(mApplSettingsPriv->mDestinationDialog->mDialog, false);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorCancel);
}

void TestCmApplSettingsUi::tcDestinationFilterWlan()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowDestinations;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    filter |= CMManagerShim::BearerTypeWlan;
    mApplSettUi->setOptions(listItems, filter);
    
    // Run the dialog
    mApplSettUi->open();
    
    // Validate the dialog content
    QStringList destinations;
    destinations
        << "Internet"
        << "My Snap";
    subCheckDialog(
        mApplSettingsPriv->mDestinationDialog,
        destinations,
        0);
    
    // Select "My Snap"
    subSelectDialogItem(
        mApplSettingsPriv->mDestinationDialog,
        1);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mDestinationDialog->mDialog, true);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNone);

    // Selection should be "My Snap" Destination
    mSelection.result = CmApplSettingsUi::SelectionTypeDestination;
    mSelection.id = 4102;
    subVerifySelection(mSelection);
}

void TestCmApplSettingsUi::tcDestinationFilterUnknown()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowDestinations;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    filter |= 0x10281BB7;       // Obsolete CSD bearer type
    mApplSettUi->setOptions(listItems, filter);

    // Run the dialog with default parameters
    mApplSettUi->open();

    // The dialog should fail since there's nothing to show
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNoContent);
}

void TestCmApplSettingsUi::tcDedicatedConnMethodSelect()
{
    // Configure the dialog
    mSelection.result = CmApplSettingsUi::SelectionTypeDestination;
    mSelection.id = 4099;
    mApplSettUi->setSelection(mSelection);
    
    // Run the dialog with default parameters
    mApplSettUi->open();

    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mDestinationDialog,
        allDestinations,
        0);
    
    // Select "Dedicated access point"
    subSelectDialogItem(
        mApplSettingsPriv->mDestinationDialog,
        2);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mDestinationDialog->mDialog, true);

    // Connection method list should open
    subCheckDialog(
        mApplSettingsPriv->mConnMethodDialog,
        allConnectionMethods,
        0);

    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mConnMethodDialog->mDialog, true);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNone);
    
    // Selection should be Connection Method "Home WLAN"
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 8;
    subVerifySelection(mSelection);
}

void TestCmApplSettingsUi::tcDedicatedConnMethodCancel()
{
    // Configure the dialog
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 1;
    mApplSettUi->setSelection(mSelection);
    
    // Run the dialog with default parameters
    mApplSettUi->open();

    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mDestinationDialog,
        allDestinations,
        2);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mDestinationDialog->mDialog, true);

    // Connection method list should open
    subCheckDialog(
        mApplSettingsPriv->mConnMethodDialog,
        allConnectionMethods,
        1);

    // Click "Cancel"
    subDismissDialog(mApplSettingsPriv->mConnMethodDialog->mDialog, false);

    // The dialog should be cancelled
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorCancel);
}

void TestCmApplSettingsUi::tcConnMethodSelect()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    mApplSettUi->setOptions(listItems, filter);
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 1;
    mApplSettUi->setSelection(mSelection);
    
    // Run the dialog
    mApplSettUi->open();
    
    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mConnMethodDialog,
        allConnectionMethods,
        1);
    
    // Select "WLAN IAP 1"
    subSelectDialogItem(
        mApplSettingsPriv->mConnMethodDialog,
        3);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mConnMethodDialog->mDialog, true);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNone);

    // Selection should be Connection Method "packet data 3"
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 4;
    subVerifySelection(mSelection);
}

void TestCmApplSettingsUi::tcConnMethodCancel()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    mApplSettUi->setOptions(listItems, filter);
    
    // Run the dialog
    mApplSettUi->open();
    
    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mConnMethodDialog,
        allConnectionMethods,
        0);
    
    // Click "Cancel"
    subDismissDialog(mApplSettingsPriv->mConnMethodDialog->mDialog, false);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorCancel);
}

void TestCmApplSettingsUi::tcConnMethodFilterGprs()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    filter |= CMManagerShim::BearerTypePacketData;
    mApplSettUi->setOptions(listItems, filter);
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 9;
    mApplSettUi->setSelection(mSelection);
    
    // Run the dialog
    mApplSettUi->open();
    
    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mConnMethodDialog,
        gprsConnectionMethods,
        3);
    
    // Select "packet data 3"
    subSelectDialogItem(
        mApplSettingsPriv->mConnMethodDialog,
        2);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mConnMethodDialog->mDialog, true);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNone);

    // Selection should be Connection Method "packet data 3"
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 4;
    subVerifySelection(mSelection);
}

void TestCmApplSettingsUi::tcConnMethodFilterWlan()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    filter |= CMManagerShim::BearerTypeWlan;
    mApplSettUi->setOptions(listItems, filter);
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 6;
    mApplSettUi->setSelection(mSelection);
    
    // Run the dialog
    mApplSettUi->open();
    
    // Validate the dialog content
    subCheckDialog(
        mApplSettingsPriv->mConnMethodDialog,
        wlanConnectionMethods,
        2);
    
    // Select "WLAN IAP 1"
    subSelectDialogItem(
        mApplSettingsPriv->mConnMethodDialog,
        1);
    
    // Click "OK"
    subDismissDialog(mApplSettingsPriv->mConnMethodDialog->mDialog, true);

    // The dialog should succeed
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNone);

    // Selection should be Connection Method "WLAN IAP 1"
    mSelection.result = CmApplSettingsUi::SelectionTypeConnectionMethod;
    mSelection.id = 5;
    subVerifySelection(mSelection);
}

void TestCmApplSettingsUi::tcConnMethodFilterUnknown()
{
    // Configure the dialog
    QFlags<CmApplSettingsUi::SelectionDialogItems> listItems;
    listItems |= CmApplSettingsUi::ShowConnectionMethods;
    QSet<CmApplSettingsUi::BearerTypeFilter> filter;
    filter |= 0x10281BB7;       // Obsolete CSD bearer type
    mApplSettUi->setOptions(listItems, filter);
    
    // Run the dialog
    mApplSettUi->open();
    
    // The dialog should fail since there's nothing to show
    subCatchSignalFinished(CmApplSettingsUi::ApplSettingsErrorNoContent);
}

// -----------------------------------------------------------------------------
// SUB TEST CASES
// -----------------------------------------------------------------------------

/**
 * Catch and verify the signal "finished(int)" emitted by mSignalFinished.
 */
void TestCmApplSettingsUi::subCatchSignalFinished(uint status)
{
    QTest::qWait(waitTime);
    QCOMPARE(mSignalFinished->count(), 1);      // A sole signal
    QList<QVariant> arguments = mSignalFinished->takeFirst();
    // Verify the first result status
    QVERIFY(arguments.at(0).toUInt() == status);
}

/**
 * Verify the current selection against given selection
 */
void TestCmApplSettingsUi::subVerifySelection(CmApplSettingsUi::SettingSelection selection)
{
    mSelection = mApplSettUi->selection();
    QCOMPARE(mSelection.result, selection.result);
    QCOMPARE(mSelection.id, selection.id);    
}

/**
 * Application settings ui dialog content validation subtestcase.
 * Checks:
 * -The dialog's radiobutton list content.
 * -Dialog's current selection.
 */
void TestCmApplSettingsUi::subCheckDialog(
    CmRadioDialog *radioDialog,
    QStringList items,
    int selected)
{
    // Wait for the dialog to show properly
    QTest::qWait(waitTime);
    
    QVERIFY(radioDialog != NULL);
    QVERIFY(radioDialog->mList != NULL);
    QCOMPARE(radioDialog->mList->items(), items);
    QCOMPARE(radioDialog->mList->selected(), selected);
}

/**
 * Select an item from the radio dialog.
 */
void TestCmApplSettingsUi::subSelectDialogItem(
    CmRadioDialog *radioDialog,
    int selected)
{
    // Wait for the dialog to show properly
    QTest::qWait(waitTime);
    
    QVERIFY(radioDialog != NULL);
    QVERIFY(radioDialog->mList != NULL);
    HbRadioButtonList *radioList = radioDialog->mList;

    // Calculate radio list item center location inside the
    // radio list widget
    QSizeF radioListSize = radioList->size();
    qDebug(
        "Radio List size height(%f) width(%f)",
        radioListSize.height(),
        radioListSize.width());
    int itemCount = radioList->items().count();
    qDebug("Radio List item count: %d", itemCount);
    qreal buttonHeight = radioListSize.height() / itemCount;
    QPoint point(
        radioListSize.width() / 2,
        buttonHeight * (selected + 0.5));
    
    // Click the button
    HbAutoTest::mouseClick(mMainWindow, radioList, point, waitTime);

    // Verify that the selection succeeded
    QCOMPARE(radioDialog->mList->selected(), selected);
}

/**
 * Dismiss the dialog by pressing either "OK" or "Cancel".
 */
void TestCmApplSettingsUi::subDismissDialog(
    QSharedPointer<HbDialog> dialog,
    bool accept)
{
    // Wait for the dialog to show properly
    QTest::qWait(waitTime);
    
    QVERIFY(dialog != NULL);
    
    // Calculate button center location inside the dialog
    QSizeF dialogSize = dialog->size();
    qDebug(
        "Dialog size height(%f) width(%f)",
        dialogSize.height(),
        dialogSize.width());
    QPoint point;
    if (accept) {
        // Left button: "OK"
        point.setX(dialogSize.width() / 4);
    } else {
        // Right button: "Cancel"
        point.setX(dialogSize.width() - (dialogSize.width() / 4));
    }
    point.setY(dialogSize.height() - 30);
    
    // Click the button
    HbAutoTest::mouseClick(mMainWindow, dialog.data(), point, waitTime);
}