mirror of
https://github.com/priyanshujain/sanderling.git
synced 2026-10-04 03:57:09 +00:00
refactor(spec): picker emits native selector + scroll endpoints, setup precedence
This commit is contained in:
1 parent
6600994ef1
commit
7a5fc9aca5
5 files changed
+161
-12
No files matched your search
@@ -53,7 +53,11 @@ test("taps draws one candidate index and targets its point", () => {
|
||||
const action = walk(builtin("taps"), rng, host);
|
||||
assert.deepEqual(action, {
|
||||
kind: "Tap",
|
||||
on: { x: POINTS[expectedIndex]!.x, y: POINTS[expectedIndex]!.y },
|
||||
on: {
|
||||
x: POINTS[expectedIndex]!.x,
|
||||
y: POINTS[expectedIndex]!.y,
|
||||
selector: POINTS[expectedIndex]!.selector,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@@ -72,6 +76,7 @@ test("typing draws candidate index then corpus index, in that order", () => {
|
||||
assert.deepEqual(action.into, {
|
||||
x: POINTS[candidateIndex]!.x,
|
||||
y: POINTS[candidateIndex]!.y,
|
||||
selector: POINTS[candidateIndex]!.selector,
|
||||
});
|
||||
assert.equal(action.text, INPUT_CORPUS[corpusIndex]);
|
||||
});
|
||||
@@ -142,7 +147,11 @@ test("doubleTaps and longPresses draw exactly one candidate index", () => {
|
||||
const kind = verb === "doubleTaps" ? "DoubleTap" : "LongPress";
|
||||
assert.deepEqual(action, {
|
||||
kind,
|
||||
on: { x: POINTS[index]!.x, y: POINTS[index]!.y },
|
||||
on: {
|
||||
x: POINTS[index]!.x,
|
||||
y: POINTS[index]!.y,
|
||||
selector: POINTS[index]!.selector,
|
||||
},
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -98,7 +98,75 @@ test("PressKey and Wait pass through their fields", () => {
|
||||
});
|
||||
});
|
||||
|
||||
test("builtin Scroll carries the pre-computed to endpoint", () => {
|
||||
assert.deepEqual(
|
||||
serializeAction({
|
||||
kind: "Scroll",
|
||||
direction: "down",
|
||||
in: { x: 100, y: 200 },
|
||||
from: { x: 100, y: 200 },
|
||||
to: { x: 100, y: 120 },
|
||||
}),
|
||||
{
|
||||
kind: "Scroll",
|
||||
direction: "down",
|
||||
fromX: 100,
|
||||
fromY: 200,
|
||||
toX: 100,
|
||||
toY: 120,
|
||||
durationMillis: 250,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test("an unresolved (string) target drops the action", () => {
|
||||
assert.equal(serializeAction({ kind: "Tap", on: "id:never-resolved" }), null);
|
||||
assert.equal(serializeAction(null), null);
|
||||
});
|
||||
|
||||
// Wire round-trip: serialize -> JSON -> parse asserts every field the Go
|
||||
// decodeAction reads survives by its exact camelCase name. A rename (fromX vs
|
||||
// from_x) would silently turn web/native actions into no-ops; this catches it.
|
||||
test("serialized actions JSON round-trip with the decoder's field names", () => {
|
||||
const cases: ActionDescriptor[] = [
|
||||
{ kind: "Tap", on: { x: 1, y: 2, selector: "id:a" } as never },
|
||||
{ kind: "InputText", into: { x: 3, y: 4 } as never, text: "x" },
|
||||
{ kind: "Swipe", from: { x: 5, y: 6 }, to: { x: 7, y: 8 }, durationMillis: 9 },
|
||||
{ kind: "Scroll", direction: "up", in: { x: 1, y: 1 } as never },
|
||||
{ kind: "PressKey", key: "enter" },
|
||||
{ kind: "Wait", durationMillis: 10 },
|
||||
];
|
||||
for (const descriptor of cases) {
|
||||
const wire = serializeAction(descriptor);
|
||||
assert.ok(wire, `expected ${descriptor.kind} to serialize`);
|
||||
const decoded = JSON.parse(JSON.stringify(wire)) as Record<string, unknown>;
|
||||
assert.equal(decoded.kind, wire!.kind);
|
||||
switch (wire!.kind) {
|
||||
case "Tap":
|
||||
assert.equal(typeof decoded.x, "number");
|
||||
assert.equal(typeof decoded.y, "number");
|
||||
assert.equal(decoded.selector, "id:a");
|
||||
break;
|
||||
case "InputText":
|
||||
assert.equal(typeof decoded.x, "number");
|
||||
assert.equal(decoded.text, "x");
|
||||
break;
|
||||
case "Swipe":
|
||||
assert.equal(decoded.fromX, 5);
|
||||
assert.equal(decoded.toY, 8);
|
||||
assert.equal(decoded.durationMillis, 9);
|
||||
break;
|
||||
case "Scroll":
|
||||
assert.equal(decoded.direction, "up");
|
||||
assert.equal(typeof decoded.fromX, "number");
|
||||
assert.equal(typeof decoded.toX, "number");
|
||||
break;
|
||||
case "PressKey":
|
||||
assert.equal(decoded.key, "enter");
|
||||
break;
|
||||
case "Wait":
|
||||
assert.equal(decoded.durationMillis, 10);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
Reference in new issue
Block a user