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