54 lines
2.5 KiB
JavaScript
54 lines
2.5 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 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");
|