File indexing completed on 2024-04-14 03:50:37

0001 /*
0002   This file is part of the kcalcore library.
0003 
0004   SPDX-FileCopyrightText: 2015 Sandro Knauß <knauss@kolabsys.com>
0005 
0006   SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 #include "testincidence.h"
0009 #include "event.h"
0010 #include "incidence.h"
0011 #include <QTest>
0012 #include <QTimeZone>
0013 #include <cmath>
0014 
0015 QTEST_MAIN(IncidenceTest)
0016 
0017 Q_DECLARE_METATYPE(KCalendarCore::Incidence::DateTimeRole)
0018 
0019 using namespace KCalendarCore;
0020 
0021 const auto TEST_TZ = "Europe/Paris";
0022 
0023 void IncidenceTest::initTestCase()
0024 {
0025     qputenv("TZ", TEST_TZ);
0026 }
0027 
0028 void IncidenceTest::testDtStartChange()
0029 {
0030     QDate dt = QDate::currentDate();
0031     QTime t = QTime::currentTime();
0032     Event inc;
0033     inc.setDtStart(QDateTime(dt, {}));
0034     inc.setAllDay(true);
0035     inc.recurrence()->setDaily(1);
0036     inc.resetDirtyFields();
0037 
0038     inc.setDtStart(QDateTime(dt, {}));
0039     QVERIFY(inc.dirtyFields().empty());
0040 
0041     inc.setDtStart(QDateTime(dt, t));
0042     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldDtStart << IncidenceBase::FieldRecurrence);
0043     QCOMPARE(inc.recurrence()->startDateTime().time(), t);
0044     inc.resetDirtyFields();
0045 
0046     inc.setDtStart(QDateTime(dt, {}).addDays(1));
0047     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldDtStart << IncidenceBase::FieldRecurrence);
0048     QCOMPARE(inc.recurrence()->startDateTime(), QDateTime(dt, {}).addDays(1));
0049     inc.resetDirtyFields();
0050 
0051     inc.setDtStart(QDateTime());
0052     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldDtStart << IncidenceBase::FieldRecurrence);
0053     QCOMPARE(inc.recurrence()->startDateTime(), QDateTime());
0054     inc.resetDirtyFields();
0055 
0056     inc.setDtStart(QDateTime(dt, {}).addDays(1));
0057     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldDtStart << IncidenceBase::FieldRecurrence);
0058     QCOMPARE(inc.recurrence()->startDateTime(), QDateTime(dt, {}).addDays(1));
0059 }
0060 
0061 void IncidenceTest::testDtStartEqual()
0062 {
0063     QDateTime dt {QDate::currentDate(), QTime::currentTime(), QTimeZone(TEST_TZ)};
0064     QVERIFY(dt.timeSpec() == Qt::TimeZone);
0065 
0066     Event i1;
0067     i1.setDtStart(dt);
0068     auto i2 = i1.clone();
0069     QVERIFY(i1 == *i2);
0070 
0071     // Create a "floating" datetime, which represents the same instant in real time
0072     // because we're still running in the test's time zone.
0073     dt.setTimeZone(QTimeZone::LocalTime);
0074 
0075     i1.setDtStart(dt);
0076     QVERIFY(i1 != *i2);
0077     i2->setDtStart(dt);
0078     QVERIFY(i1 == *i2);
0079 }
0080 
0081 void IncidenceTest::testSummaryChange()
0082 {
0083     Event inc;
0084     inc.setSummary(QStringLiteral("bla"), false);
0085     inc.resetDirtyFields();
0086 
0087     inc.setSummary(QStringLiteral("bla"), false);
0088     QVERIFY(inc.dirtyFields().empty());
0089 
0090     inc.setSummary(QStringLiteral("bla2"), false);
0091     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldSummary);
0092     inc.resetDirtyFields();
0093 
0094     inc.setSummary(QStringLiteral("bla2"), true);
0095     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldSummary);
0096 }
0097 
0098 void IncidenceTest::testLocationChange()
0099 {
0100     Event inc;
0101     inc.setLocation(QStringLiteral("here"), false);
0102     inc.resetDirtyFields();
0103 
0104     inc.setLocation(QStringLiteral("here"), false);
0105     QVERIFY(inc.dirtyFields().empty());
0106 
0107     inc.setLocation(QStringLiteral("there"), false);
0108     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldLocation);
0109     inc.resetDirtyFields();
0110 
0111     inc.setLocation(QStringLiteral("there"), true);
0112     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldLocation);
0113 }
0114 
0115 void IncidenceTest::testGeo()
0116 {
0117     Event inc;
0118 
0119     // Default state:  no GEO.
0120     QCOMPARE(inc.hasGeo(), false);
0121     QCOMPARE(inc.geoLatitude(), INVALID_LATLON);
0122     QCOMPARE(inc.geoLongitude(), INVALID_LATLON);
0123     QVERIFY(inc.dirtyFields().empty());
0124 
0125     // Set GEO, thoroughly.
0126     inc.setGeoLatitude(90.0);
0127     inc.setGeoLongitude(180.0);
0128     QCOMPARE(inc.hasGeo(), true);
0129     QCOMPARE(inc.geoLatitude(), 90.0);
0130     QCOMPARE(inc.geoLongitude(), 180.0);
0131     QCOMPARE(inc.dirtyFields(), (QSet{IncidenceBase::FieldGeoLatitude, IncidenceBase::FieldGeoLongitude}));
0132     inc.resetDirtyFields();
0133     inc.setGeoLatitude(-90.0);
0134     inc.setGeoLongitude(-180.0);
0135     QCOMPARE(inc.hasGeo(), true);
0136     QCOMPARE(inc.geoLatitude(), -90.0);
0137     QCOMPARE(inc.geoLongitude(), -180.0);
0138     QCOMPARE(inc.dirtyFields(), (QSet{IncidenceBase::FieldGeoLatitude, IncidenceBase::FieldGeoLongitude}));
0139 
0140     // Clear GEO, thoroughly.
0141     inc.resetDirtyFields();
0142     inc.setGeoLatitude(INVALID_LATLON);
0143     inc.setGeoLongitude(INVALID_LATLON);
0144     QCOMPARE(inc.hasGeo(), false);
0145     QCOMPARE(inc.geoLatitude(), INVALID_LATLON);
0146     QCOMPARE(inc.geoLongitude(), INVALID_LATLON);
0147     QCOMPARE(inc.dirtyFields(), (QSet{IncidenceBase::FieldGeoLatitude, IncidenceBase::FieldGeoLongitude}));
0148 
0149     // Error handling.
0150     inc.setGeoLatitude(90.0);
0151     inc.setGeoLongitude(180.0);
0152     inc.setGeoLatitude(INVALID_LATLON);
0153     QCOMPARE(inc.hasGeo(), false);
0154     QCOMPARE(inc.geoLatitude(), INVALID_LATLON);
0155     QCOMPARE(inc.geoLongitude(), INVALID_LATLON);
0156     inc.setGeoLatitude(90.0);
0157     inc.setGeoLongitude(180.0);
0158     inc.setGeoLongitude(INVALID_LATLON);
0159     QCOMPARE(inc.hasGeo(), false);
0160     QCOMPARE(inc.geoLatitude(), INVALID_LATLON);
0161     QCOMPARE(inc.geoLongitude(), INVALID_LATLON);
0162     inc.setGeoLatitude(90.0);
0163     inc.setGeoLongitude(180.0);
0164     inc.setGeoLatitude(NAN);
0165     QCOMPARE(inc.hasGeo(), false);
0166     QCOMPARE(inc.geoLatitude(), INVALID_LATLON);
0167     QCOMPARE(inc.geoLongitude(), INVALID_LATLON);
0168     inc.setGeoLatitude(90.0);
0169     inc.setGeoLongitude(180.0);
0170     inc.setGeoLongitude(NAN);
0171     QCOMPARE(inc.hasGeo(), false);
0172     QCOMPARE(inc.geoLatitude(), INVALID_LATLON);
0173     QCOMPARE(inc.geoLongitude(), INVALID_LATLON);
0174 }
0175 
0176 void IncidenceTest::testRecurrenceTypeChange()
0177 {
0178     QDate dt = QDate::currentDate();
0179     Event inc;
0180     inc.setDtStart(QDateTime(dt, {}));
0181     KCalendarCore::Recurrence *r = inc.recurrence();
0182     r->setDaily(1);
0183     inc.resetDirtyFields();
0184 
0185     r->setDaily(1);
0186     QVERIFY(inc.dirtyFields().empty());
0187 
0188     r->setDaily(2);
0189     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0190     inc.resetDirtyFields();
0191 
0192     r->setMonthly(2);
0193     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0194 }
0195 
0196 void IncidenceTest::testRecurrenceEndTimeChange()
0197 {
0198     QDate dt = QDate::currentDate();
0199     Event inc;
0200     inc.setDtStart(QDateTime(dt, {}));
0201     KCalendarCore::Recurrence *r = inc.recurrence();
0202     r->setDaily(1);
0203     r->setEndDateTime(QDateTime(dt, {}).addDays(1));
0204     inc.resetDirtyFields();
0205 
0206     r->setEndDateTime(QDateTime(dt, {}).addDays(1));
0207     QVERIFY(inc.dirtyFields().empty());
0208 
0209     r->setEndDateTime(QDateTime(dt, {}).addDays(2));
0210     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0211 }
0212 
0213 void IncidenceTest::testRecurrenceEndTimeDurationChange()
0214 {
0215     QDate dt = QDate::currentDate();
0216     Event inc;
0217     inc.setDtStart(QDateTime(dt, {}));
0218     KCalendarCore::Recurrence *r = inc.recurrence();
0219     r->setDaily(1);
0220     inc.resetDirtyFields();
0221     QCOMPARE(r->duration(), -1);
0222     QVERIFY(!r->endDateTime().isValid());
0223 
0224     r->setDuration(5);
0225     QVERIFY(r->endDateTime().isValid());
0226     inc.resetDirtyFields();
0227 
0228     // duration is set and set enddate to inValid
0229     r->setDuration(5);
0230     r->setEndDateTime(QDateTime());
0231     QVERIFY(inc.dirtyFields().empty());
0232 
0233     // now set valid enddate -> set duration to 0 by sideeffect
0234     r->setEndDateTime(QDateTime(dt, {}).addDays(1));
0235     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0236     QCOMPARE(r->duration(), 0);
0237     QCOMPARE(r->endDateTime(), QDateTime(dt, {}).addDays(1));
0238 
0239     // with valid endDate, now setDuration and aftward set invalid endDate
0240     r->setEndDateTime(QDateTime(dt, {}).addDays(1));
0241     r->setDuration(5);
0242     inc.resetDirtyFields();
0243 
0244     r->setEndDateTime(QDateTime());
0245     QVERIFY(inc.dirtyFields().empty());
0246     QCOMPARE(r->endDate(), dt.addDays(4));
0247     QCOMPARE(r->duration(), 5);
0248 }
0249 
0250 void IncidenceTest::testRecurrenceDurationChange()
0251 {
0252     QDate dt = QDate::currentDate();
0253     Event inc;
0254     inc.setDtStart(QDateTime(dt, {}));
0255     KCalendarCore::Recurrence *r = inc.recurrence();
0256     r->setDuration(1);
0257     inc.resetDirtyFields();
0258 
0259     r->setDuration(1);
0260     QVERIFY(inc.dirtyFields().empty());
0261 
0262     r->setDuration(2);
0263     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0264 }
0265 
0266 void IncidenceTest::testRecurrenceExDatesChange()
0267 {
0268     QDate dt = QDate::currentDate();
0269     Event inc;
0270     inc.setDtStart(QDateTime(dt, {}));
0271     KCalendarCore::Recurrence *r = inc.recurrence();
0272     r->setExDates(DateList() << dt.addDays(1) << dt.addDays(2));
0273     inc.resetDirtyFields();
0274 
0275     r->setExDates(DateList() << dt.addDays(2) << dt.addDays(1));
0276     QVERIFY(inc.dirtyFields().empty());
0277 
0278     r->setExDates(DateList() << dt.addDays(1));
0279     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0280 }
0281 
0282 void IncidenceTest::testRecurrenceMonthlyDate()
0283 {
0284     QDate dt = QDate::currentDate();
0285     Event inc;
0286     inc.setDtStart(QDateTime(dt, {}));
0287     KCalendarCore::Recurrence *r = inc.recurrence();
0288     r->setMonthly(1);
0289     r->setMonthlyDate(QList<int>() << 1 << 2 << 3);
0290     inc.resetDirtyFields();
0291 
0292     r->setMonthlyDate(QList<int>() << 3 << 1 << 2);
0293     QVERIFY(inc.dirtyFields().empty());
0294 
0295     r->setMonthlyDate(QList<int>() << 3 << 1);
0296     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0297 }
0298 
0299 void IncidenceTest::testRecurrenceMonthlyPos()
0300 {
0301     QDate dt = QDate::currentDate();
0302     RecurrenceRule::WDayPos pos1(1, 2);
0303     RecurrenceRule::WDayPos pos2(3, 4);
0304     RecurrenceRule::WDayPos pos3(1, 2);
0305     Event inc;
0306     inc.setDtStart(QDateTime(dt, {}));
0307     KCalendarCore::Recurrence *r = inc.recurrence();
0308     r->setYearly(1);
0309     r->setMonthlyPos(QList<RecurrenceRule::WDayPos>() << pos1 << pos2);
0310     inc.resetDirtyFields();
0311 
0312     // TODO: test sorting
0313     r->setMonthlyPos(QList<RecurrenceRule::WDayPos>() << pos1 << pos2);
0314     QVERIFY(inc.dirtyFields().empty());
0315 
0316     r->setMonthlyPos(QList<RecurrenceRule::WDayPos>() << pos3);
0317     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0318 }
0319 
0320 void IncidenceTest::testRecurrenceYearlyDay()
0321 {
0322     QDate dt = QDate::currentDate();
0323     Event inc;
0324     inc.setDtStart(QDateTime(dt, {}));
0325     KCalendarCore::Recurrence *r = inc.recurrence();
0326     r->setYearly(1);
0327     r->setYearlyDay(QList<int>() << 1 << 2 << 3);
0328     inc.resetDirtyFields();
0329 
0330     r->setYearlyDay(QList<int>() << 3 << 1 << 2);
0331     QVERIFY(inc.dirtyFields().empty());
0332 
0333     r->setYearlyDay(QList<int>() << 3 << 1);
0334     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0335 }
0336 
0337 void IncidenceTest::testRecurrenceYearlyMonth()
0338 {
0339     QDate dt = QDate::currentDate();
0340     Event inc;
0341     inc.setDtStart(QDateTime(dt, {}));
0342     KCalendarCore::Recurrence *r = inc.recurrence();
0343     r->setYearly(1);
0344     r->setYearlyMonth(QList<int>() << 1 << 2 << 3);
0345     inc.resetDirtyFields();
0346 
0347     r->setYearlyMonth(QList<int>() << 3 << 1 << 2);
0348     QVERIFY(inc.dirtyFields().empty());
0349 
0350     r->setYearlyMonth(QList<int>() << 3 << 1);
0351     QCOMPARE(inc.dirtyFields(), QSet<IncidenceBase::Field>() << IncidenceBase::FieldRecurrence);
0352 }
0353 
0354 #include "moc_testincidence.cpp"