From 497bcebf82a4fc1892673088fbafa317885af06e Mon Sep 17 00:00:00 2001 From: Daniel Kostro Date: Sat, 7 Oct 2017 00:21:42 +0200 Subject: [PATCH] test: increase test coverage of readline-interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds coverage for: - question callback - history navigation - bad historySize option - multi-line output - history is bound and most recent elements are preserved PR-URL: https://github.com/nodejs/node/pull/16062 Reviewed-By: Ruben Bridgewater Reviewed-By: Anna Henningsen Reviewed-By: Michaƫl Zasso --- test/parallel/test-readline-interface.js | 83 ++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/test/parallel/test-readline-interface.js b/test/parallel/test-readline-interface.js index 7b68ff652d2784..d58420e5c45985 100644 --- a/test/parallel/test-readline-interface.js +++ b/test/parallel/test-readline-interface.js @@ -375,6 +375,37 @@ function isWarned(emitter) { }); } + // constructor throws if historySize is not a positive number + { + const fi = new FakeInput(); + assert.throws(function() { + readline.createInterface({ + input: fi, historySize: 'not a number' + }); + }, common.expectsError({ + type: TypeError, + message: 'Argument "historySize" must be a positive number' + })); + + assert.throws(function() { + readline.createInterface({ + input: fi, historySize: -1 + }); + }, common.expectsError({ + type: TypeError, + message: 'Argument "historySize" must be a positive number' + })); + + assert.throws(function() { + readline.createInterface({ + input: fi, historySize: NaN + }); + }, common.expectsError({ + type: TypeError, + message: 'Argument "historySize" must be a positive number' + })); + } + // duplicate lines are removed from history when // `options.removeHistoryDuplicates` is `true` { @@ -404,6 +435,14 @@ function isWarned(emitter) { assert.notStrictEqual(rli.line, expectedLines[--callCount]); assert.strictEqual(rli.line, expectedLines[--callCount]); assert.strictEqual(callCount, 0); + fi.emit('keypress', '.', { name: 'down' }); // 'baz' + assert.strictEqual(rli.line, 'baz'); + fi.emit('keypress', '.', { name: 'n', ctrl: true }); // 'bar' + assert.strictEqual(rli.line, 'bar'); + fi.emit('keypress', '.', { name: 'down' }); // 'bat' + assert.strictEqual(rli.line, 'bat'); + fi.emit('keypress', '.', { name: 'down' }); // '' + assert.strictEqual(rli.line, ''); rli.close(); } @@ -499,7 +538,35 @@ function isWarned(emitter) { rli.close(); } + // calling the question callback + { + let called = false; + const fi = new FakeInput(); + const rli = new readline.Interface( + { input: fi, output: fi, terminal: terminal } + ); + rli.question('foo?', function(answer) { + called = true; + assert.strictEqual(answer, 'bar'); + }); + rli.write('bar\n'); + assert.ok(called); + rli.close(); + } + if (terminal) { + // history is bound + { + const fi = new FakeInput(); + const rli = new readline.Interface( + { input: fi, output: fi, terminal, historySize: 2 } + ); + const lines = ['line 1', 'line 2', 'line 3']; + fi.emit('data', lines.join('\n') + '\n'); + assert.strictEqual(rli.history.length, 2); + assert.strictEqual(rli.history[0], 'line 3'); + assert.strictEqual(rli.history[1], 'line 2'); + } // question { const fi = new FakeInput(); @@ -667,6 +734,22 @@ function isWarned(emitter) { rli.close(); }); } + + // multi-line cursor position + { + const fi = new FakeInput(); + const rli = new readline.Interface({ + input: fi, + output: fi, + prompt: '', + terminal: terminal + }); + fi.columns = 10; + fi.emit('data', 'multi-line text'); + const cursorPos = rli._getCursorPos(); + assert.strictEqual(cursorPos.rows, 1); + assert.strictEqual(cursorPos.cols, 5); + } } // isFullWidthCodePoint() should return false for non-numeric values