'use strict'; const common = require('../common'); const { PassThrough } = require('stream'); const readline = require('readline'); const assert = require('assert'); { const input = new PassThrough(); const rl = readline.createInterface({ terminal: true, input: input }); rl.on('line', common.mustCall((data) => { assert.strictEqual(data, 'abc'); })); input.end('abc'); } { const input = new PassThrough(); const rl = readline.createInterface({ terminal: true, input: input }); rl.on('line', common.mustNotCall('must not be called before newline')); input.write('abc'); } { const input = new PassThrough(); const rl = readline.createInterface({ terminal: true, input: input }); rl.on('line', common.mustCall((data) => { assert.strictEqual(data, 'abc'); })); input.write('abc\n'); } { const input = new PassThrough(); const rl = readline.createInterface({ terminal: true, input: input }); rl.write('foo'); assert.strictEqual(rl.cursor, 3); const key = { xterm: { home: ['\x1b[H', {ctrl: true, name: 'a'}], end: ['\x1b[F', {ctrl: true, name: 'e'}], }, gnome: { home: ['\x1bOH', {ctrl: true, name: 'a'}], end: ['\x1bOF', {ctrl: true, name: 'e'}] }, rxvt: { home: ['\x1b[7', {ctrl: true, name: 'a'}], end: ['\x1b[8', {ctrl: true, name: 'e'}] }, putty: { home: ['\x1b[1~', {ctrl: true, name: 'a'}], end: ['\x1b[>~', {ctrl: true, name: 'e'}] } }; [key.xterm, key.gnome, key.rxvt, key.putty].forEach(function(key) { rl.write.apply(rl, key.home); assert.strictEqual(rl.cursor, 0); rl.write.apply(rl, key.end); assert.strictEqual(rl.cursor, 3); }); } { const input = new PassThrough(); const rl = readline.createInterface({ terminal: true, input: input }); const key = { xterm: { home: ['\x1b[H', {ctrl: true, name: 'a'}], metab: ['\x1bb', {meta: true, name: 'b'}], metaf: ['\x1bf', {meta: true, name: 'f'}], } }; rl.write('foo bar.hop/zoo'); rl.write.apply(rl, key.xterm.home); [ {cursor: 4, key: key.xterm.metaf}, {cursor: 7, key: key.xterm.metaf}, {cursor: 8, key: key.xterm.metaf}, {cursor: 11, key: key.xterm.metaf}, {cursor: 12, key: key.xterm.metaf}, {cursor: 15, key: key.xterm.metaf}, {cursor: 12, key: key.xterm.metab}, {cursor: 11, key: key.xterm.metab}, {cursor: 8, key: key.xterm.metab}, {cursor: 7, key: key.xterm.metab}, {cursor: 4, key: key.xterm.metab}, {cursor: 0, key: key.xterm.metab}, ].forEach(function(action) { rl.write.apply(rl, action.key); assert.strictEqual(rl.cursor, action.cursor); }); } { const input = new PassThrough(); const rl = readline.createInterface({ terminal: true, input: input }); const key = { xterm: { home: ['\x1b[H', {ctrl: true, name: 'a'}], metad: ['\x1bd', {meta: true, name: 'd'}] } }; rl.write('foo bar.hop/zoo'); rl.write.apply(rl, key.xterm.home); [ 'bar.hop/zoo', '.hop/zoo', 'hop/zoo', '/zoo', 'zoo', '' ].forEach(function(expectedLine) { rl.write.apply(rl, key.xterm.metad); assert.strictEqual(0, rl.cursor); assert.strictEqual(expectedLine, rl.line); }); }