56 lines
2.6 KiB
JavaScript
56 lines
2.6 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import fs from "node:fs";
|
|
import factory from "../../web/app/src/vendor/blender/web_engine.js";
|
|
|
|
const root = new URL("../../", import.meta.url);
|
|
const wasmBinary = fs.readFileSync(new URL("web/app/src/vendor/blender/web_engine.wasm", root));
|
|
const fixture = fs.readFileSync(new URL("tests/files/web/sequencer_scene.blend", root));
|
|
|
|
function open(engine, handle, bytes) {
|
|
const pointer = engine._malloc(bytes.byteLength);
|
|
try {
|
|
engine.HEAPU8.set(bytes, pointer);
|
|
assert.equal(engine._web_engine_open_blend(handle, pointer, bytes.byteLength), 0,
|
|
engine.UTF8ToString(engine._web_engine_last_error_message()));
|
|
}
|
|
finally { engine._free(pointer); }
|
|
}
|
|
|
|
function snapshot(engine, handle) {
|
|
const dataOut = engine._malloc(4), lengthOut = engine._malloc(4);
|
|
try {
|
|
assert.equal(engine._web_engine_get_scene_snapshot(handle, dataOut, lengthOut), 0,
|
|
engine.UTF8ToString(engine._web_engine_last_error_message()));
|
|
const pointer = engine.HEAPU32[dataOut >>> 2], length = engine.HEAPU32[lengthOut >>> 2];
|
|
return JSON.parse(new TextDecoder().decode(engine.HEAPU8.slice(pointer, pointer + length)));
|
|
}
|
|
finally { engine._free(dataOut); engine._free(lengthOut); }
|
|
}
|
|
|
|
const engine = await factory({ wasmBinary: wasmBinary.slice() });
|
|
const handle = engine._web_engine_create();
|
|
open(engine, handle, fixture);
|
|
const scene = snapshot(engine, handle).scenes.find((candidate) => candidate.name === "SequencerScene");
|
|
assert.equal(scene?.sequencerStatus, "AVAILABLE");
|
|
const timeline = scene.sequencerTimeline;
|
|
assert.equal(timeline.schemaVersion, 1);
|
|
assert.equal(timeline.fpsNumerator, 24000);
|
|
assert.equal(timeline.fpsDenominator, 1001);
|
|
assert.equal(timeline.strips.length, 4);
|
|
const sound = timeline.strips.find((strip) => strip.name === "WebSound");
|
|
assert.equal(sound.type, "SOUND");
|
|
assert.equal(sound.sourcePath, "//media/sequencer-silence.wav");
|
|
assert.equal(sound.muted, true);
|
|
assert.equal(sound.locked, true);
|
|
const image = timeline.strips.find((strip) => strip.name === "WebImage");
|
|
assert.equal(image.type, "IMAGE");
|
|
assert.equal(image.sourcePath, "//media/sequencer-frame.png");
|
|
assert.deepEqual([image.sourceStart, image.sourceEnd], [0, 1]);
|
|
const cross = timeline.strips.find((strip) => strip.name === "WebCross");
|
|
assert.equal(cross.type, "EFFECT");
|
|
assert.equal(cross.effectType, "CROSS");
|
|
assert.equal(cross.inputStripIds.length, 2);
|
|
assert.ok(cross.inputStripIds.every((id) => timeline.strips.some((strip) => strip.id === id)));
|
|
engine._web_engine_destroy(handle);
|
|
process.stdout.write("sequencer-main-reader-ok media-paths=passed still-image-range=passed fps=passed effect-dependencies=passed\n");
|