// node --test tests/search.test.mjs import test from "node:test"; import assert from "node:assert/strict"; import { buildIndex, search, choseong, initialGroup } from "../web/static/js/search.js"; import { shortestPath } from "../web/static/js/layout.js"; const terms = [ { i: "a", n: "우선순위 설정", a: [], q: ["무엇부터"], x: "여러 문제 가운데 먼저 다룰 것을 정함" }, { i: "b", n: "건강신념모형", a: ["Health Belief Model", "HBM"], q: [], x: "" }, { i: "c", n: "발생률", a: ["incidence"], q: [], x: "새롭게 발생한 환자 비율" }, { i: "d", n: "유병률", a: ["prevalence"], q: [], x: "질병을 가진 사람 비율" }, ]; const idx = buildIndex(terms); const top = (q) => search(idx, q)[0]?.t.i; test("부분·동의어·설명 검색", () => { assert.equal(top("우선"), "a"); assert.equal(top("hbm"), "b"); assert.equal(top("prevalence"), "d"); assert.equal(top("새롭게"), "c"); assert.equal(top("무엇부터 먼저"), "a"); }); test("초성·오타", () => { assert.equal(top("ㄱㄱㅅㄴ"), "b"); assert.equal(top("우선순이"), "a"); assert.equal(choseong("건강"), "ㄱㄱ"); }); test("결과 없음", () => assert.equal(search(idx, "쀍쀍").length, 0)); test("가나다 묶음", () => { assert.equal(initialGroup("쌍둥이"), "ㅅ"); assert.equal(initialGroup("WHO"), "A–Z"); }); test("최단 경로", () => { const rels = [{ i: "r1", s: "a", t: "b" }, { i: "r2", s: "c", t: "b" }]; const adj = new Map(terms.map((t) => [t.i, []])); for (const r of rels) { adj.get(r.s).push(r); adj.get(r.t).push(r); } const p = shortestPath(adj, "a", "c"); assert.deepEqual(p.map((s) => s.to), ["b", "c"]); assert.equal(p[1].forward, false); assert.equal(shortestPath(adj, "a", "d"), null); });