Files
yawn/vendor/fxnode/test/pointer-lane.test.ts

43 lines
1.5 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import {
advancePointerLaneFence,
createPointerLane,
pointerLaneFence,
publishPointerMove,
readPointerMove,
type PointerMoveWire,
} from "@lib/browser/pointer-lane.js";
const move = (x: number, y: number): PointerMoveWire => ({
kind: "pointer",
phase: "move",
pointerId: 7,
pointerType: "pen",
position: { x, y },
button: -1,
buttons: 1,
modifiers: 8,
});
test("shared pointer lane publishes exact latest coordinates and fences", () => {
const lane = createPointerLane();
assert.equal(pointerLaneFence(lane), 0);
const generation = 0x1_0000_0007;
const sequence = publishPointerMove(lane, move(-12.25, 987.125), generation);
assert.equal(sequence, 1);
assert.deepEqual(readPointerMove(lane), { sequence: 1, hostGeneration: generation, event: move(-12.25, 987.125) });
assert.equal(advancePointerLaneFence(lane), 1);
assert.equal(pointerLaneFence(lane), 1);
assert.equal(publishPointerMove(lane, { ...move(4, 5), pointerType: "unknown" }, generation + 1), undefined);
assert.deepEqual(readPointerMove(lane), { sequence: 1, hostGeneration: generation, event: move(-12.25, 987.125) });
});
test("shared pointer lane rejects an in-progress publication", () => {
const lane = createPointerLane();
publishPointerMove(lane, move(1, 2), 3);
const words = new Int32Array(lane);
Atomics.store(words, 0, Atomics.load(words, 0) | 1);
assert.equal(readPointerMove(lane), undefined);
});