Files
bare-operating-system/packages/bare-os-coreutils/test/edit-key-parse.test.mjs
T
2026-04-09 00:28:11 -04:00

75 lines
2.3 KiB
JavaScript

/**
* Loads lib/edit-key-parse.js in an isolated function scope (same source as /bin/edit preamble).
*/
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = dirname(fileURLToPath(import.meta.url))
const parseSrc = readFileSync(join(__dirname, '../lib/edit-key-parse.js'), 'utf8')
const hook = {}
new Function(
'exports',
`${parseSrc}\nexports.bareEditTryConsumeKey = bareEditTryConsumeKey;`
)(hook)
const { bareEditTryConsumeKey } = hook
function consumeAll(bytes) {
const q = [...bytes]
const out = []
while (q.length) {
const ev = bareEditTryConsumeKey(q)
assert.ok(ev, 'expected complete key, queue=' + JSON.stringify(q))
out.push(ev)
}
return out
}
assert.equal(bareEditTryConsumeKey([97])?.type, 'key')
assert.equal(bareEditTryConsumeKey([97])?.ch, 'a')
const upCsi = consumeAll([27, 91, 65])
assert.deepEqual(upCsi, [{ type: 'nav', key: 'up' }])
const upCsiNum = consumeAll([27, 91, 49, 59, 53, 65])
assert.deepEqual(upCsiNum, [{ type: 'nav', key: 'up' }])
const leftCsi = consumeAll([27, 91, 68])
assert.deepEqual(leftCsi, [{ type: 'nav', key: 'left' }])
const stabCsi = consumeAll([27, 91, 90])
assert.deepEqual(stabCsi, [{ type: 'nav', key: 'stab' }])
const stabCsiMod = consumeAll([27, 91, 49, 59, 50, 90])
assert.deepEqual(stabCsiMod, [{ type: 'nav', key: 'stab' }])
const tabKey = consumeAll([9])
assert.deepEqual(tabKey, [{ type: 'key', ch: '\t' }])
const ss3Up = consumeAll([27, 79, 65])
assert.deepEqual(ss3Up, [{ type: 'nav', key: 'up' }])
const ss3Left = consumeAll([27, 79, 68])
assert.deepEqual(ss3Left, [{ type: 'nav', key: 'left' }])
const del = consumeAll([27, 91, 51, 126])
assert.deepEqual(del, [{ type: 'ctrl', code: 'delete' }])
/* ESC must not be consumed as generic ctrl before CSI: order test */
const q = [27, 91, 66]
const ev1 = bareEditTryConsumeKey(q)
assert.deepEqual(ev1, { type: 'nav', key: 'down' })
assert.equal(q.length, 0)
/* Incomplete CSI waits for more bytes */
const q2 = [27, 91]
assert.equal(bareEditTryConsumeKey(q2), null)
assert.deepEqual(q2, [27, 91])
q2.push(67)
const ev2 = bareEditTryConsumeKey(q2)
assert.deepEqual(ev2, { type: 'nav', key: 'right' })
console.log('edit-key-parse tests ok')