/****************************************************************************
**
** Copyright (C) 2009 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 "ut_transformcontactdata.h"

#include "cnttransformemail.h"
#include "cnttransformname.h"
#include "cnttransformnickname.h"
#include "cnttransformphonenumber.h"
#include "cnttransformaddress.h"
#include "cnttransformurl.h"
#include "cnttransformbirthday.h"
#include "cnttransformonlineaccount.h"
#include "cnttransformorganisation.h"
#include "cnttransformavatar.h"
#include "cnttransformsynctarget.h"
#include "cnttransformgender.h"
#include "cnttransformanniversary.h"
#include "cnttransformgeolocation.h"
#include "cnttransformnote.h"
#include "cnttransformfamily.h"

#include "cntmodelextuids.h"

#include <QtTest/QtTest>
#include <qglobal.h>


void TestCntTransformContactData::initTestCase()
{
}

void TestCntTransformContactData::cleanupTestCase()
{
}

void TestCntTransformContactData::executeCntTransformEmail()
{
    TRAPD(err, validateCntTransformEmailL(_L("dummyemail"), QString("dummyemail"));
        validateCntTransformEmailL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformName()
{
    TRAPD(err, validateCntTransformNameL(_L("dummyprefix"), QString("dummyprefix"),
                          _L("dummyfirst"), QString("dummyfirst"),
                          _L("dummymiddle"), QString("dummymiddle"),
                          _L("dummylast"), QString("dummylast"),
                          _L("dummysuffix"), QString("dummysuffix"),
                          _L("dummylabel"), QString("dummylabel"));
        validateCntTransformNameL(_L(""), QString(""),
                          _L(""), QString(""),
                          _L(""), QString(""),
                          _L(""), QString(""),
                          _L(""), QString(""),
                          _L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformNickname()
{
    TRAPD(err, validateCntTransformNicknameL(_L("dummynickname"), QString("dummynickname"));
        validateCntTransformNicknameL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformPhonenumber()
{
    TRAPD(err, validateCntTransformPhonenumberL(_L("dummyphonenumber"), QString("dummyphonenumber"));
        validateCntTransformPhonenumberL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformAddress()
{
    TRAPD(err, validateCntTransformAddressL(_L("dummycountry"), QString("dummycountry"),
                             _L("dummypostcode"), QString("dummypostcode"),
                             _L("dummystreet"), QString("dummystreet"),
                             _L("dummylocality"), QString("dummylocality"),
                             _L("dummyregion"), QString("dummyregion"),
                             _L("dummypostofficebox"), QString("dummypostofficebox"));
        validateCntTransformAddressL(_L(""), QString(""),
                             _L(""), QString(""),
                             _L(""), QString(""),
                             _L(""), QString(""),
                             _L(""), QString(""),
                             _L(""), QString(""));
        );
    QVERIFY(err == 0);
}
void TestCntTransformContactData::executeCntTransformUrl()
{
    TRAPD(err, validateCntTransformUrlL(_L("dummyurl"), QString("dummyurl"));
        validateCntTransformUrlL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformBithday()
{
    TDateTime dateTime(2009, ESeptember, 27, 0, 0, 0, 0);
    TTime field(dateTime);
    QDate detail(2009, 9, 28);

    TRAPD(err, validateCntTransformBirthdayL(field, detail););
    QVERIFY(err == 0);
}

#ifdef SYMBIAN_BACKEND_USE_SQLITE

void TestCntTransformContactData::executeCntTransformOnlineAccount()
{
    TRAPD(err, validateCntTransformOnlineAccountL(_L("dummysip"), QString("dummysip"),
                                                  _L("nokia"), QString("nokia"),
                                                  _L("Available"), QString("Available"),
                                                  _L("Sleeping.."), QString("Sleeping.."));
    
        validateCntTransformOnlineAccountL(_L(""), QString(""),
                                           _L(""), QString(""),
                                           _L(""), QString(""),
                                           _L(""), QString(""));
        );
    QVERIFY(err == 0);
}

#endif // SYMBIAN_BACKEND_USE_SQLITE

void TestCntTransformContactData::executeCntTransformOrganisation()
{
    TRAPD(err, validateCntTransformOrganisationL(_L("dummycompany"), QString("dummycompany"),
                                  _L("dummydepartment"), QStringList("dummydepartment"),
                                  _L("dummyjobtitle"), QString("dummyjobtitle"),
                                  _L("dummyassistant"), QString("dummyassistant"));
        validateCntTransformOrganisationL(_L(""), QString(""),
                                  _L(""), QStringList(""),
                                  _L(""), QString(""),
                                  _L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformAvatar()
{
    TRAPD(err, validateCntTransformAvatarL(_L("dummyavatar"), QString("dummyavatar"));
        validateCntTransformAvatarL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformSyncTarget()
{
    TRAPD(err, validateCntTransformSyncTargetL(_L("dummysynctarget"), QString("dummysynctarget"));
        validateCntTransformSyncTargetL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformGender()
{
    TRAPD(err, validateCntTransformGenderL(_L("dummygender"), QString("dummygender"));
        validateCntTransformGenderL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformAnniversary()
{
    QDate dateDetail(2009, 9, 28);
    TRAPD(err, validateCntTransformAnniversaryL(_L("2009-09-28,dummyevent"), dateDetail, QString("dummyevent"));
        validateCntTransformAnniversaryL(_L("dummyevent"), QDate(), QString("dummyevent"));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformGeolocation()
{
    TRAPD(err, validateCntTransformGeolocationL(_L("123.45,765.88"), 123.45, 765.88);
        validateCntTransformGeolocationL(_L("123.45,"), 123.45, -1);
        validateCntTransformGeolocationL(_L(",765.88"), -1, 765.88);
        validateCntTransformGeolocationL(_L(""), -1, -1);
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformNote()
{
    TRAPD(err, validateCntTransformNoteL(_L("dummynote"), QString("dummynote"));
        validateCntTransformNoteL(_L(""), QString(""));
        );
    QVERIFY(err == 0);
}

void TestCntTransformContactData::executeCntTransformFamily()
{
    TRAPD(err, validateCntTransformFamilyL(_L("dummyspouse"), QString("dummyspouse"),
                            _L("dummychild"), QString("dummychild"));
        validateCntTransformFamilyL(_L(""), QString(""),
                            _L(""), QString(""));
        );
    QVERIFY(err == 0);
}


void TestCntTransformContactData::validateCntTransformEmailL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformEmail = new CntTransformEmail();
    QVERIFY(transformEmail != 0);
    QVERIFY(transformEmail->supportsField(KUidContactFieldEMail.iUid));
    QVERIFY(!(transformEmail->supportsField(0))); //Test for Wrong value
    QVERIFY(transformEmail->supportsDetail(QContactEmailAddress::DefinitionName));
    QVERIFY(!(transformEmail->supportsDetail("WrongValue")));
    //Test getIdForField
    validateGetIdForField(*transformEmail, QContactEmailAddress::FieldEmailAddress,
                           KUidContactFieldEMail.iUid);
    validateGetIdForField(*transformEmail, "WrongValue",0);
    QVERIFY( !(transformEmail->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldEMail;
    validateSupportedSortingFieldTypes(*transformEmail,QContactEmailAddress::FieldEmailAddress,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformEmail,"WrongValue",uidsToVerify);

    validateContextsL(transformEmail);

    QContactEmailAddress email;
    email.setEmailAddress(detail);
    QList<CContactItemField *> fields = transformEmail->transformDetailL(email);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldEMail));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldEMail);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformEmail->transformItemField(*newField, contact);
    const QContactEmailAddress* emailAddress(static_cast<const QContactEmailAddress*>(contactDetail));
    QCOMPARE(emailAddress->emailAddress(), detail);

    delete contactDetail;
    delete newField;
    delete transformEmail;
}

void TestCntTransformContactData::validateCntTransformNameL(TPtrC16 prefixField, QString prefixDetail,
                           TPtrC16 firstnameField, QString firstnameDetail,
                           TPtrC16 middlenameField, QString middlenameDetail,
                           TPtrC16 lastnameField, QString lastnameDetail,
                           TPtrC16 suffixField, QString suffixDetail,
                           TPtrC16 customLabelField, QString customLabelDetail)
{
    CntTransformContactData* transformName = new CntTransformName();
    QVERIFY(transformName != 0);
    QVERIFY(transformName->supportsField(KUidContactFieldPrefixName.iUid));
    QVERIFY(transformName->supportsField(KUidContactFieldGivenName.iUid));
    QVERIFY(transformName->supportsField(KUidContactFieldAdditionalName.iUid));
    QVERIFY(transformName->supportsField(KUidContactFieldFamilyName.iUid));
    QVERIFY(transformName->supportsField(KUidContactFieldSuffixName.iUid));
    QVERIFY(!(transformName->supportsField(0))); //Test for Wrong value
    QVERIFY(transformName->supportsDetail(QContactName::DefinitionName));
    QVERIFY(!(transformName->supportsDetail("WrongValue")));
    validateGetIdForField(*transformName, QContactName::FieldPrefix,KUidContactFieldPrefixName.iUid);
    validateGetIdForField(*transformName, QContactName::FieldFirstName, KUidContactFieldGivenName.iUid);
    validateGetIdForField(*transformName, QContactName::FieldMiddleName,KUidContactFieldAdditionalName.iUid);
    validateGetIdForField(*transformName, QContactName::FieldLastName,KUidContactFieldFamilyName.iUid);
    validateGetIdForField(*transformName, QContactName::FieldSuffix,KUidContactFieldSuffixName.iUid);
    validateGetIdForField(*transformName, "WrongValue", 0);
    QVERIFY( !(transformName->supportsSubType("WrongValue")));
    //Test supportedSortingFieldTypes
    //supportedSortingFieldTypes - FieldPrefix
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldPrefixName;
    validateSupportedSortingFieldTypes(*transformName,QContactName::FieldPrefix,uidsToVerify);

    //supportedSortingFieldTypes - FieldFirst
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldGivenName;
    validateSupportedSortingFieldTypes(*transformName,QContactName::FieldFirstName,uidsToVerify);

    //supportedSortingFieldTypes - FieldMiddle
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldAdditionalName;
    validateSupportedSortingFieldTypes(*transformName,QContactName::FieldMiddleName,uidsToVerify);

    //supportedSortingFieldTypes - FieldLast
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldFamilyName;
    validateSupportedSortingFieldTypes(*transformName,QContactName::FieldLastName,uidsToVerify);

    //supportedSortingFieldTypes - FieldSuffix
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldSuffixName;
    validateSupportedSortingFieldTypes(*transformName,QContactName::FieldSuffix,uidsToVerify);

    //supportedSortingFieldTypes - Wrongfieldvalue
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformName,"WrongValue",uidsToVerify);



    validateContextsL(transformName);

    QContactName name;
    name.setPrefix(prefixDetail);
    name.setFirstName(firstnameDetail);
    name.setLastName(lastnameDetail);
    name.setMiddleName(middlenameDetail);
    name.setSuffix(suffixDetail);
    name.setCustomLabel(customLabelDetail);
    QList<CContactItemField *> fields = transformName->transformDetailL(name);
    // Assume zero or 6 details
    if(prefixDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 6);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPrefixName));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(prefixField), 0);
        QVERIFY(fields.at(1)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(1)->ContentType().ContainsFieldType(KUidContactFieldGivenName));
        QCOMPARE(fields.at(1)->TextStorage()->Text().CompareF(firstnameField), 0);
        QVERIFY(fields.at(2)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(2)->ContentType().ContainsFieldType(KUidContactFieldAdditionalName));
        QCOMPARE(fields.at(2)->TextStorage()->Text().CompareF(middlenameField), 0);
        QVERIFY(fields.at(3)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(3)->ContentType().ContainsFieldType(KUidContactFieldFamilyName));
        QCOMPARE(fields.at(3)->TextStorage()->Text().CompareF(lastnameField), 0);
        QVERIFY(fields.at(4)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(4)->ContentType().ContainsFieldType(KUidContactFieldSuffixName));
        QCOMPARE(fields.at(4)->TextStorage()->Text().CompareF(suffixField), 0);
        QVERIFY(fields.at(5)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(5)->ContentType().ContainsFieldType(KUidContactFieldTemplateLabel));
        QCOMPARE(fields.at(5)->TextStorage()->Text().CompareF(customLabelField), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPrefixName);
    newField->TextStorage()->SetTextL(prefixField);
    QContact contact;
    QContactDetail* contactDetail = transformName->transformItemField(*newField, contact);
    const QContactName* nameInfo1(static_cast<const QContactName*>(contactDetail));
    QCOMPARE(nameInfo1->prefix(), prefixDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldGivenName);
    newField->TextStorage()->SetTextL(firstnameField);
    contactDetail = transformName->transformItemField(*newField, contact);
    const QContactName* nameInfo2(static_cast<const QContactName*>(contactDetail));
    QCOMPARE(nameInfo2->firstName(), firstnameDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldAdditionalName);
    newField->TextStorage()->SetTextL(middlenameField);
    contactDetail = transformName->transformItemField(*newField, contact);
    const QContactName* nameInfo3(static_cast<const QContactName*>(contactDetail));
    QCOMPARE(nameInfo3->middleName(), middlenameDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldFamilyName);
    newField->TextStorage()->SetTextL(lastnameField);
    contactDetail = transformName->transformItemField(*newField, contact);
    const QContactName* nameInfo4(static_cast<const QContactName*>(contactDetail));
    QCOMPARE(nameInfo4->lastName(), lastnameDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldSuffixName);
    newField->TextStorage()->SetTextL(suffixField);
    contactDetail = transformName->transformItemField(*newField, contact);
    const QContactName* nameInfo5(static_cast<const QContactName*>(contactDetail));
    QCOMPARE(nameInfo5->suffix(), suffixDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformName;
}

void TestCntTransformContactData::validateCntTransformNicknameL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformNickname = new CntTransformNickname();
    QVERIFY(transformNickname != 0);
    QVERIFY(transformNickname->supportsField(KUidContactFieldSecondName.iUid));
    QVERIFY(!(transformNickname->supportsField(0))); //Test for Wrong value
    QVERIFY(transformNickname->supportsDetail(QContactNickname::DefinitionName));
    QVERIFY(!(transformNickname->supportsDetail("WrongValue")));
    validateGetIdForField(*transformNickname, QContactNickname::FieldNickname,KUidContactFieldSecondName.iUid);
    validateGetIdForField(*transformNickname, "WrongValue", 0);
    QVERIFY( !(transformNickname->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldSecondName;
    validateSupportedSortingFieldTypes(*transformNickname,QContactNickname::FieldNickname,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformNickname,"WrongValue",uidsToVerify);


    validateContextsL(transformNickname);

    QContactNickname nickname;
    nickname.setNickname(detail);
    QList<CContactItemField *> fields = transformNickname->transformDetailL(nickname);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldSecondName));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldSecondName);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformNickname->transformItemField(*newField, contact);
    const QContactNickname* nicknameInfo(static_cast<const QContactNickname*>(contactDetail));
    QCOMPARE(nicknameInfo->nickname(), detail);

    delete contactDetail;
    delete newField;
    delete transformNickname;
}

void TestCntTransformContactData::validateCntTransformPhonenumberL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformPhoneNumber = new CntTransformPhoneNumber();
    QVERIFY(transformPhoneNumber != 0);
    QVERIFY(transformPhoneNumber->supportsField(KUidContactFieldPhoneNumber.iUid));
    QVERIFY(transformPhoneNumber->supportsField(KUidContactFieldFax.iUid));
    QVERIFY(transformPhoneNumber->supportsField(KUidContactFieldDTMF.iUid));
    QVERIFY(!(transformPhoneNumber->supportsField(0))); //some wrong value
    QVERIFY(transformPhoneNumber->supportsDetail(QContactPhoneNumber::DefinitionName));
    QVERIFY(!(transformPhoneNumber->supportsDetail("WrongValue")));
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::FieldNumber,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeLandline,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeMobile,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeFax,KUidContactFieldFax.iUid);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypePager,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeVoice,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeModem,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeVideo,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeCar,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeBulletinBoardSystem,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeMessagingCapable,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeAssistant,0);
    validateGetIdForField(*transformPhoneNumber, QContactPhoneNumber::SubTypeDtmfMenu,KUidContactFieldDTMF.iUid);
    validateGetIdForField(*transformPhoneNumber, "WrongValue", 0);
    QVERIFY(transformPhoneNumber->supportsSubType(QContactPhoneNumber::FieldSubTypes));
    QVERIFY( !(transformPhoneNumber->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    //supportedSortingFieldTypes - FieldPrefix
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldPhoneNumber;
    uidsToVerify << KUidContactFieldFax;
    uidsToVerify << KUidContactFieldDTMF;
    validateSupportedSortingFieldTypes(*transformPhoneNumber,QContactPhoneNumber::FieldNumber,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformPhoneNumber,"WrongValue",uidsToVerify);

    validateContextsL(transformPhoneNumber);

    QContactPhoneNumber phoneNumber1;
    phoneNumber1.setNumber(detail);
    QList<CContactItemField *> fields = transformPhoneNumber->transformDetailL(phoneNumber1);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber2;
    phoneNumber2.setNumber(detail);
    phoneNumber2.setSubTypes(QContactPhoneNumber::SubTypeLandline);
    fields = transformPhoneNumber->transformDetailL(phoneNumber2);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapTEL);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapVOICE));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber3;
    phoneNumber3.setNumber(detail);
    phoneNumber3.setSubTypes(QContactPhoneNumber::SubTypeMobile);
    fields = transformPhoneNumber->transformDetailL(phoneNumber3);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapTEL);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber4;
    phoneNumber4.setNumber(detail);
    phoneNumber4.setSubTypes(QContactPhoneNumber::SubTypeFax);
    fields = transformPhoneNumber->transformDetailL(phoneNumber4);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldFax));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapTEL);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapFAX));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber5;
    phoneNumber5.setNumber(detail);
    phoneNumber5.setSubTypes(QContactPhoneNumber::SubTypePager);
    fields = transformPhoneNumber->transformDetailL(phoneNumber5);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapTEL);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapPAGER));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber6;
    phoneNumber6.setNumber(detail);
    phoneNumber6.setSubTypes(QContactPhoneNumber::SubTypeBulletinBoardSystem);
    fields = transformPhoneNumber->transformDetailL(phoneNumber6);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapTEL);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapBBS));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber7;
    phoneNumber7.setNumber(detail);
    phoneNumber7.setSubTypes(QContactPhoneNumber::SubTypeCar);
    fields = transformPhoneNumber->transformDetailL(phoneNumber7);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapTEL);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapCAR));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber8;
    phoneNumber8.setNumber(detail);
    phoneNumber8.setSubTypes(QContactPhoneNumber::SubTypeDtmfMenu);
    fields = transformPhoneNumber->transformDetailL(phoneNumber8);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldDTMF));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactPhoneNumber phoneNumber9;
    phoneNumber9.setNumber(detail);
    phoneNumber9.setSubTypes(QContactPhoneNumber::SubTypeAssistant);
    fields = transformPhoneNumber->transformDetailL(phoneNumber9);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldPhoneNumber));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapAssistantTel);
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo->number(), detail);
    QVERIFY(phoneNumberInfo->subTypes().count() == 0);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    newField->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo1(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo1->number(), detail);
    QVERIFY(phoneNumberInfo1->subTypes().contains(QContactPhoneNumber::SubTypeLandline));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    newField->AddFieldTypeL(KUidContactFieldVCardMapCELL);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo2(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo2->number(), detail);
    QVERIFY(phoneNumberInfo2->subTypes().contains(QContactPhoneNumber::SubTypeMobile));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    newField->AddFieldTypeL(KUidContactFieldVCardMapPAGER);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo3(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo3->number(), detail);
    QVERIFY(phoneNumberInfo3->subTypes().contains(QContactPhoneNumber::SubTypePager));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldFax);
    newField->TextStorage()->SetTextL(field);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo4(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo4->number(), detail);
    QVERIFY(phoneNumberInfo4->subTypes().contains(QContactPhoneNumber::SubTypeFax));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    newField->AddFieldTypeL(KUidContactFieldVCardMapBBS);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo5(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo5->number(), detail);
    QVERIFY(phoneNumberInfo5->subTypes().contains(QContactPhoneNumber::SubTypeBulletinBoardSystem));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    newField->AddFieldTypeL(KUidContactFieldVCardMapCAR);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo6(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo6->number(), detail);
    QVERIFY(phoneNumberInfo6->subTypes().contains(QContactPhoneNumber::SubTypeCar));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldDTMF);
    newField->TextStorage()->SetTextL(field);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo7(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo7->number(), detail);
    QVERIFY(phoneNumberInfo7->subTypes().contains(QContactPhoneNumber::SubTypeDtmfMenu));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPhoneNumber);
    newField->TextStorage()->SetTextL(field);
    newField->SetMapping(KUidContactFieldVCardMapAssistantTel);
    contactDetail = transformPhoneNumber->transformItemField(*newField, contact);
    const QContactPhoneNumber* phoneNumberInfo8(static_cast<const QContactPhoneNumber*>(contactDetail));
    QCOMPARE(phoneNumberInfo8->number(), detail);
    QVERIFY(phoneNumberInfo8->subTypes().contains(QContactPhoneNumber::SubTypeAssistant));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformPhoneNumber;
}

void TestCntTransformContactData::validateCntTransformAddressL(TPtrC16 countryField, QString countryDetail,
                              TPtrC16 postcodeField, QString postcodeDetail,
                              TPtrC16 streetField, QString streetDetail,
                              TPtrC16 localityField, QString localityDetail,
                              TPtrC16 regionField, QString regionDetail,
                              TPtrC16 postOfficeBoxField, QString postOfficeBoxDetail)
{
    CntTransformContactData* transformAddress = new CntTransformAddress();
    QVERIFY(transformAddress != 0);
    QVERIFY(transformAddress->supportsField(KUidContactFieldCountry.iUid));
    QVERIFY(transformAddress->supportsField(KUidContactFieldPostcode.iUid));
    QVERIFY(transformAddress->supportsField(KUidContactFieldAddress.iUid));
    QVERIFY(transformAddress->supportsField(KUidContactFieldLocality.iUid));
    QVERIFY(transformAddress->supportsField(KUidContactFieldRegion.iUid));
    QVERIFY(transformAddress->supportsField(KUidContactFieldPostOffice.iUid));
    QVERIFY(!(transformAddress->supportsField(0))); //Test for Wrong value
    QVERIFY(transformAddress->supportsDetail(QContactAddress::DefinitionName));
    QVERIFY(!(transformAddress->supportsDetail("WrongValue")));

    validateGetIdForField(*transformAddress, QContactAddress::FieldStreet,KUidContactFieldAddress.iUid);
    validateGetIdForField(*transformAddress, QContactAddress::FieldLocality,KUidContactFieldLocality.iUid);
    validateGetIdForField(*transformAddress, QContactAddress::FieldRegion,KUidContactFieldRegion.iUid);
    validateGetIdForField(*transformAddress, QContactAddress::FieldPostcode,KUidContactFieldPostcode.iUid);
    validateGetIdForField(*transformAddress, QContactAddress::FieldCountry,KUidContactFieldCountry.iUid);
    validateGetIdForField(*transformAddress, QContactAddress::FieldPostOfficeBox,KUidContactFieldPostOffice.iUid);
    validateGetIdForField(*transformAddress, QContactAddress::SubTypeParcel,0);
    validateGetIdForField(*transformAddress, QContactAddress::SubTypePostal,0);
    validateGetIdForField(*transformAddress, QContactAddress::SubTypeDomestic,0);
    validateGetIdForField(*transformAddress, QContactAddress::SubTypeInternational,0);
    validateGetIdForField(*transformAddress, "WrongValue", 0);
    QVERIFY(transformAddress->supportsSubType(QContactAddress::FieldSubTypes));
    QVERIFY( !(transformAddress->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    //supportedSortingFieldTypes - FieldStreet
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldAddress;
    validateSupportedSortingFieldTypes(*transformAddress,QContactAddress::FieldStreet,uidsToVerify);

    //supportedSortingFieldTypes - FieldLocality
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldLocality;
    validateSupportedSortingFieldTypes(*transformAddress,QContactAddress::FieldLocality,uidsToVerify);


    //supportedSortingFieldTypes - FieldRegion
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldRegion;
    validateSupportedSortingFieldTypes(*transformAddress,QContactAddress::FieldRegion,uidsToVerify);


    //supportedSortingFieldTypes - FieldPostcode
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldPostcode;
    validateSupportedSortingFieldTypes(*transformAddress,QContactAddress::FieldPostcode,uidsToVerify);


    //supportedSortingFieldTypes - FieldCountry
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldCountry;
    validateSupportedSortingFieldTypes(*transformAddress,QContactAddress::FieldCountry,uidsToVerify);


    //supportedSortingFieldTypes - FieldPostOfficeBox
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldPostOffice;
    validateSupportedSortingFieldTypes(*transformAddress,QContactAddress::FieldPostOfficeBox,uidsToVerify);

    //supportedSortingFieldTypes - Wrongvalue
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformAddress,"WrongValue",uidsToVerify);

    validateContextsL(transformAddress);

    QContactAddress address;
    address.setCountry(countryDetail);
    address.setPostcode(postcodeDetail);
    address.setStreet(streetDetail);
    address.setLocality(localityDetail);
    address.setRegion(regionDetail);
    address.setPostOfficeBox(postOfficeBoxDetail);
    QList<CContactItemField *> fields = transformAddress->transformDetailL(address);
    // Assume zero or 6 details
    if(countryDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 6);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldCountry));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(countryField), 0);
        QVERIFY(fields.at(1)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(1)->ContentType().ContainsFieldType(KUidContactFieldPostcode));
        QCOMPARE(fields.at(1)->TextStorage()->Text().CompareF(postcodeField), 0);
        QVERIFY(fields.at(2)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(2)->ContentType().ContainsFieldType(KUidContactFieldAddress));
        QCOMPARE(fields.at(2)->TextStorage()->Text().CompareF(streetField), 0);
        QVERIFY(fields.at(3)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(3)->ContentType().ContainsFieldType(KUidContactFieldLocality));
        QCOMPARE(fields.at(3)->TextStorage()->Text().CompareF(localityField), 0);
        QVERIFY(fields.at(4)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(4)->ContentType().ContainsFieldType(KUidContactFieldRegion));
        QCOMPARE(fields.at(4)->TextStorage()->Text().CompareF(regionField), 0);
        QVERIFY(fields.at(5)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(5)->ContentType().ContainsFieldType(KUidContactFieldPostOffice));
        QCOMPARE(fields.at(5)->TextStorage()->Text().CompareF(postOfficeBoxField), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldCountry);
    newField->TextStorage()->SetTextL(countryField);
    QContact contact;
    QContactDetail* contactDetail = transformAddress->transformItemField(*newField, contact);
    const QContactAddress* addressInfo1(static_cast<const QContactAddress*>(contactDetail));
    QCOMPARE(addressInfo1->country(), countryDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPostcode);
    newField->TextStorage()->SetTextL(postcodeField);
    contactDetail = transformAddress->transformItemField(*newField, contact);
    const QContactAddress* addressInfo2(static_cast<const QContactAddress*>(contactDetail));
    QCOMPARE(addressInfo2->postcode(), postcodeDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldAddress);
    newField->TextStorage()->SetTextL(streetField);
    contactDetail = transformAddress->transformItemField(*newField, contact);
    const QContactAddress* addressInfo3(static_cast<const QContactAddress*>(contactDetail));
    QCOMPARE(addressInfo3->street(), streetDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldLocality);
    newField->TextStorage()->SetTextL(localityField);
    contactDetail = transformAddress->transformItemField(*newField, contact);
    const QContactAddress* addressInfo4(static_cast<const QContactAddress*>(contactDetail));
    QCOMPARE(addressInfo4->locality(), localityDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldRegion);
    newField->TextStorage()->SetTextL(regionField);
    contactDetail = transformAddress->transformItemField(*newField, contact);
    const QContactAddress* addressInfo5(static_cast<const QContactAddress*>(contactDetail));
    QCOMPARE(addressInfo5->region(), regionDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPostOffice);
    newField->TextStorage()->SetTextL(postOfficeBoxField);
    contactDetail = transformAddress->transformItemField(*newField, contact);
    const QContactAddress* addressInfo6(static_cast<const QContactAddress*>(contactDetail));
    QCOMPARE(addressInfo6->postOfficeBox(), postOfficeBoxDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformAddress;
}

void TestCntTransformContactData::validateCntTransformUrlL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformUrl = new CntTransformUrl();
    QVERIFY(transformUrl != 0);
    QVERIFY(transformUrl->supportsField(KUidContactFieldUrl.iUid));
    QVERIFY(transformUrl->supportsDetail(QContactUrl::DefinitionName));
    QVERIFY(!(transformUrl->supportsDetail("WrongValue")));
    validateGetIdForField(*transformUrl, QContactUrl::FieldUrl,0);
    validateGetIdForField(*transformUrl, QContactUrl::SubTypeHomePage,0);
    validateGetIdForField(*transformUrl, QContactUrl::SubTypeFavourite,0);
    validateGetIdForField(*transformUrl, "WrongValue", 0);
    QVERIFY(transformUrl->supportsSubType(QContactUrl::FieldSubType));
    QVERIFY( !(transformUrl->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
   //supportedSortingFieldTypes - FieldUrl
   QList<TUid> uidsToVerify;
   uidsToVerify << KUidContactFieldUrl;
   validateSupportedSortingFieldTypes(*transformUrl,QContactUrl::FieldUrl,uidsToVerify);
   uidsToVerify.clear();
   validateSupportedSortingFieldTypes(*transformUrl,"WrongValue",uidsToVerify);

    validateContextsL(transformUrl);

    QContactUrl url;
    url.setUrl(detail);
    url.setSubType(QContactUrl::SubTypeHomePage);
    QList<CContactItemField *> fields = transformUrl->transformDetailL(url);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldUrl));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldUrl);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformUrl->transformItemField(*newField, contact);
    const QContactUrl* urlAddress(static_cast<const QContactUrl*>(contactDetail));
    QCOMPARE(urlAddress->url(), detail);

    delete contactDetail;
    delete newField;
    delete transformUrl;
}

void TestCntTransformContactData::validateCntTransformBirthdayL(TTime field, QDate detail)
{
    CntTransformContactData* transformBirthday = new CntTransformBirthday();
    QVERIFY(transformBirthday != 0);
    QVERIFY(transformBirthday->supportsField(KUidContactFieldBirthday.iUid));
    QVERIFY(!(transformBirthday->supportsField(0))); //Test for Wrong value
    QVERIFY(transformBirthday->supportsDetail(QContactBirthday::DefinitionName));
    QVERIFY(!(transformBirthday->supportsDetail("WrongValue")));

    validateGetIdForField(*transformBirthday, QContactBirthday::FieldBirthday,KUidContactFieldBirthday.iUid);
    validateGetIdForField(*transformBirthday, "WrongValue", 0);
    QVERIFY( !(transformBirthday->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    //supportedSortingFieldTypes - FieldBirthday
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldBirthday;
    validateSupportedSortingFieldTypes(*transformBirthday,QContactBirthday::FieldBirthday,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformBirthday,"WrongValue",uidsToVerify);

    validateContextsL(transformBirthday);

    QContactBirthday birthday;
    birthday.setDate(detail);
    QList<CContactItemField *> fields = transformBirthday->transformDetailL(birthday);
    QVERIFY(fields.count() == 1);
    QVERIFY(fields.at(0)->StorageType() == KStorageTypeDateTime);
    QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldBirthday));
    QCOMPARE(fields.at(0)->DateTimeStorage()->Time().DateTime().Year(), detail.year());
    QCOMPARE(fields.at(0)->DateTimeStorage()->Time().DateTime().Month() + 1, detail.month());
    QCOMPARE(fields.at(0)->DateTimeStorage()->Time().DateTime().Day() + 1, detail.day());

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeDateTime, KUidContactFieldBirthday);
    newField->DateTimeStorage()->SetTime(field);
    QContact contact;
    QContactDetail* contactDetail = transformBirthday->transformItemField(*newField, contact);
    const QContactBirthday* birthdayInfo(static_cast<const QContactBirthday*>(contactDetail));
    QCOMPARE(birthdayInfo->date().year(), field.DateTime().Year());
    QCOMPARE(birthdayInfo->date().month(), field.DateTime().Month() + 1);
    QCOMPARE(birthdayInfo->date().day(), field.DateTime().Day() + 1);

    delete contactDetail;
    delete newField;
    delete transformBirthday;
}

#ifdef SYMBIAN_BACKEND_USE_SQLITE

void TestCntTransformContactData::validateCntTransformOnlineAccountL(
    TPtrC16 sipField, QString sipDetail,
    TPtrC16 providerField, QString providerDetail,
    TPtrC16 /*presenceField*/, QString presenceDetail,
    TPtrC16 statusField, QString statusDetail)
{
	CntTransformContactData* transformOnlineAccount = new CntTransformOnlineAccount();
    QVERIFY(transformOnlineAccount != 0);
    QVERIFY(transformOnlineAccount->supportsField(KUidContactFieldSIPID.iUid));
    QVERIFY(transformOnlineAccount->supportsField(KUidContactFieldIMPP.iUid));
    QVERIFY(transformOnlineAccount->supportsField(KUidContactFieldServiceProvider.iUid));
    QVERIFY(transformOnlineAccount->supportsField(KUidContactFieldPresence.iUid));
    QVERIFY(transformOnlineAccount->supportsField(KUidContactFieldStatusMsg.iUid));
    QVERIFY(!(transformOnlineAccount->supportsField(0))); //Test for Wrong value
    QVERIFY(transformOnlineAccount->supportsDetail(QContactOnlineAccount::DefinitionName));
    QVERIFY(!(transformOnlineAccount->supportsDetail("WrongValue")));

    validateGetIdForField(*transformOnlineAccount, QContactOnlineAccount::FieldAccountUri,0);
    validateGetIdForField(*transformOnlineAccount, QContactOnlineAccount::SubTypeSip,KUidContactFieldSIPID.iUid);
    validateGetIdForField(*transformOnlineAccount, QContactOnlineAccount::SubTypeImpp, KUidContactFieldIMPP.iUid);
    validateGetIdForField(*transformOnlineAccount, QContactOnlineAccount::SubTypeSipVoip,KUidContactFieldVCardMapVOIP.iUid);
    validateGetIdForField(*transformOnlineAccount, QContactOnlineAccount::SubTypeVideoShare,KUidContactFieldVCardMapSWIS.iUid);
    validateGetIdForField(*transformOnlineAccount, "WrongValue", 0);
    QVERIFY( !(transformOnlineAccount->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    //supportedSortingFieldTypes - FieldAccountUri
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldIMPP;
    uidsToVerify << KUidContactFieldSIPID;
    validateSupportedSortingFieldTypes(*transformOnlineAccount,QContactOnlineAccount::FieldAccountUri,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformOnlineAccount,"WrongValue",uidsToVerify);

    validateContextsL(transformOnlineAccount);

    QContactOnlineAccount onlineAccount1;
    onlineAccount1.setAccountUri(sipDetail);
    onlineAccount1.setServiceProvider(providerDetail);
    onlineAccount1.setPresence(presenceDetail);
    onlineAccount1.setStatusMessage(statusDetail);
    
    onlineAccount1.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
    QList<CContactItemField *> fields = transformOnlineAccount->transformDetailL(onlineAccount1);
    if(sipDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 4);
        
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldSIPID));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapSIPID);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapVOIP));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(sipField), 0);

        QVERIFY(fields.at(1)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(1)->ContentType().ContainsFieldType(KUidContactFieldServiceProvider));
        QCOMPARE(fields.at(1)->TextStorage()->Text(), providerField );
        
        QVERIFY(fields.at(2)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(2)->ContentType().ContainsFieldType(KUidContactFieldPresence));
        //Presence information is encoded as single character value defined in enum
        //1 for Available
        QCOMPARE(fields.at(2)->TextStorage()->Text(), _L("1") );
        
        QVERIFY(fields.at(3)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(3)->ContentType().ContainsFieldType(KUidContactFieldStatusMsg));
        QCOMPARE(fields.at(3)->TextStorage()->Text(), statusField );
    }

    QContactOnlineAccount onlineAccount2;
    onlineAccount2.setAccountUri(sipDetail);
    onlineAccount2.setSubTypes(QContactOnlineAccount::SubTypeVideoShare);
    fields = transformOnlineAccount->transformDetailL(onlineAccount2);
    if(sipDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QCOMPARE(fields.count(), 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldSIPID));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapSIPID);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapSWIS));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(sipField), 0);
    }

    QContactOnlineAccount onlineAccount3;
    onlineAccount3.setAccountUri(sipDetail);
    onlineAccount3.setSubTypes(QContactOnlineAccount::SubTypeSip);
    fields = transformOnlineAccount->transformDetailL(onlineAccount3);
    if(sipDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QCOMPARE(fields.count(), 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldSIPID));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapSIPID);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVCardMapSIPID));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(sipField), 0);
    }

    QContactOnlineAccount onlineAccount4;
    onlineAccount4.setAccountUri(sipDetail);
    onlineAccount4.setSubTypes(QContactOnlineAccount::SubTypeImpp);
    fields = transformOnlineAccount->transformDetailL(onlineAccount4);
    if(sipDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QCOMPARE(fields.count(), 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldIMPP));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapUnknown);
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(sipField), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldSIPID);
    newField->TextStorage()->SetTextL(sipField);
    newField->AddFieldTypeL(KUidContactFieldVCardMapVOIP);
    QContact contact;
    QContactDetail* contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail1(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail1->accountUri(), sipDetail);
    QVERIFY(onlineAccountDetail1->subTypes().contains(QContactOnlineAccount::SubTypeSipVoip));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldSIPID);
    newField->TextStorage()->SetTextL(sipField);
    newField->AddFieldTypeL(KUidContactFieldVCardMapSWIS);
    contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail2(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail2->accountUri(), sipDetail);
    QVERIFY(onlineAccountDetail2->subTypes().contains(QContactOnlineAccount::SubTypeVideoShare));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldSIPID);
    newField->TextStorage()->SetTextL(sipField);
    newField->AddFieldTypeL(KUidContactFieldVCardMapSIPID);
    contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail3(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail3->accountUri(), sipDetail);
    QVERIFY(onlineAccountDetail3->subTypes().contains(QContactOnlineAccount::SubTypeSip));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldIMPP);
    newField->TextStorage()->SetTextL(sipField);
    contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail4(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail4->accountUri(), sipDetail);
    QVERIFY(onlineAccountDetail4->subTypes().contains(QContactOnlineAccount::SubTypeImpp));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldServiceProvider);
    newField->TextStorage()->SetTextL(providerField);
    contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail5(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail5->serviceProvider(), providerDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;
    
    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldPresence);
    // Set the presence available i.e. 1
    newField->TextStorage()->SetTextL(_L("1"));
    contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail6(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail6->presence(), QString::fromAscii("Available"));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;
    
    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldStatusMsg);
    newField->TextStorage()->SetTextL(statusField);
    contactDetail = transformOnlineAccount->transformItemField(*newField, contact);
    const QContactOnlineAccount* onlineAccountDetail7(static_cast<const QContactOnlineAccount*>(contactDetail));
    QCOMPARE(onlineAccountDetail7->statusMessage(), statusDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformOnlineAccount;
}

