import assert from 'node:assert/strict' import test from 'node:test' import { chooseTimeAxisStep, timeAxisTicks } from './time-axis.ts' function series(from: Date, to: Date, count: number): Array<{ at: string }> { const start = from.getTime() const span = to.getTime() - start return Array.from({ length: count }, (_, index) => ({ at: new Date(start + (count === 1 ? 0 : (span * index) / (count - 1))).toISOString(), })) } test('picks a tick step that matches the selected span', () => { assert.deepEqual(chooseTimeAxisStep(6 * 60 * 60 * 1000), { unit: 'hour', step: 1 }) assert.deepEqual(chooseTimeAxisStep(7 * 24 * 60 * 60 * 1000), { unit: 'day', step: 1 }) assert.deepEqual(chooseTimeAxisStep(30 * 24 * 60 * 60 * 1000), { unit: 'day', step: 7 }) assert.deepEqual(chooseTimeAxisStep(90 * 24 * 60 * 60 * 1000), { unit: 'month', step: 1 }) assert.deepEqual(chooseTimeAxisStep(365 * 24 * 60 * 60 * 1000), { unit: 'month', step: 2 }) assert.deepEqual(chooseTimeAxisStep(900 * 24 * 60 * 60 * 1000), { unit: 'month', step: 6 }) }) test('labels a week of commits by day', () => { const points = series(new Date(2026, 2, 18, 9), new Date(2026, 2, 25, 9), 15) const labels = timeAxisTicks(points, { locale: 'en-US' }).map((tick) => tick.label) assert.ok(labels.length >= 5 && labels.length <= 8) assert.match(labels[0] ?? '', /Mar 18/) assert.ok(labels.some((label) => /21/.test(label))) assert.doesNotMatch(labels.join(' | '), /,\s*\d{1,2}:\d{2}/) }) test('labels a multi-year range by month and year, not clock time', () => { const points = series(new Date(2024, 2, 18, 12), new Date(2026, 7, 29, 12), 40) const labels = timeAxisTicks(points, { locale: 'en-US' }).map((tick) => tick.label) assert.ok(labels.length >= 4 && labels.length <= 8) assert.match(labels.join(' | '), /2024/) assert.match(labels[labels.length - 1] ?? '', /2026|Aug/) assert.doesNotMatch(labels.join(' | '), /AM|PM/) }) test('maps ticks onto the nearest commit index', () => { const points = [ { at: new Date(2026, 0, 1, 12).toISOString() }, { at: new Date(2026, 3, 1, 12).toISOString() }, { at: new Date(2026, 6, 1, 12).toISOString() }, ] const ticks = timeAxisTicks(points, { locale: 'en-US' }) assert.equal(ticks[0]?.index, 0) assert.equal(ticks[ticks.length - 1]?.index, 2) assert.equal(new Set(ticks.map((tick) => tick.index)).size, ticks.length) })