Collega i documenti alle RFC che nominano, unisce con archi describes (INFERRED) i concetti che hanno lo stesso nome esatto di un simbolo, e trova il nodo del documento anche quando l'estrazione gli ha dato un id diverso (25 documenti, tra cui DD-026, prima restavano senza archi). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
145 lines
4.5 KiB
TypeScript
145 lines
4.5 KiB
TypeScript
/** Check del collegamento documenti ↔ codice nel grafo: `bun test/unit/graphify-link-docs.test.ts`. */
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
archiConcetti,
|
|
archiDocumento,
|
|
archiRfc,
|
|
estraiRfc,
|
|
estraiPercorsi,
|
|
estraiSimboli,
|
|
idDocumento,
|
|
} from "../../scripts/graphify-link-docs";
|
|
|
|
// --- percorsi: solo file del repo, con la prima riga in cui compaiono ---------
|
|
const testo =
|
|
"Intro\nVedi `src/lib/rosa.ts` e src/routes/partita.$id.tsx.\nDi nuovo src/lib/rosa.ts, www.x.it/a.ts";
|
|
const p = estraiPercorsi(testo);
|
|
assert.deepEqual([...p.keys()], ["src/lib/rosa.ts", "src/routes/partita.$id.tsx"]);
|
|
assert.equal(p.get("src/lib/rosa.ts"), 2, "tiene la prima riga");
|
|
|
|
// --- simboli: solo tra backtick, senza parentesi ------------------------------
|
|
assert.deepEqual(
|
|
[...estraiSimboli("`useIo` e `inRosa()` ma non useRosa né `a b`")],
|
|
["useIo", "inRosa"],
|
|
);
|
|
|
|
// --- id del documento come lo costruisce graphify -----------------------------
|
|
assert.equal(idDocumento("docs/modules/allenatore.md"), "docs_modules_allenatore");
|
|
assert.equal(idDocumento("docs/decisions/DD-034.md"), "docs_decisions_dd_034");
|
|
|
|
// --- archi: file citato + simboli citati che ci stanno dentro -----------------
|
|
const grafo = {
|
|
nodes: [
|
|
{ id: "docs_modules_allenatore", label: "Modulo" },
|
|
{ id: "src_lib_rosa", label: "rosa.ts", source_file: "src/lib/rosa.ts", source_location: "L1" },
|
|
{
|
|
id: "src_lib_rosa_useio",
|
|
label: "useIo()",
|
|
source_file: "src/lib/rosa.ts",
|
|
source_location: "L160",
|
|
},
|
|
{
|
|
id: "src_lib_rosa_altro",
|
|
label: "altro()",
|
|
source_file: "src/lib/rosa.ts",
|
|
source_location: "L9",
|
|
},
|
|
{ id: "src_lib_x", label: "x.ts", source_file: "src/lib/x.ts", source_location: "L1" },
|
|
],
|
|
links: [],
|
|
};
|
|
const archi = archiDocumento(
|
|
grafo,
|
|
"docs/modules/allenatore.md",
|
|
"File: `src/lib/rosa.ts` (`useIo`)",
|
|
);
|
|
assert.deepEqual(
|
|
archi.map((a) => a.target),
|
|
["src_lib_rosa", "src_lib_rosa_useio"],
|
|
"il file e solo il simbolo citato; non altro() né file non citati",
|
|
);
|
|
assert.equal(archi[0]?.source, "docs_modules_allenatore");
|
|
assert.equal(archi[0]?.["confidence"], "EXTRACTED");
|
|
assert.deepEqual(
|
|
archiDocumento(grafo, "docs/non-nel-grafo.md", "src/lib/rosa.ts"),
|
|
[],
|
|
"documento ignoto: nessun arco",
|
|
);
|
|
assert.deepEqual(
|
|
archiDocumento(grafo, "docs/modules/allenatore.md", "src/lib/inesistente.ts"),
|
|
[],
|
|
"file non nel grafo",
|
|
);
|
|
|
|
// --- RFC: tutte le forme, anche «8188/8291» ------------------------------------
|
|
assert.deepEqual([...estraiRfc("cifrata (RFC 8188/8291), poi RFC-8030 e RFC 123")].sort(), [
|
|
"8030",
|
|
"8188",
|
|
"8291",
|
|
]);
|
|
const conRfc = {
|
|
nodes: [
|
|
{ id: "docs_decisions_dd_026", label: "DD" },
|
|
{ id: "r8291", label: "RFC-8291" },
|
|
{ id: "r8030", label: "RFC-8030" },
|
|
],
|
|
links: [],
|
|
};
|
|
assert.deepEqual(
|
|
archiRfc(conRfc, "docs/decisions/DD-026.md", "cifrata (RFC 8188/8291)").map((a) => a.target),
|
|
["r8291"],
|
|
"solo le RFC che esistono come nodi",
|
|
);
|
|
|
|
// --- concetti: nome esatto e unico, solo dai documenti --------------------------
|
|
const conc = {
|
|
nodes: [
|
|
{
|
|
id: "c1",
|
|
label: "mediePagelle()",
|
|
source_file: "docs/modules/pagelle.md",
|
|
file_type: "concept",
|
|
},
|
|
{
|
|
id: "k1",
|
|
label: "mediePagelle()",
|
|
source_file: "src/lib/pagelle.ts",
|
|
file_type: "code",
|
|
_origin: "ast",
|
|
},
|
|
{ id: "c2", label: "Altra cosa", source_file: "docs/modules/pagelle.md", file_type: "concept" },
|
|
{ id: "c3", label: "dup()", source_file: "docs/x.md", file_type: "concept" },
|
|
{ id: "k2", label: "dup()", source_file: "src/a.ts", file_type: "code", _origin: "ast" },
|
|
{ id: "k3", label: "dup()", source_file: "src/b.ts", file_type: "code", _origin: "ast" },
|
|
],
|
|
links: [],
|
|
};
|
|
const ac = archiConcetti(conc);
|
|
assert.deepEqual(
|
|
ac.map((a) => [a.source, a.target]),
|
|
[["c1", "k1"]],
|
|
"esatto e unico; ambiguo scartato",
|
|
);
|
|
assert.equal(ac[0]?.["confidence"], "INFERRED");
|
|
|
|
// --- nodo-documento con id diverso da quello derivato dal percorso -------------
|
|
const altro = {
|
|
nodes: [
|
|
{
|
|
id: "docs_decisions_dd_026_dd_026",
|
|
label: "DD-026",
|
|
source_file: "docs/decisions/DD-026.md",
|
|
file_type: "document",
|
|
},
|
|
{ id: "src_lib_rosa", label: "rosa.ts", source_file: "src/lib/rosa.ts", source_location: "L1" },
|
|
],
|
|
links: [],
|
|
};
|
|
assert.equal(
|
|
archiDocumento(altro, "docs/decisions/DD-026.md", "src/lib/rosa.ts")[0]?.source,
|
|
"docs_decisions_dd_026_dd_026",
|
|
"usa il nodo document del file se l'id derivato non esiste",
|
|
);
|
|
|
|
console.log("graphify-link-docs: ok");
|