diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-17 09:04:46 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-17 09:04:46 +0200 |
| commit | 53d39b7212ffe0753d2b10ea39348bc033f06bef (patch) | |
| tree | be756f5cf2e3d4e1b303b05637924e1224ff2d96 /test/test_weather.lua | |
| parent | 752b58b3992d1a9cfb51c891deb77007286415ee (diff) | |
| download | conky-theme-udt-53d39b7212ffe0753d2b10ea39348bc033f06bef.tar.gz conky-theme-udt-53d39b7212ffe0753d2b10ea39348bc033f06bef.zip | |
fix: guard now, and clamp a negative age, in the staleness pair
is_stale and age_str were the only functions in the module doing
arithmetic on an unchecked argument: a nil `now` raised, and a raise in
this project is a blank dashboard with no message. Every caller passes
os.time(), which cannot be nil, so this was unreachable, but it is the
same bug already fixed once in icon() and the module header promises
nothing raises.
age_str also printed a negative age when the observation timestamp was
in the future, which a clock skew can produce. "stale -17m" on the card
reads as a broken widget, so the age now floors at zero and such a
reading counts as fresh: weather from the future is not old.
With this the whole module is raise-free, verified across every function
against nil, string, table, boolean, NaN, negative and zero arguments in
all three positions.
Both cases were found by the Task 5 implementer, which was asked to
probe beyond its given tests and reported them without changing the code.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'test/test_weather.lua')
| -rw-r--r-- | test/test_weather.lua | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/test/test_weather.lua b/test/test_weather.lua index 95908ce..cdcdc2d 100644 --- a/test/test_weather.lua +++ b/test/test_weather.lua @@ -222,4 +222,15 @@ assert(weather.age_str(1000, 1000 + 3600) == '1h', 'an hour reads as 1h') assert(weather.age_str(1000, 1000 + 7200) == '2h', 'two hours') assert(weather.age_str(1000, 1000 + 86400 * 2) == '2d', 'days, once it gets that bad') +-- Neither takes `now` on faith: a nil there used to raise, and a raise is a +-- blank dashboard rather than a message. +assert(weather.is_stale(1000, nil) == true, 'a nil now must not raise') +assert(weather.age_str(1000, nil) == '?', 'a nil now must not raise') + +-- A dt in the future means a clock skew. "stale -17m" reads as a broken +-- widget, so the age floors at zero and the reading counts as fresh. +assert(weather.age_str(2000, 1000) == '0m', 'a future dt reads as 0m, got ' .. + tostring(weather.age_str(2000, 1000))) +assert(weather.is_stale(2000, 1000) == false, 'a future dt is not stale') + print('test_weather: all assertions passed') |
