41 lines
1.4 KiB
JavaScript
41 lines
1.4 KiB
JavaScript
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);
|
|
});
|