94 lines
2.9 KiB
JavaScript
94 lines
2.9 KiB
JavaScript
const test = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
const { validateRenderRequest, playbackRange } = require('./renderValidation.cjs')
|
|
|
|
function scene(overrides = {}) {
|
|
return {
|
|
canvas: { width: 640, height: 360 },
|
|
duration: 2,
|
|
fps: 30,
|
|
layers: [
|
|
{
|
|
keyframes: [
|
|
{ time: 0, props: {} },
|
|
{ time: 1, props: {} },
|
|
],
|
|
},
|
|
],
|
|
assets: [],
|
|
...overrides,
|
|
}
|
|
}
|
|
|
|
test('accepts a normal render request', () => {
|
|
const result = validateRenderRequest(scene(), { fps: 30, crf: 18, preset: 'fast' })
|
|
assert.equal(result.ok, true)
|
|
assert.equal(result.options.totalFrames, 30)
|
|
})
|
|
|
|
test('rejects invalid dimensions', () => {
|
|
const result = validateRenderRequest(scene({ canvas: { width: 0, height: 360 } }))
|
|
assert.equal(result.ok, false)
|
|
assert.match(result.error, /canvas/)
|
|
})
|
|
|
|
test('rejects invalid fps and frame count', () => {
|
|
assert.equal(validateRenderRequest(scene(), { fps: 0 }).ok, false)
|
|
assert.equal(validateRenderRequest(scene({ duration: 61 }), { fps: 60 }).ok, false)
|
|
})
|
|
|
|
test('rejects invalid duration', () => {
|
|
const result = validateRenderRequest(scene({ duration: 0 }))
|
|
assert.equal(result.ok, false)
|
|
assert.match(result.error, /duration/)
|
|
})
|
|
|
|
test('rejects too many layers and keyframes', () => {
|
|
const layers = Array.from({ length: 501 }, () => ({ keyframes: [] }))
|
|
assert.equal(validateRenderRequest(scene({ layers })).ok, false)
|
|
|
|
const keyframes = Array.from({ length: 5001 }, (_, i) => ({ time: i / 60, props: {} }))
|
|
assert.equal(validateRenderRequest(scene({ layers: [{ keyframes }] })).ok, false)
|
|
})
|
|
|
|
test('rejects invalid crf and preset', () => {
|
|
assert.equal(validateRenderRequest(scene(), { crf: 52 }).ok, false)
|
|
assert.equal(validateRenderRequest(scene(), { preset: 'turbo' }).ok, false)
|
|
})
|
|
|
|
test('validates enabled camera data', () => {
|
|
const valid = validateRenderRequest(scene({
|
|
camera: {
|
|
enabled: true,
|
|
base: { x: 0, y: 0, width: 320, height: 180 },
|
|
keyframes: [{ time: 0.5, props: { x: 10 }, easing: 'linear' }],
|
|
},
|
|
}))
|
|
assert.equal(valid.ok, true)
|
|
|
|
const invalidSize = validateRenderRequest(scene({
|
|
camera: {
|
|
enabled: true,
|
|
base: { x: 0, y: 0, width: 0, height: 180 },
|
|
keyframes: [],
|
|
},
|
|
}))
|
|
assert.equal(invalidSize.ok, false)
|
|
assert.match(invalidSize.error, /camera/)
|
|
|
|
const invalidKf = validateRenderRequest(scene({
|
|
camera: {
|
|
enabled: true,
|
|
base: { x: 0, y: 0, width: 320, height: 180 },
|
|
keyframes: [{ time: Number.NaN, props: {}, easing: 'linear' }],
|
|
},
|
|
}))
|
|
assert.equal(invalidKf.ok, false)
|
|
assert.match(invalidKf.error, /keyframe/)
|
|
})
|
|
|
|
test('computes playback range from in/out or last keyframe', () => {
|
|
assert.deepEqual(playbackRange(scene({ inTime: 0.25, outTime: 1.5 })), { start: 0.25, end: 1.5 })
|
|
assert.deepEqual(playbackRange(scene()), { start: 0, end: 1 })
|
|
})
|