diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2019-12-31 15:07:37 +0100 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2020-01-10 09:11:51 +0100 |
commit | 539df7387dfc0b35840817e0a710a31db49d5a5a (patch) | |
tree | 88372f731184e9cdfbe9ac38fba06951d6f89203 /test | |
parent | b52bf605187d65be272a0ab8fb7f5623d8934f18 (diff) | |
download | node-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.js | 60 |
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( |