63 lines
2.6 KiB
TypeScript
63 lines
2.6 KiB
TypeScript
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");
|
|
});
|