import { describe, it, expect } from "bun:test"; import { PromptBuilder } from "../../src/core/prompt-builder"; describe("PromptBuilder", () => { it("空 builder build 返回空字符串", () => { const builder = new PromptBuilder(); expect(builder.build()).toBe(""); }); it("单段输出", () => { const result = new PromptBuilder().head("# 标题").build(); expect(result).toBe("# 标题"); }); it("多段按序渲染", () => { const result = new PromptBuilder() .head("# 阶段") .context("状态信息") .prompt("核心引导") .guide("操作指令") .warn("警告信息") .build(); const headPos = result.indexOf("# 阶段"); const contextPos = result.indexOf("状态信息"); const promptPos = result.indexOf("核心引导"); const guidePos = result.indexOf("操作指令"); const warnPos = result.indexOf("警告信息"); expect(headPos).toBeLessThan(contextPos); expect(contextPos).toBeLessThan(promptPos); expect(promptPos).toBeLessThan(guidePos); expect(guidePos).toBeLessThan(warnPos); }); it("空段跳过", () => { const result = new PromptBuilder().head("# 标题").prompt("内容").guide("指引").build(); expect(result).toContain("# 标题"); expect(result).toContain("内容"); expect(result).toContain("指引"); }); it("同 kind 多次追加拼接", () => { const result = new PromptBuilder() .head("# 阶段") .context("信息一") .context("信息二") .prompt("prompt") .build(); expect(result).toContain("信息一\n\n信息二"); }); it("head 重复设值覆盖", () => { const result = new PromptBuilder().head("# 旧标题").head("# 新标题").build(); expect(result).toBe("# 新标题"); expect(result).not.toContain("旧标题"); }); it("prompt 重复设值覆盖", () => { const result = new PromptBuilder().prompt("旧 prompt").prompt("新 prompt").build(); expect(result).toContain("新 prompt"); expect(result).not.toContain("旧 prompt"); }); it("空字符串段被跳过", () => { const result = new PromptBuilder().head("# 标题").context("").prompt("内容").build(); expect(result).toBe("# 标题\n---\n内容"); }); it("链式调用返回 this", () => { const builder = new PromptBuilder(); expect(builder.head("x")).toBe(builder); expect(builder.context("x")).toBe(builder); expect(builder.prompt("x")).toBe(builder); expect(builder.guide("x")).toBe(builder); expect(builder.warn("x")).toBe(builder); }); });