import { expect, test } from "bun:test"; import { buildVncWheelPointerEvents, computeContainedRemoteDisplayScale, encodeVncKeyEvent, encodeVncPointerEvent, mapClientToFramebufferPoint, normalizeVncPassword, resolveVncKeysymFromKeyboardEvent, vncButtonMaskForPointerButton, } from "../../web/src/panes/vnc-input.js"; test("encodeVncPointerEvent writes VNC pointer-event bytes", () => { expect(Array.from(encodeVncPointerEvent(5, 300, 400))).toEqual([ 5, 5, 0x01, 0x2c, 0x01, 0x90, ]); }); test("vncButtonMaskForPointerButton maps primary mouse buttons", () => { expect(vncButtonMaskForPointerButton(0)).toBe(1); expect(vncButtonMaskForPointerButton(1)).toBe(2); expect(vncButtonMaskForPointerButton(2)).toBe(4); expect(vncButtonMaskForPointerButton(5)).toBe(0); }); test("mapClientToFramebufferPoint maps scaled display coordinates into framebuffer space", () => { expect(mapClientToFramebufferPoint(150, 75, { left: 100, top: 50, width: 200, height: 100 }, 800, 400)) .toEqual({ x: 200, y: 100 }); expect(mapClientToFramebufferPoint(999, -20, { left: 100, top: 50, width: 200, height: 100 }, 800, 400)) .toEqual({ x: 799, y: 0 }); }); test("buildVncWheelPointerEvents emits press+release events", () => { const [press, release] = buildVncWheelPointerEvents(-1, 10, 20, 1); expect(Array.from(press)).toEqual([5, 9, 0, 10, 0, 20]); expect(Array.from(release)).toEqual([5, 1, 0, 10, 0, 20]); }); test("encodeVncKeyEvent writes VNC key-event bytes", () => { expect(Array.from(encodeVncKeyEvent(true, 0xff0d))).toEqual([ 4, 1, 0, 0, 0, 0, 0xff, 0x0d, ]); }); test("resolveVncKeysymFromKeyboardEvent maps special keys and printable characters", () => { expect(resolveVncKeysymFromKeyboardEvent({ key: "Enter" })).toBe(0xff0d); expect(resolveVncKeysymFromKeyboardEvent({ key: "ArrowLeft" })).toBe(0xff51); expect(resolveVncKeysymFromKeyboardEvent({ key: "a" })).toBe(0x61); expect(resolveVncKeysymFromKeyboardEvent({ key: "é" })).toBe(0xe9); expect(resolveVncKeysymFromKeyboardEvent({ key: "😀" })).toBe((0x01000000 | 0x1f600) >>> 0); expect(resolveVncKeysymFromKeyboardEvent({ key: "Unidentified", code: "ShiftRight" })).toBe(0xffe2); expect(resolveVncKeysymFromKeyboardEvent({ key: "Dead" })).toBeNull(); }); test("normalizeVncPassword treats empty strings as unset", () => { expect(normalizeVncPassword("")).toBeNull(); expect(normalizeVncPassword("secret")).toBe("secret"); expect(normalizeVncPassword(null)).toBeNull(); }); test("computeContainedRemoteDisplayScale fits the framebuffer without integer snap", () => { expect(computeContainedRemoteDisplayScale(1000, 700, 800, 600)).toBeCloseTo(1.1666666, 5); expect(computeContainedRemoteDisplayScale(400, 300, 800, 600)).toBe(0.5); });