summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2019-12-31 15:07:37 +0100
committerRuben Bridgewater <ruben@bridgewater.de>2020-01-10 09:11:51 +0100
commit539df7387dfc0b35840817e0a710a31db49d5a5a (patch)
tree88372f731184e9cdfbe9ac38fba06951d6f89203 /test
parentb52bf605187d65be272a0ab8fb7f5623d8934f18 (diff)
downloadnode-new-539df7387dfc0b35840817e0a710a31db49d5a5a.tar.gz
readline: improve getStringWidth()
1. Simplify the getStringWidth function used by Intl builds by removing dead code (the options were unused) and by refactoring the logic. 2. Improve the getStringWidth unicode handling used by non-Intl builds. The getStringWidth function returned the wrong width for multiple inputs. It's now improved by supporting various zero width characters and more full width characters. PR-URL: https://github.com/nodejs/node/pull/31112 Reviewed-By: MichaΓ«l Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-readline-interface.js60
1 files changed, 16 insertions, 44 deletions
diff --git a/test/parallel/test-readline-interface.js b/test/parallel/test-readline-interface.js
index 0f4345f40b..cbc7ed31f4 100644
--- a/test/parallel/test-readline-interface.js
+++ b/test/parallel/test-readline-interface.js
@@ -731,11 +731,7 @@ function isWarned(emitter) {
fi.emit('keypress', '.', { name: 'right' });
cursorPos = rli.getCursorPos();
assert.strictEqual(cursorPos.rows, 0);
- if (common.hasIntl) {
- assert.strictEqual(cursorPos.cols, 2);
- } else {
- assert.strictEqual(cursorPos.cols, 1);
- }
+ assert.strictEqual(cursorPos.cols, 2);
rli.on('line', common.mustCall((line) => {
assert.strictEqual(line, 'πŸ’»');
@@ -764,14 +760,7 @@ function isWarned(emitter) {
fi.emit('data', 'πŸ•');
cursorPos = rli.getCursorPos();
assert.strictEqual(cursorPos.rows, 0);
-
- if (common.hasIntl) {
- assert.strictEqual(cursorPos.cols, 2);
- } else {
- assert.strictEqual(cursorPos.cols, 1);
- // Fix cursor position without internationalization
- fi.emit('keypress', '.', { name: 'left' });
- }
+ assert.strictEqual(cursorPos.cols, 2);
rli.on('line', common.mustCall((line) => {
assert.strictEqual(line, 'πŸ•πŸ’»');
@@ -795,22 +784,12 @@ function isWarned(emitter) {
fi.emit('keypress', '.', { name: 'right' });
let cursorPos = rli.getCursorPos();
assert.strictEqual(cursorPos.rows, 0);
- if (common.hasIntl) {
- assert.strictEqual(cursorPos.cols, 2);
- } else {
- assert.strictEqual(cursorPos.cols, 1);
- // Fix cursor position without internationalization
- fi.emit('keypress', '.', { name: 'right' });
- }
+ assert.strictEqual(cursorPos.cols, 2);
fi.emit('data', 'πŸ•');
cursorPos = rli.getCursorPos();
assert.strictEqual(cursorPos.rows, 0);
- if (common.hasIntl) {
- assert.strictEqual(cursorPos.cols, 4);
- } else {
- assert.strictEqual(cursorPos.cols, 2);
- }
+ assert.strictEqual(cursorPos.cols, 4);
rli.on('line', common.mustCall((line) => {
assert.strictEqual(line, 'πŸ’»πŸ•');
@@ -972,11 +951,7 @@ function isWarned(emitter) {
fi.emit('data', 'πŸ’»');
let cursorPos = rli.getCursorPos();
assert.strictEqual(cursorPos.rows, 0);
- if (common.hasIntl) {
- assert.strictEqual(cursorPos.cols, 2);
- } else {
- assert.strictEqual(cursorPos.cols, 1);
- }
+ assert.strictEqual(cursorPos.cols, 2);
// Delete left character
fi.emit('keypress', '.', { ctrl: true, name: 'h' });
cursorPos = rli.getCursorPos();
@@ -1159,27 +1134,24 @@ function isWarned(emitter) {
}
}
- // isFullWidthCodePoint() should return false for non-numeric values
- [true, false, null, undefined, {}, [], 'あ'].forEach((v) => {
- assert.strictEqual(internalReadline.isFullWidthCodePoint('あ'), false);
- });
-
// Wide characters should be treated as two columns.
- assert.strictEqual(internalReadline.isFullWidthCodePoint('a'.charCodeAt(0)),
- false);
- assert.strictEqual(internalReadline.isFullWidthCodePoint('あ'.charCodeAt(0)),
- true);
- assert.strictEqual(internalReadline.isFullWidthCodePoint('θ°’'.charCodeAt(0)),
- true);
- assert.strictEqual(internalReadline.isFullWidthCodePoint('κ³ '.charCodeAt(0)),
- true);
- assert.strictEqual(internalReadline.isFullWidthCodePoint(0x1f251), true);
+ assert.strictEqual(internalReadline.getStringWidth('a'), 1);
+ assert.strictEqual(internalReadline.getStringWidth('あ'), 2);
+ assert.strictEqual(internalReadline.getStringWidth('θ°’'), 2);
+ assert.strictEqual(internalReadline.getStringWidth('κ³ '), 2);
+ assert.strictEqual(
+ internalReadline.getStringWidth(String.fromCodePoint(0x1f251)), 2);
assert.strictEqual(internalReadline.getStringWidth('abcde'), 5);
assert.strictEqual(internalReadline.getStringWidth('叀池や'), 6);
assert.strictEqual(internalReadline.getStringWidth('γƒŽγƒΌγƒ‰.js'), 9);
assert.strictEqual(internalReadline.getStringWidth('δ½ ε₯½'), 4);
assert.strictEqual(internalReadline.getStringWidth('μ•ˆλ…•ν•˜μ„Έμš”'), 10);
assert.strictEqual(internalReadline.getStringWidth('A\ud83c\ude00BC'), 5);
+ assert.strictEqual(internalReadline.getStringWidth('πŸ‘¨β€πŸ‘©β€πŸ‘¦β€πŸ‘¦'), 8);
+ assert.strictEqual(internalReadline.getStringWidth('πŸ•π·γ‚πŸ’»πŸ˜€'), 9);
+ // TODO(BridgeAR): This should have a width of 4.
+ assert.strictEqual(internalReadline.getStringWidth('⓬β“ͺ'), 2);
+ assert.strictEqual(internalReadline.getStringWidth('\u0301\u200D\u200E'), 0);
// Check if vt control chars are stripped
assert.strictEqual(