| '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(rl.cursor, 0); |
| assert.strictEqual(rl.line, expectedLine); |
| }); |
| } |