qtmobility/plugins/contacts/symbian/tsrc/tst_qcontactmanagersymbian/tst_qcontactmanagersymbian.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
equal deleted inserted replaced
1:2b40d63a9c3d 4:90517678cc4f
    45 #include <qtcontacts.h>
    45 #include <qtcontacts.h>
    46 #include <cntdb.h>
    46 #include <cntdb.h>
    47 #include <cntitem.h>
    47 #include <cntitem.h>
    48 
    48 
    49 QTM_USE_NAMESPACE
    49 QTM_USE_NAMESPACE
       
    50 
       
    51 #ifndef QTRY_COMPARE
       
    52 #define QTRY_COMPARE(__expr, __expected) \
       
    53     do { \
       
    54         const int __step = 50; \
       
    55         const int __timeout = 5000; \
       
    56         QTest::qWait(__step); \
       
    57         for (int __i = 0; __i < __timeout && ((__expr) != (__expected)); __i+=__step) { \
       
    58             QTest::qWait(__step); \
       
    59         } \
       
    60         QCOMPARE(__expr, __expected); \
       
    61     } while(0)
       
    62 #endif
       
    63 
       
    64 // A macro to help verifications done in signalEmission test case
       
    65 #define QTRY_COMPARE_SIGNAL_COUNTS() \
       
    66     QTRY_COMPARE(spyContactsAdded.count(), contactsAdded); \
       
    67     QTRY_COMPARE(spyContactsChanged.count(), contactsChanged); \
       
    68     QTRY_COMPARE(spyContactsRemoved.count(), contactsRemoved); \
       
    69     QTRY_COMPARE(spyRelationshipsAdded.count(), relationshipsAdded); \
       
    70     QTRY_COMPARE(spyRelationshipsRemoved.count(), relationshipsRemoved); \
       
    71     QTRY_COMPARE(spyContactsAdded2.count(), contactsAdded); \
       
    72     QTRY_COMPARE(spyContactsChanged2.count(), contactsChanged); \
       
    73     QTRY_COMPARE(spyContactsRemoved2.count(), contactsRemoved); \
       
    74     QTRY_COMPARE(spyRelationshipsAdded2.count(), relationshipsAdded); \
       
    75     QTRY_COMPARE(spyRelationshipsRemoved2.count(), relationshipsRemoved);
    50 
    76 
    51 //TESTED_CLASS=
    77 //TESTED_CLASS=
    52 //TESTED_FILES=
    78 //TESTED_FILES=
    53 
    79 
    54 /*!
    80 /*!
    66 public:
    92 public:
    67     tst_QContactManagerSymbian();
    93     tst_QContactManagerSymbian();
    68     virtual ~tst_QContactManagerSymbian();
    94     virtual ~tst_QContactManagerSymbian();
    69 
    95 
    70 public slots:
    96 public slots:
    71     //void initTestCase();
       
    72     //void cleanupTestCase();
       
    73     void init();
    97     void init();
    74     void cleanup();
    98     void cleanup();
    75 
    99 
    76 private slots:
   100 private slots:
    77     void avatarSubTypes();
   101     void signalEmission();
    78     void avatarSubTypes_data();
   102     void filtering();
    79     void avatarPixmap();
   103     void avatarImage();
    80     void avatarPixmap_data();
   104     void avatarImage_data();
    81     void avatarPathAndPixmap();
   105     void thumbnail_data();
       
   106     void thumbnail();
       
   107     void ringTone();
    82     void displayLabel_data();
   108     void displayLabel_data();
    83     void displayLabel();
   109     void displayLabel();
    84     void invalidContactItems();
   110     void invalidContactItems();
    85 
   111 
    86 private:
   112 private:
       
   113     QContact createContact(QString type, QString firstName, QString lastName);
    87     void addContactItemWithInvalidFieldsL(TContactItemId& itemId);
   114     void addContactItemWithInvalidFieldsL(TContactItemId& itemId);
    88 
   115 
    89     CContactDatabase* m_contactDatabase;
   116     CContactDatabase* m_contactDatabase;
    90     QContactManager* m_cm;
   117     QContactManager* m_cm;
    91     QContactId m_contactId;
   118     QContactId m_contactId;
   109     QContact contact;
   136     QContact contact;
   110     QContactName name;
   137     QContactName name;
   111     name.setFirstName("James");
   138     name.setFirstName("James");
   112     name.setLastName("Hunt");
   139     name.setLastName("Hunt");
   113     contact.saveDetail(&name);
   140     contact.saveDetail(&name);
       
   141     QContactPhoneNumber number;
       
   142     number.setNumber("+44752222222");
       
   143     contact.saveDetail(&number);
   114     QVERIFY(m_cm->saveContact(&contact));
   144     QVERIFY(m_cm->saveContact(&contact));
   115     m_contactId = contact.id();
   145     m_contactId = contact.id();
   116 }
   146 }
   117 
   147 
   118 void tst_QContactManagerSymbian::cleanup()
   148 void tst_QContactManagerSymbian::cleanup()
   119 {
   149 {
   120     // Commented out => leave generated contacts into database
   150     // If the following is commented out => the generated contacts are left into
       
   151     // the database
   121     QVERIFY(m_cm->removeContact(m_contactId.localId()));
   152     QVERIFY(m_cm->removeContact(m_contactId.localId()));
   122 }
   153 }
   123 
   154 
   124 void tst_QContactManagerSymbian::avatarSubTypes_data()
   155 void tst_QContactManagerSymbian::signalEmission()
   125 {
   156 {
   126     QTest::addColumn<QString>("fileName");
   157     QScopedPointer<QContactManager> cm2(QContactManager::fromUri("qtcontacts:symbian"));
   127     QTest::addColumn<QString>("subType");
   158 
   128 
   159     // Wait a moment to make sure there are no pending database observer events
   129     QString emptyString;
   160     QTest::qWait(500);
   130 
   161 
   131     // TODO: file names
   162     // counters to keep track of the expected signal counts
   132     QTest::newRow("Sub type image") << "C:\\Data\\Images\\avatar_sharks_s.jpg" << "Image";
   163     int contactsAdded(0);
   133     //QTest::newRow("Sub type video") << "C:\\Data\\Videos\\video.mpg" << "Video";
   164     int contactsChanged(0);
   134     //QTest::newRow("Sub type textured mesh") << "C:\\Data\\" << "TexturedMesh";
   165     int contactsRemoved(0);
   135     QTest::newRow("Sub type audio ringtone") << "C:\\Data\\Sounds\\avatar_sound.aac" << "AudioRingtone";
   166     int relationshipsAdded(0);
   136     QTest::newRow("Sub type video ringtone") << "C:\\Data\\Videos\\avatar_video.3gp" << "VideoRingtone"; // TODO
   167     int relationshipsRemoved(0);
   137     QTest::newRow("No sub type") << "C:\\Data\\Images\\avatar_sharks_s.jpg" << emptyString;
   168     
   138 }
   169     // Signal spys for verifying signal emissions
   139 
   170     qRegisterMetaType<QContactLocalId>("QContactLocalId");
   140 void tst_QContactManagerSymbian::avatarSubTypes()
   171     qRegisterMetaType<QList<QContactLocalId> >("QList<QContactLocalId>");
   141 {
   172     QSignalSpy spyContactsAdded(m_cm, SIGNAL(contactsAdded(QList<QContactLocalId>)));
   142     QFETCH(QString, fileName);
   173     QSignalSpy spyContactsChanged(m_cm, SIGNAL(contactsChanged(QList<QContactLocalId>)));
   143     QFETCH(QString, subType);
   174     QSignalSpy spyContactsRemoved(m_cm, SIGNAL(contactsRemoved(QList<QContactLocalId>)));
   144     QContact testContact = m_cm->contact(m_contactId.localId());
   175     QSignalSpy spyRelationshipsAdded(m_cm, SIGNAL(relationshipsAdded(QList<QContactLocalId>)));
   145 
   176     QSignalSpy spyRelationshipsRemoved(m_cm, SIGNAL(relationshipsRemoved(QList<QContactLocalId>)));
   146     // Add avatar with sub type
   177     QSignalSpy spyContactsAdded2(cm2.data(), SIGNAL(contactsAdded(QList<QContactLocalId>)));
   147     QContactAvatar avatar;
   178     QSignalSpy spyContactsChanged2(cm2.data(), SIGNAL(contactsChanged(QList<QContactLocalId>)));
   148     avatar.setAvatar(fileName);
   179     QSignalSpy spyContactsRemoved2(cm2.data(), SIGNAL(contactsRemoved(QList<QContactLocalId>)));
   149 
   180     QSignalSpy spyRelationshipsAdded2(cm2.data(), SIGNAL(relationshipsAdded(QList<QContactLocalId>)));
   150     if(!subType.isEmpty()) {
   181     QSignalSpy spyRelationshipsRemoved2(cm2.data(), SIGNAL(relationshipsRemoved(QList<QContactLocalId>)));
   151         avatar.setSubType(subType);
   182 
   152     }
   183     // create a group
   153     QVERIFY(testContact.saveDetail(&avatar));
   184     QContact group = createContact(QContactType::TypeGroup, "Hesketh", "");
   154     QVERIFY(m_cm->saveContact(&testContact));
   185     QVERIFY(m_cm->saveContact(&group));
   155 
   186     contactsAdded++;
   156     // Get avatar
   187     QTRY_COMPARE_SIGNAL_COUNTS();
   157     testContact = m_cm->contact(m_contactId.localId());
   188 
   158     QCOMPARE(testContact.details(QContactAvatar::DefinitionName).count(), 1);
   189     // change the group
   159     QContactAvatar retrievedAvatar = testContact.detail(QContactAvatar::DefinitionName);
   190     QContactName name = group.detail(QContactName::DefinitionName);
   160     QVERIFY(!retrievedAvatar.isEmpty());
   191     name.setCustomLabel("McLaren");
   161     QCOMPARE(retrievedAvatar.avatar(), fileName);
   192     group.saveDetail(&name);
   162     if(subType.isEmpty()) {
   193     QVERIFY(m_cm->saveContact(&group));
   163         // Known issue: If the sub type of a QContactAvatar is left empty, sub type
   194     contactsChanged++;
   164         // image is used by default. A side effect is that after loading this kind
   195     QTRY_COMPARE_SIGNAL_COUNTS();
   165         // of an avatar, the sub type has been set to sub type image.
   196 
   166         // -> clear sub type to make the following compare pass
   197     // remove the group
   167         QVERIFY(retrievedAvatar.removeValue(QContactAvatar::FieldSubType));
   198     QVERIFY(m_cm->removeContact(group.localId()));
   168     }
   199     contactsRemoved++;
   169     QCOMPARE(retrievedAvatar, avatar);
   200     QTRY_COMPARE_SIGNAL_COUNTS();
   170 
   201 
   171     // Remove avatar
   202     // Add two contacts
   172     retrievedAvatar = testContact.detail(QContactAvatar::DefinitionName);
   203     QContact contact1 = createContact(QContactType::TypeContact, "James", "Hunt");
   173     QVERIFY(testContact.removeDetail(&retrievedAvatar));
   204     QVERIFY(m_cm->saveContact(&contact1));
   174     QVERIFY(m_cm->saveContact(&testContact));
   205     contactsAdded++;
   175     QCOMPARE(testContact.details(QContactAvatar::DefinitionName).count(), 0);
   206     QTRY_COMPARE_SIGNAL_COUNTS();
   176 }
   207     QContact contact2 = createContact(QContactType::TypeContact, "Jochen", "Mass");
   177 
   208     QVERIFY(m_cm->saveContact(&contact2));
   178 void tst_QContactManagerSymbian::avatarPixmap_data()
   209     contactsAdded++;
       
   210     QTRY_COMPARE_SIGNAL_COUNTS();
       
   211 
       
   212     // Add group 2
       
   213     QContact group2 = createContact(QContactType::TypeGroup, "McLaren", "");
       
   214     QVERIFY(m_cm->saveContact(&group2));
       
   215     contactsAdded++;
       
   216     QTRY_COMPARE_SIGNAL_COUNTS();
       
   217 
       
   218     // Add a relationship
       
   219     QContactRelationship r;
       
   220     r.setFirst(group2.id());
       
   221     r.setSecond(contact1.id());
       
   222     r.setRelationshipType(QContactRelationship::HasMember);
       
   223     QVERIFY(m_cm->saveRelationship(&r));
       
   224     relationshipsAdded++;
       
   225     QTRY_COMPARE_SIGNAL_COUNTS();
       
   226 
       
   227     // Create one more contact manager instance
       
   228     QScopedPointer<QContactManager> cm3(QContactManager::fromUri("qtcontacts:symbian"));
       
   229     QSignalSpy spyRelationshipsAdded3(cm3.data(), SIGNAL(relationshipsAdded(QList<QContactLocalId>)));
       
   230     QSignalSpy spyRelationshipsRemoved3(cm3.data(), SIGNAL(relationshipsRemoved(QList<QContactLocalId>)));
       
   231 
       
   232     // Add a relationship
       
   233     QContactRelationship r2;
       
   234     r2.setFirst(group2.id());
       
   235     r2.setSecond(contact2.id());
       
   236     r2.setRelationshipType(QContactRelationship::HasMember);
       
   237     QVERIFY(m_cm->saveRelationship(&r2));
       
   238     relationshipsAdded++;
       
   239     QTRY_COMPARE_SIGNAL_COUNTS();
       
   240 
       
   241     // Remove relationship 1
       
   242     QVERIFY(m_cm->removeRelationship(r));
       
   243     relationshipsRemoved++;
       
   244     QTRY_COMPARE_SIGNAL_COUNTS();
       
   245     QTRY_COMPARE(spyRelationshipsAdded3.count(), 1);
       
   246     QTRY_COMPARE(spyRelationshipsRemoved3.count(), 1);
       
   247 
       
   248     // Remove relationship 2
       
   249     QVERIFY(m_cm->removeRelationship(r2));
       
   250     relationshipsRemoved++;
       
   251     QTRY_COMPARE_SIGNAL_COUNTS();
       
   252     QTRY_COMPARE(spyRelationshipsAdded3.count(), 1);
       
   253     QTRY_COMPARE(spyRelationshipsRemoved3.count(), 2);
       
   254 
       
   255     // Remove contacts
       
   256     QVERIFY(m_cm->removeContact(contact1.localId()));
       
   257     contactsRemoved++;
       
   258     QTRY_COMPARE_SIGNAL_COUNTS();
       
   259     QVERIFY(m_cm->removeContact(contact2.localId()));
       
   260     contactsRemoved++;
       
   261     QTRY_COMPARE_SIGNAL_COUNTS();
       
   262     QVERIFY(m_cm->removeContact(group2.localId()));
       
   263     contactsRemoved++;
       
   264     QTRY_COMPARE_SIGNAL_COUNTS();
       
   265 }
       
   266 
       
   267 /*
       
   268  * Special filtering cases that cannot be covered in QtMobility system level
       
   269  * test cases.
       
   270  */
       
   271 void tst_QContactManagerSymbian::filtering()
       
   272 {
       
   273     QContactDetailFilter df;
       
   274     df.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber);
       
   275     df.setValue("222");
       
   276 
       
   277     // Ends with
       
   278     df.setMatchFlags(QContactFilter::MatchEndsWith);
       
   279 
       
   280     QList<QContactLocalId> ids = m_cm->contactIds(df);
       
   281     QCOMPARE(m_cm->error(), QContactManager::NoError);
       
   282     QCOMPARE(ids.count(), 1);
       
   283 
       
   284     df.setValue("333");
       
   285     ids = m_cm->contactIds(df);
       
   286     QCOMPARE(m_cm->error(), QContactManager::NoError);
       
   287     QCOMPARE(ids.count(), 0);
       
   288 
       
   289     df.setValue("222222");
       
   290     ids = m_cm->contactIds(df);
       
   291     QCOMPARE(m_cm->error(), QContactManager::NoError);
       
   292     QCOMPARE(ids.count(), 1);
       
   293 
       
   294     df.setValue("2222222");
       
   295     ids = m_cm->contactIds(df);
       
   296     QCOMPARE(m_cm->error(), QContactManager::NoError);
       
   297     QCOMPARE(ids.count(), 1);
       
   298 
       
   299     // Match phone number
       
   300     df.setMatchFlags(QContactFilter::MatchPhoneNumber);
       
   301 
       
   302     df.setValue("2222222");
       
   303     ids = m_cm->contactIds(df);
       
   304     QCOMPARE(m_cm->error(), QContactManager::NoError);
       
   305     QCOMPARE(ids.count(), 1);
       
   306 
       
   307     df.setValue("2222");
       
   308     ids = m_cm->contactIds(df);
       
   309     // Should fail with not supported error because symbian's phone number
       
   310     // match algorithm cannot be applied with less than 7 digit search strings
       
   311     QCOMPARE(m_cm->error(), QContactManager::NotSupportedError);
       
   312     QCOMPARE(ids.count(), 0);
       
   313 
       
   314     df.setValue("3333");
       
   315     ids = m_cm->contactIds(df);
       
   316     // Should fail with not supported error because symbian's phone number
       
   317     // match algorithm cannot be applied with less than 7 digit search strings
       
   318     QCOMPARE(m_cm->error(), QContactManager::NotSupportedError);
       
   319     QCOMPARE(ids.count(), 0);
       
   320 }
       
   321 
       
   322 void tst_QContactManagerSymbian::avatarImage_data()
   179 {
   323 {
   180     QTest::addColumn<QString>("fileName");
   324     QTest::addColumn<QString>("fileName");
   181 
   325 
   182     QTest::newRow("ExtraSmall JPEG") << "C:\\Data\\Images\\avatar_sharks_xs.jpg";
   326     QTest::newRow("ExtraSmall JPEG") << "C:\\Data\\Images\\avatar_sharks_xs.jpg";
   183     QTest::newRow("Small JPEG") << "C:\\Data\\Images\\avatar_sharks_s.jpg";
   327     QTest::newRow("Small JPEG") << "C:\\Data\\Images\\avatar_sharks_s.jpg";
   184     QTest::newRow("Medium JPEG") << "C:\\Data\\Images\\avatar_sharks_m.jpg";
   328     QTest::newRow("Medium JPEG") << "C:\\Data\\Images\\avatar_sharks_m.jpg";
   185     QTest::newRow("XXLarge JPEG") << "C:\\Data\\Images\\avatar_sharks_xxl.jpg";
   329     QTest::newRow("XXLarge JPEG") << "C:\\Data\\Images\\avatar_sharks_xxl.jpg";
   186 }
   330 }
   187 
   331 
   188 void tst_QContactManagerSymbian::avatarPixmap()
   332 /*
       
   333  * Special avatar cases that cannot be covered in QtMobility system level
       
   334  * test cases.
       
   335  */
       
   336 void tst_QContactManagerSymbian::avatarImage()
   189 {
   337 {
   190     QFETCH(QString, fileName);
   338     QFETCH(QString, fileName);
   191 
   339 
   192     QContact testContact = m_cm->contact(m_contactId.localId());
   340     QContact testContact = m_cm->contact(m_contactId.localId());
   193 
   341 
   194     // Set pixmap
   342     // Verify the image exists
       
   343     QImage image(fileName);
       
   344     QVERIFY(!image.isNull());
       
   345     
       
   346     // Set image
   195     QContactAvatar avatar;
   347     QContactAvatar avatar;
   196     QPixmap pixmap(fileName);
   348     QUrl url(fileName);
   197     QVERIFY(!pixmap.isNull());
   349     QVERIFY(url.isValid());
   198     QVERIFY(avatar.setPixmap(pixmap)); 
   350     avatar.setImageUrl(url);
   199     QVERIFY(testContact.saveDetail(&avatar));
   351     QVERIFY(testContact.saveDetail(&avatar));
   200     QVERIFY(m_cm->saveContact(&testContact));
   352     QVERIFY(m_cm->saveContact(&testContact));
   201 
   353 
   202     // Get pixmap
   354     // Get image
   203     testContact = m_cm->contact(m_contactId.localId());
   355     testContact = m_cm->contact(m_contactId.localId());
   204     avatar = testContact.detail(QContactAvatar::DefinitionName);
   356     avatar = testContact.detail(QContactAvatar::DefinitionName);
   205     QVERIFY(!avatar.isEmpty());
   357     QVERIFY(!avatar.isEmpty());
   206     pixmap = avatar.pixmap();
   358     url = avatar.imageUrl();
   207     QVERIFY(!pixmap.isNull());
   359     QVERIFY(url.isValid());
   208 }
   360     image = QImage(url.toString());
   209 
   361     QVERIFY(!image.isNull());
   210 void tst_QContactManagerSymbian::avatarPathAndPixmap()
   362 }
   211 {
   363 
   212     QString fileName("C:\\Data\\Images\\avatar_sharks_s.jpg");
   364 void tst_QContactManagerSymbian::thumbnail_data()
       
   365 {
       
   366     QTest::addColumn<QString>("fileName");
       
   367 
       
   368     QTest::newRow("ExtraSmall JPEG") << "C:\\Data\\Images\\avatar_sharks_xs.jpg";
       
   369     QTest::newRow("Small JPEG") << "C:\\Data\\Images\\avatar_sharks_s.jpg";
       
   370     QTest::newRow("Medium JPEG") << "C:\\Data\\Images\\avatar_sharks_m.jpg";
       
   371     QTest::newRow("XXLarge JPEG") << "C:\\Data\\Images\\avatar_sharks_xxl.jpg";
       
   372 }
       
   373 
       
   374 /*
       
   375  * Special thumbnail cases that cannot be covered in QtMobility system level
       
   376  * test cases.
       
   377  */
       
   378 void tst_QContactManagerSymbian::thumbnail()
       
   379 {
       
   380     QFETCH(QString, fileName);
       
   381 
   213     QContact testContact = m_cm->contact(m_contactId.localId());
   382     QContact testContact = m_cm->contact(m_contactId.localId());
   214 
   383 
   215     // Set
   384     // Set
   216     QContactAvatar avatar;
   385     QContactThumbnail thumb = testContact.detail(QContactThumbnail::DefinitionName);
   217     avatar.setAvatar(fileName);
   386     QImage image(fileName);
   218     QVERIFY(avatar.setPixmap(QPixmap(fileName))); 
   387     QVERIFY(!image.isNull());
   219     QVERIFY(testContact.saveDetail(&avatar));
   388     thumb.setThumbnail(image);
       
   389     QVERIFY(testContact.saveDetail(&thumb));
   220     QVERIFY(m_cm->saveContact(&testContact));
   390     QVERIFY(m_cm->saveContact(&testContact));
   221 
   391 
   222     // Get pixmap
   392     // Get pixmap
   223     testContact = m_cm->contact(m_contactId.localId());
   393     testContact = m_cm->contact(m_contactId.localId());
   224     avatar = testContact.detail(QContactAvatar::DefinitionName);
   394     thumb = testContact.detail(QContactThumbnail::DefinitionName);
   225     QVERIFY(!avatar.isEmpty());
   395     QVERIFY(!thumb.isEmpty());
   226     QCOMPARE(avatar.avatar(), fileName);
   396     QVERIFY(!thumb.thumbnail().isNull());
   227     QPixmap pixmap = avatar.pixmap();
   397 }
   228     QVERIFY(!pixmap.isNull());
   398 
       
   399 /*
       
   400  * Special ringing tone cases that cannot be covered in QtMobility system level
       
   401  * test cases.
       
   402  */
       
   403 void tst_QContactManagerSymbian::ringTone()
       
   404 {
       
   405     QContact testContact = m_cm->contact(m_contactId.localId());
       
   406 
       
   407     // these files are not actually included to the test data
       
   408     QString audio("C:\\Data\\Sounds\\tone.wav");
       
   409     QString video("C:\\Data\\Videos\\video.3gp");
       
   410     
       
   411     // Set audio ringtone
       
   412     QContactRingtone tone = testContact.detail(QContactRingtone::DefinitionName);
       
   413     QUrl audioRingtone(audio);
       
   414     tone.setAudioRingtoneUrl(audioRingtone);
       
   415     QVERIFY(testContact.saveDetail(&tone));
       
   416     QVERIFY(m_cm->saveContact(&testContact));
       
   417 
       
   418     // Get and verify ringtone
       
   419     testContact = m_cm->contact(m_contactId.localId());
       
   420     tone = testContact.detail(QContactRingtone::DefinitionName);
       
   421     QVERIFY(!tone.isEmpty());
       
   422     QCOMPARE(tone.audioRingtoneUrl(), audioRingtone);
       
   423     QCOMPARE(tone.videoRingtoneUrl(), QUrl());
       
   424     QCOMPARE(tone.vibrationRingtoneUrl(), QUrl());
       
   425 
       
   426     // Set video ringtone
       
   427     QUrl videoRingtone(video);
       
   428     tone.setVideoRingtoneUrl(videoRingtone);
       
   429     QVERIFY(testContact.saveDetail(&tone));
       
   430     QVERIFY(m_cm->saveContact(&testContact));
       
   431 
       
   432     // Get and verify ringtone
       
   433     testContact = m_cm->contact(m_contactId.localId());
       
   434     tone = testContact.detail(QContactRingtone::DefinitionName);
       
   435     QVERIFY(!tone.isEmpty());
       
   436     QCOMPARE(tone.audioRingtoneUrl(), audioRingtone);
       
   437     QCOMPARE(tone.videoRingtoneUrl(), videoRingtone);
       
   438     QCOMPARE(tone.vibrationRingtoneUrl(), QUrl());
   229 }
   439 }
   230 
   440 
   231 void tst_QContactManagerSymbian::displayLabel_data()
   441 void tst_QContactManagerSymbian::displayLabel_data()
   232 {
   442 {
       
   443     // Expected display label
       
   444     QTest::addColumn<QString>("displayLabel");
   233     // A string list containing the detail fields in format <detail definition name>:<field name>:<value>
   445     // A string list containing the detail fields in format <detail definition name>:<field name>:<value>
   234     // For example first name: Name:First:James
   446     // For example first name: Name:First:James
   235     QTest::addColumn<QString>("displayLabel");
       
   236     // Note: With the current implementation the value must not contain a ':' character
   447     // Note: With the current implementation the value must not contain a ':' character
   237     QTest::addColumn<QStringList>("details");
   448     QTest::addColumn<QStringList>("details");
   238 
   449 
   239     QTest::newRow("first name")
   450     QTest::newRow("first name")
   240         << "James"
   451         << "James"
   290         << "McLaren"
   501         << "McLaren"
   291         << (QStringList()
   502         << (QStringList()
   292             << "Organization:Name:McLaren");
   503             << "Organization:Name:McLaren");
   293 }
   504 }
   294 
   505 
       
   506 /*
       
   507  * Special display label test cases for testing symbian backend specific
       
   508  * display label generation.
       
   509  */
   295 void tst_QContactManagerSymbian::displayLabel()
   510 void tst_QContactManagerSymbian::displayLabel()
   296 {
   511 {
   297     qDebug() << QTest::currentDataTag();
   512     qDebug() << QTest::currentDataTag();
   298     QFETCH(QString, displayLabel);
   513     QFETCH(QString, displayLabel);
   299     QFETCH(QStringList, details);
   514     QFETCH(QStringList, details);
   300 
   515 
   301     // Parse details and add them to the contact
   516     // Parse details and add them to the contact
   302     QContact contact;
   517     QContact contact;
   303     foreach(QString detail, details) {
   518     foreach(const QString& detail, details) {
   304         // the expected format is <detail definition name>:<field name>:<value>
   519         // the expected format is <detail definition name>:<field name>:<value>
   305         QStringList detailParts = detail.split(QChar(':'), QString::KeepEmptyParts, Qt::CaseSensitive);
   520         QStringList detailParts = detail.split(QChar(':'), QString::KeepEmptyParts, Qt::CaseSensitive);
   306         QVERIFY(detailParts.count() == 3);
   521         QVERIFY(detailParts.count() == 3);
   307         QContactDetail contactDetail(detailParts[0]);
   522         QContactDetail contactDetail(detailParts[0]);
   308         // use existing detail if available
   523         // use existing detail if available
   325 
   540 
   326     // Remove contact
   541     // Remove contact
   327     QVERIFY(m_cm->removeContact(contact.localId()));
   542     QVERIFY(m_cm->removeContact(contact.localId()));
   328 }
   543 }
   329 
   544 
       
   545 /*
       
   546  * Special contact handling test cases that cannot be covered in QtMobility
       
   547  * system level test cases.
       
   548  */
   330 void tst_QContactManagerSymbian::invalidContactItems()
   549 void tst_QContactManagerSymbian::invalidContactItems()
   331 {
   550 {
   332     // 1. Empty contact
   551     // 1. Empty contact
   333     QContact empty;
   552     QContact empty;
   334     QVERIFY(m_cm->saveContact(&empty));
   553     QVERIFY(m_cm->saveContact(&empty));
   335     empty = m_cm->contact(empty.localId(), QStringList());
   554     empty = m_cm->contact(empty.localId());
   336     QVERIFY(m_cm->error() == QContactManager::NoError);
   555     QVERIFY(m_cm->error() == QContactManager::NoError);
   337     QVERIFY(empty.id() != QContactId());
   556     QVERIFY(empty.id() != QContactId());
   338     QVERIFY(m_cm->removeContact(empty.localId()));
   557     QVERIFY(m_cm->removeContact(empty.localId()));
   339     
   558     
   340     // 2. CContactItem with invalid fields 
   559     // 2. CContactItem with invalid fields 
   346     // TODO: check that 3 fields are removed during save?
   565     // TODO: check that 3 fields are removed during save?
   347     QVERIFY(m_cm->saveContact(&invalidContact));
   566     QVERIFY(m_cm->saveContact(&invalidContact));
   348     QVERIFY(m_cm->removeContact(invalidContact.localId()));
   567     QVERIFY(m_cm->removeContact(invalidContact.localId()));
   349 }
   568 }
   350 
   569 
       
   570 QContact tst_QContactManagerSymbian::createContact(QString type, QString firstName, QString lastName)
       
   571 {
       
   572     QContact contact;
       
   573     contact.setType(type);
       
   574     QContactName name;
       
   575     if(type == QContactType::TypeContact) {
       
   576         name.setFirstName(firstName);
       
   577         name.setLastName(lastName);
       
   578     } else {
       
   579         name.setCustomLabel(firstName);
       
   580     }
       
   581     contact.saveDetail(&name);
       
   582     return contact;
       
   583 }
       
   584 
   351 void tst_QContactManagerSymbian::addContactItemWithInvalidFieldsL(TContactItemId& itemId)
   585 void tst_QContactManagerSymbian::addContactItemWithInvalidFieldsL(TContactItemId& itemId)
   352 {
   586 {
   353     // Create a contact with invalid item fields to the database
   587     // Create a contact with invalid item fields to the database
   354     CContactItem* contactItem = CContactCard::NewLC();
   588     CContactItem* contactItem = CContactCard::NewLC();
   355     // Note! No TFieldType defined!
   589     // Note! No TFieldType defined!