import { describe, expect, it } from "@suaveplan/testing/runner"; import { flatTransform, makeSurface } from "../__fixtures__/fixtures.js"; import type { Control, ControlNode, Group, } from "../types/control-node.types.js"; import { walkSurface } from "./walk.js"; function group(id: string, children: ReadonlyArray): Group { return { type: "group", id, layout: { kind: "absolute" }, transform: flatTransform(), children, }; } function control(id: string): Control { return { type: "control", id, kind: "knob", transform: flatTransform() }; } describe("walkSurface", () => { it("visits a single-root surface once with empty parent stack", { timeout: 5000, }, () => { const root = group("root", []); const visited: Array<{ id: string; parents: string[] }> = []; walkSurface(makeSurface(root), (node, parents) => visited.push({ id: node.id, parents: parents.map((p) => p.id) }) ); expect(visited).toEqual([{ id: "root", parents: [] }]); }); it("visits root → A → [B, C → [D]] → E in DFS pre-order", { timeout: 5000, }, () => { const tree = group("root", [ group("A", [control("B"), group("C", [control("D")])]), control("E"), ]); const ids: string[] = []; walkSurface(makeSurface(tree), (n) => ids.push(n.id)); expect(ids).toEqual(["root", "A", "B", "C", "D", "E"]); }); it("passes the root-first parent stack to every visit", { timeout: 5000, }, () => { const tree = group("root", [group("A", [control("B")])]); const stacks = new Map(); walkSurface(makeSurface(tree), (node, parents) => { stacks.set( node.id, parents.map((p) => p.id) ); }); expect(stacks.get("root")).toEqual([]); expect(stacks.get("A")).toEqual(["root"]); expect(stacks.get("B")).toEqual(["root", "A"]); }); it("visits nine nodes when a group contains two groups with three controls each", { timeout: 5000, }, () => { const tree = group("root", [ group("g1", [control("c1"), control("c2"), control("c3")]), group("g2", [control("c4"), control("c5"), control("c6")]), ]); let count = 0; walkSurface(makeSurface(tree), () => { count += 1; }); expect(count).toBe(9); }); });