mirror of
https://github.com/Youzini-afk/ST-Bionic-Memory-Ecology.git
synced 2026-05-15 22:30:38 +08:00
perf: optimize persist delta gating and diagnostics
This commit is contained in:
76
tests/graph-layout-solver.mjs
Normal file
76
tests/graph-layout-solver.mjs
Normal file
@@ -0,0 +1,76 @@
|
||||
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");
|
||||
Reference in New Issue
Block a user