import test from 'node:test'; import assert from 'node:assert/strict'; import { analyzeFrameLuma, buildThumbnailCandidateTimes } from '../public/modules/thumbnail-utils.js'; test('buildThumbnailCandidateTimes prefers early seconds and appends a bounded fallback', () => { assert.deepEqual(buildThumbnailCandidateTimes(0), [0.15]); assert.deepEqual(buildThumbnailCandidateTimes(1.2), [0.15, 0.5, 1, 1.15]); assert.deepEqual(buildThumbnailCandidateTimes(6), [0.15, 0.5, 1, 2, 3.5, 5, 5.95]); }); test('analyzeFrameLuma marks near-black frames as black and bright frames as usable', () => { const blackFrame = new Uint8ClampedArray(64 * 4).fill(0); for (let index = 3; index < blackFrame.length; index += 4) { blackFrame[index] = 255; } const brightFrame = new Uint8ClampedArray(64 * 4); for (let index = 0; index < brightFrame.length; index += 4) { brightFrame[index] = 200; brightFrame[index + 1] = 180; brightFrame[index + 2] = 120; brightFrame[index + 3] = 255; } const blackAnalysis = analyzeFrameLuma(blackFrame, { stride: 1 }); const brightAnalysis = analyzeFrameLuma(brightFrame, { stride: 1 }); assert.equal(blackAnalysis.isBlackFrame, true); assert.equal(brightAnalysis.isBlackFrame, false); assert.ok(blackAnalysis.darkRatio > brightAnalysis.darkRatio); assert.ok(brightAnalysis.averageLuma > blackAnalysis.averageLuma); });