diff --git a/lib/ical/recur_expansion.js b/lib/ical/recur_expansion.js index 903906df..7222a4a7 100644 --- a/lib/ical/recur_expansion.js +++ b/lib/ical/recur_expansion.js @@ -121,7 +121,7 @@ ICAL.RecurExpansion = (function() { * @type {Number} * @private */ - ruleDateInc: 0, + ruleDateInc: -1, /** * Current position in exDates array @@ -241,6 +241,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; @@ -278,7 +286,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. @@ -384,15 +392,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')) { diff --git a/test/recur_expansion_test.js b/test/recur_expansion_test.js index 877c5656..9078470c 100644 --- a/test/recur_expansion_test.js +++ b/test/recur_expansion_test.js @@ -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, 09, 02, 10, 00, 00), + new Date(2012, 10, 05, 10, 00, 00), + new Date(2012, 10, 10, 10, 00, 00), + new Date(2012, 10, 30, 10, 00, 00) + ], dates = [], next; + + while (next = subject.next() ) { + dates.push(next.toJSDate()); + } + + assert.deepEqual(dates, expected); + }); + test('default', function() { var dtstart = ICAL.Time.fromData({ year: 2012,