diff options
author | Kevin Wu Won <kevin.wu-won@nokia.com> | 2010-06-09 18:00:37 +1000 |
---|---|---|
committer | Kevin Wu Won <kevin.wu-won@nokia.com> | 2010-06-09 18:00:37 +1000 |
commit | d88cfc1f35eb143b78d12356db1a8564e22fdb7e (patch) | |
tree | 3a87a35e5099094309636b121d7a73dda9079ee2 | |
parent | 89b7b1b3a11298edb7fd7353c8b96e3b05f6d164 (diff) |
Implmented import/export of QOrganizerItemTodoProgress details
8 files changed, 291 insertions, 0 deletions
diff --git a/src/versit/qversitorganizerexporter_p.cpp b/src/versit/qversitorganizerexporter_p.cpp index 0fa7769546..026db3fd13 100644 --- a/src/versit/qversitorganizerexporter_p.cpp +++ b/src/versit/qversitorganizerexporter_p.cpp @@ -122,6 +122,8 @@ void QVersitOrganizerExporterPrivate::exportDetail( encodePriority(detail, *document, &removedProperties, &generatedProperties, &processedFields); } else if (detail.definitionName() == QOrganizerItemInstanceOrigin::DefinitionName) { encodeInstanceOrigin(detail, *document, &removedProperties, &generatedProperties, &processedFields); + } else if (detail.definitionName() == QOrganizerItemTodoProgress::DefinitionName) { + encodeTodoProgress(detail, *document, &removedProperties, &generatedProperties, &processedFields); } else if (mPropertyMappings.contains(detail.definitionName())) { encodeSimpleProperty(detail, *document, &removedProperties, &generatedProperties, &processedFields); } @@ -413,6 +415,55 @@ void QVersitOrganizerExporterPrivate::encodeInstanceOrigin( *processedFields << QOrganizerItemInstanceOrigin::FieldOriginalDate; } +void QVersitOrganizerExporterPrivate::encodeTodoProgress( + const QOrganizerItemDetail& detail, + const QVersitDocument& document, + QList<QVersitProperty>* removedProperties, + QList<QVersitProperty>* generatedProperties, + QSet<QString>* processedFields) +{ + QOrganizerItemTodoProgress todoProgress = static_cast<QOrganizerItemTodoProgress>(detail); + + if (todoProgress.finishedDateTime().isValid()) { + QVersitProperty property = + VersitUtils::takeProperty(document, QLatin1String("COMPLETED"), removedProperties); + property.setName(QLatin1String("COMPLETED")); + property.setValue(todoProgress.finishedDateTime().toString(QLatin1String("yyyyMMddTHHmmss"))); + *generatedProperties << property; + *processedFields << QOrganizerItemTodoProgress::FieldFinishedDateTime; + } + + if (todoProgress.hasValue(QOrganizerItemTodoProgress::FieldPercentageComplete)) { + QVersitProperty property = + VersitUtils::takeProperty(document, QLatin1String("PERCENT-COMPLETE"), removedProperties); + property.setName(QLatin1String("PERCENT-COMPLETE")); + property.setValue(QString::number(todoProgress.percentageComplete())); + *generatedProperties << property; + *processedFields << QOrganizerItemTodoProgress::FieldPercentageComplete; + } + + if (todoProgress.hasValue(QOrganizerItemTodoProgress::FieldStatus)) { + QVersitProperty property = + VersitUtils::takeProperty(document, QLatin1String("STATUS"), removedProperties); + property.setName(QLatin1String("STATUS")); + switch (todoProgress.status()) { + case QOrganizerItemTodoProgress::StatusNotStarted: + property.setValue(QLatin1String("NEEDS-ACTION")); + break; + case QOrganizerItemTodoProgress::StatusInProgress: + property.setValue(QLatin1String("IN-PROCESS")); + break; + case QOrganizerItemTodoProgress::StatusComplete: + property.setValue(QLatin1String("COMPLETED")); + break; + default: + return; + } + *generatedProperties << property; + *processedFields << QOrganizerItemTodoProgress::FieldStatus; + } +} + void QVersitOrganizerExporterPrivate::encodeSimpleProperty( const QOrganizerItemDetail& detail, const QVersitDocument& document, diff --git a/src/versit/qversitorganizerexporter_p.h b/src/versit/qversitorganizerexporter_p.h index 3d60ddea96..0be5b9b6a0 100644 --- a/src/versit/qversitorganizerexporter_p.h +++ b/src/versit/qversitorganizerexporter_p.h @@ -118,6 +118,12 @@ private: QList<QVersitProperty>* removedProperties, QList<QVersitProperty>* generatedProperties, QSet<QString>* processedFields); + void encodeTodoProgress( + const QOrganizerItemDetail& detail, + const QVersitDocument& document, + QList<QVersitProperty>* removedProperties, + QList<QVersitProperty>* generatedProperties, + QSet<QString>* processedFields); void encodeSimpleProperty( const QOrganizerItemDetail& detail, const QVersitDocument& document, diff --git a/src/versit/qversitorganizerimporter_p.cpp b/src/versit/qversitorganizerimporter_p.cpp index e71b492ae6..3bc6f76fe6 100644 --- a/src/versit/qversitorganizerimporter_p.cpp +++ b/src/versit/qversitorganizerimporter_p.cpp @@ -139,6 +139,12 @@ void QVersitOrganizerImporterPrivate::importProperty( } else if (property.name() == QLatin1String("RDATE") || (property.name() == QLatin1String("EXDATE"))) { success = createRecurrenceDates(property, item, &updatedDetails); + } else if (property.name() == QLatin1String("STATUS")) { + success = createStatus(property, item, &updatedDetails); + } else if (property.name() == QLatin1String("PERCENT-COMPLETE")) { + success = createPercentageComplete(property, item, &updatedDetails); + } else if (property.name() == QLatin1String("COMPLETED")) { + success = createFinishedDateTime(property, item, &updatedDetails); } } @@ -592,6 +598,56 @@ QDate QVersitOrganizerImporterPrivate::parseDate(QString str) return QDate::fromString(str, QLatin1String("yyyyMMdd")); } +bool QVersitOrganizerImporterPrivate::createStatus( + const QVersitProperty& property, + QOrganizerItem* item, + QList<QOrganizerItemDetail>* updatedDetails) { + QOrganizerItemTodoProgress::Status status; + if (property.value() == QLatin1String("COMPLETED")) + status = QOrganizerItemTodoProgress::StatusComplete; + else if (property.value() == QLatin1String("NEEDS-ACTION")) + status = QOrganizerItemTodoProgress::StatusNotStarted; + else if (property.value() == QLatin1String("IN-PROCESS")) + status = QOrganizerItemTodoProgress::StatusInProgress; + else + return false; + + QOrganizerItemTodoProgress progress(item->detail<QOrganizerItemTodoProgress>()); + progress.setStatus(status); + updatedDetails->append(progress); + return true; +} + +bool QVersitOrganizerImporterPrivate::createPercentageComplete( + const QVersitProperty& property, + QOrganizerItem* item, + QList<QOrganizerItemDetail>* updatedDetails) { + bool ok = false; + int percent = property.value().toInt(&ok); + if (!ok) + return false; + + QOrganizerItemTodoProgress progress(item->detail<QOrganizerItemTodoProgress>()); + progress.setPercentageComplete(percent); + updatedDetails->append(progress); + return true; +} + +bool QVersitOrganizerImporterPrivate::createFinishedDateTime( + const QVersitProperty& property, + QOrganizerItem* item, + QList<QOrganizerItemDetail>* updatedDetails) { + if (property.value().isEmpty()) + return false; + QDateTime datetime = parseDateTime(property.value()); + if (!datetime.isValid()) + return false; + QOrganizerItemTodoProgress progress(item->detail<QOrganizerItemTodoProgress>()); + progress.setFinishedDateTime(datetime); + updatedDetails->append(progress); + return true; +} + /*! Parse the iCalendar duration string \a str in an RDP fashion with a two symbol lookahead, and * returns a Duration that represents it. */ Duration Duration::parseDuration(QString str) diff --git a/src/versit/qversitorganizerimporter_p.h b/src/versit/qversitorganizerimporter_p.h index 430aae04cd..4f9732941a 100644 --- a/src/versit/qversitorganizerimporter_p.h +++ b/src/versit/qversitorganizerimporter_p.h @@ -179,6 +179,19 @@ private: bool parseDateList(const QString& str, QList<QDate>* dates); QDate parseDate(QString str); + bool createStatus( + const QVersitProperty& property, + QOrganizerItem* item, + QList<QOrganizerItemDetail>* updatedDetails); + bool createPercentageComplete( + const QVersitProperty& property, + QOrganizerItem* item, + QList<QOrganizerItemDetail>* updatedDetails); + bool createFinishedDateTime( + const QVersitProperty& property, + QOrganizerItem* item, + QList<QOrganizerItemDetail>* updatedDetails); + // versit property name -> <definition name, field name>: QMap<QString, QPair<QString, QString> > mPropertyMappings; }; diff --git a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp index ff97d491af..49fbcf6e8b 100644 --- a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp +++ b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.cpp @@ -557,6 +557,84 @@ void tst_QVersitOrganizerExporter::testExportEventDetails_data() } } +void tst_QVersitOrganizerExporter::testExportTodoDetails() +{ + QFETCH(QList<QOrganizerItemDetail>, details); + QFETCH(QList<QVersitProperty>, expectedProperties); + + QVersitOrganizerExporter exporter; + QOrganizerTodo item; + foreach (QOrganizerItemDetail detail, details) { + item.saveDetail(&detail); + } + QVERIFY(exporter.exportItems(QList<QOrganizerItem>() << item, QVersitDocument::ICalendar20Type)); + QVERIFY(exporter.errors().isEmpty()); + QVersitDocument document = exporter.document(); + QList<QVersitDocument> subDocuments = document.subDocuments(); + QCOMPARE(subDocuments.size(), 1); + + foreach(const QVersitProperty& expectedProperty, expectedProperties) { + QVersitProperty actualProperty = findPropertyByName(subDocuments.first(), expectedProperty.name()); + if (actualProperty != expectedProperty) { + qDebug() << "Actual:" << actualProperty; + qDebug() << "Expected:" << expectedProperty; + QCOMPARE(actualProperty, expectedProperty); + } + } +} + +void tst_QVersitOrganizerExporter::testExportTodoDetails_data() +{ + QTest::addColumn<QList<QOrganizerItemDetail> >("details"); + QTest::addColumn<QList<QVersitProperty> >("expectedProperties"); + + { + QVersitProperty property; + property.setName(QLatin1String("STATUS")); + property.setValue(QLatin1String("COMPLETED")); + QOrganizerItemTodoProgress progress; + progress.setStatus(QOrganizerItemTodoProgress::StatusComplete); + QTest::newRow("status completed") + << (QList<QOrganizerItemDetail>() << progress) + << (QList<QVersitProperty>() << property); + + property.setValue(QLatin1String("NEEDS-ACTION")); + progress.setStatus(QOrganizerItemTodoProgress::StatusNotStarted); + QTest::newRow("status needs-action") + << (QList<QOrganizerItemDetail>() << progress) + << (QList<QVersitProperty>() << property); + + property.setValue(QLatin1String("IN-PROCESS")); + progress.setStatus(QOrganizerItemTodoProgress::StatusInProgress); + QTest::newRow("status in-process") + << (QList<QOrganizerItemDetail>() << progress) + << (QList<QVersitProperty>() << property); + } + + { + QVersitProperty property; + property.setName(QLatin1String("PERCENT-COMPLETE")); + property.setValue(QLatin1String("42")); + QOrganizerItemTodoProgress progress; + progress.setPercentageComplete(42); + QTest::newRow("percent-complete") + << (QList<QOrganizerItemDetail>() << progress) + << (QList<QVersitProperty>() << property); + } + + { + QVersitProperty property; + property.setName(QLatin1String("COMPLETED")); + property.setValue(QLatin1String("20100609T161500")); + QOrganizerItemTodoProgress progress; + progress.setFinishedDateTime(QDateTime(QDate(2010, 6, 9), QTime(16, 15, 0))); + QTest::newRow("completed") + << (QList<QOrganizerItemDetail>() << progress) + << (QList<QVersitProperty>() << property); + } +} + + QVersitProperty tst_QVersitOrganizerExporter::findPropertyByName( const QVersitDocument &document, const QString &propertyName) { diff --git a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h index 3f4ebd4511..a075767318 100644 --- a/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h +++ b/tests/auto/qversitorganizerexporter/tst_qversitorganizerexporter.h @@ -67,6 +67,9 @@ private slots: void testExportEventDetails(); void testExportEventDetails_data(); + void testExportTodoDetails(); + void testExportTodoDetails_data(); + static QVersitProperty findPropertyByName(const QVersitDocument &document, const QString &propertyName); }; diff --git a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp index c5ef2ebe2b..e9337d329a 100644 --- a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp +++ b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.cpp @@ -638,4 +638,85 @@ void tst_QVersitOrganizerImporter::testImportEventProperties_data() } } +void tst_QVersitOrganizerImporter::testImportTodoProperties() +{ + QFETCH(QList<QVersitProperty>, properties); + QFETCH(QList<QOrganizerItemDetail>, expectedDetails); + + QVersitDocument document(QVersitDocument::ICalendar20Type); + document.setComponentType(QLatin1String("VCALENDAR")); + QVersitDocument nested(QVersitDocument::ICalendar20Type); + nested.setComponentType(QLatin1String("VTODO")); + foreach (const QVersitProperty& property, properties) { + nested.addProperty(property); + } + document.addSubDocument(nested); + + QVersitOrganizerImporter importer; + QVERIFY(importer.importDocument(document)); + QVERIFY(importer.errors().isEmpty()); + QList<QOrganizerItem> items = importer.items(); + QCOMPARE(items.size(), 1); + + foreach (const QOrganizerItemDetail& expectedDetail, expectedDetails) { + QOrganizerItemDetail actualDetail = items.first().detail(expectedDetail.definitionName()); + if (actualDetail != expectedDetail) { + qDebug() << "Actual:" << actualDetail; + qDebug() << "Expected:" << expectedDetail; + QCOMPARE(actualDetail, expectedDetail); + } + } +} + +void tst_QVersitOrganizerImporter::testImportTodoProperties_data() +{ + QTest::addColumn<QList<QVersitProperty> >("properties"); + QTest::addColumn<QList<QOrganizerItemDetail> >("expectedDetails"); + + { + QVersitProperty property; + property.setName(QLatin1String("STATUS")); + property.setValue(QLatin1String("COMPLETED")); + QOrganizerItemTodoProgress progress; + progress.setStatus(QOrganizerItemTodoProgress::StatusComplete); + QTest::newRow("status completed") + << (QList<QVersitProperty>() << property) + << (QList<QOrganizerItemDetail>() << progress); + + property.setValue(QLatin1String("NEEDS-ACTION")); + progress.setStatus(QOrganizerItemTodoProgress::StatusNotStarted); + QTest::newRow("status needs-action") + << (QList<QVersitProperty>() << property) + << (QList<QOrganizerItemDetail>() << progress); + + property.setValue(QLatin1String("IN-PROCESS")); + progress.setStatus(QOrganizerItemTodoProgress::StatusInProgress); + QTest::newRow("status in-process") + << (QList<QVersitProperty>() << property) + << (QList<QOrganizerItemDetail>() << progress); + } + + { + QVersitProperty property; + property.setName(QLatin1String("PERCENT-COMPLETE")); + property.setValue(QLatin1String("42")); + QOrganizerItemTodoProgress progress; + progress.setPercentageComplete(42); + QTest::newRow("percent-complete") + << (QList<QVersitProperty>() << property) + << (QList<QOrganizerItemDetail>() << progress); + } + + { + QVersitProperty property; + property.setName(QLatin1String("COMPLETED")); + property.setValue(QLatin1String("20100609T161500")); + QOrganizerItemTodoProgress progress; + progress.setFinishedDateTime(QDateTime(QDate(2010, 6, 9), QTime(16, 15, 0))); + QTest::newRow("completed") + << (QList<QVersitProperty>() << property) + << (QList<QOrganizerItemDetail>() << progress); + } +} + QTEST_MAIN(tst_QVersitOrganizerImporter) diff --git a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h index f0dd76b3fe..f7096c9d8e 100644 --- a/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h +++ b/tests/auto/qversitorganizerimporter/tst_qversitorganizerimporter.h @@ -61,6 +61,9 @@ private slots: void testImportEventProperties(); void testImportEventProperties_data(); + + void testImportTodoProperties(); + void testImportTodoProperties_data(); }; #endif |