1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the test suite of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
42
#include <QtTest/QtTest>
43
#include <QContactDetail>
44
#include <qcontacts.h>
48
//TESTED_COMPONENT=src/contacts
50
QTCONTACTS_USE_NAMESPACE
51
class tst_QContactDetail : public QObject
57
virtual ~tst_QContactDetail();
64
void classHierarchy();
76
tst_QContactDetail::tst_QContactDetail()
80
tst_QContactDetail::~tst_QContactDetail()
84
void tst_QContactDetail::init()
88
void tst_QContactDetail::cleanup()
92
void tst_QContactDetail::classHierarchy()
97
QVERIFY(f1.isEmpty());
98
QVERIFY(f2.isEmpty());
100
QContactPhoneNumber p1;
101
p1.setNumber("123456");
102
QVERIFY(!p1.isEmpty());
103
QVERIFY(p1.type() == QContactPhoneNumber::Type);
106
m1.setFirstName("Bob");
107
QVERIFY(!m1.isEmpty());
108
QVERIFY(m1.type() == QContactName::Type);
113
f1 = p1; // f1 is a phonenumber
116
f1 = f1; // assign to itself
122
p1 = p1; // assign leaf class to itself
127
f2 = f1; // f2 = f1 = phonenumber
133
f1 = m1; // f1 = name, f2 = phonenumber
138
QContactPhoneNumber p2(f2); // p2 = f2 = phonenumber
141
QCOMPARE(p2.number(), p1.number());
142
QCOMPARE(p2.number(), QString("123456"));
144
p2 = p1; // phone number to phone number
147
QCOMPARE(p2.number(), p1.number());
148
QCOMPARE(p2.number(), QString("123456"));
150
p2.setNumber("5678"); // NOTE: implicitly shared, this has caused a detach so p1 != 2
154
QCOMPARE(p2.number(), QString("5678"));
155
QCOMPARE(p1.number(), QString("123456"));
158
p2 = m1; // assign a name to a phone number
160
QVERIFY(p2.type() == QContactPhoneNumber::Type); // should still be a phone number though
161
QVERIFY(p2.isEmpty());
167
/* another bad assignment */
168
m2 = p2; // phone number to a name
170
QVERIFY(m2.type() == QContactName::Type);
171
QVERIFY(m2.isEmpty());
173
/* Check contexts are considered for equality */
174
p2 = QContactPhoneNumber(); // new id / detach
175
p2.setNumber(p1.number());
176
p2.setContexts(QContactDetail::ContextHome);
178
p2.removeValue(QContactDetail::FieldContext); // note, context is a value.
179
QVERIFY(p1 == p2); // different ids but same values should be equal
181
/* Copy ctor from valid type */
182
QContactDetail f3(p2);
184
QVERIFY(f3.type() == QContactPhoneNumber::Type);
186
/* Copy ctor from invalid type */
187
QContactPhoneNumber p3(m1);
189
QVERIFY(p3.type() == QContactPhoneNumber::Type);
190
QVERIFY(p3.isEmpty());
192
/* Copy ctore from invalid type, through base type */
194
QContactPhoneNumber p4(f3);
196
QVERIFY(p4.type() == QContactPhoneNumber::Type);
197
QVERIFY(p4.isEmpty());
199
/* Try a reference */
200
p1.setNumber("123456");
201
QContactDetail& ref = p1;
202
QVERIFY(p1.number() == "123456");
203
QVERIFY(p1.value(QContactPhoneNumber::FieldNumber) == "123456");
204
QVERIFY(ref.value(QContactPhoneNumber::FieldNumber) == "123456");
208
/* Try changing the original */
209
p1.setNumber("56789");
210
QVERIFY(p1.number() == "56789");
211
QVERIFY(p1.value(QContactPhoneNumber::FieldNumber) == "56789");
212
QVERIFY(ref.value(QContactPhoneNumber::FieldNumber) == "56789");
216
/* Try changing the reference */
217
ref.setValue(QContactPhoneNumber::FieldNumber, "654321");
218
QVERIFY(p1.number() == "654321");
219
QVERIFY(p1.value(QContactPhoneNumber::FieldNumber) == "654321");
220
QVERIFY(ref.value(QContactPhoneNumber::FieldNumber) == "654321");
225
void tst_QContactDetail::assignment()
227
QContactPhoneNumber p1, p2;
228
p1.setNumber("12345");
229
p2.setNumber("54321");
235
QContactEmailAddress e1;
236
e1.setEmailAddress("test@nokia.com");
239
QVERIFY(e1 != p1); // assignment across types shouldn't work
240
QVERIFY(e1.emailAddress() == QString()); // should reset the detail
241
QCOMPARE(e1, QContactEmailAddress());
243
QContactManagerEngine::setDetailAccessConstraints(&p2, QContactDetail::Irremovable);
247
void tst_QContactDetail::templates()
250
QContactPhoneNumber p1, p2;
251
p1.setNumber("1234");
252
p2.setNumber("5678");
253
QVERIFY(c.saveDetail(&p1));
254
QVERIFY(c.saveDetail(&p2));
256
QList<QContactDetail> l = c.details(QContactPhoneNumber::Type);
258
QCOMPARE(l.count(), 2);
259
QCOMPARE(QContactPhoneNumber(l.at(0)), p1);
260
QCOMPARE(QContactPhoneNumber(l.at(1)), p2);
262
QList<QContactPhoneNumber> l2 = c.details<QContactPhoneNumber>();
263
QCOMPARE(l2.count(), 2);
264
QCOMPARE(l2.at(0), p1);
265
QCOMPARE(l2.at(1), p2);
268
void tst_QContactDetail::contexts()
271
QVERIFY(d.contexts().count() == 0);
274
d.setContexts(QContactDetail::ContextWork);
275
QVERIFY(d.contexts().count() == 1);
276
QVERIFY(d.contexts().contains(QContactDetail::ContextWork));
277
QVERIFY(!d.contexts().contains(QContactDetail::ContextOther));
278
QVERIFY(!d.contexts().contains(QContactDetail::ContextHome));
281
contexts.append(QContactDetail::ContextHome);
282
contexts.append(QContactDetail::ContextOther);
283
d.setContexts(contexts);
284
QVERIFY(d.contexts().count() == 2);
285
QVERIFY(!d.contexts().contains(QContactDetail::ContextWork));
286
QVERIFY(d.contexts().contains(QContactDetail::ContextOther));
287
QVERIFY(d.contexts().contains(QContactDetail::ContextHome));
288
QCOMPARE(d.contexts(), contexts);
290
// test that contexts are values.
291
QCOMPARE(d.value<QList<int> >(QContactDetail::FieldContext), d.contexts());
294
void tst_QContactDetail::values()
297
QMap<int, QVariant> emptyValues;
298
QCOMPARE(p.values(), emptyValues);
300
QDateTime dt = QDateTime::currentDateTime();
302
t.setHMS(t.hour(), t.minute(), t.second(), 0); // milliseconds don't round trip through ISODate
306
QDateTime ddt(d); // DateTime version of a Date (QTime())
308
QVERIFY(p.setValue(QContactAddress::FieldStreet, "This is a string"));
309
QVERIFY(p.setValue(QContactAddress::FieldLocality, d));
310
QVERIFY(p.setValue(QContactAddress::FieldRegion, dt));
311
QVERIFY(p.setValue(QContactAddress::FieldPostcode, (int)6));
312
QVERIFY(p.setValue(QContactAddress::FieldSubTypes, d.toString(Qt::ISODate)));
313
QVERIFY(p.setValue(QContactAddress::FieldPostOfficeBox, dt.toString(Qt::ISODate)));
315
// Presence test (const char * version)
316
QVERIFY(p.hasValue(QContactAddress::FieldStreet));
317
QVERIFY(p.hasValue(QContactAddress::FieldLocality));
318
QVERIFY(p.hasValue(QContactAddress::FieldRegion));
319
QVERIFY(p.hasValue(QContactAddress::FieldPostcode));
320
QVERIFY(p.hasValue(QContactAddress::FieldSubTypes));
321
QVERIFY(p.hasValue(QContactAddress::FieldPostOfficeBox));
322
QVERIFY(!p.hasValue(QContactAddress::FieldCountry));
324
// string accessors with const char* key
325
QCOMPARE(p.value(QContactAddress::FieldStreet).toString(), QString("This is a string"));
326
QCOMPARE(p.value(QContactAddress::FieldLocality).toString(), d.toString(Qt::ISODate));
327
QCOMPARE(p.value(QContactAddress::FieldRegion).toString(), dt.toString(Qt::ISODate));
328
QCOMPARE(p.value(QContactAddress::FieldPostcode).toString(), QString("6"));
329
QCOMPARE(p.value(QContactAddress::FieldSubTypes).toString(), d.toString(Qt::ISODate));
330
QCOMPARE(p.value(QContactAddress::FieldPostOfficeBox).toString(), dt.toString(Qt::ISODate));
332
// Variant accessor with const char * key
333
QCOMPARE(p.value(QContactAddress::FieldStreet), QVariant(QString("This is a string")));
334
QCOMPARE(p.value(QContactAddress::FieldLocality), QVariant(d));
335
QCOMPARE(p.value(QContactAddress::FieldRegion), QVariant(dt));
336
QCOMPARE(p.value(QContactAddress::FieldPostcode), QVariant((int)6));
337
QCOMPARE(p.value(QContactAddress::FieldSubTypes), QVariant(d.toString(Qt::ISODate)));
338
QCOMPARE(p.value(QContactAddress::FieldPostOfficeBox), QVariant(dt.toString(Qt::ISODate)));
340
/* Typed accessors, string first, const char* key */
341
QCOMPARE(p.value<QString>(QContactAddress::FieldStreet), QString("This is a string"));
342
QCOMPARE(p.value<QString>(QContactAddress::FieldLocality), d.toString(Qt::ISODate));
343
QCOMPARE(p.value<QString>(QContactAddress::FieldRegion), dt.toString(Qt::ISODate));
344
QCOMPARE(p.value<QString>(QContactAddress::FieldPostcode), QString("6"));
345
QCOMPARE(p.value<QString>(QContactAddress::FieldSubTypes), d.toString(Qt::ISODate));
346
QCOMPARE(p.value<QString>(QContactAddress::FieldPostOfficeBox), dt.toString(Qt::ISODate));
348
/* Now individual original types */
349
QCOMPARE(p.value<QDate>(QContactAddress::FieldLocality), d);
350
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldRegion), dt);
351
QCOMPARE(p.value<int>(QContactAddress::FieldPostcode), 6);
353
/* Now cross types that should fail */
356
QCOMPARE(p.value<QDate>(QContactAddress::FieldStreet), id);
357
QCOMPARE(p.value<QDate>(QContactAddress::FieldPostcode), id);
358
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldStreet), idt);
359
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldPostcode), idt);
360
QCOMPARE(p.value<int>(QContactAddress::FieldLocality), 0);
361
QCOMPARE(p.value<int>(QContactAddress::FieldRegion), 0);
362
QCOMPARE(p.value<int>(QContactAddress::FieldStreet), 0);
363
QCOMPARE(p.value<int>(QContactAddress::FieldSubTypes), 0);
364
QCOMPARE(p.value<int>(QContactAddress::FieldPostOfficeBox), 0);
366
/* Cross types that should work.. */
367
QCOMPARE(p.value<int>(QContactAddress::FieldPostcode), 6);
368
QCOMPARE(p.value<QDate>(QContactAddress::FieldSubTypes), d);
369
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldPostOfficeBox), dt);
370
QCOMPARE(p.value<QDate>(QContactAddress::FieldRegion), d);
371
QCOMPARE(p.value<QDate>(QContactAddress::FieldPostOfficeBox), d);
372
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldLocality), ddt);
373
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldSubTypes), ddt);
375
/* Now set everything again */
376
QMap<int, QVariant> values = p.values();
377
QList<int> keys = values.keys();
378
foreach (int key, keys)
379
QVERIFY(p.setValue(key, QVariant()));
381
QCOMPARE(p.values(), emptyValues);
382
QVERIFY(p.values().count() == 0);
383
QVERIFY(!p.hasValue(QContactAddress::FieldStreet));
384
QVERIFY(!p.hasValue(QContactAddress::FieldLocality));
385
QVERIFY(!p.hasValue(QContactAddress::FieldRegion));
386
QVERIFY(!p.hasValue(QContactAddress::FieldPostcode));
387
QVERIFY(!p.hasValue(QContactAddress::FieldSubTypes));
388
QVERIFY(!p.hasValue(QContactAddress::FieldPostOfficeBox));
390
QVERIFY(p.value(QContactAddress::FieldStreet).toString() == QString());
391
QVERIFY(p.value(QContactAddress::FieldStreet) == QVariant());
393
values.insert(QContactAddress::FieldStreet, "This is a string");
394
values.insert(QContactAddress::FieldLocality, d);
395
values.insert(QContactAddress::FieldRegion, dt);
396
values.insert(QContactAddress::FieldPostcode, (int)6);
398
values.insert(QContactAddress::FieldSubTypes, d.toString(Qt::ISODate));
399
values.insert(QContactAddress::FieldPostOfficeBox, dt.toString(Qt::ISODate));
400
values.insert(QContactAddress::FieldStreet, QString("This is a string"));
403
keys = values.keys();
404
foreach (int key, keys)
405
QVERIFY(p.setValue(key, values.value(key)));
407
/* Now repeat the tests with our bulk set map */
408
QVERIFY(p.hasValue(QContactAddress::FieldStreet));
409
QVERIFY(p.hasValue(QContactAddress::FieldLocality));
410
QVERIFY(p.hasValue(QContactAddress::FieldRegion));
411
QVERIFY(p.hasValue(QContactAddress::FieldPostcode));
412
QVERIFY(p.hasValue(QContactAddress::FieldSubTypes));
413
QVERIFY(p.hasValue(QContactAddress::FieldPostOfficeBox));
415
/* String accessors */
416
QCOMPARE(p.value(QContactAddress::FieldStreet).toString(), QString("This is a string"));
417
QCOMPARE(p.value(QContactAddress::FieldLocality).toString(), d.toString(Qt::ISODate));
418
QCOMPARE(p.value(QContactAddress::FieldRegion).toString(), dt.toString(Qt::ISODate));
419
QCOMPARE(p.value(QContactAddress::FieldPostcode).toString(), QString("6"));
420
QCOMPARE(p.value(QContactAddress::FieldSubTypes).toString(), d.toString(Qt::ISODate));
421
QCOMPARE(p.value(QContactAddress::FieldPostOfficeBox).toString(), dt.toString(Qt::ISODate));
423
/* Typed accessors, string first */
424
QCOMPARE(p.value<QString>(QContactAddress::FieldStreet), QString("This is a string"));
425
QCOMPARE(p.value<QString>(QContactAddress::FieldLocality), d.toString(Qt::ISODate));
426
QCOMPARE(p.value<QString>(QContactAddress::FieldRegion), dt.toString(Qt::ISODate));
427
QCOMPARE(p.value<QString>(QContactAddress::FieldPostcode), QString("6"));
428
QCOMPARE(p.value<QString>(QContactAddress::FieldSubTypes), d.toString(Qt::ISODate));
429
QCOMPARE(p.value<QString>(QContactAddress::FieldPostOfficeBox), dt.toString(Qt::ISODate));
431
/* Now individual original types */
432
QCOMPARE(p.value<QDate>(QContactAddress::FieldLocality), d);
433
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldRegion), dt);
434
QCOMPARE(p.value<int>(QContactAddress::FieldPostcode), 6);
436
/* Now cross types that should fail */
437
QCOMPARE(p.value<QDate>(QContactAddress::FieldStreet), id);
438
QCOMPARE(p.value<QDate>(QContactAddress::FieldPostcode), id);
439
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldStreet), idt);
440
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldPostcode), idt);
441
QCOMPARE(p.value<int>(QContactAddress::FieldLocality), 0);
442
QCOMPARE(p.value<int>(QContactAddress::FieldRegion), 0);
443
QCOMPARE(p.value<int>(QContactAddress::FieldStreet), 0);
444
QCOMPARE(p.value<int>(QContactAddress::FieldSubTypes), 0);
445
QCOMPARE(p.value<int>(QContactAddress::FieldPostOfficeBox), 0);
447
/* Cross types that should work.. */
448
QCOMPARE(p.value<QDate>(QContactAddress::FieldSubTypes), d);
449
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldPostOfficeBox), dt);
450
QCOMPARE(p.value<QDate>(QContactAddress::FieldRegion), d);
451
QCOMPARE(p.value<QDate>(QContactAddress::FieldPostOfficeBox), d);
452
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldLocality), ddt);
453
QCOMPARE(p.value<QDateTime>(QContactAddress::FieldSubTypes), ddt);
457
keys = values.keys();
458
foreach (int key, keys)
459
QVERIFY(p.setValue(key, QVariant()));
460
QCOMPARE(p.values(), emptyValues);
462
/* Check adding a null value removes the field */
463
p.setValue(QContactAddress::FieldStreet, "stringvalue");
464
QVERIFY(p.values().contains(QContactAddress::FieldStreet));
465
QVERIFY(p.value(QContactAddress::FieldStreet) == QString("stringvalue"));
466
p.setValue(QContactAddress::FieldStreet, QVariant());
467
QVERIFY(!p.values().contains(QContactAddress::FieldStreet));
469
/* Check adding a field whose value is an empty string */
470
p.setValue(QContactAddress::FieldStreet, "");
471
QVERIFY(p.values().contains(QContactAddress::FieldStreet));
472
QVERIFY(p.value(QContactAddress::FieldStreet) == QString(""));
474
/* Check accessing a missing value */
475
QCOMPARE(p.value(QContactAddress::FieldStreet).toString(), QString());
476
QVERIFY(p.setValue(QContactAddress::FieldStreet, "changed my mind"));
477
QCOMPARE(p.value(QContactAddress::FieldStreet).toString(), QString("changed my mind"));
479
/* Check removing a missing value */
480
QVERIFY(!p.removeValue(QContactAddress::FieldCountry));
482
p.setValue(QContactAddress::FieldCountry, "555");
483
p.setValue(QContactAddress::FieldPostOfficeBox, "1234");
485
/* Check removing a real value */
486
QVERIFY(p.removeValue(QContactAddress::FieldStreet));
487
QVERIFY(p.removeValue(QContactAddress::FieldCountry));
488
QVERIFY(p.removeValue(QContactAddress::FieldPostOfficeBox));
491
void tst_QContactDetail::hash()
493
QContactExtendedDetail detail1;
494
detail1.setName("key");
495
detail1.setData(QVariant("value"));
496
QContactExtendedDetail detail2;
497
detail2.setName("key");
498
detail2.setData(QVariant("value"));
499
QContactExtendedDetail detail3;
500
detail3.setName("key");
501
detail3.setData(QVariant("different value"));
502
QVERIFY(qHash(detail1) == qHash(detail2));
503
QVERIFY(qHash(detail1) != qHash(detail3));
504
QSet<QContactDetail> set;
508
QCOMPARE(set.size(), 2);
511
void tst_QContactDetail::datastream()
514
QDataStream stream1(&buffer, QIODevice::WriteOnly);
515
QContactExtendedDetail detailIn;
516
detailIn.setName("key1");
517
detailIn.setData(QVariant("value1"));
518
detailIn.setName("key2");
519
detailIn.setData(QVariant("value2"));
522
QVERIFY(buffer.size() > 0);
524
QDataStream stream2(buffer);
525
QContactExtendedDetail detailOut;
526
stream2 >> detailOut;
527
QCOMPARE(detailOut, detailIn);
530
void tst_QContactDetail::traits()
532
QCOMPARE(sizeof(QContactDetail), sizeof(void *));
533
QVERIFY(QTypeInfo<QContactDetail>::isComplex);
534
QVERIFY(!QTypeInfo<QContactDetail>::isStatic);
535
QVERIFY(!QTypeInfo<QContactDetail>::isLarge);
536
QVERIFY(!QTypeInfo<QContactDetail>::isPointer);
537
QVERIFY(!QTypeInfo<QContactDetail>::isDummy);
540
void tst_QContactDetail::keys()
544
QVERIFY(d.key() != d2.key());
547
QVERIFY(d.key() == d2.key());
549
QVERIFY(d.key() != d2.key());
552
void tst_QContactDetail::detailUris()
555
QVERIFY(d.detailUri().isEmpty());
557
d.setDetailUri("I'm a detail uri");
558
QVERIFY(d.detailUri() == "I'm a detail uri");
560
d.setDetailUri(QString());
561
QVERIFY(d.detailUri().isEmpty());
563
QVERIFY(d.linkedDetailUris().isEmpty());
565
d.setLinkedDetailUris("5555");
566
QVERIFY(d.linkedDetailUris().count() == 1);
567
QVERIFY(d.linkedDetailUris().count("5555") == 1);
570
sl << "6666" << "7777";
571
d.setLinkedDetailUris(sl);
572
QVERIFY(d.linkedDetailUris().count() == 2);
573
QVERIFY(d.linkedDetailUris() == sl);
576
QTEST_MAIN(tst_QContactDetail)
577
#include "tst_qcontactdetail.moc"