Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { track } from "../src/delta/index.ts";
|
|
|
|
describe("immutable revision ownership", () => {
|
|
it("takes ownership of an alias-free mutable JSON root without freezing", () => {
|
|
const input = { left: { value: 1 }, right: { value: 1 } };
|
|
const tracker = track(input);
|
|
expect(tracker.value).toBe(input);
|
|
expect(tracker.value.left).not.toBe(tracker.value.right);
|
|
expect(Object.isFrozen(tracker.value)).toBe(false);
|
|
expect(Object.isFrozen(tracker.value.left)).toBe(false);
|
|
});
|
|
|
|
it("commits transaction copies in place while sharing unchanged branches", () => {
|
|
const tracker = track({ changed: { value: 1 }, retained: { value: 2 } });
|
|
const base = tracker.value;
|
|
const baseSnapshot = structuredClone(base);
|
|
const change = tracker.beginChange();
|
|
change.state.changed.value = 3;
|
|
const prepared = change.prepare();
|
|
expect(prepared.value.changed).not.toBe(base.changed);
|
|
expect(prepared.value.retained).toBe(base.retained);
|
|
expect(Object.isFrozen(prepared.value.changed)).toBe(false);
|
|
tracker.adopt(prepared);
|
|
expect(base).toEqual(baseSnapshot);
|
|
expect(tracker.value).toBe(prepared.value);
|
|
});
|
|
|
|
it("makes repeated placements independent", () => {
|
|
const tracker = track({ values: [] as { value: number }[] });
|
|
const change = tracker.beginChange();
|
|
const shared = { value: 1 };
|
|
change.state.values.push(shared, shared);
|
|
const prepared = change.prepare();
|
|
expect(prepared.value.values[0]).not.toBe(prepared.value.values[1]);
|
|
});
|
|
});
|