#endif // SYMBIAN_BACKEND_USE_SQLITE

void TestCntTransformContactData::validateCntTransformOrganisationL(TPtrC16 companyField, QString companyDetail,
                                TPtrC16 departmentField, QStringList departmentDetail,
                                TPtrC16 jobtitleField, QString jobtitleDetail,
                                TPtrC16 assistantField, QString assistantDetail)
{
    CntTransformContactData* transformOrganisation = new CntTransformOrganisation();
    QVERIFY(transformOrganisation != 0);
    QVERIFY(transformOrganisation->supportsField(KUidContactFieldCompanyName.iUid));
    QVERIFY(transformOrganisation->supportsField(KUidContactFieldDepartmentName.iUid));
    QVERIFY(transformOrganisation->supportsField(KUidContactFieldJobTitle.iUid));
    QVERIFY(transformOrganisation->supportsField(KUidContactFieldAssistant.iUid));
    QVERIFY(!(transformOrganisation->supportsField(0))); //Test for Wrong value
    QVERIFY(transformOrganisation->supportsDetail(QContactOrganization::DefinitionName));
    QVERIFY(!(transformOrganisation->supportsDetail("WrongValue")));

    validateGetIdForField(*transformOrganisation, QContactOrganization::FieldName,KUidContactFieldCompanyName.iUid);
    validateGetIdForField(*transformOrganisation, QContactOrganization::FieldLogoUrl,0);
    validateGetIdForField(*transformOrganisation, QContactOrganization::FieldDepartment,KUidContactFieldDepartmentName.iUid);
    validateGetIdForField(*transformOrganisation, QContactOrganization::FieldLocation,0);
    validateGetIdForField(*transformOrganisation, QContactOrganization::FieldTitle,KUidContactFieldJobTitle.iUid);
    validateGetIdForField(*transformOrganisation, QContactOrganization::FieldAssistantName,KUidContactFieldAssistant.iUid);
    validateGetIdForField(*transformOrganisation, "WrongValue", 0);
    QVERIFY( !(transformOrganisation->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    //supportedSortingFieldTypes - FieldPrefix
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldCompanyName;
    validateSupportedSortingFieldTypes(*transformOrganisation,QContactOrganization::FieldName,uidsToVerify);

    //supportedSortingFieldTypes - FieldDepartment
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldDepartmentName;
    validateSupportedSortingFieldTypes(*transformOrganisation,QContactOrganization::FieldDepartment,uidsToVerify);

    //supportedSortingFieldTypes - FieldTitle
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldJobTitle;
    validateSupportedSortingFieldTypes(*transformOrganisation,QContactOrganization::FieldTitle,uidsToVerify);

    //supportedSortingFieldTypes - FieldAssistantName
    uidsToVerify.clear();
    uidsToVerify << KUidContactFieldAssistant;
    validateSupportedSortingFieldTypes(*transformOrganisation,QContactOrganization::FieldAssistantName,uidsToVerify);

    //supportedSortingFieldTypes - Wrongvalue
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformOrganisation,"WrongValue",uidsToVerify);

    validateContextsL(transformOrganisation);

    QContactOrganization organisation;
    organisation.setName(companyDetail);
    organisation.setDepartment(departmentDetail);
    organisation.setTitle(jobtitleDetail);
    organisation.setAssistantName(assistantDetail);
    QList<CContactItemField *> fields = transformOrganisation->transformDetailL(organisation);
    // Assume zero or 4 details
    if(companyDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 4);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldCompanyName));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(companyField), 0);
        QVERIFY(fields.at(1)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(1)->ContentType().ContainsFieldType(KUidContactFieldDepartmentName));
        QCOMPARE(fields.at(1)->TextStorage()->Text().CompareF(departmentField), 0);
        QVERIFY(fields.at(2)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(2)->ContentType().ContainsFieldType(KUidContactFieldJobTitle));
        QCOMPARE(fields.at(2)->TextStorage()->Text().CompareF(jobtitleField), 0);
        QVERIFY(fields.at(3)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(3)->ContentType().ContainsFieldType(KUidContactFieldAssistant));
        QCOMPARE(fields.at(3)->TextStorage()->Text().CompareF(assistantField), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldCompanyName);
    newField->TextStorage()->SetTextL(companyField);
    QContact contact;
    QContactDetail* contactDetail = transformOrganisation->transformItemField(*newField, contact);
    const QContactOrganization* organisationInfo1(static_cast<const QContactOrganization*>(contactDetail));
    QCOMPARE(organisationInfo1->name(), companyDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldDepartmentName);
    newField->TextStorage()->SetTextL(departmentField);
    contactDetail = transformOrganisation->transformItemField(*newField, contact);
    const QContactOrganization* organisationInfo2(static_cast<const QContactOrganization*>(contactDetail));
    QCOMPARE(organisationInfo2->department(), departmentDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldJobTitle);
    newField->TextStorage()->SetTextL(jobtitleField);
    contactDetail = transformOrganisation->transformItemField(*newField, contact);
    const QContactOrganization* organisationInfo3(static_cast<const QContactOrganization*>(contactDetail));
    QCOMPARE(organisationInfo3->title(), jobtitleDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldAssistant);
    newField->TextStorage()->SetTextL(assistantField);
    contactDetail = transformOrganisation->transformItemField(*newField, contact);
    const QContactOrganization* organisationInfo4(static_cast<const QContactOrganization*>(contactDetail));
    QCOMPARE(organisationInfo4->assistantName(), assistantDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformOrganisation;
}

