Warning, file /frameworks/kcalendarcore/autotests/testtodo.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002   This file is part of the kcalcore library.
0003 
0004   SPDX-FileCopyrightText: 2006, 2008 Allen Winter <winter@kde.org>
0005 
0006   SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 #include "testtodo.h"
0009 #include "attachment.h"
0010 #include "event.h"
0011 #include "sorting.h"
0012 #include "todo.h"
0013 
0014 #include <QTest>
0015 QTEST_MAIN(TodoTest)
0016 
0017 using namespace KCalendarCore;
0018 
0019 const auto TEST_TZ = "UTC";
0020 
0021 void TodoTest::initTestCase()
0022 {
0023     qputenv("TZ", TEST_TZ);
0024 }
0025 
0026 void TodoTest::testValidity()
0027 {
0028     QDate dt = QDate::currentDate();
0029     Todo todo;
0030     todo.setDtStart(QDateTime(dt, {}));
0031     todo.setDtDue(QDateTime(dt, {}).addDays(1));
0032     todo.setSummary(QStringLiteral("To-do1 Summary"));
0033     todo.setDescription(QStringLiteral("This is a description of the first to-do"));
0034     todo.setLocation(QStringLiteral("the place"));
0035     todo.setPercentComplete(5);
0036 
0037     QCOMPARE(todo.summary(), QStringLiteral("To-do1 Summary"));
0038     QCOMPARE(todo.location(), QStringLiteral("the place"));
0039     QCOMPARE(todo.percentComplete(), 5);
0040 }
0041 
0042 void TodoTest::testCompare()
0043 {
0044     QDate dt = QDate::currentDate();
0045     Todo todo1;
0046     todo1.setDtStart(QDateTime(dt, {}));
0047     todo1.setDtDue(QDateTime(dt, {}).addDays(1));
0048     todo1.setSummary(QStringLiteral("To-do1 Summary"));
0049     todo1.setDescription(QStringLiteral("This is a description of the first to-do"));
0050     todo1.setLocation(QStringLiteral("the place"));
0051     todo1.setCompleted(true);
0052 
0053     Todo todo2;
0054     todo2.setDtStart(QDateTime(dt, {}).addDays(1));
0055     todo2.setDtDue(QDateTime(dt, {}).addDays(2));
0056     todo2.setSummary(QStringLiteral("To-do2 Summary"));
0057     todo2.setDescription(QStringLiteral("This is a description of the second to-do"));
0058     todo2.setLocation(QStringLiteral("the other place"));
0059     todo2.setCompleted(false);
0060 
0061     QVERIFY(!(todo1 == todo2));
0062     QCOMPARE(todo1.dtDue(), todo2.dtStart());
0063     QCOMPARE(todo2.summary(), QStringLiteral("To-do2 Summary"));
0064     QVERIFY(!(todo1.isCompleted() == todo2.isCompleted()));
0065 }
0066 
0067 void TodoTest::testDtDueEqual()
0068 {
0069     QDateTime dt {QDate::currentDate(), QTime::currentTime(), QTimeZone(TEST_TZ)};
0070     QVERIFY(dt.timeSpec() == Qt::TimeZone);
0071 
0072     Todo t1;
0073     t1.setDtDue(dt);
0074     auto t2 = t1.clone();
0075     QVERIFY(t1 == *t2);
0076 
0077     // Create a "floating" datetime, which represents the same instant in real time
0078     // because we're still running in the test's time zone.
0079     dt.setTimeSpec(Qt::LocalTime);
0080 
0081     t1.setDtDue(dt);
0082     QVERIFY(t1 != *t2);
0083     t2->setDtDue(dt);
0084     QVERIFY(t1 == *t2);
0085 }
0086 
0087 void TodoTest::testClone()
0088 {
0089     QDate dt = QDate::currentDate();
0090     Todo todo1;
0091     todo1.setDtStart(QDateTime(dt, {}));
0092     todo1.setDtDue(QDateTime(dt, {}).addDays(1));
0093     todo1.setSummary(QStringLiteral("Todo1 Summary"));
0094     todo1.setDescription(QStringLiteral("This is a description of the first todo"));
0095     todo1.setLocation(QStringLiteral("the place"));
0096 
0097     Todo *todo2 = todo1.clone();
0098     QCOMPARE(todo1.summary(), todo2->summary());
0099     QCOMPARE(todo1.dtStart(), todo2->dtStart());
0100     QCOMPARE(todo1.dtDue(), todo2->dtDue());
0101     QCOMPARE(todo1.description(), todo2->description());
0102     QCOMPARE(todo1.location(), todo2->location());
0103     QCOMPARE(todo1.isCompleted(), todo2->isCompleted());
0104     delete todo2;
0105 }
0106 
0107 void TodoTest::testCopyIncidence()
0108 {
0109     QDate dt = QDate::currentDate();
0110     Event event;
0111     event.setDtStart(QDateTime(dt, {}));
0112     event.setSummary(QStringLiteral("Event1 Summary"));
0113     event.setDescription(QStringLiteral("This is a description of the first event"));
0114     event.setLocation(QStringLiteral("the place"));
0115 
0116     Todo todo(event);
0117     QCOMPARE(todo.uid(), event.uid());
0118     QCOMPARE(todo.dtStart(), event.dtStart());
0119     QCOMPARE(todo.summary(), event.summary());
0120     QCOMPARE(todo.description(), event.description());
0121     QCOMPARE(todo.location(), event.location());
0122 }
0123 
0124 void TodoTest::testCopyConstructor()
0125 {
0126     QDate dt = QDate::currentDate();
0127     Todo todo1;
0128     todo1.setDtStart(QDateTime(dt, {}));
0129     todo1.setDtDue(QDateTime(dt, {}).addDays(1));
0130     todo1.setSummary(QStringLiteral("Todo1 Summary"));
0131     todo1.setDescription(QStringLiteral("This is a description of the first todo"));
0132     todo1.setLocation(QStringLiteral("the place"));
0133 
0134     Todo todo2 {todo1};
0135     QVERIFY(todo1 == todo2);
0136 }
0137 
0138 void TodoTest::testAssign()
0139 {
0140     QDate dt = QDate::currentDate();
0141     Todo todo1;
0142     todo1.setDtStart(QDateTime(dt, {}));
0143     todo1.setDtDue(QDateTime(dt, {}).addDays(1));
0144     todo1.setSummary(QStringLiteral("Todo1 Summary"));
0145     todo1.setDescription(QStringLiteral("This is a description of the first todo"));
0146     todo1.setLocation(QStringLiteral("the place"));
0147 
0148     IncidenceBase *todo2 = new Todo;
0149     *todo2 = todo1;     // Use IncidenceBase's virtual assignment.
0150     QVERIFY(todo1 == *todo2);
0151 
0152     // release todo2
0153     delete todo2;
0154 }
0155 
0156 void TodoTest::testSetCompletedWithDate()
0157 {
0158     Todo t;
0159     t.setStatus(Incidence::StatusNone);
0160     QVERIFY(!t.isCompleted());
0161     QVERIFY(!t.hasCompletedDate());
0162     QVERIFY(t.status() != Incidence::StatusCompleted);
0163     QVERIFY(t.percentComplete() != 100);
0164 
0165     const auto now = QDateTime::currentDateTimeUtc();
0166     t.setCompleted(now);
0167     QVERIFY(t.isCompleted());
0168     QVERIFY(t.completed() == now);
0169     QVERIFY(t.hasCompletedDate());
0170     QVERIFY(t.status() == Incidence::StatusNone);
0171     QVERIFY(t.percentComplete() == 100);
0172 }
0173 
0174 void TodoTest::testSetCompletedWithoutDate()
0175 {
0176     Todo t;
0177     t.setStatus(Incidence::StatusNeedsAction);
0178     QVERIFY(!t.isCompleted());
0179     QVERIFY(!t.hasCompletedDate());
0180     QVERIFY(t.status() != Incidence::StatusCompleted);
0181     QVERIFY(t.percentComplete() != 100);
0182 
0183     t.setCompleted(QDateTime());
0184     QVERIFY(t.isCompleted());
0185     QVERIFY(!t.hasCompletedDate());
0186     QVERIFY(t.status() == Incidence::StatusCompleted);
0187     QVERIFY(t.percentComplete() == 100);
0188 }
0189 
0190 void TodoTest::testSetCompleted()
0191 {
0192     Todo todo1;
0193     todo1.setSummary(QStringLiteral("Todo Summary"));
0194     QDateTime today = QDateTime::currentDateTimeUtc();
0195 
0196     // due yesterday
0197     QDateTime originalDueDate = today.addDays(-1);
0198 
0199     todo1.setDtStart(originalDueDate);
0200     todo1.setDtDue(originalDueDate);
0201     todo1.recurrence()->setDaily(1);
0202     todo1.setCompleted(today);
0203     QVERIFY(originalDueDate != todo1.dtDue());
0204     QVERIFY(!todo1.isCompleted());
0205 }
0206 
0207 void TodoTest::testSetCompletedBool()
0208 {
0209     Todo t;
0210     QVERIFY(!t.isCompleted());
0211     QVERIFY(!t.hasCompletedDate());
0212     QVERIFY(t.status() != Incidence::StatusCompleted);
0213     QVERIFY(t.percentComplete() != 100);
0214 
0215     t.setCompleted(true);
0216     QVERIFY(t.isCompleted());
0217     QVERIFY(!t.hasCompletedDate());
0218     QVERIFY(t.status() == Incidence::StatusCompleted);
0219     QVERIFY(t.percentComplete() == 100);
0220 
0221     const auto yesterday = QDateTime::currentDateTimeUtc().addDays(-1);
0222     t.setCompleted(yesterday);
0223     t.setCompleted(true);
0224     QVERIFY(t.isCompleted());
0225     QVERIFY(t.completed() == yesterday);
0226     QVERIFY(t.status() == Incidence::StatusCompleted);
0227     QVERIFY(t.percentComplete() == 100);
0228 
0229     t.setCompleted(false);
0230     QVERIFY(!t.isCompleted());
0231     QVERIFY(!t.hasCompletedDate());
0232     QVERIFY(t.status() == Incidence::StatusNone);
0233     QVERIFY(t.percentComplete() == 0);
0234 }
0235 
0236 void TodoTest::testSetPercent()
0237 {
0238     Todo t;
0239     t.setStatus(Incidence::StatusCompleted);
0240     t.setCompleted(QDateTime::currentDateTimeUtc());
0241     t.setPercentComplete(100);
0242     QVERIFY(t.percentComplete() == 100);
0243     QVERIFY(t.isCompleted());
0244 
0245     // Completion reset if necessary.
0246     QVERIFY(t.hasCompletedDate());
0247     t.setPercentComplete(99);
0248     QVERIFY(t.percentComplete() == 99);
0249     QVERIFY(!t.isCompleted());
0250     QVERIFY(!t.hasCompletedDate());
0251     QVERIFY(t.status() != Incidence::StatusCompleted);
0252 
0253     t.setPercentComplete(0);
0254     QVERIFY(t.percentComplete() == 0);
0255     QVERIFY(!t.isCompleted());
0256     QVERIFY(!t.hasCompletedDate());
0257     QVERIFY(t.status() != Incidence::StatusCompleted);
0258 }
0259 
0260 void TodoTest::testStatus()
0261 {
0262     QDateTime today = QDateTime::currentDateTimeUtc();
0263     QDateTime yesterday = today.addDays(-1);
0264 
0265     Todo todo1;
0266     todo1.setAllDay(true);
0267     todo1.setDtStart(yesterday);
0268     todo1.setDtDue(today);
0269     todo1.setPercentComplete(50);
0270     QVERIFY(todo1.isInProgress(false));
0271     QVERIFY(!todo1.isNotStarted(false));
0272     QVERIFY(!todo1.isOverdue());
0273     todo1.setPercentComplete(100);
0274     QVERIFY(todo1.isCompleted());
0275 
0276     Todo todo2 = todo1;
0277     todo2.setPercentComplete(33);
0278     todo2.setDtDue(QDateTime());
0279     QVERIFY(todo2.isOpenEnded());
0280 }
0281 
0282 void TodoTest::testSerializer_data()
0283 {
0284     QTest::addColumn<KCalendarCore::Todo::Ptr>("todo");
0285 
0286     QDateTime today = QDateTime::currentDateTimeUtc();
0287     QDateTime yesterday = today.addDays(-1);
0288 
0289     Todo::Ptr todo1 = Todo::Ptr(new Todo());
0290     Todo::Ptr todo2 = Todo::Ptr(new Todo());
0291     Todo::Ptr todo3 = Todo::Ptr(new Todo());
0292     Todo::Ptr todo4 = Todo::Ptr(new Todo());
0293     Todo::Ptr todo5 = Todo::Ptr(new Todo());
0294     Todo::Ptr todo6 = Todo::Ptr(new Todo());
0295 
0296     todo1->setSummary(QStringLiteral("Summary"), false);
0297     todo1->setDescription(QStringLiteral("description"), false);
0298     todo1->setCreated(yesterday);
0299     todo1->setRevision(50);
0300     todo1->setDtDue(yesterday);
0301     todo1->setDtStart(today);
0302     todo1->setPercentComplete(50);
0303     todo1->setLocation(QStringLiteral("<b>location</b>"), false);
0304 
0305     todo2->setDescription(QStringLiteral("<b>description</b>"), true);
0306     todo2->setSummary(QStringLiteral("<b>Summary2</b>"), true);
0307     todo2->setLocation(QStringLiteral("<b>location</b>"), true);
0308     todo2->setDtDue(yesterday);
0309     todo2->setPercentComplete(100);
0310 
0311     todo3->setDtStart(today);
0312     todo3->setPercentComplete(100);
0313     todo3->setCategories(QStringList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c") << QStringLiteral("d"));
0314     todo3->setResources(QStringList() << QStringLiteral("a") << QStringLiteral("b") << QStringLiteral("c") << QStringLiteral("d"));
0315     todo3->setPriority(5);
0316 
0317     QVERIFY(!todo4->dirtyFields().contains(IncidenceBase::FieldRecurrence));
0318     todo4->recurrence()->setDaily(1);
0319     QVERIFY(todo4->dirtyFields().contains(IncidenceBase::FieldRecurrence));
0320 
0321     Attachment attachment(QStringLiteral("http://www.kde.org"));
0322     todo4->addAttachment(attachment);
0323 
0324     todo5->recurrence()->setDaily(1);
0325     todo5->setCompleted(today);
0326     todo5->setStatus(Incidence::StatusDraft);
0327     todo5->setSecrecy(Incidence::SecrecyPrivate);
0328     todo5->setRelatedTo(QStringLiteral("uid1"), Incidence::RelTypeParent);
0329 #if KCALENDARCORE_BUILD_DEPRECATED_SINCE(5, 89)
0330     todo5->setHasGeo(true);
0331 #endif
0332     todo5->setGeoLatitude(40);
0333     todo5->setGeoLongitude(40);
0334     todo5->setOrganizer(QStringLiteral("organizer@mail.com"));
0335 
0336     todo6->recurrence()->setDaily(1);
0337     todo6->setCompleted(today);
0338     todo6->setRecurrenceId(yesterday);
0339     todo6->setStatus(Incidence::StatusDraft);
0340     todo6->setSecrecy(Incidence::SecrecyPrivate);
0341     todo6->setRelatedTo(QStringLiteral("uid1"), Incidence::RelTypeParent);
0342 #if KCALENDARCORE_BUILD_DEPRECATED_SINCE(5, 89)
0343     todo6->setHasGeo(true);
0344 #endif
0345     todo6->setGeoLatitude(40);
0346     todo6->setGeoLongitude(40);
0347     todo6->setUid(QStringLiteral("uid22"));
0348     todo6->setLastModified(today);
0349     todo6->addContact(QStringLiteral("addContact"));
0350 
0351     // Remaining properties tested in testevent.cpp
0352 
0353     QTest::newRow("todo1") << todo1;
0354     QTest::newRow("todo2") << todo2;
0355     QTest::newRow("todo3") << todo3;
0356     QTest::newRow("todo4") << todo4;
0357     QTest::newRow("todo5") << todo5;
0358     QTest::newRow("todo6") << todo6;
0359 }
0360 
0361 void TodoTest::testSerializer()
0362 {
0363     QFETCH(KCalendarCore::Todo::Ptr, todo);
0364     IncidenceBase::Ptr incidenceBase = todo.staticCast<KCalendarCore::IncidenceBase>();
0365 
0366     QByteArray array;
0367     QDataStream stream(&array, QIODevice::WriteOnly);
0368     stream << incidenceBase;
0369 
0370     Todo::Ptr todo2 = Todo::Ptr(new Todo());
0371     IncidenceBase::Ptr incidenceBase2 = todo2.staticCast<KCalendarCore::IncidenceBase>();
0372     QVERIFY(*todo != *todo2);
0373     QDataStream stream2(&array, QIODevice::ReadOnly);
0374     stream2 >> incidenceBase2;
0375     QVERIFY(*todo == *todo2);
0376 }
0377 
0378 void TodoTest::testRoles()
0379 {
0380     const QDateTime today = QDateTime::currentDateTimeUtc();
0381     const QDateTime yesterday = today.addDays(-1);
0382     Todo todo;
0383     todo.setDtStart(today.addDays(-1));
0384     todo.setDtDue(today);
0385     QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), today);
0386     QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), today);
0387     todo.setDtDue(QDateTime());
0388     QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), yesterday);
0389     QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), yesterday);
0390 }
0391 
0392 void TodoTest::testIconNameOneoff()
0393 {
0394     const QDateTime now = QDateTime::currentDateTime();
0395     Todo todo;
0396     todo.setDtStart(now);
0397 
0398     QCOMPARE(todo.iconName(), QLatin1String("view-calendar-tasks"));
0399     todo.setCompleted(now);
0400     QCOMPARE(todo.iconName(), QLatin1String("task-complete"));
0401 }
0402 
0403 void TodoTest::testIconNameRecurringNeverDue()
0404 {
0405     const QDateTime now = QDateTime::currentDateTime();
0406     Todo todo;
0407     todo.setDtStart(now);
0408     todo.recurrence()->setDaily(1);
0409 
0410     QCOMPARE(todo.iconName(now), QLatin1String("view-calendar-tasks"));
0411 
0412     todo.setCompleted(now);
0413     QCOMPARE(todo.iconName(now), QLatin1String("task-complete"));
0414     QCOMPARE(todo.iconName(now.addDays(1)), QLatin1String("view-calendar-tasks"));
0415 }
0416 
0417 void TodoTest::testIconNameRecurringDue()
0418 {
0419     const QDateTime now = QDateTime::currentDateTime();
0420     const QDateTime later = now.addSecs(3600);
0421     Todo todo;
0422     todo.setDtStart(now);
0423     todo.setDtDue(later, /*first=*/true);
0424     todo.recurrence()->setDaily(1);
0425 
0426     QCOMPARE(todo.iconName(now), QLatin1String("view-calendar-tasks"));
0427     QCOMPARE(todo.iconName(later), QLatin1String("view-calendar-tasks")); // Legacy case
0428 
0429     todo.setCompleted(now);
0430     QCOMPARE(todo.iconName(now), QLatin1String("task-complete"));
0431     QCOMPARE(todo.iconName(later), QLatin1String("task-complete")); // Legacy case
0432     QCOMPARE(todo.iconName(now.addDays(1)), QLatin1String("view-calendar-tasks"));
0433 }
0434 
0435 void TodoTest::testCategoriesComparison()
0436 {
0437     QSharedPointer<Todo> small(new Todo);
0438     small->setCategories({QStringLiteral("alpha")});
0439     small->setSummary(QStringLiteral("alpha"));
0440 
0441     QSharedPointer<Todo> medium(new Todo);
0442     medium->setCategories({QStringLiteral("beta")});
0443     medium->setSummary(QStringLiteral("beta 1"));
0444 
0445     QSharedPointer<Todo> large(new Todo);
0446     large->setCategories({QStringLiteral("beta")});
0447     large->setSummary(QStringLiteral("beta 2"));
0448 
0449     QVERIFY(Incidences::categoriesLessThan(small, medium));
0450     QVERIFY(!Incidences::categoriesLessThan(medium, small));
0451     QVERIFY(Incidences::categoriesLessThan(medium, large));
0452     QVERIFY(!Incidences::categoriesLessThan(large, medium));
0453     QVERIFY(!Incidences::categoriesLessThan(small, small));
0454 
0455     QVERIFY(!Incidences::categoriesMoreThan(small, medium));
0456     QVERIFY(Incidences::categoriesMoreThan(medium, small));
0457     QVERIFY(!Incidences::categoriesMoreThan(medium, large));
0458     QVERIFY(Incidences::categoriesMoreThan(large, medium));
0459     QVERIFY(!Incidences::categoriesMoreThan(small, small));
0460 }
0461 
0462 void TodoTest::testDtDueComparison()
0463 {
0464     auto now = QDateTime::currentDateTime();
0465     auto later = now.addSecs(1);
0466 
0467     QSharedPointer<Todo> small(new Todo);
0468     small->setDtDue(now);
0469     small->setAllDay(false);
0470     small->setSummary(QStringLiteral("now"));
0471 
0472     QSharedPointer<Todo> medium(new Todo);
0473     medium->setDtDue(later);
0474     medium->setAllDay(false);
0475     medium->setSummary(QStringLiteral("later 1"));
0476 
0477     QSharedPointer<Todo> large(new Todo);
0478     large->setDtDue(later);
0479     large->setAllDay(false);
0480     large->setSummary(QStringLiteral("later 2"));
0481 
0482     QSharedPointer<Todo> never(new Todo);
0483     never->setDtDue(QDateTime());
0484     never->setAllDay(false);
0485     never->setSummary(QStringLiteral("never"));
0486 
0487     QVERIFY(Todos::dueDateLessThan(small, medium));
0488     QVERIFY(!Todos::dueDateLessThan(medium, small));
0489     QVERIFY(Todos::dueDateLessThan(medium, large));
0490     QVERIFY(!Todos::dueDateLessThan(large, medium));
0491     QVERIFY(Todos::dueDateLessThan(large, never));
0492     QVERIFY(!Todos::dueDateLessThan(never, large));
0493     QVERIFY(!Todos::dueDateLessThan(small, small));
0494     QVERIFY(!Todos::dueDateLessThan(never, never));
0495 
0496     QVERIFY(!Todos::dueDateMoreThan(small, medium));
0497     QVERIFY(Todos::dueDateMoreThan(medium, small));
0498     QVERIFY(!Todos::dueDateMoreThan(medium, large));
0499     QVERIFY(Todos::dueDateMoreThan(large, medium));
0500     QVERIFY(!Todos::dueDateMoreThan(large, never));
0501     QVERIFY(Todos::dueDateMoreThan(never, large));
0502     QVERIFY(!Todos::dueDateMoreThan(small, small));
0503     QVERIFY(!Todos::dueDateLessThan(never, never));
0504 }
0505 
0506 void TodoTest::testDtDueChange()
0507 {
0508     const QDate date {QDate::currentDate()};
0509     const QTime time {1, 0, 0};
0510     Todo todo;
0511     // Note:  QDateTime's default timespec Qt::LocalTime => "floating" time.
0512     todo.setDtDue(QDateTime(date, time));
0513 
0514     todo.resetDirtyFields();
0515     todo.setDtDue(QDateTime(date, time));   // No change.
0516     QVERIFY(todo.dirtyFields().empty());
0517 
0518     todo.setDtDue(QDateTime(date, time).addDays(1));    // Normal change.
0519     QCOMPARE(todo.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtDue});
0520 
0521     todo.resetDirtyFields();
0522     todo.setDtDue(QDateTime());     // "Unset" dtDue.
0523     QCOMPARE(todo.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtDue});
0524 
0525     todo.resetDirtyFields();
0526     todo.setDtDue(QDateTime(date, time));   // Setting an unset due datetime.
0527     QCOMPARE(todo.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtDue});
0528 
0529     // Change from a floating time to the same time in a fixed time zone.
0530     todo.resetDirtyFields();
0531     todo.setDtDue(QDateTime(date, time, QTimeZone(TEST_TZ)));
0532     QCOMPARE(todo.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtDue});
0533 
0534     // Change from a time in a fixed time zone to a floating time.
0535     todo.resetDirtyFields();
0536     todo.setDtDue(QDateTime(date, time, Qt::LocalTime));
0537     QCOMPARE(todo.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtDue});
0538 }
0539 
0540 #include "moc_testtodo.cpp"