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"