void TestCntTransformContactData::validateCntTransformAvatarL(TPtrC16 /*field*/, QString /*detail*/)
{
    QFAIL("Refactor test to match new api!");
    /*
    CntTransformContactData* transformAvatar = new CntTransformAvatar();
    QVERIFY(transformAvatar != 0);
    QVERIFY(transformAvatar->supportsField(KUidContactFieldCodImage.iUid));
    QVERIFY(transformAvatar->supportsField(KUidContactFieldRingTone.iUid));
    QVERIFY(transformAvatar->supportsField(KUidContactFieldVideoRingTone.iUid));
    QVERIFY(!(transformAvatar->supportsField(0))); //Test for Wrong value
    QVERIFY(transformAvatar->supportsDetail(QContactAvatar::DefinitionName));
    QVERIFY(!(transformAvatar->supportsDetail("WrongValue")));

    validateGetIdForField(*transformAvatar, QContactAvatar::FieldAvatar,0);
    validateGetIdForField(*transformAvatar, QContactAvatar::SubTypeImage,0);
    validateGetIdForField(*transformAvatar, QContactAvatar::SubTypeVideo,0);
    validateGetIdForField(*transformAvatar, QContactAvatar::SubTypeTexturedMesh,0);
    validateGetIdForField(*transformAvatar, QContactAvatar::SubTypeAudioRingtone,0);
    validateGetIdForField(*transformAvatar, QContactAvatar::SubTypeVideoRingtone,0);
    validateGetIdForField(*transformAvatar, "WrongValue", 0);
    QVERIFY(transformAvatar->supportsSubType(QContactAvatar::FieldSubType));
    QVERIFY( !(transformAvatar->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    validateSupportedSortingFieldTypes(*transformAvatar,"WrongValue",uidsToVerify);

    validateContextsL(transformAvatar);

    QContactAvatar avatar1;
    avatar1.setAvatar(detail);
    avatar1.setSubType(QContactAvatar::SubTypeImage);
    QList<CContactItemField *> fields = transformAvatar->transformDetailL(avatar1);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldCodImage));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactAvatar avatar2;
    avatar2.setAvatar(detail);
    avatar2.setSubType(QContactAvatar::SubTypeAudioRingtone);
    fields = transformAvatar->transformDetailL(avatar2);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldRingTone));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    QContactAvatar avatar3;
    avatar2.setAvatar(detail);
    avatar2.setSubType(QContactAvatar::SubTypeVideoRingtone);
    fields = transformAvatar->transformDetailL(avatar2);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldVideoRingTone));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldCodImage);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformAvatar->transformItemField(*newField, contact);
    const QContactAvatar* avatarInfo1(static_cast<const QContactAvatar*>(contactDetail));
    QCOMPARE(avatarInfo1->avatar(), detail);
    QVERIFY(avatarInfo1->subType().contains(QContactAvatar::SubTypeImage));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldRingTone);
    newField->TextStorage()->SetTextL(field);
    contactDetail = transformAvatar->transformItemField(*newField, contact);
    const QContactAvatar* avatarInfo2(static_cast<const QContactAvatar*>(contactDetail));
    QCOMPARE(avatarInfo2->avatar(), detail);
    QVERIFY(avatarInfo2->subType().contains(QContactAvatar::SubTypeAudioRingtone));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldVideoRingTone);
    newField->TextStorage()->SetTextL(field);
    contactDetail = transformAvatar->transformItemField(*newField, contact);
    const QContactAvatar* avatarInfo3(static_cast<const QContactAvatar*>(contactDetail));
    QCOMPARE(avatarInfo3->avatar(), detail);
    QVERIFY(avatarInfo3->subType().contains(QContactAvatar::SubTypeVideoRingtone));
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformAvatar;
    */
}

