Branch 'kolab/integration/4.13.0' - 2 commits - kcalcore/occurrenceiterator.cpp kcalcore/occurrenceiterator.h kcalcore/tests

Sandro Knauß knauss at kolabsys.com
Thu Mar 12 20:28:12 CET 2015


 kcalcore/occurrenceiterator.cpp           |   50 +++++++++++++++++----------
 kcalcore/occurrenceiterator.h             |    8 ++++
 kcalcore/tests/testoccurrenceiterator.cpp |   55 ++++++++++++++++++++----------
 3 files changed, 78 insertions(+), 35 deletions(-)

New commits:
commit 254978bc05e3d4f3b17af4b980731da2561227d6
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu Mar 12 19:25:22 2015 +0100

    Add recurrenceId to OccurenceIterator
    
    The recurrenceId is needed in the case we want to create another
    exception.

diff --git a/kcalcore/occurrenceiterator.cpp b/kcalcore/occurrenceiterator.cpp
index 4fbfe87..03dbaf4 100644
--- a/kcalcore/occurrenceiterator.cpp
+++ b/kcalcore/occurrenceiterator.cpp
@@ -62,13 +62,14 @@ public:
         {
         }
 
-        Occurrence(const Incidence::Ptr &i, const KDateTime &d)
-            : incidence(i), date(d)
+        Occurrence(const Incidence::Ptr &i, const KDateTime &recurrenceId, const KDateTime &startDate)
+            : incidence(i), recurrenceId(recurrenceId), startDate(startDate)
         {
         }
 
         Incidence::Ptr incidence;
-        KDateTime date;
+        KDateTime recurrenceId;
+        KDateTime startDate;
     };
     QList<Occurrence> occurrenceList;
     QListIterator<Occurrence> occurrenceIt;
@@ -116,22 +117,24 @@ public:
                 }
                 const bool isAllDay = inc->allDay();
                 const DateTimeList occurrences = inc->recurrence()->timesInInterval(start, end);
