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"