By: Tom Sydney Kerckhove <syd@cs-syd.eu>
ical-recurrence: revive the resolve/unresolve roundtrip test This test was disabled because it asserted that resolving and unresolving any local time gives it back, which is false: a local time inside a spring-forward gap has no instant that maps to it, and a single generated observance with TZOFFSETTO past TZOFFSETFROM creates exactly such a gap. That roundtrip is the existence test. 'localTimeExists' defines it that way and 'recurEvents' drops the instances that fail it, so the property is worth having rather than deleting. It is restricted to the local times the zone has, with the gap derived from the two offsets the way the neighbouring tests derive which offset each direction picks. Deriving it from the roundtrip would assert a tautology. Nothing here is red: no source changed, and the property passes as soon as its domain is right. Two things earn their own tests instead, because the generators cannot reach them: Local times near the transition. The property generates the local time independently of the observance, so the two land within an hour of each other essentially never and the gap went uncovered. Four cases pin it, including both boundaries: the gap is [start, start + (to - from)), so 02:30 comes back as 01:30 while 03:00 comes back unchanged. Leap seconds. Whether one survives depends on the time of day and on the offset: 23:59:60 at a zero offset comes back, 00:00:60 normalises into the following minute, and 23:59:60 at +01:00 lands on the next day's midnight. That is a property of splitting an instant into a wall clock rather than anything about time zones, so the property excludes it and three cases pin the behaviour that justifies the exclusion. Found while doing so, not addressed here: BYSECOND admits 0 to 60, so a rule can generate a local time holding a leap second, and 'localTimeExists' then reports it nonexistent and drops the instance everywhere except 23:59:60 at a zero offset.
| Time to Start | Worker time | Duration | Time to finish | Idle | |
| Config | 0s | 1s | 1s | 1s | 0s |
| Eval | 1s | 11s | 11s | 12s | 0s |
| Build | 11s | 1m02s | 48s | 1m00s | 0s |
| Suite | 0s | 1m15s | 1m00s | 1m00s | 0s |