void TestCntTransformContactData::validateCntTransformSyncTargetL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformSyncTarget = new CntTransformSyncTarget();
    QVERIFY(transformSyncTarget != 0);
    QVERIFY(transformSyncTarget->supportsField(KUidContactFieldClass.iUid));
    QVERIFY(transformSyncTarget->supportsDetail(QContactSyncTarget::DefinitionName));
    QVERIFY(!(transformSyncTarget->supportsDetail("WrongValue")));

    validateGetIdForField(*transformSyncTarget,QContactSyncTarget::FieldSyncTarget,KUidContactFieldClass.iUid);
    validateGetIdForField(*transformSyncTarget, "WrongValue", 0);
    QVERIFY( !(transformSyncTarget->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldClass;
    validateSupportedSortingFieldTypes(*transformSyncTarget,QContactSyncTarget::FieldSyncTarget,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformSyncTarget,"WrongValue",uidsToVerify);

    validateContextsL(transformSyncTarget);

    QContactSyncTarget syncTarget;
    syncTarget.setSyncTarget(detail);
    QList<CContactItemField *> fields = transformSyncTarget->transformDetailL(syncTarget);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldClass));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldClass);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformSyncTarget->transformItemField(*newField, contact);
    const QContactSyncTarget* syncTargetInfo(static_cast<const QContactSyncTarget*>(contactDetail));
    QCOMPARE(syncTargetInfo->syncTarget(), detail);

    delete contactDetail;
    delete newField;
    delete transformSyncTarget;
}

