75 lines
2.3 KiB
JavaScript
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')
|