diff -r 000000000000 -r 876b1a06bc25 tests/auto/qversitcontactexporter/tst_qversitcontactexporter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/auto/qversitcontactexporter/tst_qversitcontactexporter.cpp Wed Aug 25 15:49:42 2010 +0300 @@ -0,0 +1,1179 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "tst_qversitcontactexporter.h" +#include "qversitcontactexporter.h" +#include "qversitcontactexporter_p.h" +#include "qversitdocument.h" +#include "qversitproperty.h" +#include "qversitdefs_p.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class MyQVersitContactExporterDetailHandler : public QVersitContactExporterDetailHandler +{ +public: + MyQVersitContactExporterDetailHandler() : mPreProcess(false) + { + } + + bool preProcessDetail(const QContact& contact, + const QContactDetail& detail, + QVersitDocument* document) + { + Q_UNUSED(contact) + Q_UNUSED(document) + mPreProcessedDetails.append(detail); + return mPreProcess; + } + + bool postProcessDetail(const QContact& contact, + const QContactDetail& detail, + bool alreadyProcessed, + QVersitDocument* document) + { + Q_UNUSED(contact) + Q_UNUSED(document) + if (!alreadyProcessed) + mUnknownDetails.append(detail); + else + mPostProcessedDetails.append(detail); + return false; + } + + void clear() + { + mPreProcess = false; + mDefinitionNamesToProcess.clear(); + mUnknownDetails.clear(); + mPreProcessedDetails.clear(); + mPostProcessedDetails.clear(); + } + + // a hook to control what preProcess returns: + bool mPreProcess; + QStringList mDefinitionNamesToProcess; + QList mUnknownDetails; + QList mPreProcessedDetails; + QList mPostProcessedDetails; +}; + +class MyQVersitResourceHandler : public QVersitResourceHandler +{ +public: + MyQVersitResourceHandler() + : mLoadResourceCalled(false), + mLoadSuccess(true) + { + } + + bool loadResource(const QString& location, QByteArray* contents, QString* mimeType) + { + mLocation = location; + *contents = mSimulatedData; + *mimeType = mSimulatedMimeType; + mLoadResourceCalled = true; + return mLoadSuccess; + } + + bool saveResource(const QByteArray &contents, const QVersitProperty &property, QString *location) + { + Q_UNUSED(contents) + Q_UNUSED(property) + Q_UNUSED(location) + return false; + } + + void clear() + { + mSimulatedData.clear(); + mSimulatedMimeType.clear(); + mLocation.clear(); + mLoadResourceCalled = false; + mLoadSuccess = true; + } + + QByteArray mSimulatedData; + QString mSimulatedMimeType; + QString mLocation; + bool mLoadResourceCalled; + bool mLoadSuccess; // A hook to control what loadResource returns. +}; + +const static QByteArray SAMPLE_GIF(QByteArray::fromBase64( + "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G" + "wEtxUmlPzRDnzYGfN3KBaKGT6rDmGxQAOw==")); + +// The number of vCard properties generated by a contact made with createContactWithName() +const static int BASE_PROPERTY_COUNT = 2; + +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +const QString TEST_PHOTO_FILE(QLatin1String("versitTest001.jpg")); +const QString TEST_AUDIO_FILE(QLatin1String("versitTest001.wav")); + +// Checks that the property has a value of the given expectedType and the given expectedValue. +#define CHECK_VALUE(property,expectedValueType,expectedValue) {\ + QCOMPARE(property.valueType(), expectedValueType); \ + QVariant value = property.variantValue(); \ + QCOMPARE(value.type(), QVariant::StringList); \ + QCOMPARE(value.toStringList(), expectedValue); \ +} + +void tst_QVersitContactExporter::init() +{ + mExporter = new QVersitContactExporter(); + mDetailHandler = new MyQVersitContactExporterDetailHandler; + mExporter->setDetailHandler(mDetailHandler); + mResourceHandler = new MyQVersitResourceHandler; + mExporter->setResourceHandler(mResourceHandler); +} + +void tst_QVersitContactExporter::cleanup() +{ + QVERIFY(mExporter->detailHandler() == mDetailHandler); + mExporter->setDetailHandler(0); + delete mDetailHandler; + QVERIFY(mExporter->resourceHandler() == mResourceHandler); + mExporter->setResourceHandler(0); + delete mResourceHandler; + delete mExporter; +} + +void tst_QVersitContactExporter::testConvertContact() +{ + QContact contact; + + // Adding name to the contact + QContactName name; + name.setFirstName(QString::fromAscii("Moido")); + contact.saveDetail(&name); + + // Adding phone number to the Contact. + QContactPhoneNumber phoneNumber; + phoneNumber.setNumber(QString::fromAscii("12345678")); + contact.saveDetail(&phoneNumber); + + // Convert contact into versit properties + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QList documents = mExporter->documents(); + + // Each Contact has display label detail by default. Display label is enocded + // if some value exist for the Label or if value for Name exist. + QCOMPARE(documents.size(), 1); + QCOMPARE(documents.first().properties().count(), 3); +} + +void tst_QVersitContactExporter::testContactDetailHandler() +{ + // Test1: Un-supported Avatar Test + QContact contact(createContactWithName(QLatin1String("asdf"))); + QVersitDocument document; + QContactDetail unknownDetail; + unknownDetail.setValue(QLatin1String("Unknown"), QLatin1String("Detail")); + contact.saveDetail(&unknownDetail); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + QList unknownDetails = mDetailHandler->mUnknownDetails; + QVERIFY(unknownDetails.size() > 0); + QString definitionName = unknownDetail.definitionName(); + QContactDetail detail = searchDetail(unknownDetails,definitionName); + QCOMPARE(definitionName, detail.definitionName()); + + // Test2: Un-supported Online Account + QContactOnlineAccount onlineAccount; + QString testUri = QString::fromAscii("sip:abc@temp.com"); + onlineAccount.setAccountUri(testUri); + onlineAccount.setSubTypes(QString::fromAscii("unsupported")); + contact.saveDetail(&onlineAccount); + mDetailHandler->clear(); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + unknownDetails = mDetailHandler->mUnknownDetails; + QVERIFY(unknownDetails.size() > 0); + definitionName = onlineAccount.definitionName(); + detail = searchDetail(unknownDetails, definitionName); + QCOMPARE(definitionName, detail.definitionName()); + + // Test that preProcessDetail returns true stops the exporter from doing anything. + contact.clearDetails(); + QContactName contactName; + contactName.setFirstName(QLatin1String("John")); + contact.saveDetail(&contactName); + mDetailHandler->clear(); + mDetailHandler->mPreProcess = true; + // Fails, with NoNameError + QVERIFY(!mExporter->exportContacts(QList() << contact, + QVersitDocument::VCard30Type)); + QList documents = mExporter->documents(); + QCOMPARE(documents.size(), 0); + QVERIFY(mDetailHandler->mPreProcessedDetails.count() > BASE_PROPERTY_COUNT); + QCOMPARE(mDetailHandler->mPostProcessedDetails.count(), 0); + QCOMPARE(mDetailHandler->mUnknownDetails.count(), 0); + + QVERIFY(mExporter->detailHandler() == mDetailHandler); +} + +void tst_QVersitContactExporter::testEncodeName() +{ + QContact contact; + QContactName name; + + // Special characters are NOT backslash escaped by the exporter, only by the writer. + name.setFirstName(QString::fromAscii("He;ido")); + name.setLastName(QString::fromAscii("HH")); + name.setMiddleName(QString::fromAscii("A")); + name.setPrefix(QString::fromAscii("Mr.")); + name.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&name); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + + // Each Contact has display label detail by default. Display label is enocded + // if some value exists for the Label or if value for Name exists. + QCOMPARE(document.properties().count(), 2); + + QVersitProperty displayProperty = document.properties().at(0); + // Check name + QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); + // Check value + QCOMPARE(displayProperty.value(), QString::fromAscii("He;ido HH")); + + QVersitProperty nameProperty = document.properties().at(1); + // Check parameters, contexts not allowed for N property + QCOMPARE(nameProperty.parameters().count(), 0); + // Check name + QCOMPARE(nameProperty.name(), QString::fromAscii("N")); + CHECK_VALUE(nameProperty, QVersitProperty::CompoundType, + QStringList() << QLatin1String("HH") << QLatin1String("He;ido") + << QLatin1String("A") << QLatin1String("Mr.") << QString()); +} + +void tst_QVersitContactExporter::testEncodePhoneNumber() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactPhoneNumber phoneNumber; + phoneNumber.setNumber(QString::fromAscii("12345678")); + phoneNumber.setContexts(QContactDetail::ContextHome); + phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile); + contact.saveDetail(&phoneNumber); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("TEL")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("CELL"))); + // Check value + QCOMPARE(property.value(), phoneNumber.number()); + + QContactPhoneNumber assistantNumber; + assistantNumber.setNumber(QLatin1String("4321")); + assistantNumber.setContexts(QContactDetail::ContextWork); + assistantNumber.setSubTypes(QContactPhoneNumber::SubTypeAssistant); + contact.saveDetail(&assistantNumber); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = findPropertyByName(document, QLatin1String("X-ASSISTANT-TEL")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); + QCOMPARE(property.value(), assistantNumber.number()); +} + +void tst_QVersitContactExporter::testEncodeEmailAddress() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactEmailAddress email; + email.setEmailAddress(QString::fromAscii("test@test")); + email.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&email); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("EMAIL")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + // Check value + QCOMPARE(property.value(), email.emailAddress()); +} + +void tst_QVersitContactExporter::testEncodeStreetAddress() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactAddress address; + + address.setPostOfficeBox(QLatin1String("1234")); + address.setCountry(QLatin1String("Finland")); + address.setPostcode(QLatin1String("00440")); + // Special characters are not escaped by the exporter, but by the writer + address.setStreet(QLatin1String("HKKI; 1X 90")); + address.setLocality(QLatin1String("Helsinki")); + address.setContexts(QContactDetail::ContextHome); + address.setSubTypes(QContactAddress::SubTypePostal); + contact.saveDetail(&address); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("ADR")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("POSTAL"))); + // Check name + QCOMPARE(property.name(), QString::fromAscii("ADR")); + CHECK_VALUE(property, QVersitProperty::CompoundType, + QStringList() << QLatin1String("1234") << QString() << QLatin1String("HKKI; 1X 90") + << QLatin1String("Helsinki") << QString() << QLatin1String("00440") + << QLatin1String("Finland")); +} + +void tst_QVersitContactExporter::testEncodeUrl() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactUrl url; + url.setUrl(QString::fromAscii("http://www.myhome.com")); + url.setContexts(QContactDetail::ContextHome); + url.setSubType(QContactUrl::SubTypeHomePage); + contact.saveDetail(&url); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("URL")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + // Check value + QCOMPARE(property.value(), url.url()); +} + +void tst_QVersitContactExporter::testEncodeUid() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactGuid guid; + + guid.setContexts(QContactDetail::ContextHome); + guid.setGuid(QString::fromAscii("0101222")); + contact.saveDetail(&guid); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("UID")); + QVERIFY(!property.isEmpty()); + // Check parameters + // Contexts are not allowed for UID + QCOMPARE(property.parameters().count(), 0); + // Check value + QCOMPARE(property.value(), guid.guid()); +} + +void tst_QVersitContactExporter::testEncodeRev() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactTimestamp timeStamp; + + // Last modified time found + QDateTime revisionTime = + QDateTime::fromString( + QString::fromAscii("M1d1y200906:01:02"), + QString::fromAscii("'M'M'd'd'y'yyyyhh:mm:ss")); + revisionTime.setTimeSpec(Qt::UTC); + timeStamp.setLastModified(revisionTime); + // Contexts not allowed in REV property, check that they are not added + timeStamp.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("REV")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QString expectedValueUTCEncoded = QString::fromAscii("2009-01-01T06:01:02Z"); + QCOMPARE(property.value(), expectedValueUTCEncoded); + + // Last modified time not found, use the creation time + QDateTime emptyTime; + timeStamp.setLastModified(emptyTime); + timeStamp.setCreated(revisionTime); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("REV")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), expectedValueUTCEncoded); + + // Last modified time found, Local Time spec not UTC + QDateTime localTime; + revisionTime.setTimeSpec(Qt::LocalTime); + timeStamp.setLastModified(revisionTime); + localTime.setTimeSpec(Qt::LocalTime); + timeStamp.setCreated(localTime); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("REV")); + QVERIFY(!property.isEmpty()); + QString expectedValueEncoded = QString::fromAscii("2009-01-01T06:01:02"); + QCOMPARE(property.value(), expectedValueEncoded); + + // Last modified time not found, creation time not found + timeStamp.setLastModified(emptyTime); + timeStamp.setCreated(emptyTime); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); +} + +void tst_QVersitContactExporter::testEncodeBirthDay() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QDate date(2009,1,1); + QContactBirthday birthDay; + birthDay.setDate(date); + // Contexts not allowed in BDAY property, check that they are not added + birthDay.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&birthDay); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("BDAY")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(), QString::fromAscii("2009-01-01")); +} + +void tst_QVersitContactExporter::testEncodeNote() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactNote note; + note.setNote(QString::fromAscii("My Note")); + // Contexts not allowed in NOTE property, check that they are not added + note.setContexts(QContactDetail::ContextHome); + contact.saveDetail(¬e); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("NOTE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(), note.note()); +} + +void tst_QVersitContactExporter::testEncodeGeoLocation() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactGeoLocation geoLocation; + QString longitude = QString::fromAscii("99.9"); + geoLocation.setLongitude(longitude.toDouble()); + QString latitude = QString::fromAscii("98.9"); + geoLocation.setLatitude(latitude.toDouble()); + // Contexts not allowed in GEO property, check that they are not added + geoLocation.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&geoLocation); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("GEO")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.name(), QString::fromAscii("GEO")); + CHECK_VALUE(property, QVersitProperty::CompoundType, + QStringList() << QLatin1String("99.9") << QLatin1String("98.9")); +} + +void tst_QVersitContactExporter::testEncodeOrganization() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactOrganization organization; + QVersitDocument document; + QVersitProperty property; + QString title(QString::fromAscii("Developer")); + + // TITLE + organization.setTitle(title); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("TITLE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), title); + + // ORG with name + organization.setTitle(QString()); + organization.setName(QString::fromAscii("Nokia")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = document.properties().at(BASE_PROPERTY_COUNT); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList(QLatin1String("Nokia"))); + + // ORG with department/unit + organization.setName(QString()); + QStringList departments(QString::fromAscii("R&D")); + departments.append(QString::fromAscii("Qt")); + organization.setDepartment(departments); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = document.properties().at(BASE_PROPERTY_COUNT); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList() + << QString() << QLatin1String("R&D") << QLatin1String("Qt")); + + // ORG with name and department/unit + organization.setName(QString::fromAscii("Nokia")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = document.properties().at(BASE_PROPERTY_COUNT); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList() + << QLatin1String("Nokia") << QLatin1String("R&D") << QLatin1String("Qt")); + + // TITLE and ORG + organization.setTitle(QString::fromAscii("Developer")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = findPropertyByName(document, QLatin1String("TITLE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), title); + property = findPropertyByName(document, QLatin1String("ORG")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList() + << QLatin1String("Nokia") << QLatin1String("R&D") << QLatin1String("Qt")); + + // ORG LOGO Test1: LOGO as remote Resouce + const QString url = QString::fromAscii("http://myhome.com/test.jpg"); + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setLogoUrl(url); + contact.saveDetail(&organization); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + mExporter->setResourceHandler(mResourceHandler); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + + // Source type is encoded, but media type is not for a URL. + property = findPropertyByName(document, QLatin1String("LOGO")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 1); + + QVERIFY(property.parameters().contains( + QString::fromAscii("VALUE"), QString::fromAscii("URL"))); + + //Check property value + QCOMPARE(property.value(), url); + + // ORG LOGO Test2: LOGO File. + mResourceHandler->mSimulatedData = "simulated data"; + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setLogoUrl(TEST_PHOTO_FILE); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); + + // It should be stored in the property as a QVariant of QByteArray + property = findPropertyByName(document, QLatin1String("LOGO")); + QVERIFY(!property.isEmpty()); + QMultiHash parameters = property.parameters(); + // Media type is encoded + QCOMPARE(parameters.count(), 1); + QVERIFY(parameters.contains( + QString::fromAscii("TYPE"), QString::fromAscii("JPEG"))); + // Verify value. + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); + + // Assistant Name Test. + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setAssistantName(QString::fromAscii("myAssistant")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-ASSISTANT")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), QString::fromAscii("myAssistant")); + + // Test: Role + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setRole(QString::fromAscii("Executive")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("ROLE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), QString::fromAscii("Executive")); + +} + +void tst_QVersitContactExporter::testEncodeAvatar() +{ + QContact contact = createContactWithName(QLatin1String("asdf")); + QContactAvatar contactAvatar; + mResourceHandler->mSimulatedData = "simulated data"; + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + + // Test1: Web URL + const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); + contactAvatar.setImageUrl(url); + contact.saveDetail(&contactAvatar); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QVERIFY(document.properties().length() > BASE_PROPERTY_COUNT); + QVersitProperty property = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 1); + QCOMPARE(property.value(), url); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + + // Test 2: Local Media PHOTO + contactAvatar.setImageUrl(TEST_PHOTO_FILE); + contact.saveDetail(&contactAvatar); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); + // verify the value + QVERIFY(document.properties().length() > BASE_PROPERTY_COUNT); + property = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!property.isEmpty()); + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); + QVERIFY(property.parameters().contains(QString::fromAscii("TYPE"), + QString::fromAscii("JPEG"))); +} + +void tst_QVersitContactExporter::testEncodeThumbnail() { + QImage image; + image.loadFromData(SAMPLE_GIF); + if (QImageWriter::supportedImageFormats().contains("png")) { + QContactThumbnail thumbnail; + thumbnail.setThumbnail(image); + QContact contact(createContactWithName(QLatin1String("asdf"))); + contact.saveDetail(&thumbnail); + QVERIFY(mExporter->exportContacts(QList() << contact, + QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + // verify the value + QVERIFY(document.properties().length() > BASE_PROPERTY_COUNT); + QVersitProperty property = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!property.isEmpty()); + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QByteArray retrievedData = variantValue.value(); + QImage retrievedImage; + retrievedImage.loadFromData(retrievedData); + QCOMPARE(retrievedImage, image); + } +} + + +void tst_QVersitContactExporter::testEncodeEmbeddedContent() +{ + QContact contact = createContactWithName(QLatin1String("asdf")); + QContactAvatar contactAvatar; + QVariant variantValue; + + // Test 1: URL + const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); + contactAvatar.setImageUrl(url); + contact.saveDetail(&contactAvatar); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + QVERIFY(document.properties().size() > BASE_PROPERTY_COUNT); + QVersitProperty photoProperty = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!photoProperty.isEmpty()); + QCOMPARE(photoProperty.parameters().count(), 1); + QVERIFY(photoProperty.parameters().contains( + QString::fromAscii("VALUE"),QString::fromAscii("URL"))); + QCOMPARE(photoProperty.value(), url); + + // Test 2: Local PHOTO, image loaded by the loader + contactAvatar.setImageUrl(TEST_PHOTO_FILE); + contact.saveDetail(&contactAvatar); + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + mResourceHandler->mSimulatedData = "simulated image data"; + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QVERIFY(document.properties().size() > BASE_PROPERTY_COUNT); + photoProperty = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!photoProperty.isEmpty()); + QCOMPARE(photoProperty.parameters().count(), 1); + QVERIFY(photoProperty.parameters().contains(QString::fromAscii("TYPE"), + QString::fromAscii("JPEG"))); + variantValue = photoProperty.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); + + // Without a resource handler + mExporter->setResourceHandler(0); + contactAvatar.setImageUrl(TEST_PHOTO_FILE); + contact.saveDetail(&contactAvatar); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + + mExporter->setResourceHandler(mResourceHandler); +} + +void tst_QVersitContactExporter::testEncodeRingtone() +{ + QContactRingtone ringtone; + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("audio/wav"); + mResourceHandler->mSimulatedData = "simulated audio data"; + ringtone.setAudioRingtoneUrl(TEST_AUDIO_FILE); + QContact contact(createContactWithName(QLatin1String("asdf"))); + contact.saveDetail(&ringtone); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QVersitProperty soundProperty = findPropertyByName(document, QLatin1String("SOUND")); + QVERIFY(!soundProperty.isEmpty()); + QCOMPARE(soundProperty.parameters().count(), 1); + QVERIFY(soundProperty.parameters().contains( + QString::fromAscii("TYPE"), + QString::fromAscii("WAV"))); + QVariant variantValue = soundProperty.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); +} + +void tst_QVersitContactExporter::testEncodeParameters() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactPhoneNumber phoneNumber; + phoneNumber.setNumber(QString::fromAscii("12345678")); + QStringList subtypes; + subtypes.append(QContactPhoneNumber::SubTypeMobile); + subtypes.append(QContactPhoneNumber::SubTypeVideo); + // Add a not supported subtype in vCard, to make sure its not encoded. + subtypes.append(QContactPhoneNumber::SubTypeDtmfMenu); + phoneNumber.setSubTypes(subtypes); + contact.saveDetail(&phoneNumber); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("TEL")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"), QString::fromAscii("CELL"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("VIDEO"))); +} + +void tst_QVersitContactExporter::testEncodeGender() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + gender.setContexts(QContactGender::ContextHome); // Should not be encoded + contact.saveDetail(&gender); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("X-GENDER")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(), gender.gender()); +} + +void tst_QVersitContactExporter::testEncodeNickName() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + + // Add an extra detail + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + contact.saveDetail(&gender); + + // One nickname given + QContactNickname firstNickname; + firstNickname.setNickname(QLatin1String("Homie")); + contact.saveDetail(&firstNickname); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + QVersitProperty property = document.properties().at(BASE_PROPERTY_COUNT+1); + QCOMPARE(property.name(), QLatin1String("X-NICKNAME")); + CHECK_VALUE(property, QVersitProperty::ListType, QStringList(QLatin1String("Homie"))); + + // Two nicknames given, should be collated into a single property + contact = createContactWithName(QLatin1String("asdf")); + contact.saveDetail(&gender); + contact.saveDetail(&firstNickname); + QContactNickname secondNickname; + secondNickname.setNickname(QLatin1String("Jay")); + contact.saveDetail(&secondNickname); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = findPropertyByName(document, QLatin1String("X-NICKNAME")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.name(), QString::fromAscii("X-NICKNAME")); + CHECK_VALUE(property, QVersitProperty::ListType, + QStringList() << QLatin1String("Homie") << QLatin1String("Jay")); +} + +void tst_QVersitContactExporter::testEncodeTag() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + + // Add an extra detail + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + contact.saveDetail(&gender); + + // One tag given + QContactTag firstTag; + firstTag.setTag(QLatin1String("red")); + contact.saveDetail(&firstTag); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + QVersitProperty property = document.properties().at(BASE_PROPERTY_COUNT+1); + QCOMPARE(property.name(), QLatin1String("CATEGORIES")); + CHECK_VALUE(property, QVersitProperty::ListType, QStringList(QLatin1String("red"))); + + // Two tags given, should be collated into a single property + contact = createContactWithName(QLatin1String("asdf")); + contact.saveDetail(&firstTag); + contact.saveDetail(&gender); + QContactTag secondTag; + secondTag.setTag(QLatin1String("green")); + contact.saveDetail(&secondTag); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = document.properties().at(BASE_PROPERTY_COUNT+1); + QCOMPARE(property.name(), QString::fromAscii("CATEGORIES")); + CHECK_VALUE(property, QVersitProperty::ListType, + QStringList() << QLatin1String("red") << QLatin1String("green")); +} + +void tst_QVersitContactExporter::testEncodeAnniversary() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactAnniversary anniversary; + QDate date(2009,1,1); + anniversary.setOriginalDate(date); + anniversary.setContexts(QContactDetail::ContextHome); + anniversary.setSubType(QContactAnniversary::SubTypeWedding); + contact.saveDetail(&anniversary); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("X-ANNIVERSARY")); + QVERIFY(!property.isEmpty()); + // The contexts and subtypes are not defined for X-ANNIVERSARY property + QCOMPARE(property.parameters().count(), 0); + // Check value + QCOMPARE(property.value(), date.toString(Qt::ISODate)); +} + + +void tst_QVersitContactExporter::testEncodeOnlineAccount() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactOnlineAccount onlineAccount; + QString accountUri(QString::fromAscii("sip:abc@temp.com")); + onlineAccount.setAccountUri(accountUri); + + // Video sharing + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeVideoShare); + onlineAccount.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("X-SIP")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("SWIS"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // VoIP + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); + onlineAccount.setContexts(QContactDetail::ContextWork); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-SIP")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("VOIP"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // Plain SIP + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSip); + onlineAccount.setContexts(QContactDetail::ContextWork); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-SIP")); + QVERIFY(!property.isEmpty()); + // Check parameters, SIP not added as a TYPE parameter + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // IMPP / X-IMPP + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); + onlineAccount.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-IMPP")); + QVERIFY(!property.isEmpty()); + // Check parameters, SIP not added as a TYPE parameter + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // Other subtypes not converted + onlineAccount.setSubTypes(QString::fromAscii("INVALIDSUBTYPE")); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); +} + +void tst_QVersitContactExporter::testEncodeFamily() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactFamily family; + + // No spouse, no family + family.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&family); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + + // Only spouse present + QString spouce = QString::fromAscii("ABC"); + family.setSpouse(spouce); + contact.saveDetail(&family); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty spouseProperty = findPropertyByName(document, QLatin1String("X-SPOUSE")); + QVERIFY(!spouseProperty.isEmpty()); + QCOMPARE(spouseProperty.parameters().count(), 0); + QCOMPARE(spouseProperty.value(), spouce); + + // Spouse and children + QStringList children; + children << QString::fromAscii("A") << QString::fromAscii("B") ; + family.setChildren(children); + family.setSpouse(spouce); + contact.saveDetail(&family); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + spouseProperty = findPropertyByName(document, QLatin1String("X-SPOUSE")); + QVERIFY(!spouseProperty.isEmpty()); + QCOMPARE(spouseProperty.parameters().count(), 0); + QCOMPARE(spouseProperty.value(), spouce); + QVersitProperty childrenProperty = findPropertyByName(document, QLatin1String("X-CHILDREN")); + QVERIFY(!spouseProperty.isEmpty()); + QCOMPARE(childrenProperty.parameters().count(), 0); + QCOMPARE(childrenProperty.name(), QString::fromAscii("X-CHILDREN")); + CHECK_VALUE(childrenProperty, QVersitProperty::ListType, children); +} + + +void tst_QVersitContactExporter::testEncodeDisplayLabel() +{ + QContact contact; + QContactName contactName; + + // No display label, but QContactName found + contactName.setFirstName(QString::fromAscii("First")); + contactName.setLastName(QString::fromAscii("Last")); + contactName.setMiddleName(QString::fromAscii("Middle")); + contact.saveDetail(&contactName); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), 2); + QVersitProperty displayProperty = document.properties().at(0); + QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); + QCOMPARE(displayProperty.value(), QString::fromAscii("First Last")); + QVersitProperty nameProperty = document.properties().at(1); + QCOMPARE(nameProperty.name(), QString::fromAscii("N")); + CHECK_VALUE(nameProperty, QVersitProperty::CompoundType, QStringList() + << QLatin1String("Last") << QLatin1String("First") << QLatin1String("Middle") + << QString() << QString()); +} + +void tst_QVersitContactExporter::testDefaultResourceHandler() +{ + QVersitDefaultResourceHandler handler; + QByteArray contents; + QString mimeType; + handler.loadResource(QLatin1String("test.jpg"), &contents, &mimeType); + QCOMPARE(mimeType, QLatin1String("image/jpeg")); + + QVersitProperty property; + QString location; + QVERIFY(!handler.saveResource("test contents", property, &location)); +} + +// Test utility functions +QContact tst_QVersitContactExporter::createContactWithName(QString name) +{ + QContact contact; + QContactName nameDetail; + nameDetail.setFirstName(name); + contact.saveDetail(&nameDetail); + return contact; +} + +QContactDetail tst_QVersitContactExporter::searchDetail( + QList details, + QString search) +{ + QContactDetail detail; + for (int i= 0; i < details.count(); i++) { + if ( details.at(i).definitionName() == search ) + detail = details.at(i); + } + return detail; +} + +QVersitProperty tst_QVersitContactExporter::findPropertyByName( + const QVersitDocument &document, const QString &propertyName) +{ + foreach (const QVersitProperty& property, document.properties()) { + if (property.name() == propertyName) + return property; + } + return QVersitProperty(); +} + +QTEST_MAIN(tst_QVersitContactExporter) +