void TestCntTransformContactData::validateCntTransformGenderL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformGender = new CntTransformGender();
    QVERIFY(transformGender != 0);
    QVERIFY(transformGender->supportsField(KUidContactFieldGender.iUid));
    QVERIFY(!(transformGender->supportsField(0))); //Test for Wrong value
    QVERIFY(transformGender->supportsDetail(QContactGender::DefinitionName));
    QVERIFY(!(transformGender->supportsDetail("WrongValue")));

    validateGetIdForField(*transformGender, QContactGender::FieldGender,KUidContactFieldGender.iUid);
    validateGetIdForField(*transformGender, QContactGender::GenderMale,0);
    validateGetIdForField(*transformGender, QContactGender::GenderFemale,0);
    validateGetIdForField(*transformGender, QContactGender::GenderUnspecified,0);
    validateGetIdForField(*transformGender, "WrongValue", 0);
    QVERIFY( !(transformGender->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldGender;
    validateSupportedSortingFieldTypes(*transformGender,QContactGender::FieldGender,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformGender,"WrongValue",uidsToVerify);

    validateContextsL(transformGender);

    QContactGender gender;
    gender.setGender(detail);
    QList<CContactItemField *> fields = transformGender->transformDetailL(gender);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldGender));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldGender);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformGender->transformItemField(*newField, contact);
    const QContactGender* genderInfo(static_cast<const QContactGender*>(contactDetail));
    QCOMPARE(genderInfo->gender(), detail);

    delete contactDetail;
    delete newField;
    delete transformGender;
}

