import { describe, expect, it } from "vitest"; import { replaceManagedMarkdownBlock, withTrailingNewline } from "./memory-host-markdown.js"; describe("withTrailingNewline", () => { it("preserves trailing newlines", () => { expect(withTrailingNewline("hello\n")).toBe("hello\n"); }); it("adds a trailing newline when missing", () => { expect(withTrailingNewline("hello")).toBe("hello\n"); }); }); describe("replaceManagedMarkdownBlock", () => { it("appends a managed block when missing", () => { expect( replaceManagedMarkdownBlock({ original: "# Title\n", heading: "## Generated", startMarker: "", endMarker: "", body: "- first", }), ).toBe("# Title\n\n## Generated\n\n- first\n\n"); }); it("replaces an existing managed block in place", () => { expect( replaceManagedMarkdownBlock({ original: "# Title\n\n## Generated\n\n- old\n\n\n## Notes\nkept\n", heading: "## Generated", startMarker: "", endMarker: "", body: "- new", }), ).toBe("# Title\n\n## Generated\n\n- new\n\n\n## Notes\nkept\n"); }); it("supports headingless blocks", () => { expect( replaceManagedMarkdownBlock({ original: "alpha\n", startMarker: "", endMarker: "", body: "beta", }), ).toBe("alpha\n\n\nbeta\n\n"); }); it("replaces headed blocks with CRLF line endings in place", () => { expect( replaceManagedMarkdownBlock({ original: "# Title\r\n\r\n## Generated\r\n\r\n- old\r\n\r\n", heading: "## Generated", startMarker: "", endMarker: "", body: "- new", }), ).toBe("# Title\r\n\r\n## Generated\n\n- new\n\r\n"); }); it("collapses pre-existing duplicate managed blocks into one", () => { const original = [ "# Title", "", "## Generated", "", "- run-1", "", "", "## Generated", "", "- run-2", "", "", "## Generated", "", "- run-3", "", "", ].join("\n"); const updated = replaceManagedMarkdownBlock({ original, heading: "## Generated", startMarker: "", endMarker: "", body: "- latest", }); expect(updated).toBe("# Title\n\n## Generated\n\n- latest\n\n"); expect(updated.match(//g)?.length).toBe(1); expect(updated).not.toContain("run-"); }); it("preserves unmanaged markdown while removing duplicate blocks", () => { const original = [ "# Title", "", "Paragraph A", "", "", "Paragraph B", "", "## Generated", "", "- old", "", "", "## Generated", "", "- stale", "", "", "## Notes", "kept", "", "", ].join("\n"); expect( replaceManagedMarkdownBlock({ original, heading: "## Generated", startMarker: "", endMarker: "", body: "- new", }), ).toBe( "# Title\n\nParagraph A\n\n\nParagraph B\n\n## Generated\n\n- new\n\n\n## Notes\nkept\n\n", ); }); it("is idempotent across repeated calls with the same body", () => { const params = { heading: "## Generated", startMarker: "", endMarker: "", body: "- only", } as const; const first = replaceManagedMarkdownBlock({ original: "# Title\n", ...params }); const second = replaceManagedMarkdownBlock({ original: first, ...params }); const third = replaceManagedMarkdownBlock({ original: second, ...params }); expect(second).toBe(first); expect(third).toBe(first); }); });