-                foreach(KDateTime occurrenceDate, occurrences) {    //krazy:exclude=foreach
                 Incidence::Ptr incidence(inc), lastInc(inc);
                 qint64 offset(0), lastOffset(0);
+                KDateTime occurrenceStartDate;
+                foreach(KDateTime recurrenceId, occurrences) {    //krazy:exclude=foreach
                     //timesInInterval generates always date-times,
                     //which is not what we want for all-day events
-                    occurrenceDate.setDateOnly(isAllDay);
+                    recurrenceId.setDateOnly(isAllDay);
+                    occurrenceStartDate = recurrenceId;
 
                     bool resetIncidence = false;
-                    if (recurrenceIds.contains(occurrenceDate)) {
+                    if (recurrenceIds.contains(recurrenceId)) {
                         // TODO: exclude exceptions where the start/end is not within
                         // (so the occurrence of the recurrence is omitted, but no exception is added)
-                        if (recurrenceIds.value(occurrenceDate)->status() == Incidence::StatusCanceled)
+                        if (recurrenceIds.value(recurrenceId)->status() == Incidence::StatusCanceled)
                             continue;
 
-                        incidence = recurrenceIds.value(occurrenceDate);
-                        occurrenceDate = incidence->dtStart();
+                        incidence = recurrenceIds.value(recurrenceId);
+                        occurrenceStartDate = incidence->dtStart();
                         resetIncidence = !incidence->thisAndFuture();
                         offset = incidence->recurrenceId().secsTo_long(incidence->dtStart());
                         if (incidence->thisAndFuture()) {
@@ -139,18 +142,20 @@ public:
                             lastOffset = offset;
                         }
                     } else if (inc != incidence) {   //thisAndFuture exception is active
-                        occurrenceDate = occurrenceDate.addSecs(offset);
+                        occurrenceStartDate = occurrenceStartDate.addSecs(offset);
                     }
-                    if (!occurrenceIsHidden(calendar, incidence, occurrenceDate)) {
-                        occurrenceList << Private::Occurrence(incidence, occurrenceDate);
+
+                    if (!occurrenceIsHidden(calendar, incidence, occurrenceStartDate)) {
+                        occurrenceList << Private::Occurrence(incidence, recurrenceId , occurrenceStartDate);
                     }
+
                     if (resetIncidence) {
                         incidence = lastInc;
                         offset = lastOffset;
                     }
                 }
             } else {
-                occurrenceList << Private::Occurrence(inc, inc->dtStart());
+                occurrenceList << Private::Occurrence(inc, KDateTime(), inc->dtStart());
             }
         }
         occurrenceIt = QListIterator<Private::Occurrence>(occurrenceList);
@@ -244,5 +249,10 @@ Incidence::Ptr OccurrenceIterator::incidence() const
 
 KDateTime OccurrenceIterator::occurrenceStartDate() const
 {
-    return d->current.date;
+    return d->current.startDate;
 }
+
+KDateTime OccurrenceIterator::recurrenceId() const
+{
+    return d->current.recurrenceId;
+}
\ No newline at end of file
diff --git a/kcalcore/occurrenceiterator.h b/kcalcore/occurrenceiterator.h
index f972f6a..ce51ace 100644
--- a/kcalcore/occurrenceiterator.h
+++ b/kcalcore/occurrenceiterator.h
@@ -83,6 +83,14 @@ public:
      */
     KDateTime occurrenceStartDate() const;
 
+    /**
+     * Returns the recurrence Id.
+     *
+     * This is the date where the occurrence starts without exceptions,
+     * this id is used to identify one excat occurence.
+     */
+    KDateTime recurrenceId() const;
+
 private:
     Q_DISABLE_COPY(OccurrenceIterator)
     //@cond PRIVATE
diff --git a/kcalcore/tests/testoccurrenceiterator.cpp b/kcalcore/tests/testoccurrenceiterator.cpp
index 2fdf614..379b18e 100644
--- a/kcalcore/tests/testoccurrenceiterator.cpp
+++ b/kcalcore/tests/testoccurrenceiterator.cpp
@@ -224,6 +224,7 @@ void TestOccurrenceIterator::testWithExceptionThisAndFuture()
 //     qDebug() << "summary: " << rIt.incidence()->summary();
 //     qDebug() << "start: " << rIt.incidence()->dtStart().toString();
 //     qDebug();
+        QCOMPARE(rIt.recurrenceId(), start.addDays(occurrence - 1));
         if (occurrence == 1) {
             QCOMPARE(rIt.occurrenceStartDate(), start);
             QCOMPARE(rIt.incidence()->summary(), event1->summary());


commit 8923967c2bd00f01850da604507b1eff4bbc949f
Author: Sandro Knauß <knauss at kolabsys.com>
Date:   Thu Mar 12 19:16:05 2015 +0100

    Exceptions with THISANDFUTURE and single exception
    
    Make sure that, if a THISANDFUTURE exception is used, that also after a
    single additional exception it falls back to the THISANDFUTURE
    exception.

diff --git a/kcalcore/occurrenceiterator.cpp b/kcalcore/occurrenceiterator.cpp
index 50d0e21..4fbfe87 100644
--- a/kcalcore/occurrenceiterator.cpp
+++ b/kcalcore/occurrenceiterator.cpp
@@ -116,9 +116,9 @@ public:
                 }
                 const bool isAllDay = inc->allDay();
                 const DateTimeList occurrences = inc->recurrence()->timesInInterval(start, end);
-                Incidence::Ptr incidence(inc);
-                qint64 offset(0);
                 foreach(KDateTime occurrenceDate, occurrences) {    //krazy:exclude=foreach
+                Incidence::Ptr incidence(inc), lastInc(inc);
+                qint64 offset(0), lastOffset(0);
                     //timesInInterval generates always date-times,
                     //which is not what we want for all-day events
                     occurrenceDate.setDateOnly(isAllDay);
@@ -134,6 +134,10 @@ public:
                         occurrenceDate = incidence->dtStart();
                         resetIncidence = !incidence->thisAndFuture();
                         offset = incidence->recurrenceId().secsTo_long(incidence->dtStart());
+                        if (incidence->thisAndFuture()) {
+                            lastInc = incidence;
+                            lastOffset = offset;
+                        }
                     } else if (inc != incidence) {   //thisAndFuture exception is active
                         occurrenceDate = occurrenceDate.addSecs(offset);
                     }
@@ -141,8 +145,8 @@ public:
                         occurrenceList << Private::Occurrence(incidence, occurrenceDate);
                     }
                     if (resetIncidence) {
-                        incidence = inc;
-                        offset = 0;
+                        incidence = lastInc;
+                        offset = lastOffset;
                     }
                 }
             } else {
diff --git a/kcalcore/tests/testoccurrenceiterator.cpp b/kcalcore/tests/testoccurrenceiterator.cpp
index 89c9f09..2fdf614 100644
--- a/kcalcore/tests/testoccurrenceiterator.cpp
+++ b/kcalcore/tests/testoccurrenceiterator.cpp
@@ -178,11 +178,15 @@ void TestOccurrenceIterator::testWithExceptionThisAndFuture()
     KDateTime start(QDate(2013, 03, 10), QTime(10, 0, 0), KDateTime::UTC);
     KDateTime end(QDate(2013, 03, 10), QTime(11, 0, 0), KDateTime::UTC);
 
-    KDateTime recurrenceId(QDate(2013, 03, 11), QTime(10, 0, 0), KDateTime::UTC);
-    KDateTime exceptionStart(QDate(2013, 03, 11), QTime(12, 0, 0), KDateTime::UTC);
-    KDateTime exceptionEnd(QDate(2013, 03, 11), QTime(13, 0, 0), KDateTime::UTC);
+    KDateTime recurrenceId1(QDate(2013, 03, 11), QTime(10, 0, 0), KDateTime::UTC);
+    KDateTime exceptionStart1(QDate(2013, 03, 11), QTime(12, 0, 0), KDateTime::UTC);
+    KDateTime exceptionEnd1(QDate(2013, 03, 11), QTime(13, 0, 0), KDateTime::UTC);
 
-    KDateTime actualEnd(QDate(2013, 03, 12), QTime(11, 0, 0), KDateTime::UTC);
+    KDateTime recurrenceId2(QDate(2013, 03, 13), QTime(10, 0, 0), KDateTime::UTC);
+    KDateTime exceptionStart2(QDate(2013, 03, 13), QTime(14, 0, 0), KDateTime::UTC);
+    KDateTime exceptionEnd2(QDate(2013, 03, 13), QTime(15, 0, 0), KDateTime::UTC);
+
+    KDateTime actualEnd(QDate(2013, 03, 14), QTime(11, 0, 0), KDateTime::UTC);
 
     KCalCore::Event::Ptr event1(new KCalCore::Event());
     event1->setUid("event1");
@@ -192,14 +196,22 @@ void TestOccurrenceIterator::testWithExceptionThisAndFuture()
     event1->recurrence()->setDaily(1);
     calendar.addEvent(event1);
 
-    KCalCore::Event::Ptr exception(new KCalCore::Event());
-    exception->setUid(event1->uid());
-    exception->setSummary("exception");
-    exception->setRecurrenceId(recurrenceId);
-    exception->setThisAndFuture(true);
-    exception->setDtStart(exceptionStart);
-    exception->setDtEnd(exceptionEnd);
-    calendar.addEvent(exception);
+    KCalCore::Event::Ptr exception1(new KCalCore::Event());
+    exception1->setUid(event1->uid());
+    exception1->setSummary("exception1");
+    exception1->setRecurrenceId(recurrenceId1);
+    exception1->setThisAndFuture(true);
+    exception1->setDtStart(exceptionStart1);
+    exception1->setDtEnd(exceptionEnd1);
+    calendar.addEvent(exception1);
+
+    KCalCore::Event::Ptr exception2(new KCalCore::Event());
+    exception2->setUid(event1->uid());
+    exception2->setSummary("exception2");
+    exception2->setRecurrenceId(recurrenceId2);
+    exception2->setDtStart(exceptionStart2);
+    exception2->setDtEnd(exceptionEnd2);
+    calendar.addEvent(exception2);
 
     int occurrence = 0;
     KCalCore::OccurrenceIterator rIt(calendar, start, actualEnd);
@@ -217,15 +229,23 @@ void TestOccurrenceIterator::testWithExceptionThisAndFuture()
             QCOMPARE(rIt.incidence()->summary(), event1->summary());
         }
         if (occurrence == 2) {
-            QCOMPARE(rIt.occurrenceStartDate(), exceptionStart);
-            QCOMPARE(rIt.incidence()->summary(), exception->summary());
+            QCOMPARE(rIt.occurrenceStartDate(), exceptionStart1);
+            QCOMPARE(rIt.incidence()->summary(), exception1->summary());
         }
         if (occurrence == 3) {
-            QCOMPARE(rIt.occurrenceStartDate(), exceptionStart.addDays(1));
-            QCOMPARE(rIt.incidence()->summary(), exception->summary());
+            QCOMPARE(rIt.occurrenceStartDate(), exceptionStart1.addDays(1));
+            QCOMPARE(rIt.incidence()->summary(), exception1->summary());
+        }
+        if (occurrence == 4) {
+            QCOMPARE(rIt.occurrenceStartDate(), exceptionStart2);
+            QCOMPARE(rIt.incidence()->summary(), exception2->summary());
+        }
+        if (occurrence == 5) {
+            QCOMPARE(rIt.occurrenceStartDate(), exceptionStart1.addDays(3));
+            QCOMPARE(rIt.incidence()->summary(), exception1->summary());
         }
     }
-    QCOMPARE(occurrence, 3);
+    QCOMPARE(occurrence, 5);
 }
 
 void TestOccurrenceIterator::testSubDailyRecurrences()




More information about the commits mailing list