update tests & externalize event hanlding implementation
prevent spurious .last == .next when .next never did or cannot happen
ref. 758ff844, in case update routine is called repeatedly
ref. #2629, 'event' should output coherent values
amends 8edb7b6333
- streamline event handling through time_point & to_minutes
instead of sometimes seconds, sometimes minutes and sometimes both
- minor refactoring cref -> value for time point and durations function args
- probe for double and missing hours when daylight saving time happens
this is specific to local time schedules, utc should remain unaffected
- try to stay consistent with current pattern matching happening in loop
when an hour is missing, simply skip to the next schedule
when hour is repeated, make sure to recheck 'earlier' matches
- clean-up tests previously using very-very internal structs
try to handle everything (sic) using `handle_*` functions
from the corresponding namespace
Reference calendar time of other schedules, user-created named events
or the sun{rise,set} (when enabled)
For example
- '15m before sunset'
- '30m after cal#0'
- '1h15m after "foobar"'
Empty time spec is allowed, defaults to '1m'
'before sunrise' is the same as '1m before sunrise'
Internals are reworked to handle a more generalized 'Event' type, based
on the 'time point' and 'event' base classes fron sunrise and sunset
Sunrise and sunset should also track 'last' event as well as 'next
(not currently displayed anywhere, though)
ffs -> clz minus int size, otherwise multiple match order is broken
experiment with future masking, using ffs correctly this time
update tests to handle all branches of closest_delta, both future and past
allow just "UTC", "Monday", "05-01", etc.
clarify webui paragraph and mention KEYWORD as an element
ignore sunrise and sunset keywords when sun module is disabled
move all of parsing to time module, test whether combined match works
certain actions need to happen when
- starting restore()
- switching date within restore()
- stopping restore()
pretty good fit for an object and raii. so, using context struct to handle
sun{rise,set} initialization and per-schedule time match updates
sun{rise,set} event happens on a specific date, make sure it is also checked
fix double action trigger by comparing minutes, not raw timestamp seconds
experimenting with 'invalid state' i.e. when timestamp was not generated
include restore logic in tests, as code now lives in .ipp