import test from 'node:test'; import assert from 'node:assert/strict'; import { arrowDirection, directionalFocusIndex } from '../src/lib/remote.mjs'; const rect = (left, top, width = 100, height = 40) => ({ left, top, right: left + width, bottom: top + height }); test('remote arrows support standard keys and legacy key codes', () => { assert.equal(arrowDirection('ArrowDown'), 'down'); assert.equal(arrowDirection('Unidentified', 38), 'up'); assert.equal(arrowDirection('Enter', 13), null); }); test('vertical focus follows rows and keeps the palette column', () => { const boxes = [rect(0, 0, 240), rect(0, 70), rect(140, 70), rect(0, 130), rect(140, 130), rect(0, 200, 240)]; assert.equal(directionalFocusIndex(boxes, 0, 'down'), 1); assert.equal(directionalFocusIndex(boxes, 1, 'down'), 3); assert.equal(directionalFocusIndex(boxes, 2, 'down'), 4); assert.equal(directionalFocusIndex(boxes, 4, 'down'), 5); assert.equal(directionalFocusIndex(boxes, 4, 'up'), 2); }); test('horizontal arrows stay in the same row and boundaries do not wrap', () => { const boxes = [rect(0, 0), rect(140, 0), rect(0, 90), rect(140, 90)]; assert.equal(directionalFocusIndex(boxes, 0, 'right'), 1); assert.equal(directionalFocusIndex(boxes, 1, 'right'), -1); assert.equal(directionalFocusIndex(boxes, 0, 'left'), -1); assert.equal(directionalFocusIndex(boxes, 0, 'up'), -1); assert.equal(directionalFocusIndex(boxes, 3, 'down'), -1); assert.equal(directionalFocusIndex(boxes, -1, 'down'), 0); assert.equal(directionalFocusIndex([], -1, 'down'), -1); });