mirror of
https://github.com/badlogic/pi-mono.git
synced 2026-11-05 23:37:25 +00:00
37 lines
1.4 KiB
TypeScript
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]);
|
|
});
|
|
});
|