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" |