import { describe, expect, test } from "bun:test"; const { treeify } = await import("../treeify"); describe("treeify", () => { test("renders flat tree with two keys", () => { const result = treeify({ a: "value-a", b: "value-b" }); const lines = result.split("\n"); expect(lines.length).toBe(2); expect(lines[0]).toContain("a"); expect(lines[0]).toContain("value-a"); expect(lines[1]).toContain("b"); expect(lines[1]).toContain("value-b"); }); test("uses branch character for non-last items", () => { const result = treeify({ a: "1", b: "2" }); // First item uses ├ (branch), last uses └ (lastBranch) expect(result).toContain("├"); expect(result).toContain("└"); }); test("uses lastBranch for single item", () => { const result = treeify({ only: "val" }); expect(result).toContain("└"); expect(result).not.toContain("├"); }); test("renders nested objects", () => { const result = treeify({ parent: { child: "val" } }); expect(result).toContain("parent"); expect(result).toContain("child"); expect(result).toContain("val"); }); test("renders arrays with length", () => { const result = treeify({ items: ["1", "2", "3"] } as any); expect(result).toContain("items"); expect(result).toContain("[Array(3)]"); }); test("detects circular references", () => { const obj: Record = { name: "root" }; obj.self = obj; const result = treeify(obj as any); expect(result).toContain("[Circular]"); }); test("returns (empty) for empty object", () => { const result = treeify({}); expect(result).toBe("(empty)"); }); test("hideFunctions filters out function values", () => { const obj = { name: "test", fn: () => {} }; const result = treeify(obj as any, { hideFunctions: true }); expect(result).toContain("name"); expect(result).not.toContain("fn"); }); test("showValues false hides leaf values", () => { const obj = { name: "test" }; const result = treeify(obj, { showValues: false }); expect(result).toContain("name"); expect(result).not.toContain("test"); }); test("showValues true shows function as [Function]", () => { const obj = { fn: () => {} }; const result = treeify(obj as any, { showValues: true }); expect(result).toContain("[Function]"); }); test("deep nesting produces correct indentation", () => { const obj = { a: { b: { c: "deep" } } }; const result = treeify(obj); const lines = result.split("\n"); expect(lines.length).toBe(3); // Each level adds indentation expect(lines[2].length).toBeGreaterThan(lines[1].length); }); test("handles empty string key with string value", () => { const obj = { " ": "whitespace-key" }; const result = treeify(obj); expect(result).toContain("whitespace-key"); }); test("handles mixed object and primitive values", () => { const obj = { name: "test", nested: { inner: "val" }, count: 5 }; const result = treeify(obj as any); expect(result).toContain("name"); expect(result).toContain("nested"); expect(result).toContain("inner"); expect(result).toContain("count"); }); });