diff --git a/lib/ical/recur_expansion.js b/lib/ical/recur_expansion.js index 98b420b5..8bb0bbf1 100644 --- a/lib/ical/recur_expansion.js +++ b/lib/ical/recur_expansion.js @@ -106,7 +106,7 @@ class RecurExpansion { * @type {Number} * @private */ - ruleDateInc = 0; + ruleDateInc = -1; /** * Current position in exDates array @@ -240,6 +240,14 @@ class RecurExpansion { // _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; @@ -278,7 +286,7 @@ class RecurExpansion { } //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. @@ -379,15 +387,14 @@ class RecurExpansion { this.ruleDateInc = 0; this.last = this.ruleDates[0].clone(); + this.ruleDate = this.ruleDates[0]; } else { this.ruleDateInc = binsearchInsert( this.ruleDates, this.last, (a, b) => a.compare(b) - ); + ) - 1; } - - this.ruleDate = this.ruleDates[this.ruleDateInc]; } if (component.hasProperty('rrule')) { diff --git a/test/recur_expansion_test.js b/test/recur_expansion_test.js index eb5d37d1..fd871cb6 100644 --- a/test/recur_expansion_test.js +++ b/test/recur_expansion_test.js @@ -54,6 +54,29 @@ suite('recur_expansion', function() { }, ".ruleIterators or .component must be given"); }); + test('only rdate without rrule', function() { + let component = primary.component.toJSON(); + component = new ICAL.Component(component); + component.removeAllProperties('rrule'); + + const subj = new ICAL.RecurExpansion({ + component, + dtstart: primary.startDate + }); + let expected = [ + new Date(2012, 9, 2, 10), + new Date(2012, 10, 5, 10), + new Date(2012, 10, 10, 10), + new Date(2012, 10, 30, 10) + ], dates = [], next; + + while ((next = subj.next())) { + dates.push(next.toJSDate()); + } + + assert.deepEqual(dates, expected); + }); + test('default', function() { let dtstart = ICAL.Time.fromData({ year: 2012,