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"