Add Camino datatypes package export
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
import assert from "node:assert/strict";
|
||||
import test from "node:test";
|
||||
import {
|
||||
applyCanonicalFieldValue,
|
||||
beginLocalFieldWrite,
|
||||
createRegisterFieldState,
|
||||
failLocalFieldWrite,
|
||||
revisionFieldClock,
|
||||
} from "../src/field-semantics.js";
|
||||
|
||||
test("register fields reject stale canonical values", () => {
|
||||
const state = createRegisterFieldState({
|
||||
value: "current",
|
||||
clock: revisionFieldClock(5n),
|
||||
});
|
||||
|
||||
beginLocalFieldWrite(state, "local:1", "current!");
|
||||
|
||||
const stale = applyCanonicalFieldValue(state, {
|
||||
value: "old",
|
||||
clock: revisionFieldClock(4n),
|
||||
});
|
||||
|
||||
assert.equal(stale.accepted, false);
|
||||
assert.equal(state.canonical.value, "current");
|
||||
assert.equal(state.visible, "current!");
|
||||
assert.equal(state.pending.length, 1);
|
||||
});
|
||||
|
||||
test("register fields reconcile optimistic writes by mutation id", () => {
|
||||
const state = createRegisterFieldState({
|
||||
value: "a",
|
||||
clock: revisionFieldClock(1n),
|
||||
});
|
||||
|
||||
beginLocalFieldWrite(state, "local:1", "ab");
|
||||
beginLocalFieldWrite(state, "local:2", "abc");
|
||||
|
||||
const otherWriter = applyCanonicalFieldValue(state, {
|
||||
value: "z",
|
||||
clock: revisionFieldClock(2n),
|
||||
});
|
||||
assert.equal(otherWriter.accepted, true);
|
||||
assert.equal(state.canonical.value, "z");
|
||||
assert.equal(state.visible, "abc");
|
||||
assert.equal(state.pending.length, 2);
|
||||
|
||||
const firstAck = applyCanonicalFieldValue(
|
||||
state,
|
||||
{
|
||||
value: "ab",
|
||||
clock: revisionFieldClock(3n),
|
||||
},
|
||||
"local:1",
|
||||
);
|
||||
assert.equal(firstAck.accepted, true);
|
||||
assert.equal(state.canonical.value, "ab");
|
||||
assert.equal(state.visible, "abc");
|
||||
assert.equal(state.pending.length, 1);
|
||||
|
||||
const secondAck = applyCanonicalFieldValue(
|
||||
state,
|
||||
{
|
||||
value: "abc",
|
||||
clock: revisionFieldClock(4n),
|
||||
},
|
||||
"local:2",
|
||||
);
|
||||
assert.equal(secondAck.accepted, true);
|
||||
assert.equal(state.canonical.value, "abc");
|
||||
assert.equal(state.visible, "abc");
|
||||
assert.equal(state.pending.length, 0);
|
||||
});
|
||||
|
||||
test("register fields reject unclocked values after a revision is known", () => {
|
||||
const state = createRegisterFieldState({
|
||||
value: "known",
|
||||
clock: revisionFieldClock(9n),
|
||||
});
|
||||
|
||||
const result = applyCanonicalFieldValue(state, {
|
||||
value: "unclocked",
|
||||
clock: revisionFieldClock(undefined),
|
||||
});
|
||||
|
||||
assert.equal(result.accepted, false);
|
||||
assert.equal(state.canonical.value, "known");
|
||||
assert.equal(state.visible, "known");
|
||||
});
|
||||
|
||||
test("failed optimistic writes reveal the newest accepted canonical value", () => {
|
||||
const state = createRegisterFieldState({
|
||||
value: "base",
|
||||
clock: revisionFieldClock(1n),
|
||||
});
|
||||
|
||||
beginLocalFieldWrite(state, "local:1", "local");
|
||||
applyCanonicalFieldValue(state, {
|
||||
value: "remote",
|
||||
clock: revisionFieldClock(2n),
|
||||
});
|
||||
failLocalFieldWrite(state, "local:1");
|
||||
|
||||
assert.equal(state.canonical.value, "remote");
|
||||
assert.equal(state.visible, "remote");
|
||||
assert.equal(state.pending.length, 0);
|
||||
});
|
||||
Reference in New Issue
Block a user