Skip to content

Commit

Permalink
recur_expansion.js: fix iterator with RDATE-only recurrence
Browse files Browse the repository at this point in the history
kewisch#534

When iterating with
  e is an event-component
  if (e.isRecurring() {
     let i = e.iterator();
     while (n = i.next()) {
       o = g.getOccurrenceDetails(obj)
       …
     }
  }

on the first iteration the DTSTART instance shall be returned.  It is returned,
when there is RRULE.  In the lack of this change, on the first iteration, when
RDATE is present without RRULE, the first RDATE instance is returned.
  • Loading branch information
dilyanpalauzov committed Sep 16, 2022
1 parent 04f2d11 commit c1ee71d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 5 deletions.
17 changes: 12 additions & 5 deletions lib/ical/recur_expansion.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ ICAL.RecurExpansion = (function() {
* @type {Number}
* @private
*/
ruleDateInc: 0,
ruleDateInc: -1,

/**
* Current position in exDates array
Expand Down Expand Up @@ -256,6 +256,14 @@ ICAL.RecurExpansion = (function() {
// _after_ we choose a value this should be
// the only spot where we need to worry about the
// end of events.
if (this.ruleDateInc == -1) {
this._nextRuleDay();
if (!iter) {
// on the first iteration return DTSTART
return this.last;
}
}

if (!next && !iter) {
// there are no more iterators or rdates
this.complete = true;
Expand Down Expand Up @@ -294,7 +302,7 @@ ICAL.RecurExpansion = (function() {
}

//XXX: The spec states that after we resolve the final
// list of dates we execute exdate this seems somewhat counter
// list of dates we execute exdate. This seems somewhat counter
// intuitive to what I have seen most servers do so for now
// I exclude based on the original date not the one that may
// have been modified by the exception.
Expand Down Expand Up @@ -400,15 +408,14 @@ ICAL.RecurExpansion = (function() {

this.ruleDateInc = 0;
this.last = this.ruleDates[0].clone();
this.ruleDate = this.ruleDates[0];
} else {
this.ruleDateInc = ICAL.helpers.binsearchInsert(
this.ruleDates,
this.last,
compareTime
);
) - 1;
}

this.ruleDate = this.ruleDates[this.ruleDateInc];
}

if (component.hasProperty('rrule')) {
Expand Down
23 changes: 23 additions & 0 deletions test/recur_expansion_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,29 @@ suite('recur_expansion', function() {
}, ".ruleIterators or .component must be given");
});

test('only rdate without rrule', function() {
var component = primary.component.toJSON();
component = new ICAL.Component(component);
component.removeAllProperties('rrule');

var subject = new ICAL.RecurExpansion({
component,
dtstart: primary.startDate
});
var expected = [
new Date("2012-10-02T07:00:00.000Z"),
new Date("2012-11-05T08:00:00.000Z"),
new Date("2012-11-10T08:00:00.000Z"),
new Date("2012-11-30T08:00:00.000Z")
], dates = [], next;

while (next = subject.next() ) {
dates.push(next.toJSDate());
}

assert.deepEqual(dates, expected);
});

test('default', function() {
var dtstart = ICAL.Time.fromData({
year: 2012,
Expand Down

0 comments on commit c1ee71d

Please sign in to comment.