import { test } from 'node:test'; import assert from 'node:assert/strict'; import { type Segment, formatTime, buildTimeline, mainOffsetMs, segmentIndexAtVirtualMs, chapterToVirtualMs, } from './media-player.logic.ts'; // A main file A split around an insertion, then a second main file B: // [ main A 10s ][ ad 5s ][ main A 8s ][ main B 6s ] const segs: Segment[] = [ { url: 'A', duration_ms: 10_000, segment_type: 'main' }, { url: 'X', duration_ms: 5_000, segment_type: 'ad' }, { url: 'A', duration_ms: 8_000, segment_type: 'main' }, { url: 'B', duration_ms: 6_000, segment_type: 'main' }, ]; test('formatTime formats m:ss and h:mm:ss', () => { assert.equal(formatTime(0), '0:00'); assert.equal(formatTime(65), '1:05'); assert.equal(formatTime(3661), '1:01:01'); assert.equal(formatTime(NaN), '0:00'); }); test('buildTimeline gives cumulative starts + total', () => { const { segStarts, totalMs } = buildTimeline(segs); assert.deepEqual(segStarts, [0, 10_000, 15_000, 23_000]); assert.equal(totalMs, 29_000); }); test('mainOffsetMs is the offset within a split main URL', () => { assert.equal(mainOffsetMs(segs, 0), 0); // A's first appearance assert.equal(mainOffsetMs(segs, 1), 0); // insertion → 0 assert.equal(mainOffsetMs(segs, 2), 10_000); // A's second slice sits 10s into A assert.equal(mainOffsetMs(segs, 3), 0); // B's first appearance }); test('segmentIndexAtVirtualMs finds the containing segment and clamps past end', () => { const { segStarts, totalMs } = buildTimeline(segs); assert.equal(segmentIndexAtVirtualMs(segStarts, segs, 0), 0); assert.equal(segmentIndexAtVirtualMs(segStarts, segs, 12_000), 1); assert.equal(segmentIndexAtVirtualMs(segStarts, segs, 15_000), 2); assert.equal(segmentIndexAtVirtualMs(segStarts, segs, totalMs + 1), 3); }); test('chapterToVirtualMs maps main-only time across insertions', () => { // 5s into main lands at 5s virtual (nothing precedes it). assert.equal(chapterToVirtualMs(segs, 5_000), 5_000); // 12s of main = all of A1 (10s) + 2s of A2; virtual = 10s A1 + 5s ad + 2s = 17s. assert.equal(chapterToVirtualMs(segs, 12_000), 17_000); });