// Phase 1B entity extractor test suite. // Run: node test/test-entities.js // Exits 0 on full pass, 1 on any failure. // // Expected order: first occurrence in the source text (deduped). Matches // the task brief. import { extractEntities } from "../src/entities.js"; const cases = [ { name: "machine + product + tailscale ip", in: "DNS2 runs Triangles daemon on 100.121.150.22", want: ["DNS2", "Triangles", "100.121.150.22"], }, { name: "PR code + Phase code", in: "PR-30 fixed Phase 4 of the plan", want: ["PR-30", "Phase 4"], }, { name: "explicit arrow relations yield source+target entities", in: "DashCaddy → Caddy → nftables", want: ["DashCaddy", "Caddy", "nftables"], }, { name: "Hermes + krystie (profile) + MCP all-caps token", in: "Hermes (krystie profile) uses MCP stdio", want: ["Hermes", "krystie", "MCP"], }, ]; let pass = 0; let fail = 0; for (const c of cases) { const got = extractEntities(c.in); const ok = JSON.stringify(got) === JSON.stringify(c.want); if (ok) { pass++; console.log(`PASS ${c.name}`); console.log(` in=${JSON.stringify(c.in)}`); console.log(` out=${JSON.stringify(got)}`); } else { fail++; console.log(`FAIL ${c.name}`); console.log(` in=${JSON.stringify(c.in)}`); console.log(` got=${JSON.stringify(got)}`); console.log(` want=${JSON.stringify(c.want)}`); } } console.log(`\n${pass}/${pass + fail} passed`); if (fail > 0) process.exit(1);