File indexing completed on 2024-04-21 03:52:39
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 "testevent.h" 0009 #include "event.h" 0010 #include "todo.h" 0011 0012 #include <QTest> 0013 #include <QTimeZone> 0014 QTEST_MAIN(EventTest) 0015 0016 Q_DECLARE_METATYPE(KCalendarCore::Incidence::DateTimeRole) 0017 0018 using namespace KCalendarCore; 0019 0020 const auto TEST_TZ = "Europe/Paris"; 0021 0022 void EventTest::initTestCase() 0023 { 0024 qputenv("TZ", TEST_TZ); 0025 } 0026 0027 void EventTest::testSetRoles_data() 0028 { 0029 QTest::addColumn<QDateTime>("originalDtStart"); 0030 QTest::addColumn<QDateTime>("originalDtEnd"); 0031 QTest::addColumn<bool>("allDayEvent"); 0032 0033 QTest::addColumn<KCalendarCore::Incidence::DateTimeRole>("setRole"); 0034 QTest::addColumn<QDateTime>("dateTimeToSet"); 0035 QTest::addColumn<QDateTime>("expectedDtStart"); 0036 QTest::addColumn<QDateTime>("expectedDtEnd"); 0037 0038 const QDateTime todayDate(QDate::currentDate(), {}); // all day event 0039 const QDateTime todayDateTime = QDateTime::currentDateTimeUtc(); 0040 0041 QTest::newRow("dnd 0 duration") << todayDate << todayDate << true << KCalendarCore::Incidence::RoleDnD << todayDateTime << todayDateTime 0042 << todayDateTime.addSecs(3600); 0043 } 0044 0045 void EventTest::testSetRoles() 0046 { 0047 QFETCH(QDateTime, originalDtStart); 0048 QFETCH(QDateTime, originalDtEnd); 0049 QFETCH(bool, allDayEvent); 0050 QFETCH(KCalendarCore::Incidence::DateTimeRole, setRole); 0051 0052 QFETCH(QDateTime, dateTimeToSet); 0053 QFETCH(QDateTime, expectedDtStart); 0054 QFETCH(QDateTime, expectedDtEnd); 0055 0056 Event::Ptr event = Event::Ptr(new Event()); 0057 event->setDtStart(originalDtStart); 0058 event->setDtEnd(originalDtEnd); 0059 event->setAllDay(allDayEvent); 0060 0061 event->setDateTime(dateTimeToSet, setRole); 0062 QCOMPARE(event->dtStart(), expectedDtStart); 0063 QCOMPARE(event->dtEnd(), expectedDtEnd); 0064 } 0065 0066 void EventTest::testValidity() 0067 { 0068 QDate dt = QDate::currentDate(); 0069 Event event; 0070 event.setDtStart(QDateTime(dt, {})); 0071 event.setDtEnd(QDateTime(dt, {}).addDays(1)); 0072 event.setSummary(QStringLiteral("Event1 Summary")); 0073 event.setDescription(QStringLiteral("This is a description of the first event")); 0074 event.setLocation(QStringLiteral("the place")); 0075 0076 QCOMPARE(event.summary(), QStringLiteral("Event1 Summary")); 0077 QCOMPARE(event.location(), QStringLiteral("the place")); 0078 QCOMPARE(event.type(), Incidence::TypeEvent); 0079 } 0080 0081 void EventTest::testCompare() 0082 { 0083 QDate dt = QDate::currentDate(); 0084 Event event1; 0085 event1.setDtStart(QDateTime(dt, {})); 0086 event1.setDtEnd(QDateTime(dt, {}).addDays(1)); 0087 event1.setSummary(QStringLiteral("Event1 Summary")); 0088 event1.setDescription(QStringLiteral("This is a description of the first event")); 0089 event1.setLocation(QStringLiteral("the place")); 0090 0091 Event event2; 0092 event2.setDtStart(QDateTime(dt, {}).addDays(1)); 0093 event2.setDtEnd(QDateTime(dt, {}).addDays(2)); 0094 event2.setSummary(QStringLiteral("Event2 Summary")); 0095 event2.setDescription(QStringLiteral("This is a description of the second event")); 0096 event2.setLocation(QStringLiteral("the other place")); 0097 0098 QVERIFY(!(event1 == event2)); 0099 QCOMPARE(event1.dtEnd(), event2.dtStart()); 0100 QCOMPARE(event2.summary(), QStringLiteral("Event2 Summary")); 0101 } 0102 0103 void EventTest::testDtEndEqual() 0104 { 0105 QDateTime dt {QDate::currentDate(), QTime::currentTime(), QTimeZone(TEST_TZ)}; 0106 QVERIFY(dt.timeSpec() == Qt::TimeZone); 0107 0108 Event e1; 0109 e1.setDtEnd(dt); 0110 auto e2 = e1.clone(); 0111 QVERIFY(e1 == *e2); 0112 0113 // Create a "floating" datetime, which represents the same instant in real time 0114 // because we're still running in the test's time zone. 0115 dt.setTimeZone(QTimeZone::LocalTime); 0116 0117 e1.setDtEnd(dt); 0118 QVERIFY(e1 != *e2); 0119 e2->setDtEnd(dt); 0120 QVERIFY(e1 == *e2); 0121 } 0122 0123 void EventTest::testCompareAlarms() 0124 { 0125 Event event1; 0126 event1.setUid(QStringLiteral("uid")); 0127 Alarm::Ptr alarm1 = event1.newAlarm(); 0128 alarm1->setType(Alarm::Email); 0129 alarm1->setMailAddress(Person(QStringLiteral("name"), QStringLiteral("email@foo.com"))); 0130 0131 Event event2; 0132 event2.setUid(QStringLiteral("uid")); 0133 Alarm::Ptr alarm2 = event2.newAlarm(); 0134 alarm2->setType(Alarm::Email); 0135 alarm2->setMailAddress(Person(QStringLiteral("name"), QStringLiteral("email@foo.com"))); 0136 0137 QCOMPARE(event1, event2); 0138 } 0139 0140 void EventTest::testClone() 0141 { 0142 QDate dt = QDate::currentDate(); 0143 Event event1; 0144 event1.setDtStart(QDateTime(dt, {})); 0145 event1.setDtEnd(QDateTime(dt, {}).addDays(1)); 0146 event1.setSummary(QStringLiteral("Event1 Summary")); 0147 event1.setDescription(QStringLiteral("This is a description of the first event")); 0148 event1.setLocation(QStringLiteral("the place")); 0149 0150 Event *event2 = event1.clone(); 0151 QCOMPARE(event1.summary(), event2->summary()); 0152 QCOMPARE(event1.dtStart(), event2->dtStart()); 0153 QCOMPARE(event1.dtEnd(), event2->dtEnd()); 0154 QCOMPARE(event1.description(), event2->description()); 0155 QCOMPARE(event1.location(), event2->location()); 0156 delete event2; 0157 } 0158 0159 void EventTest::testCopyConstructor() 0160 { 0161 QDate dt = QDate::currentDate(); 0162 Event event1; 0163 event1.setDtStart(QDateTime(dt, {})); 0164 event1.setDtEnd(QDateTime(dt, {}).addDays(1)); 0165 event1.setSummary(QStringLiteral("Event1 Summary")); 0166 event1.setDescription(QStringLiteral("This is a description of the first event")); 0167 event1.setLocation(QStringLiteral("the place")); 0168 event1.setTransparency(Event::Transparent); 0169 0170 Event event2 {event1}; 0171 QCOMPARE(event1.summary(), event2.summary()); 0172 QCOMPARE(event1.dtStart(), event2.dtStart()); 0173 QCOMPARE(event1.dtEnd(), event2.dtEnd()); 0174 QCOMPARE(event1.description(), event2.description()); 0175 QCOMPARE(event1.location(), event2.location()); 0176 } 0177 0178 void EventTest::testCopyIncidence() 0179 { 0180 QDate dt = QDate::currentDate(); 0181 Todo todo; 0182 todo.setDtStart(QDateTime(dt, {})); 0183 todo.setSummary(QStringLiteral("Event1 Summary")); 0184 todo.setDescription(QStringLiteral("This is a description of the first event")); 0185 todo.setLocation(QStringLiteral("the place")); 0186 0187 Event event(todo); 0188 QCOMPARE(event.uid(), todo.uid()); 0189 QCOMPARE(event.dtStart(), todo.dtStart()); 0190 QCOMPARE(event.summary(), todo.summary()); 0191 QCOMPARE(event.description(), todo.description()); 0192 QCOMPARE(event.location(), todo.location()); 0193 } 0194 0195 void EventTest::testAssign() 0196 { 0197 QDate dt = QDate::currentDate(); 0198 Event event1; 0199 event1.setDtStart(QDateTime(dt, {})); 0200 event1.setDtEnd(QDateTime(dt, {}).addDays(1)); 0201 event1.setSummary(QStringLiteral("Event1 Summary")); 0202 event1.setDescription(QStringLiteral("This is a description of the first event")); 0203 event1.setLocation(QStringLiteral("the place")); 0204 event1.setTransparency(Event::Transparent); 0205 0206 IncidenceBase *event2 = new Event; 0207 *event2 = event1; // Use IncidenceBase's virtual assignment. 0208 QCOMPARE(event1, *event2); 0209 } 0210 0211 void EventTest::testSerializer_data() 0212 { 0213 QTest::addColumn<KCalendarCore::Event::Ptr>("event"); 0214 QDateTime today = QDateTime::currentDateTimeUtc(); 0215 QDateTime yesterday = today.addDays(-1); 0216 0217 Event::Ptr event1 = Event::Ptr(new Event()); 0218 Attendee attendee1(QStringLiteral("fred"), QStringLiteral("fred@flintstone.com")); 0219 event1->addAttendee(attendee1); 0220 event1->setDtStart(yesterday); 0221 event1->setDtEnd(today); 0222 0223 Event::Ptr event2 = Event::Ptr(new Event()); 0224 Attendee attendee2(QStringLiteral("fred"), QStringLiteral("fred@flintstone.com")); 0225 event2->addAttendee(attendee2); 0226 event2->setDtStart(yesterday); 0227 event2->setDtEnd(today); 0228 event2->setAllDay(true); 0229 0230 event2->addComment(QStringLiteral("comment1")); 0231 event2->setUrl(QUrl(QStringLiteral("http://someurl"))); 0232 0233 event2->setCustomProperty("app", "key", QStringLiteral("value")); 0234 0235 // Remaining properties tested in testtodo.cpp 0236 0237 QTest::newRow("event") << event1; 0238 QTest::newRow("event2") << event2; 0239 } 0240 0241 void EventTest::testSerializer() 0242 { 0243 QFETCH(KCalendarCore::Event::Ptr, event); 0244 IncidenceBase::Ptr incidenceBase = event.staticCast<KCalendarCore::IncidenceBase>(); 0245 0246 QByteArray array; 0247 QDataStream stream(&array, QIODevice::WriteOnly); 0248 stream << incidenceBase; 0249 0250 Event::Ptr event2 = Event::Ptr(new Event()); 0251 IncidenceBase::Ptr incidenceBase2 = event2.staticCast<KCalendarCore::IncidenceBase>(); 0252 QVERIFY(*event != *event2); 0253 QDataStream stream2(&array, QIODevice::ReadOnly); 0254 stream2 >> incidenceBase2; 0255 QCOMPARE(*event, *event2); 0256 } 0257 0258 void EventTest::testDurationDtEnd() 0259 { 0260 const QDate dt = QDate::currentDate(); 0261 0262 { 0263 Event event; 0264 event.setDtStart(QDateTime(dt, {})); 0265 event.setDtEnd(QDateTime(dt, {}).addDays(1)); 0266 QCOMPARE(event.hasEndDate(), true); 0267 QCOMPARE(event.hasDuration(), false); 0268 } 0269 { 0270 Event event; 0271 event.setDtStart(QDateTime(dt, {})); 0272 event.setDuration(Duration(QDateTime(dt, {}), QDateTime(dt, {}).addDays(1))); 0273 QCOMPARE(event.hasDuration(), true); 0274 QCOMPARE(event.hasEndDate(), false); 0275 } 0276 } 0277 0278 void EventTest::testDtStartChange() 0279 { 0280 QDate dt = QDate::currentDate(); 0281 Event event1; 0282 event1.setDtStart(QDateTime(dt, QTime(1, 0, 0), QTimeZone(TEST_TZ))); 0283 event1.resetDirtyFields(); 0284 0285 event1.setDtStart(QDateTime(dt, QTime(1, 0, 0))); 0286 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtStart}); 0287 event1.resetDirtyFields(); 0288 0289 event1.setDtStart(QDateTime(dt, QTime(1, 0, 0), QTimeZone(TEST_TZ))); 0290 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtStart}); 0291 event1.resetDirtyFields(); 0292 } 0293 0294 void EventTest::testDtEndChange() 0295 { 0296 QDate dt = QDate::currentDate(); 0297 Event event1; 0298 event1.setDtStart(QDateTime(dt, {})); 0299 event1.setDtEnd(QDateTime(dt, {}).addDays(1)); 0300 event1.resetDirtyFields(); 0301 0302 event1.setDtEnd(QDateTime(dt, {}).addDays(1)); 0303 QVERIFY(event1.dirtyFields().empty()); 0304 0305 event1.setDtEnd(QDateTime(dt, {}).addDays(2)); 0306 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtEnd}); 0307 event1.resetDirtyFields(); 0308 0309 event1.setDtEnd(QDateTime()); 0310 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtEnd}); 0311 event1.resetDirtyFields(); 0312 0313 event1.setDtEnd(QDateTime(dt, {}).addDays(2)); 0314 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtEnd}); 0315 event1.resetDirtyFields(); 0316 0317 event1.setDtEnd(QDateTime(dt, QTime(1, 0, 0), QTimeZone(TEST_TZ))); 0318 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtEnd}); 0319 event1.resetDirtyFields(); 0320 0321 event1.setDtEnd(QDateTime(dt, QTime(1, 0, 0), QTimeZone::LocalTime)); 0322 QCOMPARE(event1.dirtyFields(), QSet<IncidenceBase::Field>{IncidenceBase::FieldDtEnd}); 0323 event1.resetDirtyFields(); 0324 } 0325 0326 void EventTest::testIsMultiDay_data() 0327 { 0328 QTest::addColumn<QDateTime>("start"); 0329 QTest::addColumn<QDateTime>("end"); 0330 QTest::addColumn<bool>("isMultiDay"); 0331 0332 QTest::newRow("event0") << QDateTime(QDate(2016, 7, 9), QTime(12, 0, 0)) << QDateTime(QDate(2016, 7, 9), QTime(13, 0, 0)) << false; 0333 0334 QTest::newRow("event1") << QDateTime(QDate(2016, 7, 9), QTime(12, 0, 0)) << QDateTime(QDate(2016, 7, 10), QTime(0, 0, 0)) << false; 0335 0336 QTest::newRow("event2") << QDateTime(QDate(2016, 7, 9), QTime(12, 0, 0)) << QDateTime(QDate(2016, 7, 10), QTime(12, 0, 0)) << true; 0337 0338 QTest::newRow("event3") << QDateTime(QDate(2016, 12, 31), QTime(0, 0, 0)) << QDateTime(QDate(2017, 1, 1), QTime(0, 0, 0)) << false; 0339 0340 QTest::newRow("event4") << QDateTime(QDate(2016, 12, 31), QTime(0, 0, 1)) << QDateTime(QDate(2017, 1, 1), QTime(0, 0, 1)) << true; 0341 0342 QTest::newRow("event5") << QDateTime(QDate(2016, 12, 31), QTime(12, 0, 0)) << QDateTime(QDate(2017, 1, 1), QTime(12, 0, 0)) << true; 0343 0344 QTest::newRow("event6") << QDateTime(QDate(2016, 12, 24), QTime(12, 0, 0)) << QDateTime(QDate(2017, 1, 1), QTime(0, 0, 0)) << true; 0345 } 0346 0347 void EventTest::testIsMultiDay() 0348 { 0349 QFETCH(QDateTime, start); 0350 QFETCH(QDateTime, end); 0351 QFETCH(bool, isMultiDay); 0352 0353 Event event; 0354 event.setDtStart(start); 0355 event.setDtEnd(end); 0356 0357 QCOMPARE(event.isMultiDay(), isMultiDay); 0358 } 0359 0360 #include "moc_testevent.cpp"