diff -r c18f9fa7f42e -r 640d30f4fb64 phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/cntlistmodel/tsrc/ut_cntlistmodel/src/ut_cntlistmodel.cpp Fri Oct 15 12:24:46 2010 +0300 @@ -0,0 +1,601 @@ +/* +* 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 "ut_cntlistmodel.h" +#include "cntlistmodel.h" +#include "cntlistmodel_p.h" + +#include +#include +#include + +void TestCntListModel::initTestCase() +{ + //let's have clean database before running tests + mManager = new QContactManager("symbian"); + QList ids = mManager->contactIds(); + QMap errorMapInit; + mManager->removeContacts(ids, &errorMapInit); + mManager->removeContact(mManager->selfContactId()); +} + +void TestCntListModel::contactReady(int startRow, int endRow) +{ + QVERIFY(startRow == endRow); + mDataReady = true; +} + +void TestCntListModel::create() +{ + mCntModel = new CntListModel(); + QVERIFY(mCntModel != NULL); + QVERIFY(mCntModel->rowCount() == 1); + QVERIFY(mCntModel->d->m_cache); + QVERIFY(mCntModel->d->m_ownedContactManager); + QVERIFY(mCntModel->d->m_contactManager != NULL); + + delete mCntModel; + mCntModel = NULL; + + mCntModel = new CntListModel(mManager); + QVERIFY(mCntModel != NULL); + QCOMPARE(mCntModel->rowCount(), 1); + QVERIFY(mCntModel->rowCount() == 1); + QVERIFY(mCntModel->d->m_cache); + QVERIFY(!mCntModel->d->m_ownedContactManager); + QVERIFY(mCntModel->d->m_contactManager != NULL); +} + +void TestCntListModel::data() +{ + mModelListener = new ModelListener(this); + mDataReady = false; + + //create and save contact + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QContactPhoneNumber number; + number.setNumber("1234567"); + number.setContexts(QContactDetail::ContextHome); + number.setSubTypes(QContactPhoneNumber::SubTypeMobile); + c.saveDetail(&number); + QContactEmailAddress email; + email.setEmailAddress("dummyemail"); + c.saveDetail(&email); + QVERIFY(mManager->saveContact(&c)); + QTest::qWait(1000); + + //check invalid row and column + QVariant ret; + ret = mCntModel->data(QModelIndex(), Qt::UserRole); + QVERIFY(ret.isNull()); + + //check the saved contact's info + QModelIndex modelIndex = mCntModel->indexOfContact(c); + int row = modelIndex.row(); + QContact contactFromModel = mCntModel->contact(modelIndex); + QVERIFY(c == contactFromModel); + + ret = mCntModel->data(modelIndex, Qt::UserRole); + QVERIFY(ret.isNull()); + + ret = mCntModel->data(modelIndex, Qt::DisplayRole); + QVERIFY(ret.type() == QVariant::StringList); + QStringList displayContent; + displayContent = ret.toStringList(); + QVERIFY(displayContent.count() == 2); + QVERIFY(displayContent.at(0) == "firstname lastname"); + // second string is only an empty placeholder, e.g. " ", until cache has fetched the value + + // wait for cache to signal that all contact info is ready + while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); } + mDataReady = false; + ret = mCntModel->data(modelIndex, Qt::DisplayRole); + + QVERIFY(ret.type() == QVariant::StringList); + displayContent = ret.toStringList(); + QVERIFY(displayContent.count() == 2); + QVERIFY(displayContent.at(0) == "firstname lastname"); + QVERIFY(displayContent.at(1) == "1234567"); + + // check backgroundrole + ret = mCntModel->data(modelIndex, Qt::BackgroundRole); + QVERIFY(ret.isNull()); + + //check decoration role + ret = mCntModel->data(modelIndex, Qt::DecorationRole); + QVERIFY(ret.type() == QVariant::List); + + ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); + QVERIFY(ret.type() == QVariant::String); + + // add empty avatar and check decoration + QContactAvatar avatar; + c.saveDetail(&avatar); + QVERIFY(mManager->saveContact(&c)); + QTest::qWait(1000); + ret = mCntModel->data(modelIndex, Qt::DecorationRole); + QVERIFY(ret.type() == QVariant::List); + + // add data to the avatar and check decoration + avatar.setImageUrl(QUrl("dummyimagepath")); + c.saveDetail(&avatar); + QVERIFY(mManager->saveContact(&c)); + QTest::qWait(1000); + modelIndex = mCntModel->indexOfContact(c); + ret = mCntModel->data(modelIndex, Qt::DecorationRole); + + // wait for cache to signal that all contact info is ready + while (!mDataReady) { QTest::qWait(200); QApplication::processEvents(); } + mDataReady = false; + ret = mCntModel->data(modelIndex, Qt::DecorationRole); + QVERIFY(ret.type() == QVariant::List); + + // check MyCard info from the model + modelIndex = mCntModel->index(0, 0); + ret = mCntModel->data(modelIndex, Qt::BackgroundRole); + QVERIFY(!ret.isNull()); + + // create and assign empty MyCard + QContact myCard; + QVERIFY(mManager->saveContact(&myCard)); + QTest::qWait(1000); + mManager->setSelfContactId(myCard.localId()); + QTest::qWait(1000); + + // check that MyCard was really saved + QCOMPARE(mCntModel->myCardId(), myCard.localId()); + + // check MyCard info from the model + myCard = mManager->contact(mManager->selfContactId()); + modelIndex = mCntModel->indexOfContact(myCard); + ret = mCntModel->data(modelIndex, Qt::BackgroundRole); + QVERIFY(!ret.isNull()); + + ret = mCntModel->data(modelIndex, Qt::DisplayRole); + QVERIFY(ret.type() == QVariant::StringList); + displayContent = ret.toStringList(); + QVERIFY(displayContent.count() == 1); // "Unnamed" + + // add some content to MyCard + myCard.saveDetail(&number); + QVERIFY(mManager->saveContact(&myCard)); + QTest::qWait(1000); + ret = mCntModel->data(modelIndex, Qt::DisplayRole); + // wait for cache + QTest::qWait(1000); + ret = mCntModel->data(modelIndex, Qt::DisplayRole); + QVERIFY(ret.type() == QVariant::StringList); + displayContent = ret.toStringList(); + QVERIFY(displayContent.contains(hbTrId("txt_phob_list_unnamed"))); + + ret = mCntModel->data(modelIndex, Hb::IndexFeedbackRole); + QVERIFY(ret.isNull()); +} + +void TestCntListModel::rowCount() +{ + // we should have 2 contacts in the model saved from the last test case + QTest::qWait(5000); + QCOMPARE(mCntModel->rowCount(), 2); +} + +void TestCntListModel::contact() +{ + QList ids = mManager->contactIds(); + QMap errorMapContact; + mManager->removeContacts(ids,&errorMapContact); + QTest::qWait(1000); + + QModelIndex modelIndex = mCntModel->index(0, 0); + QContact empty = mCntModel->contact(modelIndex); + //QVERIFY(empty.isEmpty()); + + //create and save contact + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QContactPhoneNumber number; + number.setNumber("1234567"); + number.setContexts(QContactDetail::ContextHome); + number.setSubTypes(QContactPhoneNumber::SubTypeMobile); + c.saveDetail(&number); + QContactEmailAddress email; + email.setEmailAddress("dummyemail"); + c.saveDetail(&email); + QVERIFY(mManager->saveContact(&c)); + QTest::qWait(1000); + + modelIndex = mCntModel->index(10, 0); + c = mCntModel->contact(modelIndex); + QVERIFY(c.isEmpty()); + + modelIndex = mCntModel->index(1, 0); + c = mCntModel->contact(modelIndex); + QVERIFY(!c.isEmpty()); +} + +void TestCntListModel::contactId() +{ + QModelIndex modelIndex = mCntModel->index(1, 0); + QContact c = mCntModel->contact(modelIndex); + + QVERIFY(mCntModel->contactId(modelIndex) == c.localId()); +} + +void TestCntListModel::indexOfContact() +{ + QModelIndex modelIndex = mCntModel->index(1, 0); + QContact c = mCntModel->contact(modelIndex); + + QVERIFY(mCntModel->indexOfContact(c) == modelIndex); +} + +void TestCntListModel::indexOfContactId() +{ + QModelIndex modelIndex = mCntModel->index(1, 0); + QContact c = mCntModel->contact(modelIndex); + + QVERIFY(mCntModel->indexOfContactId(c.localId()) == modelIndex); +} + +void TestCntListModel::contactManager() +{ + QVERIFY(mManager == &(mCntModel->contactManager())); +} + +void TestCntListModel::setFilter() +{ + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + QContactUnionFilter unionFilter; + + QContactDetailFilter landlineFilter; + landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); + landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline)); + unionFilter << landlineFilter; + + QContactDetailFilter mobileFilter; + mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); + mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile)); + unionFilter << mobileFilter; + + mCntModel->setFilter(unionFilter); + + QModelIndex modelIndex = mCntModel->indexOfContact(c); + QVERIFY(modelIndex.row() < 0); + QVERIFY(mCntModel->d->m_filter == unionFilter); + QVERIFY(mCntModel->d->m_sortOrders.count() == 2); +} + +void TestCntListModel::myCard() +{ + delete mCntModel; + mCntModel = 0; + + mCntModel = new CntListModel(mManager); + + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + QSignalSpy spy(mCntModel, SIGNAL(modelReset())); + + QVERIFY(mCntModel->myCardStatus()); + + mCntModel->showMyCard(false); + QVERIFY(!mCntModel->myCardStatus()); + QCOMPARE(spy.count(), 2); + + mCntModel->showMyCard(true); + QVERIFY(mCntModel->myCardStatus()); + QCOMPARE(spy.count(), 4); + + mManager->setSelfContactId(c.localId()); + QTest::qWait(1000); + spy.clear(); + + mCntModel->showMyCard(false); + QVERIFY(!mCntModel->myCardStatus()); + QCOMPARE(spy.count(), 2); + + mCntModel->showMyCard(true); + QVERIFY(mCntModel->myCardStatus()); + QCOMPARE(spy.count(), 4); + mCntModel->showMyCard(true); + QVERIFY(mCntModel->myCardStatus()); + QCOMPARE(spy.count(), 4); +} + +void TestCntListModel::rowId() +{ + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + int row = mCntModel->rowId(c.localId()); + QVERIFY(row > 0); + QVERIFY(mCntModel->validRowId(row)); + QVERIFY(!mCntModel->validRowId(-100)); + QVERIFY(!mCntModel->validRowId(100)); +} + +void TestCntListModel::dataForDisplayRole() +{ + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + int row = mCntModel->rowId(c.localId()); + QVariant var = mCntModel->dataForRole(row, Qt::DisplayRole); + QVERIFY(var.type() == QVariant::StringList); + + var = mCntModel->dataForRole(0, Qt::DisplayRole); + QVERIFY(var.type() == QVariant::StringList); +} + +void TestCntListModel::handleAdded() +{ + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeInserted(const QModelIndex&, int, int))); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + QCOMPARE(spy.count(), 1); + + QList emptyList; + mCntModel->handleAdded(emptyList); + QCOMPARE(spy.count(), 1); +} + +void TestCntListModel::handleChanged() +{ + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + QSignalSpy spy(mCntModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex&))); + + name.setMiddleName("mid"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + QCOMPARE(spy.count(), 1); + + QList emptyList; + mCntModel->handleChanged(emptyList); + QCOMPARE(spy.count(), 1); +} + +void TestCntListModel::handleRemoved() +{ + QSignalSpy spy(mCntModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int, int))); + + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QCOMPARE(spy.count(), 1); + + QList emptyList; + mCntModel->handleRemoved(emptyList); + QCOMPARE(spy.count(), 1); +} + +void TestCntListModel::handleMyCardChanged() +{ + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + QContact c; + QContactName name; + name.setFirstName("firstname"); + name.setLastName("lastname"); + c.saveDetail(&name); + QVERIFY(mManager->saveContact(&c)); + + mCntModel->handleMyCardChanged(0, c.localId()); + QVERIFY(mCntModel->d->m_myCardId == c.localId()); +} + +void TestCntListModel::handleRelationships() +{ + // remove all contacts + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids,&errorMap); + QTest::qWait(1000); + + // create group "myGroup" + QContact group; + group.setType(QContactType::TypeGroup); + QContactName groupName; + groupName.setCustomLabel("myGroup"); + group.saveDetail(&groupName); + mManager->saveContact(&group); + + // create a relationship filter + QContactRelationshipFilter groupFilter; + groupFilter.setRelationshipType(QContactRelationship::HasMember); + groupFilter.setRelatedContactRole(QContactRelationship::First); + groupFilter.setRelatedContactId(group.id()); + + // create new listmodel + CntListModel* groupListModel = new CntListModel(mManager, groupFilter, false); + QVERIFY(groupListModel != NULL); + + QCOMPARE(groupListModel->rowCount(), 0); + + // create contacts + QList contacts; + contacts << createContact("Alfa", "One"); + contacts << createContact("Beta", "Two"); + contacts << createContact("Gamma", "Three"); + QTest::qWait(1000); + QCOMPARE(groupListModel->rowCount(), 0); + + // add contacts to group + foreach (QContact contact, contacts) { + addGroupMember(group, contact); + } + QTest::qWait(1000); + QCOMPARE(groupListModel->rowCount(), 3); + + // remove contact from group + removeGroupMember(group, contacts.at(1)); + QTest::qWait(1000); + QCOMPARE(groupListModel->rowCount(), 2); + + // add and remove empty list + QList emptyList; + emptyList << group.localId(); + mCntModel->handleAddedRelationship(emptyList); + QCOMPARE(groupListModel->rowCount(), 2); + mCntModel->handleRemovedRelationship(emptyList); + QCOMPARE(groupListModel->rowCount(), 2); + + // verify that contact on second row is "Gamma Three" (comes after "Alfa One" + // regardless of sorting type and Beta Two was removed) + QVERIFY(groupListModel->indexOfContact(contacts.at(0)).row() == 0); + QVERIFY(groupListModel->indexOfContact(contacts.at(1)).row() == -1); + QVERIFY(groupListModel->indexOfContact(contacts.at(2)).row() == 1); + + // create a contact and make sure list model count does not change + createContact("Delta", "Four"); + QTest::qWait(1000); + QCOMPARE(groupListModel->rowCount(), 2); + + delete groupListModel; +} + +QContact TestCntListModel::createContact(const QString& firstName, const QString& lastName) +{ + QContact contact; + QContactName name; + name.setFirstName(firstName); + name.setLastName(lastName); + contact.saveDetail(&name); + mManager->saveContact(&contact); + + return contact; +} + +void TestCntListModel::addGroupMember(const QContact& group, const QContact& contact) +{ + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(group.id()); + relationship.setSecond(contact.id()); + mManager->saveRelationship(&relationship); +} + +void TestCntListModel::removeGroupMember(const QContact& group, const QContact& contact) +{ + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(group.id()); + relationship.setSecond(contact.id()); + mManager->removeRelationship(relationship); +} + +void TestCntListModel::cleanupTestCase() +{ + mCntModel->d->m_cache->onShutdown(); + delete mCntModel; + mCntModel = 0; + + //let's have clean database after running tests + QList ids = mManager->contactIds(); + QMap errorMap; + mManager->removeContacts(ids, &errorMap); + delete mManager; + mManager = 0; + delete mModelListener; + mModelListener = 0; +} + + +ModelListener::ModelListener(TestCntListModel* parent) + : mParent(parent) +{ + connect(mParent->mCntModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onDataChanged(QModelIndex,QModelIndex))); +} + +void ModelListener::onDataChanged(QModelIndex start, QModelIndex end) +{ + mParent->contactReady(start.row(), end.row()); +} +