Files
workinf_Blender_Wasm/tools/web/check-editor-main-reader.mjs
2026-08-12 15:23:35 -04:00

67 lines
3.3 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/basic_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 supportedEditors = new Set([
"VIEW_3D", "OUTLINER", "PROPERTIES", "UV_IMAGE", "NODE", "GRAPH", "DOPE_SHEET", "NLA",
"SPREADSHEET", "SEQUENCER", "CLIP",
]);
const regionKinds = new Set(["HEADER", "MAIN", "TOOLBAR", "SIDEBAR", "FOOTER"]);
const engine = await factory({ wasmBinary: wasmBinary.slice() });
const handle = engine._web_engine_create();
open(engine, handle, fixture);
const scene = snapshot(engine, handle);
assert.equal(scene.editorWorkflowStatus, "AVAILABLE");
const workflow = scene.editorWorkflow;
assert.equal(workflow.schemaVersion, 1);
assert.ok(workflow.workspaces.length > 0 && workflow.workspaces.length <= 64);
let areaCount = 0, regionCount = 0;
for (const workspace of workflow.workspaces) {
assert.ok(workspace.areas.some((area) => area.id === workspace.activeAreaId));
assert.equal(workspace.revision, scene.revision);
areaCount += workspace.areas.length;
for (const area of workspace.areas) {
assert.ok(supportedEditors.has(area.editor), `unsupported editor ${area.editor}`);
assert.ok(area.rect.x >= 0 && area.rect.y >= 0 && area.rect.width > 0 && area.rect.height > 0);
assert.ok(area.rect.x + area.rect.width <= 1 && area.rect.y + area.rect.height <= 1);
assert.ok(area.regions.some((region) => region.kind === "MAIN"));
regionCount += area.regions.length;
for (const region of area.regions) assert.ok(regionKinds.has(region.kind));
}
}
assert.ok(areaCount <= 1024 && regionCount <= 4096);
const activeWorkspace = workflow.workspaces.find((workspace) => workspace.id === workflow.context.workspaceId);
const activeArea = activeWorkspace?.areas.find((area) => area.id === workflow.context.activeAreaId);
assert.equal(activeArea?.editor, workflow.context.activeEditor);
assert.equal(workflow.context.revision, scene.revision);
assert.equal(workflow.context.activeObjectId, scene.activeObjectId);
assert.deepEqual(workflow.context.selection, scene.activeObjectId === null ? [] : [scene.activeObjectId]);
assert.deepEqual(workflow.keymaps, []);
engine._web_engine_destroy(handle);
process.stdout.write(`editor-main-reader-ok workspaces=${workflow.workspaces.length} areas=${areaCount} regions=${regionCount}\n`);