2654f8b7

ical-recurrence: record what an event without a DTSTART does

An event with no DTSTART is conforming input when the calendar carries a
METHOD:

@
; The following is REQUIRED if the component
; appears in an iCalendar object that doesn't
; specify the "METHOD" property; otherwise, it
; is OPTIONAL; in any case, it MUST NOT occur
; more than once.
;
dtstart /
@

recurEvents returns early for one, so its RDATEs are dropped and its
EXDATEs go unapplied.  With METHOD:REQUEST, a DURATION and two RDATEs,
the recurrence set comes back as a single occurrence with no start and
neither RDATE in it.

This records that rather than changing it, because the spec does not say
what the recurrence set of such an event is.  Every definition of one is
phrased in terms of DTSTART, down to "The DTSTART property defines the
first instance in the recurrence set", and there is no way to work out
where an instance an RDATE adds should end when the DTSTART and DTEND pair
that the duration would come from is what is missing.  A period-valued
RDATE carries its own end and a DURATION would carry over, but a DTEND
without a DTSTART would not, so a fix would have to invent an answer for
that case.

Applying the EXDATEs alone would change nothing: the single occurrence has
no start, and an exception date cannot match that.

No behaviour changes here.  Worth a decision rather than a silent gap.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 10s 10s 11s 0s
Build 10s 58s 58s 1m09s 0s
Suite 0s 1m09s 1m09s 1m09s 0s

Timeline

0s10s20s30s40s50s1m