void TestCntTransformContactData::validateCntTransformAnniversaryL(TPtrC16 field, QDate dateDetail, QString eventDetail)
{
    CntTransformContactData* transformAnniversary = new CntTransformAnniversary();
    QVERIFY(transformAnniversary != 0);
    QVERIFY(transformAnniversary->supportsField(KUidContactFieldAnniversary.iUid));
    QVERIFY(!(transformAnniversary->supportsField(0))); //Test for Wrong value
    QVERIFY(transformAnniversary->supportsDetail(QContactAnniversary::DefinitionName));
    QVERIFY(!(transformAnniversary->supportsDetail("WrongValue")));

    validateGetIdForField(*transformAnniversary, QContactAnniversary::FieldCalendarId,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::FieldOriginalDate,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::FieldEvent,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::SubTypeWedding,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::SubTypeEngagement,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::SubTypeHouse,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::SubTypeEmployment,0);
    validateGetIdForField(*transformAnniversary, QContactAnniversary::SubTypeMemorial,0);
    validateGetIdForField(*transformAnniversary, "WrongValue", 0);
    QVERIFY(transformAnniversary->supportsSubType(QContactAnniversary::FieldSubType));
    QVERIFY( !(transformAnniversary->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    validateSupportedSortingFieldTypes(*transformAnniversary,"WrongValue",uidsToVerify);

    validateContextsL(transformAnniversary);

    QContactAnniversary anniversary;
    anniversary.setOriginalDate(dateDetail);
    anniversary.setEvent(eventDetail);
    QList<CContactItemField *> fields = transformAnniversary->transformDetailL(anniversary);
    QVERIFY(fields.count() == 1);
    QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
    QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldAnniversary));
    QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldAnniversary);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformAnniversary->transformItemField(*newField, contact);
    const QContactAnniversary* anniversaryInfo(static_cast<const QContactAnniversary*>(contactDetail));
    QCOMPARE(anniversaryInfo->event(), eventDetail);
    if (dateDetail.isValid()) {
        QCOMPARE(anniversaryInfo->originalDate(), dateDetail);
    }

    delete contactDetail;
    delete newField;
    delete transformAnniversary;
}

