import { expect, test } from "bun:test"; import { InspectorDrafts, type InspectorValues } from "../src/inspector-drafts.ts"; const node = { id: "text", props: { text: "Saved" }, styles: {} }; const baseline: InspectorValues = { props: { text: "Saved", decorative: false }, styles: { fontSize: { value: "", empty: "true" } }, }; const edited: InspectorValues = { props: { text: "Typing", decorative: true }, styles: { fontSize: { value: "20px", empty: "" } }, }; test("selection and preview remount preserve independent props, checkbox, and style drafts", () => { const store = new InspectorDrafts(); store.capture(node, baseline, edited); expect(store.restore({ ...node, id: "other" }, baseline)).toEqual(baseline); expect(store.restore(node, baseline)).toEqual(edited); expect(store.restore(node, baseline)).toEqual(edited); expect(node.props.text).toBe("Saved"); expect(store.size).toBe(1); }); test("applying content does not discard pending style changes or resurrect applied content", () => { const store = new InspectorDrafts(); store.capture(node, baseline, edited); const applied = { ...node, props: { text: "Typing" } }; const next = { ...baseline, props: { ...baseline.props, text: "Typing" } }; expect(store.restore(applied, next)).toEqual({ ...next, styles: edited.styles }); expect(store.restore(node, baseline).props).toEqual(baseline.props); }); test("applying styles does not erase content drafts", () => { const store = new InspectorDrafts(); store.capture(node, baseline, edited); const applied = { ...node, styles: { fontSize: { base: "20px" } } }; const next = { ...baseline, styles: edited.styles }; expect(store.restore(applied, next)).toEqual({ props: edited.props, styles: edited.styles }); }); test("reverting fields, discarding, and deleting blocks release their drafts", () => { const store = new InspectorDrafts(); store.capture(node, baseline, edited); store.capture(node, baseline, baseline); expect(store.size).toBe(0); store.capture(node, baseline, edited); store.discard(node.id); expect(store.restore(node, baseline)).toEqual(baseline); store.capture(node, baseline, edited); store.retain(new Set(["other"])); expect(store.size).toBe(0); }); test("capture and restore do not share mutable control snapshots", () => { const store = new InspectorDrafts(), draft = structuredClone(edited); store.capture(node, baseline, draft); draft.styles.fontSize!.value = "99px"; const restored = store.restore(node, baseline); restored.styles.fontSize!.value = "88px"; expect(store.restore(node, baseline).styles.fontSize!.value).toBe("20px"); });