Files
claude-code/src/utils/__tests__/treeify.test.ts
2026-04-17 10:13:09 +08:00

98 lines
3.1 KiB
TypeScript

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<string, unknown> = { 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");
});
});