== Daily fast-forward from decades earlier == PASS daily since 1980 matches reference walk PASS daily since 1980 includes 2026-02-15 PASS daily since 1980 is fast (< 50ms) == Daily INTERVAL > 1 == PASS daily interval=13 since 1985 matches reference PASS daily interval=13 produced some occurrences == COUNT ending before the range == PASS COUNT=100 from 2020 yields nothing in 2026 == COUNT spanning into the range == PASS COUNT=20 remaining occurrences match reference PASS COUNT=20 gives exactly Feb 1-8 == Weekly fast-forward from decades earlier == PASS weekly MO since 2000 → Feb 2026 Mondays == Weekly multiple BYDAY == PASS weekly MO,TH since 2000 → Feb 1-14 2026 == Monthly fast-forward from decades earlier == PASS monthly 15th since 2000 → 2026 Q1 == Monthly day 29-31 / BYMONTHDAY degrade (#83 D1a) == PASS BYMONTHDAY=31 from the 31st degrades: Jan 31 only, nothing stepped PASS BYMONTHDAY=30 from the 30th degrades: Jan 30 only PASS BYMONTHDAY=29 degrades: a window past DTSTART gets NOTHING (no invented occurrence) PASS BYMONTHDAY=-1 degrades: Jan 31 only, never Feb 28 / Mar 31 / Apr 30 PASS BYMONTHDAY=1,15 degrades (list never truncated to the 1st): Jan 15 only PASS BYMONTHDAY=0 degrades (only DTSTART kept, no identity) PASS MONTHLY COUNT=3 from the 31st degrades: Jan 31 only (never Mar 31 / May 31, never Feb 28) PASS MONTHLY INTERVAL=2 from the 31st degrades: Jan 31 only PASS MONTHLY from the 29th degrades PASS MONTHLY from the 28th is supported and steps every month PASS MONTHLY from the 28th reports supported PASS MONTHLY COUNT=3 from the 28th → Jan, Feb, Mar 28 PASS MONTHLY INTERVAL=2 from the 28th (2026) == Yearly February 29 degrades (#83 D1a); other anchors supported == PASS yearly Feb 29 degrades: 2024-02-29 only, never 2028 PASS yearly Feb 29: a window past DTSTART gets nothing (never Feb 28 / Mar 1) PASS yearly Feb 29 COUNT=3 degrades: 2024 only PASS yearly Feb 28 is supported across 2024-2029 PASS yearly Mar 1 COUNT=3 → 2024, 2025, 2026 PASS yearly Dec 31 INTERVAL=2 is supported (day-of-month limit is MONTHLY only) == Monthly INTERVAL multiple of 12 on a certified anchor == PASS INTERVAL=12 from Feb 28 lands every February (2024-2030) PASS INTERVAL=12 from Feb 28 matches the reference walker PASS INTERVAL=12;COUNT=2 yields 2024-02-28 and 2025-02-28 PASS INTERVAL=12;COUNT=2 fast-forwarded into 2025 returns 2025-02-28 PASS INTERVAL=12;COUNT=2 fast-forward matches the reference walker PASS INTERVAL=24 from Feb 28 → 2024, 2026, 2028, 2030 PASS INTERVAL=36 from Feb 28 → 2024, 2027, 2030 PASS INTERVAL=12;COUNT=1 exhausted before 2025 → nothing PASS INTERVAL=12;COUNT=3 into 2026 → 2026-02-28 only PASS INTERVAL=12;BYMONTHDAY=29 from Feb 29 degrades: 2024-02-29 only == Century leap-year rules == PASS 2096 is a leap year PASS 2100 is NOT a leap year (divisible by 100, not 400) PASS 2400 is a leap year (divisible by 400) PASS 2000 is a leap year, 1900 is not PASS INTERVAL=12 Feb 29 across 2100 degrades: 2096-02-29 only == UNTIL on a supported monthly series == PASS UNTIL before the next position stops after Jan 15 PASS UNTIL after Mar 15 keeps Jan, Feb and Mar 15 PASS UNTIL exactly on an occurrence keeps that occurrence == Monthly EXDATE / RDATE == PASS EXDATE removes the Mar 15 occurrence PASS RDATE adds an explicit Feb 20 occurrence == Monthly fast-forward matches reference walker == PASS monthly 15 since 1985 matches reference PASS monthly 28 INTERVAL=3 since 1984 matches reference PASS monthly 15 COUNT=500 since 1985 matches reference == Weekly fast-forward matches reference walker (sweep) == PASS weekly sweep matches the reference walker (540 configurations) PASS weekly sweep: every COUNT+UNTIL configuration degrades to DTSTART only (540 configurations) == UNTIL in UTC and local time == PASS daily UNTIL (UTC) stops at 2026-02-05 PASS daily UNTIL (UTC form on a zoned DTSTART) stops at 2026-02-05 in Sydney PASS daily UNTIL in LOCAL form on a zoned DTSTART is degraded_invalid (nothing stepped; DTSTART is outside the window) PASS daily UNTIL (floating form on a floating DTSTART) stops at 2026-02-05 == EXDATE after fast-forward == PASS EXDATE removes 2026-02-09 Monday == RDATE after fast-forward == PASS RDATE adds 2026-02-11 == Global work budget == PASS exhausted budget throws too_large (not partial data) PASS shared budget across many events throws too_large == Regression: origin far more than 10,000 days before range == PASS origin is > 10,000 days before range PASS far-origin daily still produces the full month (not truncated) == Work-budget accounting == PASS weekly 7-BYDAY consumes >= 7 units for one week PASS weekly 7-BYDAY costs ~6 more candidates than 1-BYDAY PASS many weekly events exhaust a small budget → too_large PASS RDATE candidates consume budget PASS per-event occurrence cap throws too_large PASS no partial occurrence array is returned on cap PASS ordinary month view stays well below the default budget PASS one unit per candidate and none on append (5 in-range days → spent 5) == Iteration guard fails closed == PASS DAILY guard exhaustion throws too_large PASS DAILY guard exhaustion returns no partial array PASS WEEKLY guard exhaustion throws too_large PASS WEEKLY guard exhaustion returns no partial array PASS MONTHLY guard exhaustion throws too_large PASS MONTHLY guard exhaustion returns no partial array PASS YEARLY guard exhaustion throws too_large PASS YEARLY guard exhaustion returns no partial array PASS a degraded series never trips the iteration guard (limit 0, 76-year window) PASS an HOURLY series never trips the iteration guard (nothing is stepped) PASS guard exhaustion with all candidates EXDATE-excluded still throws too_large PASS EXDATE-excluded guard exhaustion returns no partial (empty) array PASS COUNT termination does not trip the guard PASS UNTIL termination does not trip the guard PASS range-end termination does not trip the guard PASS ordinary month rendering stays far below the iteration guard (limit 200) PASS env-lowered occurrence cap throws too_large PASS env-lowered occurrence cap returns no partial array == Single preview expansion == PASS preview flow expands recurrences exactly once PASS legacy separate calls expand twice (control) PASS bucket+select on one expansion still yields events == Exact-boundary recurrence termination == == Exact-boundary: DAILY == PASS DAILY COUNT=2 with limit/budget=2 succeeds PASS DAILY COUNT=2 exact-limit spends exactly 2 PASS DAILY COUNT=0 consumes zero iterations/work (limit 0 does not throw) PASS DAILY COUNT=0 preserves the DTSTART as degraded_invalid with no identity PASS DAILY UNTIL allowing exactly 2 candidates succeeds with limit/budget=2 PASS DAILY range containing exactly 2 candidates succeeds with limit/budget=2 PASS DAILY: a third required candidate with limit/budget=2 throws too_large == Exact-boundary: WEEKLY == PASS WEEKLY one emitted week with iteration limit=1 succeeds PASS WEEKLY two emitted weeks with limit=2 succeed PASS WEEKLY COUNT ending on the final BYDAY candidate succeeds with exactly 1 iteration (no wasted next-week probe) PASS WEEKLY COUNT-terminated series spends exactly 2 work units PASS WEEKLY UNTIL ending on the final candidate succeeds with exactly 1 iteration (no wasted next-week probe) PASS WEEKLY one additional required week (limit 1, needs 2) throws too_large == Exact-boundary: MONTHLY == PASS MONTHLY one valid position with iteration limit=1 succeeds PASS MONTHLY COUNT=1 does not enter or charge a second month PASS MONTHLY COUNT=1 spends exactly 1 PASS MONTHLY Jan 28 + Feb 28 are charged once each (= 2) PASS MONTHLY Jan 28 + Feb 28 produce two occurrences PASS MONTHLY Jan+Feb succeeds at exact limit 2 PASS MONTHLY Jan+Feb throws too_large one below limit PASS MONTHLY from the 31st is degraded: zero iterations/work, DTSTART only PASS MONTHLY one additional required inspected month throws too_large == Exact-boundary: YEARLY == PASS YEARLY one valid position with limit=1 succeeds PASS YEARLY COUNT=1 does not charge the following year PASS YEARLY 2024 + 2025 are charged once each (= 2) PASS YEARLY 2024 + 2025 yield two occurrences PASS YEARLY from Feb 29 is degraded: zero iterations/work, DTSTART only PASS YEARLY natural range completion does not require an extra iteration PASS YEARLY one additional inspected year (2025) throws too_large == Exact-boundary: work-budget assertions == PASS spent() equals the actual candidate count under exact COUNT termination PASS spent() does not increase for a COUNT termination check PASS spent() does not increase for an UNTIL termination check PASS spent() does not increase for a range-end termination check PASS exact work budget succeeds PASS one unit below the required budget throws too_large PASS no partial array is returned on actual budget exhaustion == #613 cross-engine recurrence-set parity (CaleeMobile#613 / calee-hub-core#558 D1a) == PASS weekly_byday_order_count: BYDAY=SU,MO;COUNT=3 is bounded chronologically PASS weekly_byday_order_count: BYDAY=MO,SU;COUNT=3 gives the same set PASS weekly_byday_order_count: token order is not observable PASS weekly_byday_duplicate_count: BYDAY=MO,MO;COUNT=4 emits no duplicate PASS weekly_byday_duplicate_count: BYDAY=MO;COUNT=4 gives the same set PASS weekly_byday_duplicate_count: repetition is not observable PASS weekly_byday_duplicate_count: BYDAY=MO,SU,MO;COUNT=3 collapses to {MO,SU} PASS weekly_byday_duplicate_count: four distinct recurrence identities PASS weekly_byday_distant_window: the series reaches the window at all PASS weekly_byday_distant_window: BYDAY=MO equals bare WEEKLY PASS weekly_byday_distant_window: a COUNT large enough to reach the window is reproduced PASS weekly_byday_distant_count_exhausted: COUNT=10 stays empty PASS weekly_byday_distant_count_exhausted: MO,WE,FR COUNT=5000 stays empty PASS weekly_byday_distant_count_exhausted: MO,WE,FR COUNT=10340 stays empty PASS weekly_byday_distant_count_exhausted: MO,WE,FR COUNT=10400 reaches the window PASS weekly_byday_distant_count_exhausted: single-weekday boundary COUNT=3445 stays empty PASS weekly_byday_distant_count_exhausted: single-weekday boundary COUNT=3450 yields exactly two PASS floating_until_calendar_context: America/New_York keeps the final occurrence PASS floating_until_calendar_context: America/New_York final instant is on the calendar clock PASS floating_until_calendar_context: America/Denver keeps the final occurrence PASS floating_until_calendar_context: America/Denver final instant is on the calendar clock PASS floating_until_calendar_context: Asia/Kolkata keeps the final occurrence PASS floating_until_calendar_context: Asia/Kolkata final instant is on the calendar clock PASS floating_until_calendar_context: Australia/Perth keeps the final occurrence PASS floating_until_calendar_context: Australia/Perth final instant is on the calendar clock PASS floating_until_calendar_context: UTC control unchanged under UTC PASS floating_until_calendar_context: UTC control unchanged under America/New_York PASS floating_until_calendar_context: UTC control unchanged under Australia/Perth PASS dtstart_not_in_byday: a Saturday DTSTART with BYDAY=MO,WE opens on the next Monday PASS dtstart_mid_week: a Wednesday DTSTART with BYDAY=MO,FR drops that week's Monday PASS dtstart_sunday: SU is the last day of the Monday-anchored week PASS dtstart_phase: INTERVAL=2 keeps the publisher's week cadence after the skip PASS until_week_candidates: a final Monday survives a Friday DTSTART PASS until_week_candidates: a whole final week survives a Saturday DTSTART PASS until_week_candidates: the final Monday survives across the Sunday wrap PASS distant_dtstart_work_budget: 19600104 FREQ=DAILY reaches the range PASS distant_dtstart_work_budget: 19600104 FREQ=WEEKLY reaches the range PASS distant_dtstart_work_budget: 19600104 FREQ=WEEKLY;BYDAY=MO reaches the range PASS distant_dtstart_work_budget: 19600104 FREQ=WEEKLY;BYDAY=MO,WE,FR reaches the range PASS distant_dtstart_work_budget: 19600104 FREQ=MONTHLY reaches the range PASS distant_dtstart_work_budget: 19600104 FREQ=YEARLY reaches the range PASS distant_dtstart_work_budget: 19700105 FREQ=DAILY reaches the range PASS distant_dtstart_work_budget: 19700105 FREQ=WEEKLY reaches the range PASS distant_dtstart_work_budget: 19700105 FREQ=WEEKLY;BYDAY=MO reaches the range PASS distant_dtstart_work_budget: 19700105 FREQ=WEEKLY;BYDAY=MO,WE,FR reaches the range PASS distant_dtstart_work_budget: 19700105 FREQ=MONTHLY reaches the range PASS distant_dtstart_work_budget: 19700105 FREQ=YEARLY reaches the range PASS distant_dtstart_work_budget: 20000103 FREQ=DAILY reaches the range PASS distant_dtstart_work_budget: 20000103 FREQ=WEEKLY reaches the range PASS distant_dtstart_work_budget: 20000103 FREQ=WEEKLY;BYDAY=MO reaches the range PASS distant_dtstart_work_budget: 20000103 FREQ=WEEKLY;BYDAY=MO,WE,FR reaches the range PASS distant_dtstart_work_budget: 20000103 FREQ=MONTHLY reaches the range PASS distant_dtstart_work_budget: 20000103 FREQ=YEARLY reaches the range PASS distant_dtstart_work_budget: 20150105 FREQ=DAILY reaches the range PASS distant_dtstart_work_budget: 20150105 FREQ=WEEKLY reaches the range PASS distant_dtstart_work_budget: 20150105 FREQ=WEEKLY;BYDAY=MO reaches the range PASS distant_dtstart_work_budget: 20150105 FREQ=WEEKLY;BYDAY=MO,WE,FR reaches the range PASS distant_dtstart_work_budget: 20150105 FREQ=MONTHLY reaches the range PASS distant_dtstart_work_budget: 20150105 FREQ=YEARLY reaches the range PASS distant_dtstart_work_budget: 20200106 FREQ=DAILY reaches the range PASS distant_dtstart_work_budget: 20200106 FREQ=WEEKLY reaches the range PASS distant_dtstart_work_budget: 20200106 FREQ=WEEKLY;BYDAY=MO reaches the range PASS distant_dtstart_work_budget: 20200106 FREQ=WEEKLY;BYDAY=MO,WE,FR reaches the range PASS distant_dtstart_work_budget: 20200106 FREQ=MONTHLY reaches the range PASS distant_dtstart_work_budget: 20200106 FREQ=YEARLY reaches the range PASS distant_dtstart_work_budget: BYDAY=MO equals bare WEEKLY from a 1960 Monday PASS distant_dtstart_work_budget: a 1960 daily series equals a 2020 one in-range All recurrence self-tests passed.