From 80c8ecb5c8c9a5d47e100011b1ecbd7d42fd2cdc Mon Sep 17 00:00:00 2001 From: Tim Evans Date: Mon, 20 Jul 2026 13:58:49 +0100 Subject: [PATCH] feat: elapsed + drift formatting helpers --- src/core/format.js | 13 +++++++++++++ tests/core/format.test.js | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/core/format.js create mode 100644 tests/core/format.test.js diff --git a/src/core/format.js b/src/core/format.js new file mode 100644 index 0000000..ac938c0 --- /dev/null +++ b/src/core/format.js @@ -0,0 +1,13 @@ +export function fmtElapsed(ms) { + const total = Math.floor(ms / 1000); + const h = Math.floor(total / 3600); + const m = Math.floor((total % 3600) / 60); + return `${h}:${String(m).padStart(2, '0')}`; +} + +export function fmtDrift(driftMin) { + if (driftMin == null) return ''; + const r = Math.round(driftMin); + if (r === 0) return 'on time'; + return r > 0 ? `+${r} behind` : `${Math.abs(r)} ahead`; +} diff --git a/tests/core/format.test.js b/tests/core/format.test.js new file mode 100644 index 0000000..bed5192 --- /dev/null +++ b/tests/core/format.test.js @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { fmtElapsed, fmtDrift } from '../../src/core/format.js'; + +describe('formatting', () => { + it('formats elapsed time', () => { + expect(fmtElapsed(0)).toBe('0:00'); + expect(fmtElapsed(65 * 1000)).toBe('0:01'); + expect(fmtElapsed(112 * 60 * 1000)).toBe('1:52'); + }); + it('formats drift with direction', () => { + expect(fmtDrift(null)).toBe(''); + expect(fmtDrift(0)).toBe('on time'); + expect(fmtDrift(6)).toBe('+6 behind'); + expect(fmtDrift(-3)).toBe('3 ahead'); + }); +});