Add Chromium-only Blender WebEngine parity work
This commit is contained in:
53
tools/web/check-modifier-cycle.mjs
Normal file
53
tools/web/check-modifier-cycle.mjs
Normal file
@@ -0,0 +1,53 @@
|
||||
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 golden = JSON.parse(fs.readFileSync(new URL("tests/golden/N-002/modifier_dependency_cycle.json", root), "utf8"));
|
||||
const blend = fs.readFileSync(new URL(`tests/files/web/${golden.fixture}`, root));
|
||||
const wasmBinary = fs.readFileSync(new URL("web/app/src/vendor/blender/web_engine.wasm", root));
|
||||
const engine = await factory({ wasmBinary });
|
||||
const handle = engine._web_engine_create();
|
||||
|
||||
const input = engine._malloc(blend.byteLength);
|
||||
engine.HEAPU8.set(blend, input);
|
||||
assert.equal(engine._web_engine_open_blend(handle, input, blend.byteLength), 0);
|
||||
engine._free(input);
|
||||
|
||||
const dataOut = engine._malloc(4);
|
||||
const lengthOut = engine._malloc(4);
|
||||
assert.equal(engine._web_engine_evaluate_depsgraph(handle, dataOut, lengthOut), 0);
|
||||
const pointer = engine.HEAPU32[dataOut >>> 2];
|
||||
const length = engine.HEAPU32[lengthOut >>> 2];
|
||||
const report = JSON.parse(new TextDecoder().decode(engine.HEAPU8.slice(pointer, pointer + length)));
|
||||
const byObject = new Map(report.objects.map((object) => [object.objectId, object]));
|
||||
|
||||
for (const name of golden.cycleObjects) {
|
||||
const object = byObject.get(`object:${name}`);
|
||||
assert.ok(object, `${name} report is missing`);
|
||||
assert.equal(object.modifiers.length, 1);
|
||||
assert.equal(object.modifiers[0].status, "BLOCKED");
|
||||
assert.equal(object.modifiers[0].errorCode, "MODIFIER_DEPENDENCY_CYCLE");
|
||||
assert.equal(object.modifiers[0].targetObjectIds.length, 1);
|
||||
}
|
||||
|
||||
const missing = byObject.get(`object:${golden.missingTarget.object}`)?.modifiers.find(
|
||||
(modifier) => modifier.name === golden.missingTarget.modifier,
|
||||
);
|
||||
assert.equal(missing?.status, "BLOCKED");
|
||||
assert.equal(missing?.errorCode, "MODIFIER_TARGET_MISSING");
|
||||
|
||||
const ordered = byObject.get(`object:${golden.orderedStack.object}`)?.modifiers;
|
||||
assert.deepEqual(ordered?.map((modifier) => modifier.name), golden.orderedStack.modifiers);
|
||||
assert.deepEqual(ordered?.[1].dependsOn, [ordered[0].uuid]);
|
||||
assert.equal(ordered?.[0].showViewport, true);
|
||||
assert.equal(ordered?.[0].showRender, true);
|
||||
assert.equal(ordered?.[0].showEditmode, true);
|
||||
assert.equal(ordered?.[0].showOnCage, true);
|
||||
assert.equal(ordered?.[1].status, "DISABLED");
|
||||
assert.equal(ordered?.[1].showRender, true);
|
||||
|
||||
engine._free(dataOut);
|
||||
engine._free(lengthOut);
|
||||
engine._web_engine_destroy(handle);
|
||||
process.stdout.write("modifier-cycle-ok cycles=2 missingTargets=1 orderedStack=2\n");
|
||||
Reference in New Issue
Block a user