void TestCntTransformContactData::validateCntTransformGeolocationL(TPtrC16 field, double latitudeDetail, double longitudeDetail)
{
    CntTransformContactData* transformGeolocation = new CntTransformGeolocation();
    QVERIFY(transformGeolocation != 0);
    QVERIFY(transformGeolocation->supportsField(KUidContactFieldGEO.iUid));
    QVERIFY(!(transformGeolocation->supportsField(0))); //Test for Wrong value
    QVERIFY(transformGeolocation->supportsDetail(QContactGeoLocation::DefinitionName));
    QVERIFY(!(transformGeolocation->supportsDetail("WrongValue")));

    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldLabel,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldLatitude,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldLongitude,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldAccuracy,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldAltitude,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldAltitudeAccuracy,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldHeading,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldSpeed,0);
    validateGetIdForField(*transformGeolocation, QContactGeoLocation::FieldTimestamp,0);
    validateGetIdForField(*transformGeolocation, "WrongValue", 0);
    QVERIFY( !(transformGeolocation->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    validateSupportedSortingFieldTypes(*transformGeolocation,"WrongValue",uidsToVerify);


    validateContextsL(transformGeolocation);

    QContactGeoLocation geolocation;
    geolocation.setLatitude(latitudeDetail);
    geolocation.setLongitude(longitudeDetail);
    QList<CContactItemField *> fields = transformGeolocation->transformDetailL(geolocation);
    if (latitudeDetail >= 0.0 || longitudeDetail >= 0.0) {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldGEO));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }
    else {
        QVERIFY(fields.count() == 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldGEO);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformGeolocation->transformItemField(*newField, contact);
    const QContactGeoLocation* geolocationInfo(static_cast<const QContactGeoLocation*>(contactDetail));
    if (latitudeDetail >= 0.0 ) {
        QCOMPARE(geolocationInfo->latitude(), latitudeDetail);
    }
    else {
        QCOMPARE(geolocationInfo->latitude(), -1.0);
    }

    if (longitudeDetail > 0.0) {
        QCOMPARE(geolocationInfo->longitude(), longitudeDetail);
    }
    else {
        QCOMPARE(geolocationInfo->longitude(), -1.0);
    }

    delete contactDetail;
    delete newField;
    delete transformGeolocation;
}

