diff --git a/lib/ical/recur_expansion.js b/lib/ical/recur_expansion.js index 4f282e12..b3fc0d75 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 @@ -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; @@ -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. @@ -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')) { diff --git a/test/recur_expansion_test.js b/test/recur_expansion_test.js index e3cfc356..9cb48d7a 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-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,