Amp-Thread-ID: https://ampcode.com/threads/T-019f9d91-77c1-7206-a60f-ed6554ce92ab Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
43 lines
1.5 KiB
TypeScript
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);
|
|
});
|