import assert from "node:assert/strict"; import { WorkspaceRuntime } from "../workspace/runtime.mjs"; import { resolveResources } from "../workspace/resource-resolver.mjs"; const workspace = new WorkspaceRuntime({ files: { "config/main.ini": "[HAL]\nHALFILE = machine.hal\n[EMC]\nTOOL_TABLE = tools.tbl\n[RS274NGC]\nPARAMETER_FILE = vars.var\nPROGRAM = main.ngc\n[PYTHON]\nPYTHONFILE = hooks.py\n[DISPLAY]\nVCP = panel.xml\n[CLASSICLADDER]\nCLPFILE = plc.clp\n", "config/machine.hal": "loadrt sim\n", "config/tools.tbl": "T1 P1\n", "config/vars.var": "#1 = 2\n", "config/main.ngc": "G21\n", "config/hooks.py": "print('ok')\n", "config/panel.xml": "\n", "config/plc.clp": "classicladder\n", } }); const graph = resolveResources({ workspace, entrypoint: "config/main.ini" }); assert.equal(graph.status, "ready"); assert.equal(graph.resolved_count, 7); assert.equal(graph.blocked_count, 0); assert.equal(new Set(graph.resources.map((row) => row.type)).size, 7); assert.match(graph.state_hash, /^fnv1a64:/); const missing = resolveResources({ workspace: new WorkspaceRuntime({ files: { "config/main.ini": "[HAL]\nHALFILE = missing.hal\n" } }), entrypoint: "config/main.ini" }); assert.equal(missing.status, "blocked"); assert.equal(missing.resources[0].code, "resource_missing"); const host = resolveResources({ workspace: new WorkspaceRuntime({ files: { "config/main.ini": "[PYTHON]\nPYTHONFILE = /tmp/x.py\n" } }), entrypoint: "config/main.ini" }); assert.equal(host.resources[0].code, "resource_host_path"); const duplicate = resolveResources({ workspace, entrypoint: "config/main.ini", explicit: [{ type: "hal", path: "machine.hal" }] }); assert.equal(duplicate.resources.some((row) => row.code === "resource_duplicate"), true); const second = resolveResources({ workspace, entrypoint: "config/main.ini" }); assert.equal(second.state_hash, graph.state_hash); console.log(`resource_resolver=passed resolved=${graph.resolved_count} blocked=${graph.blocked_count} state_hash=${graph.state_hash}`);