pi-mono/packages/chord/test/state-value.test.ts
2026-09-23 02:22:52 +02:00

37 lines
1.4 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { track } from "../src/delta/index.ts";
describe("immutable revision ownership", () => {
it("imports detached frozen JSON and expands aliases", () => {
const shared = { value: 1 };
const input = { left: shared, right: shared };
const tracker = track(input);
expect(tracker.value).toEqual(input);
expect(tracker.value).not.toBe(input);
expect(tracker.value.left).not.toBe(tracker.value.right);
expect(Object.isFrozen(tracker.value)).toBe(true);
expect(Object.isFrozen(tracker.value.left)).toBe(true);
});
it("commits transaction copies in place while sharing unchanged branches", () => {
const tracker = track({ changed: { value: 1 }, retained: { value: 2 } });
const base = tracker.value;
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(true);
tracker.adopt(prepared);
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]);
});
});