void TestCntTransformContactData::validateCntTransformNoteL(TPtrC16 field, QString detail)
{
    CntTransformContactData* transformNote = new CntTransformNote();
    QVERIFY(transformNote != 0);
    QVERIFY(transformNote->supportsField(KUidContactFieldNote.iUid));
    QVERIFY(!(transformNote->supportsField(0))); //Test for Wrong value
    QVERIFY(transformNote->supportsDetail(QContactNote::DefinitionName));
    QVERIFY(!(transformNote->supportsDetail("WrongValue")));

    validateGetIdForField(*transformNote, QContactNote::FieldNote,KUidContactFieldNote.iUid);
    validateGetIdForField(*transformNote, "WrongValue", 0);
    QVERIFY( !(transformNote->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    uidsToVerify << KUidContactFieldNote;
    validateSupportedSortingFieldTypes(*transformNote,QContactNote::FieldNote,uidsToVerify);
    uidsToVerify.clear();
    validateSupportedSortingFieldTypes(*transformNote,"WrongValue",uidsToVerify);


    validateContextsL(transformNote);

    QContactNote note;
    note.setNote(detail);
    QList<CContactItemField *> fields = transformNote->transformDetailL(note);
    if(detail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 1);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldNote));
        QVERIFY(fields.at(0)->ContentType().Mapping() == KUidContactFieldVCardMapNOTE);
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(field), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldNote);
    newField->TextStorage()->SetTextL(field);
    QContact contact;
    QContactDetail* contactDetail = transformNote->transformItemField(*newField, contact);
    const QContactNote* noteInfo(static_cast<const QContactNote*>(contactDetail));
    QCOMPARE(noteInfo->note(), detail);

    delete contactDetail;
    delete newField;
    delete transformNote;
}

void TestCntTransformContactData::validateCntTransformFamilyL(TPtrC16 spouseField, QString spouseDetail,
                             TPtrC16 childField, QString childDetail)
{
    CntTransformContactData* transformFamily = new CntTransformFamily();
    QVERIFY(transformFamily != 0);
    QVERIFY(transformFamily->supportsField(KUidContactFieldSpouse.iUid));
    QVERIFY(transformFamily->supportsField(KUidContactFieldChildren.iUid));
    QVERIFY(!(transformFamily->supportsField(0))); //Test for Wrong value
    QVERIFY(transformFamily->supportsDetail(QContactFamily::DefinitionName));
    QVERIFY(!(transformFamily->supportsDetail("WrongValue")));

    validateGetIdForField(*transformFamily, QContactFamily::FieldSpouse,KUidContactFieldSpouse.iUid);
    validateGetIdForField(*transformFamily, QContactFamily::FieldChildren,KUidContactFieldChildren.iUid);
    validateGetIdForField(*transformFamily, "WrongValue", 0);
    QVERIFY( !(transformFamily->supportsSubType("WrongValue")));

    //Test supportedSortingFieldTypes
    QList<TUid> uidsToVerify;
    validateSupportedSortingFieldTypes(*transformFamily,"WrongValue",uidsToVerify);

    validateContextsL(transformFamily);

    QContactFamily family;
    family.setSpouse(spouseDetail);
    family.setChildren(QStringList(childDetail));
    QList<CContactItemField *> fields = transformFamily->transformDetailL(family);
    if(spouseDetail.isEmpty()) {
        QVERIFY(fields.count() == 0);
    } else {
        QVERIFY(fields.count() == 2);
        QVERIFY(fields.at(0)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(0)->ContentType().ContainsFieldType(KUidContactFieldSpouse));
        QCOMPARE(fields.at(0)->TextStorage()->Text().CompareF(spouseField), 0);
        QVERIFY(fields.at(1)->StorageType() == KStorageTypeText);
        QVERIFY(fields.at(1)->ContentType().ContainsFieldType(KUidContactFieldChildren));
        QCOMPARE(fields.at(1)->TextStorage()->Text().CompareF(childField), 0);
    }

    CContactItemField* newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldSpouse);
    newField->TextStorage()->SetTextL(spouseField);
    QContact contact;
    QContactDetail* contactDetail = transformFamily->transformItemField(*newField, contact);
    const QContactFamily* familyInfo1(static_cast<const QContactFamily*>(contactDetail));
    QCOMPARE(familyInfo1->spouse(), spouseDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldChildren);
    newField->TextStorage()->SetTextL(childField);
    contactDetail = transformFamily->transformItemField(*newField, contact);
    contact.saveDetail(contactDetail);
    const QContactFamily* familyInfo2(static_cast<const QContactFamily*>(contactDetail));
    QCOMPARE(familyInfo2->children().count(), 1);
    QCOMPARE(familyInfo2->children().at(0), childDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    newField = CContactItemField::NewL(KStorageTypeText, KUidContactFieldChildren);
    newField->TextStorage()->SetTextL(childField);
    contactDetail = transformFamily->transformItemField(*newField, contact);
    const QContactFamily* familyInfo3(static_cast<const QContactFamily*>(contactDetail));
    QCOMPARE(familyInfo3->children().count(), 2);
    QCOMPARE(familyInfo3->children().at(1), childDetail);
    delete contactDetail;
    contactDetail = 0;
    delete newField;
    newField = 0;

    delete transformFamily;
}

void TestCntTransformContactData::validateContextsL(CntTransformContactData* transformContactData) const
{
    QContactDetail detail1;
    transformContactData->setContexts(KUidContactFieldVCardMapHOME, detail1);
    QVERIFY(detail1.contexts().count() == 1);
    QVERIFY(detail1.contexts().at(0) == QContactDetail::ContextHome);

    CContactItemField* itemField = CContactItemField::NewL(KStorageTypeText);
    transformContactData->setContextsL(detail1, *itemField);
    QVERIFY(itemField->ContentType().ContainsFieldType(KUidContactFieldVCardMapHOME));
    delete itemField;
    itemField = 0;

    QContactDetail detail2;
    transformContactData->setContexts(KUidContactFieldVCardMapWORK, detail2);
    QVERIFY(detail2.contexts().count() == 1);
    QVERIFY(detail2.contexts().at(0) == QContactDetail::ContextWork);

    itemField = CContactItemField::NewL(KStorageTypeText);
    transformContactData->setContextsL(detail2, *itemField);
    QVERIFY(itemField->ContentType().ContainsFieldType(KUidContactFieldVCardMapWORK));
    delete itemField;
    itemField = 0;
}

/*!
 * Validates the getIdForField function
 *
 * \a transformContactData the tranformcontact instance
 * \a filedname - The filedname which has to be checked
 * \a idValue - the correct id value against which the comparison is done
 * \a isSame -  If this value is true then '==' comparison is done else '!=' comparison is done
 */
void TestCntTransformContactData::validateGetIdForField(
                    const CntTransformContactData& transformContactData,
                    const QString& filedname,
                    const quint32  idValue )const
{
    //Ravikiran
    quint32 idForField =  transformContactData.getIdForField(filedname);
    QVERIFY(idValue == idForField );
}
void TestCntTransformContactData::validateSupportedSortingFieldTypes(
        const CntTransformContactData& transformContactData,
        const QString& filedname,
        const QList<TUid>&  checkSortFieldList )const
{
    QList<TUid> sortFieldList = transformContactData.supportedSortingFieldTypes(filedname);

    QVERIFY(sortFieldList.count() == checkSortFieldList.count() );
    if(sortFieldList.count() == checkSortFieldList.count()){

    for(int i = 0; i<sortFieldList.count() ; i++ )
        {
        QVERIFY(sortFieldList.at(i) == checkSortFieldList.at(i));
        }

    }


}

