Files
ST-Bionic-Memory-Ecology/tests/graph-layout-solver.mjs
2026-04-13 16:11:43 +08:00

77 lines
1.8 KiB
JavaScript

import assert from "node:assert/strict";
import { solveLayoutWithJs } from "../ui/graph-layout-solver.js";
const payload = {
nodes: [
{
x: 20,
y: 20,
vx: 0,
vy: 0,
pinned: false,
radius: 8,
regionKey: "objective",
regionRect: { x: 0, y: 0, w: 200, h: 160 },
},
{
x: 80,
y: 30,
vx: 0,
vy: 0,
pinned: false,
radius: 9,
regionKey: "objective",
regionRect: { x: 0, y: 0, w: 200, h: 160 },
},
{
x: 100,
y: 80,
vx: 0,
vy: 0,
pinned: true,
radius: 10,
regionKey: "objective",
regionRect: { x: 0, y: 0, w: 200, h: 160 },
},
],
edges: [
{ from: 0, to: 1, strength: 0.8 },
{ from: 1, to: 2, strength: 0.6 },
],
config: {
iterations: 32,
repulsion: 2200,
springK: 0.05,
damping: 0.87,
centerGravity: 0.02,
minGap: 10,
speedCap: 3,
},
};
const resultA = solveLayoutWithJs(payload);
assert.equal(resultA.ok, true);
assert.ok(resultA.positions instanceof Float32Array);
assert.equal(resultA.positions.length, payload.nodes.length * 2);
assert.equal(resultA.diagnostics.solver, "js-worker");
assert.equal(resultA.diagnostics.nodeCount, 3);
const resultB = solveLayoutWithJs(payload);
assert.deepEqual(Array.from(resultA.positions), Array.from(resultB.positions));
for (let index = 0; index < payload.nodes.length; index++) {
const x = resultA.positions[index * 2];
const y = resultA.positions[index * 2 + 1];
assert.ok(Number.isFinite(x));
assert.ok(Number.isFinite(y));
assert.ok(x >= 0 && x <= 200);
assert.ok(y >= 0 && y <= 160);
}
const emptyResult = solveLayoutWithJs({ nodes: [], edges: [] });
assert.equal(emptyResult.ok, true);
assert.equal(emptyResult.positions.length, 0);
console.log("graph-layout-solver tests passed");