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"