Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 115 additions & 4 deletions wasm_bindings/js/tests/test-wasm.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,125 @@
const cg = require("../pkg-node/causalgraphs_wasm.js");

// --- helpers ---
const sortStrings = (arr) => arr.slice().sort();
const sortPairs = (pairs) =>
pairs
.map(([a, b]) => [String(a), String(b)])
.sort((p, q) => (p[0] === q[0] ? p[1].localeCompare(q[1]) : p[0].localeCompare(q[0])));

const latentsList = (dag) => {
const v = dag.latents; // exposed as a getter property
if (Array.isArray(v)) return sortStrings(v);
if (v && typeof v === "object") {
return sortStrings(Object.keys(v).filter((k) => v[k]));
}
return [];
};

describe("RustDAG wasm (CJS)", () => {
it("should add nodes & edges", () => {
it("should add nodes & edges (basic)", () => {
const dag = new cg.RustDAG();
dag.addNode("U");
dag.addNode("V");
dag.addEdge("U","V");
expect(dag.nodes()).toEqual(["U","V"]);
dag.addEdge("U", "V");
expect(dag.nodes()).toEqual(["U", "V"]);
expect(dag.nodeCount).toBe(2);
expect(dag.edges()).toEqual([["U","V"]]);
expect(dag.edges()).toEqual([["U", "V"]]);
expect(dag.edgeCount).toBe(1);
});

it("addNode with optional latent flag; latents getter", () => {
const dag = new cg.RustDAG();
dag.addNode("A");
dag.addNode("L", true);
expect(sortStrings(dag.nodes())).toEqual(["A", "L"]);

const lats = latentsList(dag);
expect(lats).toContain("L");
expect(lats).not.toContain("A");
});

it("addNodesFrom with optional latent mask (Uint8Array)", () => {
const dag = new cg.RustDAG();
dag.addNodesFrom(["X", "Y", "Z"], [true, false, true]);
expect(sortStrings(dag.nodes())).toEqual(["X", "Y", "Z"]);

const lats = latentsList(dag);
expect(lats).toEqual(["X", "Z"]);
});

it("getParents and getChildren", () => {
const dag = new cg.RustDAG();
dag.addNodesFrom(["A", "B", "C", "D"]);
dag.addEdge("A", "B");
dag.addEdge("A", "C");
dag.addEdge("B", "D");
dag.addEdge("C", "D");

expect(sortStrings(dag.getParents("D"))).toEqual(["B", "C"]);
expect(sortStrings(dag.getChildren("A"))).toEqual(["B", "C"]);
});

it("getAncestorsOf for a single target", () => {
const dag = new cg.RustDAG();
dag.addNodesFrom(["A", "B", "C", "D"]);
dag.addEdge("A", "B");
dag.addEdge("A", "C");
dag.addEdge("B", "D");
dag.addEdge("C", "D");

const ancD = sortStrings(dag.getAncestorsOf(["D"]));
expect(ancD).toEqual(["A", "B", "C", "D"]);
});

it("getAncestorsOf for multiple targets", () => {
const dag = new cg.RustDAG();
dag.addNodesFrom(["A", "B", "C", "D", "E"]);
dag.addEdge("A", "B");
dag.addEdge("B", "C");
dag.addEdge("A", "D");
dag.addEdge("D", "E");

const anc = sortStrings(dag.getAncestorsOf(["C", "E"]));
expect(anc).toEqual(["A", "B", "C", "D", "E"]);
});

it("edges reflects added edges (order-insensitive)", () => {
const dag = new cg.RustDAG();
dag.addNodesFrom(["A", "B", "C"]);
dag.addEdge("A", "B");
dag.addEdge("B", "C");

const expected = sortPairs([
["A", "B"],
["B", "C"],
]);
const got = dag.edges();
expect(Array.isArray(got)).toBe(true);

const normalized = sortPairs(got.map((e) => (Array.isArray(e) ? e.slice(0, 2) : e)));
expect(normalized).toEqual(expected);
});

it("addEdge can take an optional weight (graph relations still correct)", () => {
const dag = new cg.RustDAG();
dag.addNodesFrom(["S", "T"]);
dag.addEdge("S", "T", 0.75);

expect(dag.getParents("T")).toEqual(["S"]);
expect(dag.getChildren("S")).toEqual(["T"]);
});

it("nodeCount / edgeCount track mutations", () => {
const dag = new cg.RustDAG();
expect(dag.nodeCount).toBe(0);
expect(dag.edgeCount).toBe(0);

dag.addNodesFrom(["A", "B", "C"]);
expect(dag.nodeCount).toBe(3);

dag.addEdge("A", "B");
dag.addEdge("B", "C");
expect(dag.edgeCount).toBe(2);
});
});
1 change: 0 additions & 1 deletion wasm_bindings/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use std::collections::HashSet;
use wasm_bindgen::prelude::*;

#[wasm_bindgen(js_name = RustDAG)]
#[derive(Clone)]
pub struct RustDAG {
inner: rust_core::RustDAG,
}
Expand Down
Loading