File indexing completed on 2024-05-05 05:13:42
0001 /* 0002 SPDX-FileCopyrightText: 2010 Casey Link <unnamedrambler@gmail.com> 0003 SPDX-FileCopyrightText: 2009-2010 Klaralvdalens Datakonsult AB, a KDAB Group company <info@kdab.net> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "conflictresolvertest.h" 0009 #include "conflictresolver.h" 0010 0011 #include <KCalendarCore/Duration> 0012 #include <KCalendarCore/Event> 0013 #include <KCalendarCore/Period> 0014 0015 #include <QTest> 0016 #include <QWidget> 0017 0018 using namespace IncidenceEditorNG; 0019 0020 void ConflictResolverTest::insertAttendees() 0021 { 0022 for (const CalendarSupport::FreeBusyItem::Ptr &item : std::as_const(attendees)) { 0023 resolver->insertAttendee(item); 0024 } 0025 } 0026 0027 void ConflictResolverTest::addAttendee(const QString &email, const KCalendarCore::FreeBusy::Ptr &fb, KCalendarCore::Attendee::Role role) 0028 { 0029 QString name = QStringLiteral("attendee %1").arg(attendees.count()); 0030 CalendarSupport::FreeBusyItem::Ptr item( 0031 new CalendarSupport::FreeBusyItem(KCalendarCore::Attendee(name, email, false, KCalendarCore::Attendee::Accepted, role), nullptr)); 0032 item->setFreeBusy(KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(*fb.data()))); 0033 attendees << item; 0034 } 0035 0036 void ConflictResolverTest::initTestCase() 0037 { 0038 parent = new QWidget; 0039 init(); 0040 } 0041 0042 void ConflictResolverTest::init() 0043 { 0044 base = QDateTime::currentDateTime().addDays(1); 0045 end = base.addSecs(10 * 60 * 60); 0046 resolver = new ConflictResolver(parent, parent); 0047 } 0048 0049 void ConflictResolverTest::cleanup() 0050 { 0051 delete resolver; 0052 resolver = nullptr; 0053 attendees.clear(); 0054 } 0055 0056 void ConflictResolverTest::simpleTest() 0057 { 0058 KCalendarCore::Period meeting(end.addSecs(-3 * 60 * 60), KCalendarCore::Duration(2 * 60 * 60)); 0059 addAttendee(QStringLiteral("albert@einstein.net"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting))); 0060 0061 insertAttendees(); 0062 0063 static const int resolution = 15 * 60; 0064 resolver->setResolution(resolution); 0065 resolver->setEarliestDateTime(base); 0066 resolver->setLatestDateTime(end); 0067 resolver->findAllFreeSlots(); 0068 0069 QVERIFY(resolver->availableSlots().size() == 2); 0070 0071 KCalendarCore::Period first = resolver->availableSlots().at(0); 0072 QCOMPARE(first.start(), base); 0073 QCOMPARE(first.end(), meeting.start()); 0074 0075 KCalendarCore::Period second = resolver->availableSlots().at(1); 0076 QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Continue); 0077 QCOMPARE(second.start(), meeting.end().addSecs(resolution)); // add 15 minutes because the 0078 // free block doesn't start until 0079 // the next timeslot 0080 QCOMPARE(second.end(), end); 0081 } 0082 0083 void ConflictResolverTest::stillPrettySimpleTest() 0084 { 0085 KCalendarCore::Period meeting1(base, KCalendarCore::Duration(2 * 60 * 60)); 0086 KCalendarCore::Period meeting2(base.addSecs(60 * 60), KCalendarCore::Duration(2 * 60 * 60)); 0087 KCalendarCore::Period meeting3(end.addSecs(-3 * 60 * 60), KCalendarCore::Duration(2 * 60 * 60)); 0088 addAttendee(QStringLiteral("john.f@kennedy.com"), 0089 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting1 << meeting3))); 0090 addAttendee(QStringLiteral("elvis@rock.com"), 0091 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting2 << meeting3))); 0092 addAttendee(QStringLiteral("albert@einstein.net"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << meeting3))); 0093 0094 insertAttendees(); 0095 0096 static const int resolution = 15 * 60; 0097 resolver->setResolution(resolution); 0098 resolver->setEarliestDateTime(base); 0099 resolver->setLatestDateTime(end); 0100 resolver->findAllFreeSlots(); 0101 0102 QVERIFY(resolver->availableSlots().size() == 2); 0103 0104 KCalendarCore::Period first = resolver->availableSlots().at(0); 0105 QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Continue); 0106 QCOMPARE(first.start(), meeting2.end().addSecs(resolution)); 0107 QCOMPARE(first.end(), meeting3.start()); 0108 0109 KCalendarCore::Period second = resolver->availableSlots().at(1); 0110 QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Continue); 0111 QCOMPARE(second.start(), meeting3.end().addSecs(resolution)); // add 15 minutes because the 0112 // free block doesn't start until 0113 // the next timeslot 0114 QCOMPARE(second.end(), end); 0115 } 0116 0117 #define _time(h, m) QDateTime(base.date(), QTime(h, m)) 0118 0119 void ConflictResolverTest::akademy2010() 0120 { 0121 // based off akademy 2010 schedule 0122 0123 // first event was at 9:30, so lets align our start time there 0124 base.setTime(QTime(9, 30)); 0125 end = base.addSecs(8 * 60 * 60); 0126 KCalendarCore::Period opening(_time(9, 30), _time(9, 45)); 0127 KCalendarCore::Period keynote(_time(9, 45), _time(10, 30)); 0128 0129 KCalendarCore::Period sevenPrinciples(_time(10, 30), _time(11, 15)); 0130 KCalendarCore::Period commAsService(_time(10, 30), _time(11, 15)); 0131 0132 KCalendarCore::Period kdeForums(_time(11, 15), _time(11, 45)); 0133 KCalendarCore::Period oviStore(_time(11, 15), _time(11, 45)); 0134 0135 // 10 min break 0136 0137 KCalendarCore::Period highlights(_time(12, 0), _time(12, 45)); 0138 KCalendarCore::Period styles(_time(12, 0), _time(12, 45)); 0139 0140 KCalendarCore::Period wikimedia(_time(12, 45), _time(13, 15)); 0141 KCalendarCore::Period avalanche(_time(12, 45), _time(13, 15)); 0142 0143 KCalendarCore::Period pimp(_time(13, 15), _time(13, 45)); 0144 KCalendarCore::Period direction(_time(13, 15), _time(13, 45)); 0145 0146 // lunch 1 hr 25 min lunch 0147 0148 KCalendarCore::Period blurr(_time(15, 15), _time(16, 00)); 0149 KCalendarCore::Period plasma(_time(15, 15), _time(16, 00)); 0150 0151 // for ( int i = 1; i < 80; ++i ) { 0152 // adds 80 people (adds the same 8 people 10 times) 0153 addAttendee( 0154 QStringLiteral("akademyattendee1@email.com"), 0155 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << oviStore << wikimedia << direction))); 0156 addAttendee( 0157 QStringLiteral("akademyattendee2@email.com"), 0158 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << commAsService << highlights << pimp))); 0159 addAttendee(QStringLiteral("akademyattendee3@email.com"), 0160 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << kdeForums << styles << pimp << plasma))); 0161 addAttendee(QStringLiteral("akademyattendee4@email.com"), 0162 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << oviStore << pimp << blurr))); 0163 addAttendee(QStringLiteral("akademyattendee5@email.com"), 0164 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << keynote << oviStore << highlights << avalanche))); 0165 addAttendee(QStringLiteral("akademyattendee6@email.com"), 0166 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << commAsService << highlights))); 0167 addAttendee(QStringLiteral("akademyattendee7@email.com"), 0168 KCalendarCore::FreeBusy::Ptr( 0169 new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << kdeForums << styles << avalanche << pimp << plasma))); 0170 addAttendee( 0171 QStringLiteral("akademyattendee8@email.com"), 0172 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << opening << keynote << oviStore << wikimedia << blurr))); 0173 // } 0174 0175 insertAttendees(); 0176 0177 const int resolution = 5 * 60; 0178 resolver->setResolution(resolution); 0179 resolver->setEarliestDateTime(base); 0180 resolver->setLatestDateTime(end); 0181 // QBENCHMARK { 0182 resolver->findAllFreeSlots(); 0183 // } 0184 0185 QVERIFY(resolver->availableSlots().size() == 3); 0186 QEXPECT_FAIL("", "Got broken in revision f17b9a8c975588ad7cf4ce8b94ab8e32ac193ed8", Abort); 0187 QCOMPARE(resolver->availableSlots().at(0).duration(), KCalendarCore::Duration(10 * 60)); 0188 QCOMPARE(resolver->availableSlots().at(1).duration(), KCalendarCore::Duration(1 * 60 * 60 + 25 * 60)); 0189 QVERIFY(resolver->availableSlots().at(2).start() > plasma.end()); 0190 } 0191 0192 void ConflictResolverTest::testPeriodIsLargerThenTimeframe() 0193 { 0194 base.setDate(QDate(2010, 7, 29)); 0195 base.setTime(QTime(7, 30)); 0196 0197 end.setDate(QDate(2010, 7, 29)); 0198 end.setTime(QTime(8, 30)); 0199 0200 KCalendarCore::Period testEvent(_time(5, 45), _time(8, 45)); 0201 0202 addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), 0203 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); 0204 addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); 0205 0206 insertAttendees(); 0207 resolver->setEarliestDateTime(base); 0208 resolver->setLatestDateTime(end); 0209 resolver->findAllFreeSlots(); 0210 0211 QCOMPARE(resolver->availableSlots().size(), 0); 0212 } 0213 0214 void ConflictResolverTest::testPeriodBeginsBeforeTimeframeBegins() 0215 { 0216 base.setDate(QDate(2010, 7, 29)); 0217 base.setTime(QTime(7, 30)); 0218 0219 end.setDate(QDate(2010, 7, 29)); 0220 end.setTime(QTime(9, 30)); 0221 0222 KCalendarCore::Period testEvent(_time(5, 45), _time(8, 45)); 0223 0224 addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), 0225 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); 0226 addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); 0227 0228 insertAttendees(); 0229 resolver->setEarliestDateTime(base); 0230 resolver->setLatestDateTime(end); 0231 resolver->findAllFreeSlots(); 0232 0233 QCOMPARE(resolver->availableSlots().size(), 1); 0234 KCalendarCore::Period freeslot = resolver->availableSlots().at(0); 0235 QCOMPARE(freeslot.start(), _time(8, 45)); 0236 QCOMPARE(freeslot.end(), end); 0237 } 0238 0239 void ConflictResolverTest::testPeriodEndsAfterTimeframeEnds() 0240 { 0241 base.setDate(QDate(2010, 7, 29)); 0242 base.setTime(QTime(7, 30)); 0243 0244 end.setDate(QDate(2010, 7, 29)); 0245 end.setTime(QTime(9, 30)); 0246 0247 KCalendarCore::Period testEvent(_time(8, 00), _time(9, 45)); 0248 0249 addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), 0250 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); 0251 addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); 0252 0253 insertAttendees(); 0254 resolver->setEarliestDateTime(base); 0255 resolver->setLatestDateTime(end); 0256 resolver->findAllFreeSlots(); 0257 0258 QCOMPARE(resolver->availableSlots().size(), 1); 0259 KCalendarCore::Period freeslot = resolver->availableSlots().at(0); 0260 QCOMPARE(freeslot.duration(), KCalendarCore::Duration(30 * 60)); 0261 QCOMPARE(freeslot.start(), base); 0262 QCOMPARE(freeslot.end(), _time(8, 00)); 0263 } 0264 0265 void ConflictResolverTest::testPeriodEndsAtSametimeAsTimeframe() 0266 { 0267 base.setDate(QDate(2010, 7, 29)); 0268 base.setTime(QTime(7, 45)); 0269 0270 end.setDate(QDate(2010, 7, 29)); 0271 end.setTime(QTime(8, 45)); 0272 0273 KCalendarCore::Period testEvent(_time(5, 45), _time(8, 45)); 0274 0275 addAttendee(QStringLiteral("kdabtest1@demo.kolab.org"), 0276 KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List() << testEvent))); 0277 addAttendee(QStringLiteral("kdabtest2@demo.kolab.org"), KCalendarCore::FreeBusy::Ptr(new KCalendarCore::FreeBusy(KCalendarCore::Period::List()))); 0278 0279 insertAttendees(); 0280 resolver->setEarliestDateTime(base); 0281 resolver->setLatestDateTime(end); 0282 resolver->findAllFreeSlots(); 0283 0284 QCOMPARE(resolver->availableSlots().size(), 0); 0285 } 0286 0287 QTEST_MAIN(ConflictResolverTest) 0288 0289 #include "moc_conflictresolvertest.cpp"