feat(k1): add live cameras and reliable spatial following
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { after, before, test } from "node:test";
|
||||
|
||||
import { createServer } from "vite";
|
||||
|
||||
let server;
|
||||
let selectMonotonicXgridsState;
|
||||
|
||||
before(async () => {
|
||||
server = await createServer({
|
||||
appType: "custom",
|
||||
logLevel: "silent",
|
||||
server: { middlewareMode: true },
|
||||
});
|
||||
({ selectMonotonicXgridsState } = await server.ssrLoadModule(
|
||||
"/src/device-plugins/xgrids-k1/stateOrdering.ts",
|
||||
));
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await server?.close();
|
||||
});
|
||||
|
||||
function snapshot(revision, generation, phase = "streaming", sessionId = "device-session-a") {
|
||||
return {
|
||||
phase: "connected",
|
||||
message: `${phase}:${revision}:${generation}`,
|
||||
device_session: sessionId === null
|
||||
? null
|
||||
: {
|
||||
device_session_id: sessionId,
|
||||
device_id: `device-for-${sessionId}`,
|
||||
connectivity: "connected",
|
||||
},
|
||||
camera_preview: {
|
||||
phase,
|
||||
revision,
|
||||
generation,
|
||||
active_source_id: generation === null ? null : "sensor.camera.left",
|
||||
delivery: null,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
test("accepts the first camera preview snapshot", () => {
|
||||
const incoming = snapshot(1, 1);
|
||||
assert.equal(selectMonotonicXgridsState(null, incoming), incoming);
|
||||
});
|
||||
|
||||
test("rejects a lower revision even when its generation is higher", () => {
|
||||
const current = snapshot(8, 3);
|
||||
const stale = snapshot(7, 99);
|
||||
assert.equal(selectMonotonicXgridsState(current, stale), current);
|
||||
});
|
||||
|
||||
test("uses generation only as a tie-breaker for equal revisions", () => {
|
||||
const current = snapshot(8, 3);
|
||||
const stale = snapshot(8, 2);
|
||||
const equal = snapshot(8, 3, "selected");
|
||||
|
||||
assert.equal(selectMonotonicXgridsState(current, stale), current);
|
||||
assert.equal(selectMonotonicXgridsState(current, equal), equal);
|
||||
});
|
||||
|
||||
test("accepts a newer stop revision with a null generation", () => {
|
||||
const current = snapshot(8, 3);
|
||||
const stopped = snapshot(9, null, "idle");
|
||||
|
||||
assert.equal(selectMonotonicXgridsState(current, stopped), stopped);
|
||||
});
|
||||
|
||||
test("rejects an unversioned camera snapshot after a versioned one", () => {
|
||||
const current = snapshot(8, 3);
|
||||
const stale = {
|
||||
phase: "connected",
|
||||
device_session: current.device_session,
|
||||
};
|
||||
|
||||
assert.equal(selectMonotonicXgridsState(current, stale), current);
|
||||
});
|
||||
|
||||
test("accepts revision reset when the authoritative device session changes", () => {
|
||||
const current = snapshot(18, 7, "streaming", "device-session-a");
|
||||
const nextDevice = snapshot(0, null, "idle", "device-session-b");
|
||||
|
||||
assert.equal(selectMonotonicXgridsState(current, nextDevice), nextDevice);
|
||||
});
|
||||
|
||||
test("accepts backend reset that clears and later recreates the device session", () => {
|
||||
const current = snapshot(18, 7, "streaming", "device-session-a");
|
||||
const reset = snapshot(0, null, "idle", null);
|
||||
const reconnected = snapshot(0, null, "idle", "device-session-c");
|
||||
|
||||
assert.equal(selectMonotonicXgridsState(current, reset), reset);
|
||||
assert.equal(selectMonotonicXgridsState(reset, reconnected), reconnected);
|
||||
});
|
||||
|
||||
test("rejects the entire stale atomic snapshot instead of merging unrelated fields", () => {
|
||||
const current = {
|
||||
...snapshot(8, 3),
|
||||
metrics: { point_count: 2_500 },
|
||||
};
|
||||
const stale = {
|
||||
...snapshot(7, 2),
|
||||
metrics: { point_count: 9_999 },
|
||||
};
|
||||
|
||||
const accepted = selectMonotonicXgridsState(current, stale);
|
||||
assert.equal(accepted, current);
|
||||
assert.equal(accepted.metrics.point_count, 2_500);
|
||||
});
|
||||
Reference in New Issue
Block a user