/
test.js
47 lines (43 loc) · 1.96 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import test from 'ava';
import stringWidth from './index.js';
test('main', t => {
t.is(stringWidth('⛣', {ambiguousIsNarrow: false}), 2);
t.is(stringWidth('abcde'), 5);
t.is(stringWidth('古池や'), 6);
t.is(stringWidth('あいうabc'), 9);
t.is(stringWidth('あいう★'), 7);
t.is(stringWidth('あいう★', {ambiguousIsNarrow: false}), 8);
t.is(stringWidth('±'), 1);
t.is(stringWidth('ノード.js'), 9);
t.is(stringWidth('你好'), 4);
t.is(stringWidth('안녕하세요'), 10);
t.is(stringWidth('A\uD83C\uDE00BC'), 5, 'surrogate');
t.is(stringWidth('\u001B[31m\u001B[39m'), 0);
t.is(stringWidth('\u001B[31m\u001B[39m', {countAnsiEscapeCodes: true}), 8);
t.is(stringWidth('\u001B]8;;https://github.com\u0007Click\u001B]8;;\u0007'), 5);
t.is(stringWidth('\u{231A}'), 2, '⌚ default emoji presentation character (Emoji_Presentation)');
t.is(stringWidth('\u{2194}\u{FE0F}'), 2, '↔️ default text presentation character rendered as emoji');
t.is(stringWidth('\u{1F469}'), 2, '👩 emoji modifier base (Emoji_Modifier_Base)');
t.is(stringWidth('\u{1F469}\u{1F3FF}'), 2, '👩🏿 emoji modifier base followed by a modifier');
t.is(stringWidth('\u{845B}\u{E0100}'), 2, 'Variation Selectors');
t.is(stringWidth('ปฏัก'), 3, 'Thai script');
t.is(stringWidth('_\u0E34'), 1, 'Thai script');
t.is(stringWidth('“', {ambiguousIsNarrow: false}), 2);
});
test('ignores control characters', t => {
t.is(stringWidth(String.fromCodePoint(0)), 0);
t.is(stringWidth(String.fromCodePoint(31)), 0);
t.is(stringWidth(String.fromCodePoint(127)), 0);
t.is(stringWidth(String.fromCodePoint(134)), 0);
t.is(stringWidth(String.fromCodePoint(159)), 0);
t.is(stringWidth('\u001B'), 0);
});
test('handles combining characters', t => {
t.is(stringWidth('x\u0300'), 1);
});
test('handles ZWJ characters', t => {
t.is(stringWidth('👶'), 2);
t.is(stringWidth('👶🏽'), 2);
t.is(stringWidth('👩👩👦👦'), 2);
t.is(stringWidth('👨❤️💋👨'), 2);
});