Loading the parity record
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Parity / RRule
Every number on this page was produced by running both implementations over the same cases: the real python-dateutil package pinned at 2.9.0.post0 answers first, and its answer is the expectation the Go port is held to. Nothing is a hand-written expectation, so a new upstream release re-scores the port on its own. See RRule for the port's own documentation. Source: github.com/malcolmston/rrule.
Not a generic diagram: every node below names an artefact of this harness — the pinned package it installed, the runner files it started, the case files it streamed, and the counts it wrote out.
| Case group | Cases | Match | Mismatch | Group parity |
|---|---|---|---|---|
| strings | 29 | 22 | 7 | 75.9% |
| combinations | 26 | 26 | 0 | 100.0% |
| sets | 24 | 23 | 1 | 95.8% |
| byday | 19 | 19 | 0 | 100.0% |
| byweekno | 19 | 17 | 2 | 89.5% |
| frequencies | 17 | 17 | 0 | 100.0% |
| timeofday | 15 | 14 | 1 | 93.3% |
| errors | 14 | 9 | 5 | 64.3% |
| windows | 14 | 14 | 0 | 100.0% |
| bymonthday | 12 | 10 | 2 | 83.3% |
| portbugs | 12 | 1 | 11 | 8.3% |
| bysetpos | 11 | 11 | 0 | 100.0% |
| timezone | 11 | 7 | 4 | 63.6% |
| bymonth | 10 | 8 | 2 | 80.0% |
| interval | 10 | 10 | 0 | 100.0% |
| limits | 10 | 10 | 0 | 100.0% |
| byyearday | 8 | 6 | 2 | 75.0% |
Every exported symbol of the upstream package, and what the port offers for it. The upstream list is derived mechanically, never from a README: python3 -c "import dateutil; print(dateutil.__version__)"
2.9.0.post0
python3 -c "import dateutil.rrule as R; print(sorted(n for n in dir(R) if not n.startswith('_')))"
['DAILY', 'FR', 'FREQNAMES', 'HOURLY', 'M365MASK', 'M365RANGE', 'M366MASK',
'M366RANGE', 'MDAY365MASK', 'MDAY366MASK', 'MINUTELY', 'MO', 'MONTHLY',
'NMDAY365MASK', 'NMDAY366MASK', 'SA', 'SECONDLY', 'SU', 'TH', 'TU',
'WDAYMASK', 'WE', 'WEEKLY', 'YEARLY', 'advance_iterator', 'calendar',
'datetime', 'easter', 'gcd', 'integer_types', 'itertools', 'parser', 'range',
're', 'rrule', 'rrulebase', 'rruleset', 'rrulestr', 'sys', 'wa…. A symbol with no case is untested, never a match.
| Upstream symbol | Go symbol | Status | Cases | Note |
|---|---|---|---|---|
| dateutil.rrule.YEARLY | rrule.Yearly | match | freq-yearly, freq-yearly-unbounded, interval-yearly-2 | |
| dateutil.rrule.MONTHLY | rrule.Monthly | match | freq-monthly, freq-monthly-day31 | |
| dateutil.rrule.WEEKLY | rrule.Weekly | match | freq-weekly, wkst-weekly-interval2-* | |
| dateutil.rrule.DAILY | rrule.Daily | match | freq-daily, daily-count10 | |
| dateutil.rrule.HOURLY | rrule.Hourly | match | freq-hourly, hourly-3-until-1700 | |
| dateutil.rrule.MINUTELY | rrule.Minutely | match | freq-minutely, minutely-15-count6 | |
| dateutil.rrule.SECONDLY | rrule.Secondly | match | freq-secondly, secondly-filtered | |
| dateutil.rrule.MO | rrule.MO | match | byday-plain-mo, byweekno-20-mo | |
| dateutil.rrule.TU | rrule.TU | match | byday-plain-multi, us-election-day | |
| dateutil.rrule.WE | rrule.WE | match | byday-hourly, byweekno-multi | |
| dateutil.rrule.TH | rrule.TH | match | byday-plain-multi, bymonth-with-byday-th | |
| dateutil.rrule.FR | rrule.FR | match | byday-monthly-last-fr, friday-the-13th | |
| dateutil.rrule.SA | rrule.SA | match | saturday-after-first-sunday, byday-all-seven | |
| dateutil.rrule.SU | rrule.SU | match | byday-monthly-first-and-last-su, byweekno-1-wkst-su | |
| dateutil.rrule.weekday | rrule.Weekday | match | byday-plain-mo, byday-monthly-mixed-ordinals | |
| dateutil.rrule.weekdaybase | rrule.Weekday | match | byday-plain-mo | upstream splits base/subclass; the port has one struct |
| dateutil.rrule.weekday.n | rrule.Weekday.N | match | byday-monthly-1fr, byday-monthly-2nd-last-mo | |
| dateutil.rrule.weekday.weekday | rrule.Weekday.Day | match | byday-plain-mo | |
| dateutil.rrule.weekday.__call__(n) | rrule.Weekday.Nth | match | byday-monthly-plus1mo, byday-monthly-last-fr, byday-yearly-20mo | MO(+1) / FR(-1) vs MO.Nth(1) / FR.Nth(-1) |
| dateutil.rrule.weekdays | — | missing | — | no aggregate [7]Weekday slice is exported |
| dateutil.rrule.FREQNAMES | rrule.Freq.String | match | rulestring-daily-count, rulestring-byweekno-byday | same seven spellings |
| dateutil.rrule.rrule | rrule.RRule / rrule.New | match | all 197 expand cases | |
| dateutil.rrule.rrulebase | (methods on *RRule and *Set) | match | after-basic, before-basic, between-basic | the port has no separate base type |
| dateutil.rrule.rruleset | rrule.Set / rrule.NewSet | match | setbuild-*, set-* | |
| dateutil.rrule.rrulestr | rrule.Parse / rrule.StrToRRule | differs | parse-rrule-prefix, parse-trailing-semicolon, parse-whitespace, duplicate-part, byeaster-0 | the port accepts text upstream rejects, and rejects BYEASTER |
| dateutil.rrule.WDAYMASK | — | missing | — | precomputed weekday mask; the port's equivalent (iterInfo) is unexported |
| dateutil.rrule.M365MASK | — | missing | — | as above |
| dateutil.rrule.M366MASK | — | missing | — | as above |
| dateutil.rrule.M365RANGE | — | missing | — | as above |
| dateutil.rrule.M366RANGE | — | missing | — | as above |
| dateutil.rrule.MDAY365MASK | — | missing | — | as above |
| dateutil.rrule.MDAY366MASK | — | missing | — | as above |
| dateutil.rrule.NMDAY365MASK | — | missing | — | as above |
| dateutil.rrule.NMDAY366MASK | — | missing | — | as above |
| rrule.__iter__ | rrule.RRule.Iterator | match | every expand case | the port's All is bounded by MaxAllOccurrences |
| rrule.__str__ | rrule.RRule.String | differs | rulestring-until-utc, rulestring-byyearday, rulestring-unsorted-byday, rulestring-duplicate-bymonthday, rulestring-tz-named-zone | see [Serialisation](#serialisation) |
| rrulebase.after | rrule.RRule.After | match | after-basic, after-inclusive, after-past-end | upstream None and the port's zero time.Time both encode as JSON null |
| rrulebase.before | rrule.RRule.Before | match | before-basic, before-inclusive, before-start | |
| rrulebase.between | rrule.RRule.Between | match | between-basic, between-inclusive, between-exclusive-endpoints, between-empty, between-unbounded-rule | |
| rrulebase.count | len(rrule.RRule.All()) | match | count-daily-10, count-until, count-empty | |
| rrule.replace | — | missing | — | no "rebuild with changed parts" helper; Options() + New() is the manual equivalent |
| rrulebase.xafter | — | missing | — | no "iterate n occurrences after t" helper |
| rrulebase.__getitem__ | — | missing | — | no index/slice access into a rule |
| rrulebase.__contains__ | — | missing | — | no membership test |
| rruleset.rrule | rrule.Set.RRule | match | setbuild-two-rules-tz, set-two-rrules, set-duplicate-instants | |
| rruleset.exrule | rrule.Set.ExRule | match | setbuild-exrule, set-exrule, set-exrule-weekday | |
| rruleset.rdate | rrule.Set.RDate | match | set-rdate, set-rdate-multi, setbuild-rrule-rdate-exdate | |
| rruleset.exdate | rrule.Set.ExDate | match | set-exdate, set-exdate-multi, set-exdate-cancels-rdate, set-friday-13th-exdate | |
| rruleset.__iter__ | rrule.Set.Iterator | match | every set / setbuild case | |
| rruleset.after | rrule.Set.After | untested | — | inherited from rrulebase; only the single-rule path is exercised |
| rruleset.before | rrule.Set.Before | untested | — | as above |
| rruleset.between | rrule.Set.Between | untested | — | as above |
| rruleset.count | len(rrule.Set.All()) | untested | — | as above |
| rruleset.xafter | — | missing | — | |
| rrule(freq=…) | Options.Freq | differs | freq-* (7), bug-missing-freq, bug-missing-freq-byday, unknown-freq | all seven frequencies agree; an **absent** FREQ is rejected upstream and silently read as YEARLY by the port |
| rrule(dtstart=…) | Options.DTStart | differs | tz-* (11), bug-dst-* (3), set-tzid, set-utc-z | zone handling of a non-existent / ambiguous wall clock diverges — see [DST](#dst-and-timezones) |
| rrule(interval=…) | Options.Interval | differs | interval-* (10), bug-interval-zero, bug-interval-zero-hourly, bug-huge-interval, bug-huge-interval-monthly, bug-large-interval, interval-negative | normal intervals agree; INTERVAL=0 and INTERVAL=2^63-1 do not |
| rrule(wkst=…) | Options.Wkst | match | wkst-weekly-interval2-{mo…su} (7), byweekno-20-wkst-su, byweekno-1-wkst-su, byweekno-1-wkst-mo-su, wkst-bad | all seven week starts agree, including the RFC 5545 §3.8.5.3 WKST example |
| rrule(count=…) | Options.Count | differs | count-1, count-exact-limit, count-overrun-probe, bug-count-zero, bug-count-zero-with-until, count-negative, count-not-int | COUNT=0 means "none" upstream, "unlimited" in the port; COUNT=-1 is accepted upstream, rejected by the port |
| rrule(until=…) | Options.Until | match | until-utc, until-naive, until-equals-dtstart, until-utc-before-dtstart, until-mid-day, count-and-until, until-and-count-until-wins, until-malformed | inclusive on both sides; UNTIL wins over COUNT on both sides |
| rrule(bysetpos=…) | Options.BySetPos | match | all 11 bysetpos-*, weekly-byday-bysetpos | including the two RFC 5545 §3.8.5.3 BYSETPOS examples and out-of-range positions |
| rrule(bymonth=…) | Options.ByMonth | differs | bymonth-* (10), bymonth-13, bymonth-0 | in-range values agree; out-of-range values are ignored upstream, rejected by the port |
| rrule(bymonthday=…) | Options.ByMonthDay | differs | bymonthday-* (12) | negatives, -31, Feb 29 and "invalid date ignored" all agree; 0 / 32 diverge |
| rrule(byyearday=…) | Options.ByYearDay | differs | byyearday-* (8) | 1,100,200, 366, -366 and MONTHLY misuse agree; 0 / 367 diverge |
| rrule(byweekno=…) | Options.ByWeekNo | differs | byweekno-* (11 + 7 WKST variants) | weeks 1/20/53/-1 and every WKST agree; 0 / 54 diverge |
| rrule(byweekday=…) | Options.ByWeekday | differs | all 19 byday-*, byday-empty-value | plain, +1MO, -1FR, -2MO, 5SU, 20MO, 53MO, mixed ordinals and ordinal-ignored-below-MONTHLY all agree; an empty BYDAY= value is rejected upstream, accepted by the port |
| rrule(byhour=…) | Options.ByHour | match | byhour-daily, byhour-byminute-daily, byhour-minutely, byhour-hourly-filter, byhour-yearly, byhour-24, byhour-unreachable-interval | |
| rrule(byminute=…) | Options.ByMinute | match | byminute-daily, byminute-hourly-expand, byminute-60, all-three-times | |
| rrule(bysecond=…) | Options.BySecond | differs | bysecond-daily, bysecond-minutely-expand, bysecond-60, bysecond-61 | BYSECOND=60 (the RFC 5545 leap second) is rejected upstream and accepted by the port, which folds it into the next minute |
| rrule(byeaster=…) | — | missing | byeaster-0, byeaster-negative | not an RFC 5545 rule part; the port rejects it as an unknown rule part |
| rrulestr(forceset=True) | rrule.StrToSet | match | all 20 set-* cases | the port splits the two return types into two functions instead of a flag |
| rrulestr(dtstart=…) | — | missing | — | the port takes the anchor only from a DTSTART line; the runner works around this with Options() + New() |
| rrulestr(unfold=…) | (always unfolds) | untested | — | the port unfolds RFC 5545 continuation lines unconditionally |
| rrulestr(ignoretz=…) | — | missing | — | |
| rrulestr(tzids=…), rrulestr(tzinfos=…) | — | missing | — | the port always resolves TZID through time.LoadLocation |
| rrulestr(compatible=…) | — | missing | — | no pre-RFC compatibility mode |
| rrulestr(cache=…) | — | missing | — | |
| — | rrule.RRule.RuleString | extra | all 13 rulestring-* | the RRULE value without the property name |
| — | rrule.SundayStart | extra | byweekno-*-wkst-su, wkst-weekly-interval2-su | Options.Wkst's zero value must mean Monday, so Sunday needs a sentinel |
| — | rrule.MaxAllOccurrences | extra | — | documented bound on All for an unbounded rule |
| — | rrule.RRule.Options / .DTStart / .Freq | extra | every case (the runner re-anchors through Options()) | read the compiled rule back |
| — | rrule.Set.RRules / .ExRules / .RDates / .ExDates / .DTStart / .String | extra | — | read a set's parts back |
| — | rrule.ErrInvalidRule / ErrInvalidFreq / ErrInvalidWeekday / ErrEmptyRule / ErrParse / ErrNoRRule / ErrInvalidCalendar | extra | every failing case | errors.Is-classifiable sentinels; upstream raises bare ValueError/TypeError |
| — | rrule.Calendar / Event / Property / ParseCalendar / Calendar.Encode | extra | — | an iCalendar container layer; outside dateutil.rrule entirely |
Every case the harness streamed to both runners, with the exact upstream symbol and Go symbol it exercised. A deliberate, documented difference is a deviation and is counted apart from a mismatch.
| Case | Group | Upstream symbol | Go symbol | Status | Note |
|---|---|---|---|---|---|
| byday-plain-mo | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-plain-multi | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-all-seven | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-daily-filter | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-monthly-1fr | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-monthly-plus1mo | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | explicit + sign on the ordinal |
| byday-monthly-last-fr | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-monthly-2nd-last-mo | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-monthly-first-and-last-su | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-monthly-5th-su | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | a 5th Sunday only exists in some months |
| byday-yearly-20mo | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-yearly-last-we | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-yearly-53th-mo | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | a 53rd Monday exists only in long years |
| byday-weekly-ordinal-ignored | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545: the ordinal must be ignored for FREQ finer than MONTHLY |
| byday-daily-ordinal-ignored | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-hourly | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byday-monthly-mixed-ordinals | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | qualified and unqualified entries in one BYDAY |
| byday-bad-weekday | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | both sides must fail |
| byday-zero-ordinal | byday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | ordinal 0 is not valid |
| bymonth-6-7 | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-1-2-3-alt-years | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-january-daily | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-january-yearly-byday | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-monthly-filter | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-weekly-filter | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-13 | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| bymonth-0 | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| bymonth-with-byday-th | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonth-summer-thursdays | bymonth | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-2-15 | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-first-and-last | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-neg3 | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-31 | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | skips months with fewer than 31 days |
| bymonthday-neg31 | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-29-feb | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-range-10-15 | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-invalid-30-ignored | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: February 30 is simply ignored |
| bymonthday-yearly | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-daily-filter | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bymonthday-zero | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | 0 is out of range; both sides must fail |
| bymonthday-32 | bymonthday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| bysetpos-3rd-tuwedth | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-2nd-to-last-weekday | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-first-weekday | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-last-day-of-year | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-multi | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-yearly-byday | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-hourly | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| bysetpos-out-of-range-high | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | no month has 10 Mondays: empty result, not an error |
| bysetpos-zero | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | 0 is invalid |
| bysetpos-367 | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | out of range |
| bysetpos-alone | bysetpos | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | BYSETPOS with no other BYxxx part |
| byweekno-20-mo | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byweekno-1-mo | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byweekno-53-mo | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | ISO week 53 exists only in long years |
| byweekno-neg1-mo | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byweekno-20-wkst-su | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | WKST=SU changes which days fall in ISO week 20 |
| byweekno-1-wkst-su | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byweekno-1-wkst-mo-su | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byweekno-no-byday | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | BYWEEKNO with no BYDAY: the weekday comes from DTSTART |
| byweekno-multi | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byweekno-54 | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| byweekno-0 | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| wkst-weekly-interval2-mo | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-weekly-interval2-tu | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-weekly-interval2-we | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-weekly-interval2-th | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-weekly-interval2-fr | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-weekly-interval2-sa | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-weekly-interval2-su | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 3.8.5.3: WKST shifts the every-other-week boundary |
| wkst-bad | byweekno | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | invalid WKST |
| byyearday-1-100-200 | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byyearday-negative | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byyearday-366 | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | only leap years have a 366th day |
| byyearday-neg366 | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byyearday-daily-filter | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byyearday-monthly | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | RFC 5545 forbids BYYEARDAY with MONTHLY; dateutil is the oracle |
| byyearday-0 | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| byyearday-367 | byyearday | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | mismatch | out of range |
| friday-the-13th | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| saturday-after-first-sunday | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| us-election-day | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| every-other-tuesday-monthly | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| impossible-feb-30 | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | can never occur; must terminate, not hang |
| byweekno-and-bymonth | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| byyearday-and-byday | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| monthly-byday-byhour | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| weekly-byday-bysetpos | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| yearly-everything | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| hourly-byminute-bysecond | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| secondly-filtered | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| every-other-week-mo-we-fr | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| every-other-week-tu-th | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| weekly-tu-th-until | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| monthly-1fr-until | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| every-other-week-wkst-su-unbounded | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| hourly-3-until-1700 | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| minutely-15-count6 | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| daily-until-19971224 | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match | |
| daily-interval2-unbounded | combinations | dateutil.rrule.rrulestr | rrule.Parse+rrule.New+RRule.Iterator | match |