Normalize countdown keyboard adjustments and roll seconds across minutes

Co-authored-by: Shelley <shelley@exe.dev>
This commit is contained in:
Leon Mika 2026-10-10 06:50:45 +00:00
parent 9c993beda8
commit ebfd6e4ce1
3 changed files with 48 additions and 4 deletions

View file

@ -1,6 +1,38 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { Countdown, integer, splitSeconds } from './timer.mjs';
import { Countdown, integer, splitSeconds, adjustTime } from './timer.mjs';
for (const [minutes, seconds, delta, expectedMinutes, expectedSeconds] of [
['1', '59', 1n, '2', '00'],
['2', '00', -1n, '1', '59'],
['2', '05', -10n, '1', '55'],
['1', '58', 10n, '2', '08'],
['2', '00', -10n, '1', '50'],
['0', '90', 1n, '1', '31'],
['0', '90', -10n, '1', '20'],
['0', '00', -1n, '0', '00'],
['0', '05', -10n, '0', '00'],
]) {
test(`seconds adjustment ${minutes}:${seconds} ${delta} normalizes and rolls`, () => {
assert.deepEqual(adjustTime(minutes, seconds, 'seconds', delta), {
minutes: expectedMinutes,
seconds: expectedSeconds,
});
});
}
test('minute adjustments normalize first and keep minutes nonnegative', () => {
assert.deepEqual(adjustTime('0', '90', 'minutes', 1n), { minutes: '2', seconds: '30' });
assert.deepEqual(adjustTime('0', '90', 'minutes', -1n), { minutes: '0', seconds: '30' });
assert.deepEqual(adjustTime('1', '90', 'minutes', 10n), { minutes: '12', seconds: '30' });
assert.deepEqual(adjustTime('1', '90', 'minutes', -10n), { minutes: '0', seconds: '30' });
});
test('keyboard adjustments preserve large integer precision', () => {
assert.deepEqual(adjustTime('12345678901234567890', '59', 'seconds', 1n), {
minutes: '12345678901234567891', seconds: '00',
});
});
function fixture() {
let now = 1000;