1/****************************************************************************
2**
3** Copyright (C) 2015 The Qt Company Ltd.
4** Contact: http://www.qt.io/licensing/
5**
6** This file is part of the test suite of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL21$
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 The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
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 or version 3 as published by the Free
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22** following information to ensure the GNU Lesser General Public License
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25**
26** As a special exception, The Qt Company gives you certain additional
27** rights. These rights are described in The Qt Company LGPL Exception
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29**
30** $QT_END_LICENSE$
31**
32****************************************************************************/
33
34//TESTED_COMPONENT=src/versit
35
36#include "tst_qversitorganizerexporter.h"
37#include <QtTest/QtTest>
38
39QTORGANIZER_USE_NAMESPACE
40QTVERSITORGANIZER_USE_NAMESPACE
41
42Q_DECLARE_METATYPE(QList<QOrganizerItem>)
43Q_DECLARE_METATYPE(QList<QOrganizerItemDetail>)
44Q_DECLARE_METATYPE(QList<QVersitProperty>)
45
46void tst_QVersitOrganizerExporter::testExport()
47{
48 QFETCH(QList<QOrganizerItem>, items);
49 QFETCH(QVersitDocument, expectedDocument);
50
51 QVersitOrganizerExporter exporter;
52 QVERIFY(exporter.exportItems(items));
53 QVERIFY(exporter.errorMap().isEmpty());
54 QVersitDocument document = exporter.document();
55 if (document != expectedDocument) {
56 qDebug() << "Actual:" << document;
57 qDebug() << "Expected:" << expectedDocument;
58 QCOMPARE(document, expectedDocument);
59 }
60}
61
62void tst_QVersitOrganizerExporter::testExport_data()
63{
64 QTest::addColumn<QList<QOrganizerItem> >(name: "items");
65 QTest::addColumn<QVersitDocument>(name: "expectedDocument");
66
67 {
68 QVersitDocument document(QVersitDocument::ICalendar20Type);
69 document.setComponentType(QStringLiteral("VCALENDAR"));
70 QVersitDocument nested(QVersitDocument::ICalendar20Type);
71 nested.setComponentType(QStringLiteral("VEVENT"));
72 QVersitProperty property;
73 property.setName(QStringLiteral("SUMMARY"));
74 property.setValue(QStringLiteral("Bastille Day Party"));
75 nested.addProperty(property);
76 property.setName(QStringLiteral("DTSTART"));
77 property.setValue(QStringLiteral("19970714T170000Z"));
78 nested.addProperty(property);
79 property.setName(QStringLiteral("DTEND"));
80 property.setValue(QStringLiteral("19970715T035959Z"));
81 nested.addProperty(property);
82 document.addSubDocument(subdocument: nested);
83
84 nested.clear();
85 nested.setType(QVersitDocument::ICalendar20Type);
86 nested.setComponentType(QStringLiteral("VTODO"));
87 property.setName(QStringLiteral("SUMMARY"));
88 property.setValue(QStringLiteral("Take out the garbage"));
89 nested.addProperty(property);
90 property.setName(QStringLiteral("DTSTART"));
91 property.setValue(QStringLiteral("20100609T080000"));
92 nested.addProperty(property);
93 property.setName(QStringLiteral("DUE"));
94 property.setValue(QStringLiteral("20100610T080000"));
95 nested.addProperty(property);
96 document.addSubDocument(subdocument: nested);
97
98 nested.clear();
99 nested.setType(QVersitDocument::ICalendar20Type);
100 nested.setComponentType(QStringLiteral("VJOURNAL"));
101 property.setName(QStringLiteral("SUMMARY"));
102 property.setValue(QStringLiteral("Trip to Thailand"));
103 nested.addProperty(property);
104 property.setName(QStringLiteral("DTSTART"));
105 property.setValue(QStringLiteral("20100615T112300"));
106 nested.addProperty(property);
107 document.addSubDocument(subdocument: nested);
108
109 QOrganizerEvent event;
110 event.setDisplayLabel(QStringLiteral("Bastille Day Party"));
111 event.setStartDateTime(QDateTime(QDate(1997, 7, 14), QTime(17, 0, 0), Qt::UTC));
112 event.setEndDateTime(QDateTime(QDate(1997, 7, 15), QTime(3, 59, 59), Qt::UTC));
113
114 QOrganizerTodo todo;
115 todo.setDisplayLabel(QStringLiteral("Take out the garbage"));
116 todo.setStartDateTime(QDateTime(QDate(2010, 6, 9), QTime(8, 0, 0)));
117 todo.setDueDateTime(QDateTime(QDate(2010, 6, 10), QTime(8, 0, 0)));
118
119 QOrganizerJournal journal;
120 journal.setDisplayLabel(QStringLiteral("Trip to Thailand"));
121 journal.setDateTime(QDateTime(QDate(2010, 6, 15), QTime(11, 23, 0)));
122
123 QList<QOrganizerItem> items;
124 items << static_cast<QOrganizerItem>(event);
125 items << static_cast<QOrganizerItem>(todo);
126 items << static_cast<QOrganizerItem>(journal);
127
128 QTest::newRow(dataTag: "sample event, todo and journal") << items << document;
129 }
130
131 {
132 QVersitDocument document(QVersitDocument::ICalendar20Type);
133 document.setComponentType(QStringLiteral("VCALENDAR"));
134 QVersitDocument nested(QVersitDocument::ICalendar20Type);
135 nested.setComponentType(QStringLiteral("VEVENT"));
136 QVersitProperty property;
137 property.setName(QStringLiteral("UID"));
138 property.setValue(QStringLiteral("1234"));
139 nested.addProperty(property);
140 property.setName(QStringLiteral("RECURRENCE-ID"));
141 property.setValue(QStringLiteral("20100608"));
142 nested.addProperty(property);
143 document.addSubDocument(subdocument: nested);
144
145 // An event occurrence with OriginalDate and Guid set
146 QOrganizerEventOccurrence event;
147 event.setGuid(QStringLiteral("1234"));
148 event.setOriginalDate(QDate(2010, 6, 8));
149
150 QList<QOrganizerItem> items;
151 items << static_cast<QOrganizerItem>(event);
152
153 QTest::newRow(dataTag: "event occurrence exception") << items << document;
154 }
155}
156
157/*! Test that bad input causes the exporter to fail with the correct error */
158void tst_QVersitOrganizerExporter::testExportError()
159{
160 QFETCH(QList<QOrganizerItem>, items);
161 QFETCH(QVersitDocument, expectedDocument);
162 QFETCH(int, expectedError);
163
164 QVersitOrganizerExporter exporter;
165 QVERIFY(!exporter.exportItems(items));
166 QVERIFY(!exporter.errorMap().isEmpty());
167 QVERIFY(exporter.errorMap()[0] == expectedError);
168 QVersitDocument document = exporter.document();
169 if (document != expectedDocument) {
170 qDebug() << "Actual:" << document;
171 qDebug() << "Expected:" << expectedDocument;
172 QCOMPARE(document, expectedDocument);
173 }
174}
175
176void tst_QVersitOrganizerExporter::testExportError_data()
177{
178 QTest::addColumn<QList<QOrganizerItem> >(name: "items");
179 QTest::addColumn<QVersitDocument>(name: "expectedDocument");
180 QTest::addColumn<int>(name: "expectedError");
181
182 QVersitDocument document(QVersitDocument::ICalendar20Type);
183 document.setComponentType(QStringLiteral("VCALENDAR"));
184
185 // An event occurrence with OriginalDate set but no Guid
186 QOrganizerEventOccurrence event;
187 event.setOriginalDate(QDate(2010, 6, 8));
188
189 QList<QOrganizerItem> items;
190 items << static_cast<QOrganizerItem>(event);
191
192 QTest::newRow(dataTag: "event occurrence exception with no guid") << items << document
193 << (int)QVersitOrganizerExporter::UnderspecifiedOccurrenceError;
194}
195
196void tst_QVersitOrganizerExporter::testExportEventDetails()
197{
198 QFETCH(QList<QOrganizerItemDetail>, details);
199 QFETCH(QList<QVersitProperty>, expectedProperties);
200
201 QVersitOrganizerExporter exporter;
202 QOrganizerEvent item;
203 foreach (QOrganizerItemDetail detail, details) {
204 item.saveDetail(detail: &detail);
205 }
206 QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item));
207 QVERIFY(exporter.errorMap().isEmpty());
208 QVersitDocument document = exporter.document();
209 QList<QVersitDocument> subDocuments = document.subDocuments();
210 QCOMPARE(subDocuments.size(), 1);
211 int currentVAlarmSubDocumentIndex = 0;
212 foreach(const QVersitProperty& expectedProperty, expectedProperties) {
213 QList<QVersitProperty> actualProperties =
214 findPropertiesByName(document: subDocuments.first(), propertyName: expectedProperty.name());
215 if (expectedProperty.valueType() == QVersitProperty::VersitDocumentType) {
216 QCOMPARE(subDocuments.first().subDocuments().size(), expectedProperties.size());
217 QVersitDocument actualVAlarmDocument =
218 subDocuments.first().subDocuments().at(i: currentVAlarmSubDocumentIndex);
219 QVersitDocument expectedVAlarmDocument =
220 expectedProperty.variantValue().value<QVersitDocument>();
221 foreach (const QVersitProperty &valarmProp, expectedVAlarmDocument.properties()) {
222 if (!actualVAlarmDocument.properties().contains(t: valarmProp)) {
223 qDebug() << "Actual:" << actualVAlarmDocument.properties();
224 qDebug() << "Expected to find:" << valarmProp;
225 QVERIFY(false);
226 }
227 }
228 currentVAlarmSubDocumentIndex ++; //move to next expected valarm document
229 } else if (!actualProperties.contains(t: expectedProperty)) {
230 qDebug() << "Actual:" << actualProperties;
231 qDebug() << "Expected to find:" << expectedProperty;
232 QVERIFY(false);
233 }
234 }
235}
236
237void tst_QVersitOrganizerExporter::testExportEventDetails_data()
238{
239 QTest::addColumn<QList<QOrganizerItemDetail> >(name: "details");
240 QTest::addColumn<QList<QVersitProperty> >(name: "expectedProperties");
241
242 {
243 QVersitProperty property;
244 property.setName(QStringLiteral("SUMMARY"));
245 property.setValue(QStringLiteral("jabberwocky"));
246 QOrganizerItemDisplayLabel displayLabel;
247 displayLabel.setLabel(QStringLiteral("jabberwocky"));
248 QTest::newRow(dataTag: "one summary") << (QList<QOrganizerItemDetail>() << displayLabel)
249 << (QList<QVersitProperty>() << property);
250 }
251
252 {
253 QVersitProperty property;
254 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
255 QList<QVersitProperty> valarmProperties;
256 QMultiHash<QString, QString> parameters;
257 property.setName(QStringLiteral("ACTION"));
258 property.setValue(QStringLiteral("AUDIO"));
259 valarmProperties << property;
260 property.setName(QStringLiteral("ATTACH"));
261 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
262 valarmProperties << property;
263 property.setName(QStringLiteral("DURATION"));
264 property.setValue(QStringLiteral("PT5S"));
265 valarmProperties << property;
266 property.setName(QStringLiteral("REPEAT"));
267 property.setValue(3);
268 valarmProperties << property;
269 property.setName(QStringLiteral("TRIGGER"));
270 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
271 property.setParameters(parameters);
272 property.setValue(QStringLiteral("-PT90S"));
273 valarmProperties << property;
274 property.clear();
275 valarmDocument.setComponentType("VALARM");
276 valarmDocument.setProperties(valarmProperties);
277 property.setValueType(QVersitProperty::VersitDocumentType);
278 property.setName(QStringLiteral("VALARM"));
279 property.setValue(QVariant::fromValue(value: valarmDocument));
280 QOrganizerItemAudibleReminder audibleReminder;
281 audibleReminder.setDataUrl(QUrl("http://qt.nokia.com"));
282 audibleReminder.setRepetition(count: 3, delaySeconds: 5);
283 audibleReminder.setSecondsBeforeStart(90);
284 QTest::newRow(dataTag: "audible reminder") << (QList<QOrganizerItemDetail>() << audibleReminder)
285 << (QList<QVersitProperty>() << property);
286 }
287
288 {
289 QVersitProperty property;
290 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
291 QList<QVersitProperty> valarmProperties;
292 QMultiHash<QString, QString> parameters;
293
294 property.setName(QStringLiteral("ACTION"));
295 property.setValue(QStringLiteral("DISPLAY"));
296 valarmProperties << property;
297 property.setName(QStringLiteral("x-QTPROJECT-ATTACH"));
298 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
299 valarmProperties << property;
300 property.setName(QStringLiteral("DURATION"));
301 property.setValue(QStringLiteral("PT5S"));
302 valarmProperties << property;
303 property.setName(QStringLiteral("REPEAT"));
304 property.setValue(3);
305 valarmProperties << property;
306 property.setName(QStringLiteral("TRIGGER"));
307 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
308 property.setParameters(parameters);
309 property.setValue(QStringLiteral("-PT90S"));
310 valarmProperties << property;
311 property.clear();
312 property.setName(QStringLiteral("DESCRIPTION"));
313 property.setValue(QStringLiteral("Test visual reminder"));
314 valarmProperties << property;
315
316 valarmDocument.setComponentType("VALARM");
317 valarmDocument.setProperties(valarmProperties);
318 property.setValueType(QVersitProperty::VersitDocumentType);
319 property.setName(QStringLiteral("VALARM"));
320 property.setValue(QVariant::fromValue(value: valarmDocument));
321 QOrganizerItemVisualReminder visualReminder;
322 visualReminder.setDataUrl(QUrl("http://qt.nokia.com"));
323 visualReminder.setRepetition(count: 3, delaySeconds: 5);
324 visualReminder.setSecondsBeforeStart(90);
325 visualReminder.setMessage(QStringLiteral("Test visual reminder"));
326 QTest::newRow(dataTag: "visual reminder") << (QList<QOrganizerItemDetail>() << visualReminder)
327 << (QList<QVersitProperty>() << property);
328 }
329
330 {
331 QVersitProperty property;
332 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
333 QList<QVersitProperty> valarmProperties;
334 QMultiHash<QString, QString> parameters;
335
336 property.setName(QStringLiteral("ACTION"));
337 property.setValue(QStringLiteral("DISPLAY"));
338 valarmProperties << property;
339 property.setName(QStringLiteral("x-QTPROJECT-ATTACH"));
340 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
341 valarmProperties << property;
342 property.setName(QStringLiteral("DURATION"));
343 property.setValue(QStringLiteral("PT5S"));
344 valarmProperties << property;
345 property.setName(QStringLiteral("REPEAT"));
346 property.setValue(3);
347 valarmProperties << property;
348 property.setName(QStringLiteral("TRIGGER"));
349 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
350 property.setParameters(parameters);
351 property.setValue(QStringLiteral("-PT90S"));
352 valarmProperties << property;
353 property.clear();
354 property.setName(QStringLiteral("DESCRIPTION"));
355 property.setValue(QStringLiteral(""));
356 valarmProperties << property;
357
358 valarmDocument.setComponentType("VALARM");
359 valarmDocument.setProperties(valarmProperties);
360 property.setValueType(QVersitProperty::VersitDocumentType);
361 property.setName(QStringLiteral("VALARM"));
362 property.setValue(QVariant::fromValue(value: valarmDocument));
363 QOrganizerItemVisualReminder visualReminder;
364 visualReminder.setDataUrl(QUrl("http://qt.nokia.com"));
365 visualReminder.setRepetition(count: 3, delaySeconds: 5);
366 visualReminder.setSecondsBeforeStart(90);
367 QTest::newRow(dataTag: "visual reminder: no message") << (QList<QOrganizerItemDetail>() << visualReminder)
368 << (QList<QVersitProperty>() << property);
369 }
370
371 {
372 QVersitProperty property;
373 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
374 QList<QVersitProperty> valarmProperties;
375 QMultiHash<QString, QString> parameters;
376
377 property.setName(QStringLiteral("ACTION"));
378 property.setValue(QStringLiteral("EMAIL"));
379 valarmProperties << property;
380 property.setName(QStringLiteral("DURATION"));
381 property.setValue(QStringLiteral("PT5S"));
382 valarmProperties << property;
383 property.setName(QStringLiteral("REPEAT"));
384 property.setValue(3);
385 valarmProperties << property;
386 property.setName(QStringLiteral("TRIGGER"));
387 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
388 property.setParameters(parameters);
389 property.setValue(QStringLiteral("-PT90S"));
390 valarmProperties << property;
391 property.clear();
392 property.setName(QStringLiteral("DESCRIPTION"));
393 property.setValue(QStringLiteral("Test email body"));
394 valarmProperties << property;
395 property.setName(QStringLiteral("SUMMARY"));
396 property.setValue(QStringLiteral("Test email subject"));
397 valarmProperties << property;
398 property.setName(QStringLiteral("ATTENDEE"));
399 property.setValue(QStringLiteral("First email recipient"));
400 valarmProperties << property;
401 property.setValue(QStringLiteral("Second email recipient"));
402 valarmProperties << property;
403
404 valarmDocument.setComponentType("VALARM");
405 valarmDocument.setProperties(valarmProperties);
406 property.setValueType(QVersitProperty::VersitDocumentType);
407 property.setName(QStringLiteral("VALARM"));
408 property.setValue(QVariant::fromValue(value: valarmDocument));
409 QOrganizerItemEmailReminder emailReminder;
410 QVariantList attachments;
411 emailReminder.setRepetition(count: 3, delaySeconds: 5);
412 emailReminder.setSecondsBeforeStart(90);
413 emailReminder.setRecipients((QStringList() << QStringLiteral("First email recipient")
414 << QStringLiteral("Second email recipient")));
415 emailReminder.setContents(QStringLiteral("Test email subject"),
416 QStringLiteral("Test email body"),
417 attachments);
418 QTest::newRow(dataTag: "email reminder") << (QList<QOrganizerItemDetail>() << emailReminder)
419 << (QList<QVersitProperty>() << property);
420 }
421
422 {
423 QVersitProperty property;
424 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
425 QList<QVersitProperty> valarmProperties;
426 QMultiHash<QString, QString> parameters;
427
428 property.setName(QStringLiteral("ACTION"));
429 property.setValue(QStringLiteral("EMAIL"));
430 valarmProperties << property;
431 property.setName(QStringLiteral("DURATION"));
432 property.setValue(QStringLiteral("PT5S"));
433 valarmProperties << property;
434 property.setName(QStringLiteral("REPEAT"));
435 property.setValue(3);
436 valarmProperties << property;
437 property.setName(QStringLiteral("TRIGGER"));
438 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
439 property.setParameters(parameters);
440 property.setValue(QStringLiteral("-PT90S"));
441 valarmProperties << property;
442 property.clear();
443 property.setName(QStringLiteral("DESCRIPTION"));
444 property.setValue(QStringLiteral(""));
445 valarmProperties << property;
446 property.setName(QStringLiteral("SUMMARY"));
447 property.setValue(QStringLiteral(""));
448 valarmProperties << property;
449 property.setName(QStringLiteral("ATTENDEE"));
450 property.setValue(QStringLiteral("First email recipient"));
451 valarmProperties << property;
452 property.setValue(QStringLiteral("Second email recipient"));
453 valarmProperties << property;
454
455 valarmDocument.setComponentType("VALARM");
456 valarmDocument.setProperties(valarmProperties);
457 property.setValueType(QVersitProperty::VersitDocumentType);
458 property.setName(QStringLiteral("VALARM"));
459 property.setValue(QVariant::fromValue(value: valarmDocument));
460 QOrganizerItemEmailReminder emailReminder;
461 QVariantList attachments;
462 emailReminder.setRepetition(count: 3, delaySeconds: 5);
463 emailReminder.setSecondsBeforeStart(90);
464 emailReminder.setRecipients((QStringList() << QStringLiteral("First email recipient")
465 << QStringLiteral("Second email recipient")));
466 emailReminder.setValue(field: QOrganizerItemEmailReminder::FieldAttachments, value: attachments);
467 QTest::newRow(dataTag: "email reminder: no subject, no body") << (QList<QOrganizerItemDetail>() << emailReminder)
468 << (QList<QVersitProperty>() << property);
469 }
470
471 {
472 QList<QOrganizerItemDetail> detailsToExport;
473 QList<QVersitProperty> expectedProperties;
474 {
475 QVersitProperty property;
476 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
477 QList<QVersitProperty> valarmProperties;
478 QMultiHash<QString, QString> parameters;
479 property.setName(QStringLiteral("ACTION"));
480 property.setValue(QStringLiteral("AUDIO"));
481 valarmProperties << property;
482 property.setName(QStringLiteral("ATTACH"));
483 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
484 valarmProperties << property;
485 property.setName(QStringLiteral("DURATION"));
486 property.setValue(QStringLiteral("PT5S"));
487 valarmProperties << property;
488 property.setName(QStringLiteral("REPEAT"));
489 property.setValue(3);
490 valarmProperties << property;
491 property.setName(QStringLiteral("TRIGGER"));
492 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
493 property.setParameters(parameters);
494 property.setValue(QStringLiteral("-PT90S"));
495 valarmProperties << property;
496 property.clear();
497 valarmDocument.setComponentType("VALARM");
498 valarmDocument.setProperties(valarmProperties);
499 property.setValueType(QVersitProperty::VersitDocumentType);
500 property.setName(QStringLiteral("VALARM"));
501 property.setValue(QVariant::fromValue(value: valarmDocument));
502 QOrganizerItemAudibleReminder audibleReminder;
503 audibleReminder.setDataUrl(QUrl("http://qt.nokia.com"));
504 audibleReminder.setRepetition(count: 3, delaySeconds: 5);
505 audibleReminder.setSecondsBeforeStart(90);
506 detailsToExport << audibleReminder;
507 expectedProperties << property;
508 }
509
510 {
511 QVersitProperty property;
512 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
513 QList<QVersitProperty> valarmProperties;
514 QMultiHash<QString, QString> parameters;
515
516 property.setName(QStringLiteral("ACTION"));
517 property.setValue(QStringLiteral("DISPLAY"));
518 valarmProperties << property;
519 property.setName(QStringLiteral("x-QTPROJECT-ATTACH"));
520 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
521 valarmProperties << property;
522 property.setName(QStringLiteral("DURATION"));
523 property.setValue(QStringLiteral("PT5S"));
524 valarmProperties << property;
525 property.setName(QStringLiteral("REPEAT"));
526 property.setValue(3);
527 valarmProperties << property;
528 property.setName(QStringLiteral("TRIGGER"));
529 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
530 property.setParameters(parameters);
531 property.setValue(QStringLiteral("-PT90S"));
532 valarmProperties << property;
533 property.clear();
534 property.setName(QStringLiteral("DESCRIPTION"));
535 property.setValue(QStringLiteral(""));
536 valarmProperties << property;
537
538 valarmDocument.setComponentType("VALARM");
539 valarmDocument.setProperties(valarmProperties);
540 property.setValueType(QVersitProperty::VersitDocumentType);
541 property.setName(QStringLiteral("VALARM"));
542 property.setValue(QVariant::fromValue(value: valarmDocument));
543 QOrganizerItemVisualReminder visualReminder;
544 visualReminder.setDataUrl(QUrl("http://qt.nokia.com"));
545 visualReminder.setRepetition(count: 3, delaySeconds: 5);
546 visualReminder.setSecondsBeforeStart(90);
547 detailsToExport << visualReminder;
548 expectedProperties << property;
549 }
550 {
551 QVersitProperty property;
552 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
553 QList<QVersitProperty> valarmProperties;
554 QMultiHash<QString, QString> parameters;
555
556 property.setName(QStringLiteral("ACTION"));
557 property.setValue(QStringLiteral("EMAIL"));
558 valarmProperties << property;
559 property.setName(QStringLiteral("DURATION"));
560 property.setValue(QStringLiteral("PT5S"));
561 valarmProperties << property;
562 property.setName(QStringLiteral("REPEAT"));
563 property.setValue(3);
564 valarmProperties << property;
565 property.setName(QStringLiteral("TRIGGER"));
566 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("START"));
567 property.setParameters(parameters);
568 property.setValue(QStringLiteral("-PT90S"));
569 valarmProperties << property;
570 property.clear();
571 property.setName(QStringLiteral("DESCRIPTION"));
572 property.setValue(QStringLiteral(""));
573 valarmProperties << property;
574 property.setName(QStringLiteral("SUMMARY"));
575 property.setValue(QStringLiteral(""));
576 valarmProperties << property;
577 property.setName(QStringLiteral("ATTENDEE"));
578 property.setValue(QStringLiteral("First email recipient"));
579 valarmProperties << property;
580 property.setValue(QStringLiteral("Second email recipient"));
581 valarmProperties << property;
582
583 valarmDocument.setComponentType("VALARM");
584 valarmDocument.setProperties(valarmProperties);
585 property.setValueType(QVersitProperty::VersitDocumentType);
586 property.setName(QStringLiteral("VALARM"));
587 property.setValue(QVariant::fromValue(value: valarmDocument));
588 QOrganizerItemEmailReminder emailReminder;
589 QVariantList attachments;
590 emailReminder.setRepetition(count: 3, delaySeconds: 5);
591 emailReminder.setSecondsBeforeStart(90);
592 emailReminder.setRecipients((QStringList() << QStringLiteral("First email recipient")
593 << QStringLiteral("Second email recipient")));
594 emailReminder.setValue(field: QOrganizerItemEmailReminder::FieldAttachments, value: attachments);
595 detailsToExport << emailReminder;
596 expectedProperties << property;
597 }
598 QTest::newRow(dataTag: "multiple reminders") << detailsToExport << expectedProperties;
599 }
600 {
601 QVersitProperty property;
602 property.setName(QStringLiteral("DESCRIPTION"));
603 property.setValue(QStringLiteral("Twinkle, twinkle, little bat! How I wonder what you're at."));
604 QOrganizerItemDescription description;
605 description.setDescription(QStringLiteral("Twinkle, twinkle, little bat! How I wonder what you're at."));
606 QTest::newRow(dataTag: "one description") << (QList<QOrganizerItemDetail>() << description)
607 << (QList<QVersitProperty>() << property);
608 }
609
610 {
611 QVersitProperty property = createExtendedDetailPropertyForStringData(name: "name", data: "data");
612 QOrganizerItemExtendedDetail extendedDetail = createExtendedDetail(name: "name", QStringLiteral("data"));
613 QTest::newRow(dataTag: "extended detail") << (QList<QOrganizerItemDetail>() << extendedDetail)
614 << (QList<QVersitProperty>() << property);
615 }
616
617 {
618 QVersitProperty property; // Proper version.
619 property.setName(QStringLiteral("X-QTPROJECT-VERSION"));
620 property.setValueType(QVersitProperty::CompoundType);
621 property.setValue(QStringList() << QStringLiteral("4711") << QStringLiteral("134f23dbb2"));
622 QOrganizerItemVersion version;
623 version.setVersion(4711);
624 version.setExtendedVersion(QByteArray("134f23dbb2"));
625 QTest::newRow(dataTag: "version") << (QList<QOrganizerItemDetail>() << version)
626 << (QList<QVersitProperty>() << property);
627 }
628
629 {
630 QVersitProperty property; // Extended version empty.
631 property.setName(QStringLiteral("X-QTPROJECT-VERSION"));
632 property.setValueType(QVersitProperty::CompoundType);
633 property.setValue(QStringList() << QStringLiteral("4711") << QStringLiteral(""));
634 QOrganizerItemVersion version;
635 version.setVersion(4711);
636 version.setExtendedVersion(QByteArray(""));
637 QTest::newRow(dataTag: "version") << (QList<QOrganizerItemDetail>() << version)
638 << (QList<QVersitProperty>() << property);
639 }
640
641 {
642 QVersitProperty property; // No extended version.
643 property.setName(QStringLiteral("X-QTPROJECT-VERSION"));
644 property.setValueType(QVersitProperty::CompoundType);
645 property.setValue(QStringList() << QStringLiteral("4711") << QStringLiteral(""));
646 QOrganizerItemVersion version;
647 version.setVersion(4711);
648 QTest::newRow(dataTag: "version") << (QList<QOrganizerItemDetail>() << version)
649 << (QList<QVersitProperty>() << property);
650 }
651
652 {
653 QVersitProperty property; // Empty version detail.
654 QOrganizerItemVersion version;
655 property.setName(QStringLiteral("X-QTPROJECT-VERSION"));
656 property.setValueType(QVersitProperty::CompoundType);
657 property.setValue(QStringList() << QStringLiteral("0") << QStringLiteral(""));
658 QTest::newRow(dataTag: "version") << (QList<QOrganizerItemDetail>() << version)
659 << (QList<QVersitProperty>());
660 }
661
662 {
663 QVersitProperty property1;
664 property1.setName(QStringLiteral("COMMENT"));
665 property1.setValue(QStringLiteral("Comment 1"));
666 QVersitProperty property2;
667 property2.setName(QStringLiteral("COMMENT"));
668 property2.setValue(QStringLiteral("Comment 2"));
669 QOrganizerItemComment comment1;
670 comment1.setComment(QStringLiteral("Comment 1"));
671 QOrganizerItemComment comment2;
672 comment2.setComment(QStringLiteral("Comment 2"));
673 QTest::newRow(dataTag: "two comments")
674 << (QList<QOrganizerItemDetail>() << comment1 << comment2)
675 << (QList<QVersitProperty>() << property1 << property2);
676 }
677
678 {
679 QVersitProperty property;
680 property.setName(QStringLiteral("UID"));
681 property.setValue(QStringLiteral("1234567"));
682 QOrganizerItemGuid guid;
683 guid.setGuid(QStringLiteral("1234567"));
684 QTest::newRow(dataTag: "guid") << (QList<QOrganizerItemDetail>() << guid)
685 << (QList<QVersitProperty>() << property);
686 }
687
688 {
689 QList<QVersitProperty> properties;
690 QVersitProperty dtstart;
691 dtstart.setName(QStringLiteral("DTSTART"));
692 dtstart.setValue(QStringLiteral("20100102T030405"));
693 properties << dtstart;
694 QVersitProperty dtend;
695 dtend.setName(QStringLiteral("DTEND"));
696 dtend.setValue(QStringLiteral("20100102T030406"));
697 properties << dtend;
698 QOrganizerEventTime etr;
699 etr.setStartDateTime(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 5)));
700 etr.setEndDateTime(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 6)));
701 QTest::newRow(dataTag: "dtstart and dtend") << (QList<QOrganizerItemDetail>() << etr)
702 << properties;
703 }
704
705 {
706 QList<QVersitProperty> properties;
707 QVersitProperty dtstart;
708 dtstart.setName(QStringLiteral("DTSTART"));
709 dtstart.setValue(QStringLiteral("20100102"));
710 dtstart.insertParameter(QStringLiteral("VALUE"), QStringLiteral("DATE"));
711 properties << dtstart;
712 QVersitProperty dtend;
713 dtend.setName(QStringLiteral("DTEND"));
714 // Note: in iCalendar, the end date is exclusive while in Qt Organizer, it is inclusive.
715 // Hence, this is an event that occurs all day on 2 January (not including 3 January)
716 dtend.setValue(QStringLiteral("20100103"));
717 dtend.insertParameter(QStringLiteral("VALUE"), QStringLiteral("DATE"));
718 properties << dtend;
719 QOrganizerEventTime etr;
720 etr.setStartDateTime(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 5)));
721 etr.setEndDateTime(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 6)));
722 etr.setAllDay(true);
723 QTest::newRow(dataTag: "all day event") << (QList<QOrganizerItemDetail>() << etr)
724 << properties;
725 }
726
727 {
728 QList<QVersitProperty> properties;
729 QVersitProperty created;
730 created.setName(QStringLiteral("CREATED"));
731 created.setValue(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 5)).toUTC().toString(
732 QStringLiteral("yyyyMMddTHHmmssZ")));
733 properties << created;
734 QVersitProperty modified;
735 modified.setName(QStringLiteral("LAST-MODIFIED"));
736 modified.setValue(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 6)).toUTC().toString(
737 QStringLiteral("yyyyMMddTHHmmssZ")));
738 properties << modified;
739 QOrganizerItemTimestamp timestamp;
740 timestamp.setCreated(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 5)));
741 timestamp.setLastModified(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 6)));
742 QTest::newRow(dataTag: "created and last modified")
743 << (QList<QOrganizerItemDetail>() << timestamp)
744 << properties;
745 }
746
747 {
748 QVersitProperty rrule;
749 rrule.setValueType(QVersitProperty::PreformattedType);
750 rrule.setName(QStringLiteral("RRULE"));
751 rrule.setValue(QStringLiteral("FREQ=DAILY"));
752 QOrganizerItemRecurrence recurrence;
753 QOrganizerRecurrenceRule recurrenceRule;
754 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Daily);
755 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
756 QTest::newRow(dataTag: "rrule daily")
757 << (QList<QOrganizerItemDetail>() << recurrence)
758 << (QList<QVersitProperty>() << rrule);
759
760 rrule.setValue(QStringLiteral("FREQ=WEEKLY"));
761 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Weekly);
762 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
763 QTest::newRow(dataTag: "rrule weekly")
764 << (QList<QOrganizerItemDetail>() << recurrence)
765 << (QList<QVersitProperty>() << rrule);
766
767 rrule.setValue(QStringLiteral("FREQ=MONTHLY"));
768 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Monthly);
769 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
770 QTest::newRow(dataTag: "rrule monthly")
771 << (QList<QOrganizerItemDetail>() << recurrence)
772 << (QList<QVersitProperty>() << rrule);
773
774 rrule.setValue(QStringLiteral("FREQ=YEARLY"));
775 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Yearly);
776 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
777 QTest::newRow(dataTag: "rrule yearly")
778 << (QList<QOrganizerItemDetail>() << recurrence)
779 << (QList<QVersitProperty>() << rrule);
780
781 rrule.setValue(QStringLiteral("FREQ=MONTHLY;INTERVAL=2;BYDAY=TU"));
782 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Monthly);
783 recurrenceRule.setInterval(2);
784 recurrenceRule.setDaysOfWeek(QSet<Qt::DayOfWeek>() << Qt::Tuesday);
785 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
786 QTest::newRow(dataTag: "rrule monthly")
787 << (QList<QOrganizerItemDetail>() << recurrence)
788 << (QList<QVersitProperty>() << rrule);
789 }
790
791 {
792 QVersitProperty rrule;
793 rrule.setValueType(QVersitProperty::PreformattedType);
794 rrule.setName(QStringLiteral("RRULE"));
795 rrule.setValue(QStringLiteral("FREQ=MONTHLY;BYMONTHDAY=-3,1"));
796 QOrganizerItemRecurrence recurrence;
797 QOrganizerRecurrenceRule recurrenceRule;
798 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Monthly);
799 recurrenceRule.setDaysOfMonth(QSet<int>() << 1 << -3);
800 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
801 QTest::newRow(dataTag: "rrule bymonthday")
802 << (QList<QOrganizerItemDetail>() << recurrence)
803 << (QList<QVersitProperty>() << rrule);
804 }
805
806 {
807 QVersitProperty rrule;
808 rrule.setValueType(QVersitProperty::PreformattedType);
809 rrule.setName(QStringLiteral("RRULE"));
810 rrule.setValue(QStringLiteral("FREQ=YEARLY;BYWEEKNO=-3,1"));
811 QOrganizerItemRecurrence recurrence;
812 QOrganizerRecurrenceRule recurrenceRule;
813 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Yearly);
814 recurrenceRule.setWeeksOfYear(QSet<int>() << 1 << -3);
815 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
816 QTest::newRow(dataTag: "rrule byweekno")
817 << (QList<QOrganizerItemDetail>() << recurrence)
818 << (QList<QVersitProperty>() << rrule);
819 }
820
821 {
822 QVersitProperty rrule;
823 rrule.setValueType(QVersitProperty::PreformattedType);
824 rrule.setName(QStringLiteral("RRULE"));
825 rrule.setValue(QStringLiteral("FREQ=YEARLY;BYMONTH=1,10"));
826 QOrganizerItemRecurrence recurrence;
827 QOrganizerRecurrenceRule recurrenceRule;
828 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Yearly);
829 recurrenceRule.setMonthsOfYear(QSet<QOrganizerRecurrenceRule::Month>()
830 << QOrganizerRecurrenceRule::January
831 << QOrganizerRecurrenceRule::October);
832 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
833 QTest::newRow(dataTag: "rrule bymonth")
834 << (QList<QOrganizerItemDetail>() << recurrence)
835 << (QList<QVersitProperty>() << rrule);
836 }
837
838 {
839 QVersitProperty rrule;
840 rrule.setValueType(QVersitProperty::PreformattedType);
841 rrule.setName(QStringLiteral("RRULE"));
842 rrule.setValue(QStringLiteral("FREQ=YEARLY;BYYEARDAY=-1,1,366"));
843 QOrganizerItemRecurrence recurrence;
844 QOrganizerRecurrenceRule recurrenceRule;
845 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Yearly);
846 recurrenceRule.setDaysOfYear(QSet<int>() << 1 << 366 << -1);
847 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
848 QTest::newRow(dataTag: "rrule byyearday")
849 << (QList<QOrganizerItemDetail>() << recurrence)
850 << (QList<QVersitProperty>() << rrule);
851 }
852
853 {
854 QVersitProperty rrule;
855 rrule.setValueType(QVersitProperty::PreformattedType);
856 rrule.setName(QStringLiteral("RRULE"));
857 rrule.setValue(QStringLiteral("FREQ=WEEKLY;COUNT=4;INTERVAL=2;BYDAY=TU,SU;WKST=SU"));
858 QOrganizerItemRecurrence recurrence;
859 QOrganizerRecurrenceRule recurrenceRule;
860 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Weekly);
861 recurrenceRule.setInterval(2);
862 recurrenceRule.setLimit(4);
863 recurrenceRule.setDaysOfWeek(QSet<Qt::DayOfWeek>() << Qt::Tuesday << Qt::Sunday);
864 recurrenceRule.setFirstDayOfWeek(Qt::Sunday);
865 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
866 QTest::newRow(dataTag: "rrule wkst")
867 << (QList<QOrganizerItemDetail>() << recurrence)
868 << (QList<QVersitProperty>() << rrule);
869 }
870
871 {
872 QVersitProperty rrule;
873 rrule.setValueType(QVersitProperty::PreformattedType);
874 rrule.setName(QStringLiteral("RRULE"));
875 rrule.setValue(QStringLiteral("FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1"));
876 QOrganizerItemRecurrence recurrence;
877 QOrganizerRecurrenceRule recurrenceRule;
878 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Monthly);
879 recurrenceRule.setDaysOfWeek(QSet<Qt::DayOfWeek>()
880 << Qt::Monday << Qt::Tuesday << Qt::Wednesday << Qt::Thursday << Qt::Friday);
881 recurrenceRule.setPositions(QSet<int>() << -1);
882 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
883 QTest::newRow(dataTag: "rrule bysetpos")
884 << (QList<QOrganizerItemDetail>() << recurrence)
885 << (QList<QVersitProperty>() << rrule);
886 }
887
888 {
889 QVersitProperty rrule;
890 rrule.setValueType(QVersitProperty::PreformattedType);
891 rrule.setName(QStringLiteral("RRULE"));
892 rrule.setValue(QStringLiteral("FREQ=DAILY;UNTIL=20000131;BYMONTH=1"));
893 QOrganizerItemRecurrence recurrence;
894 QOrganizerRecurrenceRule recurrenceRule;
895 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Daily);
896 recurrenceRule.setLimit(QDate(2000, 1, 31));
897 recurrenceRule.setMonthsOfYear(QSet<QOrganizerRecurrenceRule::Month>()
898 << QOrganizerRecurrenceRule::January);
899 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
900 QTest::newRow(dataTag: "rrule until")
901 << (QList<QOrganizerItemDetail>() << recurrence)
902 << (QList<QVersitProperty>() << rrule);
903 }
904
905 {
906 QVersitProperty rrule;
907 rrule.setValueType(QVersitProperty::PreformattedType);
908 rrule.setName(QStringLiteral("RRULE"));
909 rrule.setValue(QStringLiteral("FREQ=DAILY;COUNT=5;BYMONTH=1"));
910 QOrganizerItemRecurrence recurrence;
911 QOrganizerRecurrenceRule recurrenceRule;
912 recurrenceRule.setFrequency(QOrganizerRecurrenceRule::Daily);
913 recurrenceRule.setLimit(5);
914 recurrenceRule.setMonthsOfYear(QSet<QOrganizerRecurrenceRule::Month>()
915 << QOrganizerRecurrenceRule::January);
916 recurrence.setRecurrenceRules(QSet<QOrganizerRecurrenceRule>() << recurrenceRule);
917 QTest::newRow(dataTag: "rrule count")
918 << (QList<QOrganizerItemDetail>() << recurrence)
919 << (QList<QVersitProperty>() << rrule);
920 }
921
922 {
923 QVersitProperty rdate;
924 rdate.insertParameter(QStringLiteral("VALUE"), QStringLiteral("DATE"));
925 rdate.setName(QStringLiteral("RDATE"));
926 rdate.setValue(QStringLiteral("19970304"));
927 QOrganizerEventTime etr;
928 etr.setStartDateTime(QDateTime(QDate(1997, 3, 4), QTime(11, 0, 0)));
929 etr.setEndDateTime(QDateTime(QDate(1997, 3, 4), QTime(11, 0, 0)));
930 QOrganizerItemRecurrence recurrence;
931 QSet<QDate> recurrenceDates;
932 recurrenceDates << QDate(1997, 3, 4);
933 recurrence.setRecurrenceDates(recurrenceDates);
934 QTest::newRow(dataTag: "rdate")
935 << (QList<QOrganizerItemDetail>() << etr << recurrence)
936 << (QList<QVersitProperty>() << rdate);
937
938 rdate.setValue(QStringLiteral("19970304,19970504,19970704"));
939 recurrenceDates.clear();
940 recurrenceDates << QDate(1997, 3, 4)
941 << QDate(1997, 5, 4)
942 << QDate(1997, 7, 4);
943 recurrence.setRecurrenceDates(recurrenceDates);
944 QTest::newRow(dataTag: "multiple rdate")
945 << (QList<QOrganizerItemDetail>() << etr << recurrence)
946 << (QList<QVersitProperty>() << rdate);
947 }
948
949 {
950 QVersitProperty rdate;
951 rdate.insertParameter(QStringLiteral("VALUE"), QStringLiteral("DATE"));
952 rdate.setName(QStringLiteral("EXDATE"));
953 rdate.setValue(QStringLiteral("19970304"));
954 QOrganizerEventTime etr;
955 etr.setStartDateTime(QDateTime(QDate(1997, 3, 4), QTime(11, 0, 0)));
956 etr.setEndDateTime(QDateTime(QDate(1997, 3, 4), QTime(11, 0, 0)));
957 QOrganizerItemRecurrence recurrence;
958 QSet<QDate> exceptionDates;
959 exceptionDates << QDate(1997, 3, 4);
960 recurrence.setExceptionDates(exceptionDates);
961 QTest::newRow(dataTag: "exdate")
962 << (QList<QOrganizerItemDetail>() << etr << recurrence)
963 << (QList<QVersitProperty>() << rdate);
964 }
965
966 {
967 QVersitProperty property;
968 property.setName(QStringLiteral("CATEGORIES"));
969 property.setValue(QStringLiteral("Important Event"));
970 QOrganizerItemTag tag;
971 tag.setTag(QStringLiteral("Important Event"));
972 QTest::newRow(dataTag: "tag 1")
973 << (QList<QOrganizerItemDetail>() << tag)
974 << (QList<QVersitProperty>() << property);
975
976 // Set another one for multiple handling test
977 property.setValue(QStringLiteral("Important Event 2"));
978 tag.setTag(QStringLiteral("Important Event 2"));
979 QTest::newRow(dataTag: "tag 2")
980 << (QList<QOrganizerItemDetail>() << tag)
981 << (QList<QVersitProperty>() << property);
982
983 // Empty tag
984 property.clear();
985 property.setName("CATEGORIES");
986 tag.removeValue(field: QOrganizerItemTag::FieldTag);
987 QTest::newRow(dataTag: "empty tag")
988 << (QList<QOrganizerItemDetail>() << tag)
989 << (QList<QVersitProperty>() << property);
990 }
991
992 {
993 QVersitProperty property;
994 property.setName(QStringLiteral("PRIORITY"));
995 property.setValue(QStringLiteral("0"));
996
997 QOrganizerItemPriority detail;
998 detail.setPriority(QOrganizerItemPriority::UnknownPriority);
999 QTest::newRow(dataTag: "priority 0")
1000 << (QList<QOrganizerItemDetail>() << detail)
1001 << (QList<QVersitProperty>() << property);
1002
1003 property.setValue(QStringLiteral("1"));
1004 detail.setPriority(QOrganizerItemPriority::HighestPriority);
1005 QTest::newRow(dataTag: "priority 1")
1006 << (QList<QOrganizerItemDetail>() << detail)
1007 << (QList<QVersitProperty>() << property);
1008
1009 property.setValue(QStringLiteral("2"));
1010 detail.setPriority(QOrganizerItemPriority::ExtremelyHighPriority);
1011 QTest::newRow(dataTag: "priority 2")
1012 << (QList<QOrganizerItemDetail>() << detail)
1013 << (QList<QVersitProperty>() << property);
1014
1015 property.setValue(QStringLiteral("3"));
1016 detail.setPriority(QOrganizerItemPriority::VeryHighPriority);
1017 QTest::newRow(dataTag: "priority 3")
1018 << (QList<QOrganizerItemDetail>() << detail)
1019 << (QList<QVersitProperty>() << property);
1020
1021 property.setValue(QStringLiteral("4"));
1022 detail.setPriority(QOrganizerItemPriority::HighPriority);
1023 QTest::newRow(dataTag: "priority 4")
1024 << (QList<QOrganizerItemDetail>() << detail)
1025 << (QList<QVersitProperty>() << property);
1026
1027 property.setValue(QStringLiteral("5"));
1028 detail.setPriority(QOrganizerItemPriority::MediumPriority);
1029 QTest::newRow(dataTag: "priority 5")
1030 << (QList<QOrganizerItemDetail>() << detail)
1031 << (QList<QVersitProperty>() << property);
1032
1033 property.setValue(QStringLiteral("6"));
1034 detail.setPriority(QOrganizerItemPriority::LowPriority);
1035 QTest::newRow(dataTag: "priority 6")
1036 << (QList<QOrganizerItemDetail>() << detail)
1037 << (QList<QVersitProperty>() << property);
1038
1039 property.setValue(QStringLiteral("7"));
1040 detail.setPriority(QOrganizerItemPriority::VeryLowPriority);
1041 QTest::newRow(dataTag: "priority 7")
1042 << (QList<QOrganizerItemDetail>() << detail)
1043 << (QList<QVersitProperty>() << property);
1044
1045 property.setValue(QStringLiteral("8"));
1046 detail.setPriority(QOrganizerItemPriority::ExtremelyLowPriority);
1047 QTest::newRow(dataTag: "priority 8")
1048 << (QList<QOrganizerItemDetail>() << detail)
1049 << (QList<QVersitProperty>() << property);
1050
1051 property.setValue(QStringLiteral("9"));
1052 detail.setPriority(QOrganizerItemPriority::LowestPriority);
1053 QTest::newRow(dataTag: "priority 9")
1054 << (QList<QOrganizerItemDetail>() << detail)
1055 << (QList<QVersitProperty>() << property);
1056 }
1057}
1058
1059void tst_QVersitOrganizerExporter::testExportTodoDetails()
1060{
1061 QFETCH(QList<QOrganizerItemDetail>, details);
1062 QFETCH(QList<QVersitProperty>, expectedProperties);
1063
1064 QVersitOrganizerExporter exporter;
1065 QOrganizerTodo item;
1066 foreach (QOrganizerItemDetail detail, details) {
1067 item.saveDetail(detail: &detail);
1068 }
1069 QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item));
1070 QVERIFY(exporter.errorMap().isEmpty());
1071 QVersitDocument document = exporter.document();
1072 QList<QVersitDocument> subDocuments = document.subDocuments();
1073 QCOMPARE(subDocuments.size(), 1);
1074 foreach(const QVersitProperty& expectedProperty, expectedProperties) {
1075 QList<QVersitProperty> actualProperties =
1076 findPropertiesByName(document: subDocuments.first(), propertyName: expectedProperty.name());
1077 if (expectedProperty.valueType() == QVersitProperty::VersitDocumentType) {
1078 QCOMPARE(subDocuments.first().subDocuments().size(), 1);
1079 QVersitDocument actualVAlarmDocument =
1080 subDocuments.first().subDocuments().first();
1081 QVersitDocument expectedVAlarmDocument =
1082 expectedProperty.variantValue().value<QVersitDocument>();
1083 foreach (const QVersitProperty &valarmProp, expectedVAlarmDocument.properties()) {
1084 if (!actualVAlarmDocument.properties().contains(t: valarmProp)) {
1085 qDebug() << "Actual:" << actualVAlarmDocument.properties();
1086 qDebug() << "Expected to find:" << valarmProp;
1087 QVERIFY(false);
1088 }
1089 }
1090 } else if (!actualProperties.contains(t: expectedProperty)) {
1091 qDebug() << "Actual:" << actualProperties;
1092 qDebug() << "Expected to find:" << expectedProperty;
1093 QVERIFY(false);
1094 }
1095 }
1096}
1097
1098void tst_QVersitOrganizerExporter::testExportTodoDetails_data()
1099{
1100 QTest::addColumn<QList<QOrganizerItemDetail> >(name: "details");
1101 QTest::addColumn<QList<QVersitProperty> >(name: "expectedProperties");
1102
1103 {
1104 QList<QVersitProperty> properties;
1105 QVersitProperty dtstart;
1106 dtstart.setName(QStringLiteral("DTSTART"));
1107 dtstart.setValue(QStringLiteral("20100102"));
1108 dtstart.insertParameter(QStringLiteral("VALUE"), QStringLiteral("DATE"));
1109 properties << dtstart;
1110 QVersitProperty due;
1111 due.setName(QStringLiteral("DUE"));
1112 due.setValue(QStringLiteral("20100103"));
1113 due.insertParameter(QStringLiteral("VALUE"), QStringLiteral("DATE"));
1114 properties << due;
1115 QOrganizerTodoTime todoTime;
1116 todoTime.setStartDateTime(QDateTime(QDate(2010, 1, 2), QTime(3, 4, 5)));
1117 todoTime.setDueDateTime(QDateTime(QDate(2010, 1, 3), QTime(3, 4, 6)));
1118 todoTime.setAllDay(true);
1119 QTest::newRow(dataTag: "all day todo") << (QList<QOrganizerItemDetail>() << todoTime)
1120 << properties;
1121 }
1122
1123 {
1124 QVersitProperty property;
1125 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
1126 QList<QVersitProperty> valarmProperties;
1127 QMultiHash<QString, QString> parameters;
1128 property.setName(QStringLiteral("ACTION"));
1129 property.setValue(QStringLiteral("AUDIO"));
1130 valarmProperties << property;
1131 property.setName(QStringLiteral("ATTACH"));
1132 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
1133 valarmProperties << property;
1134 property.setName(QStringLiteral("DURATION"));
1135 property.setValue(QStringLiteral("PT5S"));
1136 valarmProperties << property;
1137 property.setName(QStringLiteral("REPEAT"));
1138 property.setValue(3);
1139 valarmProperties << property;
1140 property.setName(QStringLiteral("TRIGGER"));
1141 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("END"));
1142 property.setParameters(parameters);
1143 property.setValue(QStringLiteral("-PT90S"));
1144 valarmProperties << property;
1145 property.clear();
1146 valarmDocument.setComponentType("VALARM");
1147 valarmDocument.setProperties(valarmProperties);
1148 property.setValueType(QVersitProperty::VersitDocumentType);
1149 property.setName(QStringLiteral("VALARM"));
1150 property.setValue(QVariant::fromValue(value: valarmDocument));
1151 QOrganizerItemAudibleReminder audibleReminder;
1152 audibleReminder.setDataUrl(QUrl("http://qt.nokia.com"));
1153 audibleReminder.setRepetition(count: 3, delaySeconds: 5);
1154 audibleReminder.setSecondsBeforeStart(90);
1155 QTest::newRow(dataTag: "audible reminder") << (QList<QOrganizerItemDetail>() << audibleReminder)
1156 << (QList<QVersitProperty>() << property);
1157 }
1158
1159 {
1160 QVersitProperty property;
1161 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
1162 QList<QVersitProperty> valarmProperties;
1163 QMultiHash<QString, QString> parameters;
1164
1165 property.setName(QStringLiteral("ACTION"));
1166 property.setValue(QStringLiteral("DISPLAY"));
1167 valarmProperties << property;
1168 property.setName(QStringLiteral("x-QTPROJECT-ATTACH"));
1169 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
1170 valarmProperties << property;
1171 property.setName(QStringLiteral("DURATION"));
1172 property.setValue(QStringLiteral("PT5S"));
1173 valarmProperties << property;
1174 property.setName(QStringLiteral("REPEAT"));
1175 property.setValue(3);
1176 valarmProperties << property;
1177 property.setName(QStringLiteral("TRIGGER"));
1178 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("END"));
1179 property.setParameters(parameters);
1180 property.setValue(QStringLiteral("-PT90S"));
1181 valarmProperties << property;
1182 property.clear();
1183 property.setName(QStringLiteral("DESCRIPTION"));
1184 property.setValue(QStringLiteral("Test visual reminder"));
1185 valarmProperties << property;
1186
1187 valarmDocument.setComponentType("VALARM");
1188 valarmDocument.setProperties(valarmProperties);
1189 property.setValueType(QVersitProperty::VersitDocumentType);
1190 property.setName(QStringLiteral("VALARM"));
1191 property.setValue(QVariant::fromValue(value: valarmDocument));
1192 QOrganizerItemVisualReminder visualReminder;
1193 visualReminder.setDataUrl(QUrl("http://qt.nokia.com"));
1194 visualReminder.setRepetition(count: 3, delaySeconds: 5);
1195 visualReminder.setSecondsBeforeStart(90);
1196 visualReminder.setMessage(QStringLiteral("Test visual reminder"));
1197 QTest::newRow(dataTag: "visual reminder") << (QList<QOrganizerItemDetail>() << visualReminder)
1198 << (QList<QVersitProperty>() << property);
1199 }
1200
1201 {
1202 QVersitProperty property;
1203 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
1204 QList<QVersitProperty> valarmProperties;
1205 QMultiHash<QString, QString> parameters;
1206
1207 property.setName(QStringLiteral("ACTION"));
1208 property.setValue(QStringLiteral("DISPLAY"));
1209 valarmProperties << property;
1210 property.setName(QStringLiteral("x-QTPROJECT-ATTACH"));
1211 property.setValue(QUrl(QStringLiteral("http://qt.nokia.com")));
1212 valarmProperties << property;
1213 property.setName(QStringLiteral("DURATION"));
1214 property.setValue(QStringLiteral("PT5S"));
1215 valarmProperties << property;
1216 property.setName(QStringLiteral("REPEAT"));
1217 property.setValue(3);
1218 valarmProperties << property;
1219 property.setName(QStringLiteral("TRIGGER"));
1220 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("END"));
1221 property.setParameters(parameters);
1222 property.setValue(QStringLiteral("-PT90S"));
1223 valarmProperties << property;
1224 property.clear();
1225 property.setName(QStringLiteral("DESCRIPTION"));
1226 property.setValue(QStringLiteral(""));
1227 valarmProperties << property;
1228
1229 valarmDocument.setComponentType("VALARM");
1230 valarmDocument.setProperties(valarmProperties);
1231 property.setValueType(QVersitProperty::VersitDocumentType);
1232 property.setName(QStringLiteral("VALARM"));
1233 property.setValue(QVariant::fromValue(value: valarmDocument));
1234 QOrganizerItemVisualReminder visualReminder;
1235 visualReminder.setDataUrl(QUrl("http://qt.nokia.com"));
1236 visualReminder.setRepetition(count: 3, delaySeconds: 5);
1237 visualReminder.setSecondsBeforeStart(90);
1238 QTest::newRow(dataTag: "visual reminder: no message") << (QList<QOrganizerItemDetail>() << visualReminder)
1239 << (QList<QVersitProperty>() << property);
1240 }
1241
1242 {
1243 QVersitProperty property;
1244 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
1245 QList<QVersitProperty> valarmProperties;
1246 QMultiHash<QString, QString> parameters;
1247
1248 property.setName(QStringLiteral("ACTION"));
1249 property.setValue(QStringLiteral("EMAIL"));
1250 valarmProperties << property;
1251 property.setName(QStringLiteral("DURATION"));
1252 property.setValue(QStringLiteral("PT5S"));
1253 valarmProperties << property;
1254 property.setName(QStringLiteral("REPEAT"));
1255 property.setValue(3);
1256 valarmProperties << property;
1257 property.setName(QStringLiteral("TRIGGER"));
1258 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("END"));
1259 property.setParameters(parameters);
1260 property.setValue(QStringLiteral("-PT90S"));
1261 valarmProperties << property;
1262 property.clear();
1263 property.setName(QStringLiteral("DESCRIPTION"));
1264 property.setValue(QStringLiteral("Test email body"));
1265 valarmProperties << property;
1266 property.setName(QStringLiteral("SUMMARY"));
1267 property.setValue(QStringLiteral("Test email subject"));
1268 valarmProperties << property;
1269 property.setName(QStringLiteral("ATTENDEE"));
1270 property.setValue(QStringLiteral("First email recipient"));
1271 valarmProperties << property;
1272 property.setValue(QStringLiteral("Second email recipient"));
1273 valarmProperties << property;
1274
1275 valarmDocument.setComponentType("VALARM");
1276 valarmDocument.setProperties(valarmProperties);
1277 property.setValueType(QVersitProperty::VersitDocumentType);
1278 property.setName(QStringLiteral("VALARM"));
1279 property.setValue(QVariant::fromValue(value: valarmDocument));
1280 QOrganizerItemEmailReminder emailReminder;
1281 QVariantList attachments;
1282 emailReminder.setRepetition(count: 3, delaySeconds: 5);
1283 emailReminder.setSecondsBeforeStart(90);
1284 emailReminder.setRecipients((QStringList() << QStringLiteral("First email recipient")
1285 << QStringLiteral("Second email recipient")));
1286 emailReminder.setContents(QStringLiteral("Test email subject"),
1287 QStringLiteral("Test email body"),
1288 attachments);
1289 QTest::newRow(dataTag: "email reminder") << (QList<QOrganizerItemDetail>() << emailReminder)
1290 << (QList<QVersitProperty>() << property);
1291 }
1292
1293 {
1294 QVersitProperty property;
1295 QVersitDocument valarmDocument(QVersitDocument::ICalendar20Type);
1296 QList<QVersitProperty> valarmProperties;
1297 QMultiHash<QString, QString> parameters;
1298
1299 property.setName(QStringLiteral("ACTION"));
1300 property.setValue(QStringLiteral("EMAIL"));
1301 valarmProperties << property;
1302 property.setName(QStringLiteral("DURATION"));
1303 property.setValue(QStringLiteral("PT5S"));
1304 valarmProperties << property;
1305 property.setName(QStringLiteral("REPEAT"));
1306 property.setValue(3);
1307 valarmProperties << property;
1308 property.setName(QStringLiteral("TRIGGER"));
1309 parameters.insert(QStringLiteral("RELATED"), QStringLiteral("END"));
1310 property.setParameters(parameters);
1311 property.setValue(QStringLiteral("-PT90S"));
1312 valarmProperties << property;
1313 property.clear();
1314 property.setName(QStringLiteral("DESCRIPTION"));
1315 property.setValue(QStringLiteral(""));
1316 valarmProperties << property;
1317 property.setName(QStringLiteral("SUMMARY"));
1318 property.setValue(QStringLiteral(""));
1319 valarmProperties << property;
1320 property.setName(QStringLiteral("ATTENDEE"));
1321 property.setValue(QStringLiteral("First email recipient"));
1322 valarmProperties << property;
1323 property.setValue(QStringLiteral("Second email recipient"));
1324 valarmProperties << property;
1325
1326 valarmDocument.setComponentType("VALARM");
1327 valarmDocument.setProperties(valarmProperties);
1328 property.setValueType(QVersitProperty::VersitDocumentType);
1329 property.setName(QStringLiteral("VALARM"));
1330 property.setValue(QVariant::fromValue(value: valarmDocument));
1331 QOrganizerItemEmailReminder emailReminder;
1332 QVariantList attachments;
1333 emailReminder.setRepetition(count: 3, delaySeconds: 5);
1334 emailReminder.setSecondsBeforeStart(90);
1335 emailReminder.setRecipients((QStringList() << QStringLiteral("First email recipient")
1336 << QStringLiteral("Second email recipient")));
1337 emailReminder.setValue(field: QOrganizerItemEmailReminder::FieldAttachments, value: attachments);
1338 QTest::newRow(dataTag: "email reminder: no subject, no body") << (QList<QOrganizerItemDetail>() << emailReminder)
1339 << (QList<QVersitProperty>() << property);
1340 }
1341
1342
1343 {
1344 QVersitProperty property;
1345 property.setName(QStringLiteral("STATUS"));
1346 property.setValue(QStringLiteral("COMPLETED"));
1347 QOrganizerTodoProgress progress;
1348 progress.setStatus(QOrganizerTodoProgress::StatusComplete);
1349 QTest::newRow(dataTag: "status completed")
1350 << (QList<QOrganizerItemDetail>() << progress)
1351 << (QList<QVersitProperty>() << property);
1352
1353 property.setValue(QStringLiteral("NEEDS-ACTION"));
1354 progress.setStatus(QOrganizerTodoProgress::StatusNotStarted);
1355 QTest::newRow(dataTag: "status needs-action")
1356 << (QList<QOrganizerItemDetail>() << progress)
1357 << (QList<QVersitProperty>() << property);
1358
1359 property.setValue(QStringLiteral("IN-PROCESS"));
1360 progress.setStatus(QOrganizerTodoProgress::StatusInProgress);
1361 QTest::newRow(dataTag: "status in-process")
1362 << (QList<QOrganizerItemDetail>() << progress)
1363 << (QList<QVersitProperty>() << property);
1364 }
1365
1366 {
1367 QVersitProperty property;
1368 property.setName(QStringLiteral("PERCENT-COMPLETE"));
1369 property.setValue(QStringLiteral("42"));
1370 QOrganizerTodoProgress progress;
1371 progress.setPercentageComplete(42);
1372 QTest::newRow(dataTag: "percent-complete")
1373 << (QList<QOrganizerItemDetail>() << progress)
1374 << (QList<QVersitProperty>() << property);
1375 }
1376
1377 {
1378 QVersitProperty property;
1379 property.setName(QStringLiteral("COMPLETED"));
1380 property.setValue(QStringLiteral("20100609T161500"));
1381 QOrganizerTodoProgress progress;
1382 progress.setFinishedDateTime(QDateTime(QDate(2010, 6, 9), QTime(16, 15, 0)));
1383 QTest::newRow(dataTag: "completed")
1384 << (QList<QOrganizerItemDetail>() << progress)
1385 << (QList<QVersitProperty>() << property);
1386 }
1387
1388 {
1389 QVersitProperty property;
1390 property.setName(QStringLiteral("CATEGORIES"));
1391 property.setValue(QStringLiteral("Important Event"));
1392 QOrganizerItemTag tag;
1393 tag.setTag(QStringLiteral("Important Event"));
1394 QTest::newRow(dataTag: "tag 1")
1395 << (QList<QOrganizerItemDetail>() << tag)
1396 << (QList<QVersitProperty>() << property);
1397
1398 // Set another one for multiple handling test
1399 property.setValue(QStringLiteral("Important Event 2"));
1400 tag.setTag(QStringLiteral("Important Event 2"));
1401 QTest::newRow(dataTag: "tag 2")
1402 << (QList<QOrganizerItemDetail>() << tag)
1403 << (QList<QVersitProperty>() << property);
1404
1405 // Empty tag
1406 property.clear();
1407 property.setName("CATEGORIES");
1408 tag.removeValue(field: QOrganizerItemTag::FieldTag);
1409 QTest::newRow(dataTag: "empty tag")
1410 << (QList<QOrganizerItemDetail>() << tag)
1411 << (QList<QVersitProperty>() << property);
1412 }
1413
1414 {
1415 QVersitProperty property = createExtendedDetailPropertyForStringData(name: "name", data: "data");
1416 QOrganizerItemExtendedDetail extendedDetail = createExtendedDetail(name: "name", QStringLiteral("data"));
1417 QTest::newRow(dataTag: "extended detail") << (QList<QOrganizerItemDetail>() << extendedDetail)
1418 << (QList<QVersitProperty>() << property);
1419 }
1420}
1421
1422void tst_QVersitOrganizerExporter::testExtendedDetail()
1423{
1424 QFETCH(QString, extendedDetailName);
1425 QFETCH(QVariant, extendedDetailData);
1426 QFETCH(QString, extendedDetailDataInProperty);
1427 QFETCH(bool, extendedDetailPropertyCreated);
1428
1429 QOrganizerEvent item;
1430 QOrganizerItemExtendedDetail extendedDetail = createExtendedDetail(name: extendedDetailName, data: extendedDetailData);
1431 item.saveDetail(detail: &extendedDetail);
1432
1433 QVersitProperty expectedProperty =
1434 createExtendedDetailProperty(name: extendedDetailName, data: extendedDetailDataInProperty);
1435
1436 QVersitOrganizerExporter exporter;
1437 QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item));
1438
1439 QVersitDocument document = exporter.document().subDocuments().first();
1440 QList<QVersitProperty> actualProperties =
1441 findPropertiesByName(document, propertyName: expectedProperty.name());
1442 if (!extendedDetailPropertyCreated) {
1443 QCOMPARE(actualProperties.size(), 0);
1444 } else {
1445 QCOMPARE(actualProperties.size(), 1);
1446 if (static_cast<QMetaType::Type>(extendedDetailData.type()) == QMetaType::Double
1447 || static_cast<QMetaType::Type>(extendedDetailData.type()) == QMetaType::Float) {
1448 QCOMPARE(actualProperties.first().name(), expectedProperty.name());
1449 QStringList actualStringList = actualProperties.first().variantValue().toStringList();
1450 QCOMPARE(actualStringList.size(), 2);
1451 QString actualString = actualStringList.at(i: 1);
1452 actualString.replace(c: '[',after: "").replace(c: ']',after: "").replace(c: '\n', after: "");
1453 QStringList expectedStringList = expectedProperty.variantValue().toStringList();
1454 QCOMPARE(expectedStringList.size(), 2);
1455 QString expectedString = expectedStringList.at(i: 1);
1456 expectedString.replace(c: '[',after: "").replace(c: ']',after: "").replace(c: '\n', after: "");
1457 if (static_cast<QMetaType::Type>(extendedDetailData.type()) == QMetaType::Float) {
1458 float actualF = actualString.toFloat();
1459 float expectedF = expectedString.toFloat();
1460 QCOMPARE(actualStringList.first(), expectedStringList.first()); // "name"
1461 QCOMPARE(actualF, expectedF); // "value"
1462 } else {
1463 double actualD = actualString.toDouble();
1464 double expectedD = expectedString.toDouble();
1465 QCOMPARE(actualStringList.first(), expectedStringList.first()); // "name"
1466 QCOMPARE(actualD, expectedD); // "value"
1467 }
1468 } else if (!actualProperties.contains(t: expectedProperty)) {
1469 qDebug() << "Actual:" << actualProperties;
1470 qDebug() << "Expected to find:" << expectedProperty;
1471 QVERIFY(false);
1472 }
1473 }
1474}
1475
1476void tst_QVersitOrganizerExporter::testExtendedDetail_data()
1477{
1478 QTest::addColumn<QString>(name: "extendedDetailName");
1479 QTest::addColumn<QVariant>(name: "extendedDetailData");
1480 QTest::addColumn<QString>(name: "extendedDetailDataInProperty");
1481 QTest::addColumn<bool>(name: "extendedDetailPropertyCreated");
1482
1483 QString jsonArrayWith("[\n %1\n]\n");
1484 QString jsonArrayWithString = jsonArrayWith.arg(a: "\"%1\"");
1485 {
1486 QTest::newRow(dataTag: "string data")
1487 << QString("name")
1488 << QVariant(QString("data"))
1489 << jsonArrayWithString.arg(a: "data")
1490 << true;
1491 QTest::newRow(dataTag: "string data, empty")
1492 << QString("name")
1493 << QVariant(QString(""))
1494 << jsonArrayWithString.arg(a: "")
1495 << true;
1496 QTest::newRow(dataTag: "string data, containing reserved characters")
1497 << QString("name")
1498 << QVariant(QString(",;:\\"))
1499 << jsonArrayWithString.arg(a: ",;:\\\\")
1500 << true;
1501 }
1502
1503 {
1504 QTest::newRow(dataTag: "double data")
1505 << QString("name")
1506 << QVariant((double)2.0)
1507 << jsonArrayWith.arg(a: "2")
1508 << true;
1509 QTest::newRow(dataTag: "double data, negative")
1510 << QString("name")
1511 << QVariant((double)-1.0)
1512 << jsonArrayWith.arg(a: "-1")
1513 << true;
1514 QTest::newRow(dataTag: "double data, multiple digits")
1515 << QString("name")
1516 << QVariant::fromValue<double>(value: 10.199999999999999)
1517 << jsonArrayWith.arg(a: "10.199999999999999")
1518 << true;
1519 }
1520
1521 {
1522 QTest::newRow(dataTag: "boolean data")
1523 << QString("name")
1524 << QVariant(true)
1525 << jsonArrayWith.arg(a: "true")
1526 << true;
1527 }
1528
1529 {
1530 QTest::newRow(dataTag: "integer data, serialized as number/double")
1531 << QString("name")
1532 << QVariant((int)2)
1533 << jsonArrayWith.arg(a: "2")
1534 << true;
1535 QTest::newRow(dataTag: "integer data, serialized as number/double")
1536 << QString("name")
1537 << QVariant((int)-10)
1538 << jsonArrayWith.arg(a: "-10")
1539 << true;
1540 }
1541 {
1542 QTest::newRow(dataTag: "datetime data (using local time)")
1543 << QString("name")
1544 << QVariant(QDateTime::fromString(s: "1997-07-16T19:20:30.123+01:00", f: Qt::ISODate))
1545 << jsonArrayWithString.arg(a: "1997-07-16T19:20:30+01:00")
1546 << true;
1547 QTest::newRow(dataTag: "datetime data (using UTC)")
1548 << QString("name")
1549 << QVariant(QDateTime::fromString(s: "1997-07-16T19:20:30.123+01:00", f: Qt::ISODate).toUTC())
1550 << jsonArrayWithString.arg(a: "1997-07-16T18:20:30Z")
1551 << true;
1552 QTest::newRow(dataTag: "datetime data (using local time with unspecified timezone)")
1553 << QString("name")
1554 << QVariant(QDateTime::fromString(s: "1997-07-16T19:20:30", f: Qt::ISODate))
1555 << jsonArrayWithString.arg(a: "1997-07-16T19:20:30")
1556 << true;
1557 }
1558
1559 {
1560 QTest::newRow(dataTag: "list data")
1561 << QString("name")
1562 << QVariant(QVariantList() << QString("string 1") << QString("string 2"))
1563 << QString("[\n [\n \"string 1\",\n \"string 2\"\n ]\n]\n")
1564 << true;
1565 }
1566
1567 {
1568 QVariantMap map;
1569 map["key 1"] = QString("string 1");
1570 map["key 2"] = QString("string 2");
1571 QTest::newRow(dataTag: "map data")
1572 << QString("name")
1573 << QVariant(map)
1574 << QString("[\n {\n \"key 1\": \"string 1\",\n \"key 2\": \"string 2\"\n }\n]\n")
1575 << true;
1576 }
1577
1578 {
1579 QVariantMap map;
1580 map["key"] = QVariantList() << (double)1 << (double)2;
1581 QTest::newRow(dataTag: "map data, containing a nested list")
1582 << QString("name")
1583 << QVariant(map)
1584 << QString("[\n {\n \"key\": [\n 1,\n 2\n ]\n }\n]\n")
1585 << true;
1586 }
1587
1588 {
1589 QTest::newRow(dataTag: "empty string as name")
1590 << QString("")
1591 << QVariant(QString("data"))
1592 << jsonArrayWithString.arg(a: "data")
1593 << true;
1594 QTest::newRow(dataTag: "name containing reserved characters")
1595 << QString(",;:\\")
1596 << QVariant(QString("data"))
1597 << jsonArrayWithString.arg(a: "data")
1598 << true;
1599 }
1600
1601 {
1602 QTest::newRow(dataTag: "empty variant as data")
1603 << QString("name")
1604 << QVariant()
1605 << jsonArrayWith.arg(a: "null")
1606 << true;
1607 }
1608
1609 {
1610 QVariantHash hash;
1611 hash["key 1"] = QString("string 1");
1612 hash["key 2"] = QString("string 2");
1613 QTest::newRow(dataTag: "hash data")
1614 << QString("name")
1615 << QVariant(hash)
1616 << QString("[\n {\n \"key 1\": \"string 1\",\n \"key 2\": \"string 2\"\n }\n]\n")
1617 << true;
1618 }
1619 {
1620 QTest::newRow(dataTag: "data type not supported")
1621 << QString("name")
1622 << QVariant(QSize(1, 1))
1623 << QString()
1624 << false;
1625 }
1626}
1627
1628void tst_QVersitOrganizerExporter::testMultipleExtendedDetails()
1629{
1630 QOrganizerEvent item;
1631 QOrganizerItemExtendedDetail extendedDetail1 = createExtendedDetail(name: "detailName1", data: "detailData1");
1632 item.saveDetail(detail: &extendedDetail1);
1633 QOrganizerItemExtendedDetail extendedDetail2 = createExtendedDetail(name: "detailName2", data: "detailData2");
1634 item.saveDetail(detail: &extendedDetail2);
1635
1636 QList<QVersitProperty> expectedProperties;
1637 expectedProperties << createExtendedDetailPropertyForStringData(name: extendedDetail1.name(), data: "detailData1");
1638 expectedProperties << createExtendedDetailPropertyForStringData(name: extendedDetail2.name(), data: "detailData2");
1639
1640 QVersitOrganizerExporter exporter;
1641 QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item));
1642
1643 QVersitDocument document = exporter.document().subDocuments().first();
1644 QCOMPARE(findPropertiesByName(document, expectedProperties.first().name()).size(), 2);
1645 foreach (const QVersitProperty& expectedProperty, expectedProperties) {
1646 QList<QVersitProperty> actualProperties =
1647 findPropertiesByName(document, propertyName: expectedProperty.name());
1648 if (!actualProperties.contains(t: expectedProperty)) {
1649 qDebug() << "Actual:" << actualProperties;
1650 qDebug() << "Expected to find:" << expectedProperty;
1651 QVERIFY(false);
1652 }
1653 }
1654}
1655
1656QOrganizerItemExtendedDetail tst_QVersitOrganizerExporter::createExtendedDetail(
1657 const QString &name,
1658 const QVariant &data)
1659{
1660 QOrganizerItemExtendedDetail extendedDetail;
1661 extendedDetail.setName(name);
1662 extendedDetail.setData(data);
1663 return extendedDetail;
1664}
1665
1666QVersitProperty tst_QVersitOrganizerExporter::createExtendedDetailProperty(
1667 const QString &name,
1668 const QVariant &data)
1669{
1670 QVersitProperty property;
1671 property.setName(QStringLiteral("X-QTPROJECT-EXTENDED-DETAIL"));
1672 property.setValueType(QVersitProperty::CompoundType);
1673 property.setValue(QStringList() << name << data.toString());
1674 return property;
1675}
1676
1677QVersitProperty tst_QVersitOrganizerExporter::createExtendedDetailPropertyForStringData(
1678 const QString &name,
1679 const QString &data)
1680{
1681 QString jsonArrayWith("[\n %1\n]\n");
1682 QString jsonArrayWithString = jsonArrayWith.arg(a: "\"%1\"");
1683 return createExtendedDetailProperty(name, data: jsonArrayWithString.arg(a: data));
1684}
1685
1686QList<QVersitProperty> tst_QVersitOrganizerExporter::findPropertiesByName(
1687 const QVersitDocument &document, const QString &propertyName)
1688{
1689 QList<QVersitProperty> retval;
1690 foreach (const QVersitProperty& property, document.properties()) {
1691 if (property.name() == propertyName)
1692 retval << property;
1693 }
1694 return retval;
1695}
1696
1697void tst_QVersitOrganizerExporter::testEmptyItemShouldNotBeExported()
1698{
1699 QVersitOrganizerExporter exporter;
1700 QList<QOrganizerItem> items;
1701
1702 QOrganizerEvent ev;
1703 QVERIFY(ev.isEmpty());
1704 QOrganizerItem item1;
1705 QVERIFY(item1.isEmpty());
1706 items << static_cast<QOrganizerItem>(ev)<<item1;
1707
1708 QVERIFY(!exporter.exportItems(items));
1709 QVERIFY(!exporter.errorMap().isEmpty());
1710
1711 QVersitOrganizerExporter::Error errorCode = exporter.errorMap().value(akey: 0);
1712 QVERIFY2(errorCode == QVersitOrganizerExporter::EmptyOrganizerError,
1713 QString("exporter.errorMap().value(0) == "
1714 + QString::number(errorCode)).toStdString().c_str());
1715 errorCode = exporter.errorMap().value(akey: 1);
1716 QVERIFY2(errorCode == QVersitOrganizerExporter::EmptyOrganizerError
1717 || errorCode == QVersitOrganizerExporter::UnknownComponentTypeError,
1718 QString("exporter.errorMap().value(1) == "
1719 + QString::number(errorCode)).toStdString().c_str() );
1720 items.clear();
1721 exporter.errorMap().clear();
1722}
1723
1724QTEST_MAIN(tst_QVersitOrganizerExporter)
1725

source code of qtpim/tests/auto/versitorganizer/qversitorganizerexporter/tst_qversitorganizerexporter.cpp