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");