]>
Commit | Line | Data |
---|---|---|
d3865ad2 DI |
1 | /** |
2 | * @license MIT | |
3 | */ | |
4 | import jsdom = require('jsdom'); | |
5 | import { assert } from 'chai'; | |
6 | import { ITerminal } from './Interfaces'; | |
7 | import { CharMeasure } from './utils/CharMeasure'; | |
8 | import { CircularList } from './utils/CircularList'; | |
9 | import { SelectionManager } from './SelectionManager'; | |
10 | ||
11 | class TestSelectionManager extends SelectionManager { | |
12 | constructor( | |
13 | terminal: ITerminal, | |
14 | buffer: CircularList<any>, | |
15 | rowContainer: HTMLElement, | |
16 | charMeasure: CharMeasure | |
17 | ) { | |
18 | super(terminal, buffer, rowContainer, charMeasure); | |
19 | } | |
20 | ||
21 | public selectWordAt(coords: [number, number]): void { this._selectWordAt(coords); } | |
22 | ||
23 | // Disable DOM interaction | |
24 | public enable(): void {} | |
25 | public disable(): void {} | |
26 | public refresh(): void {} | |
27 | } | |
28 | ||
29 | describe('SelectionManager', () => { | |
30 | let window: Window; | |
31 | let document: Document; | |
32 | ||
33 | let buffer: CircularList<any>; | |
34 | let rowContainer: HTMLElement; | |
35 | let selectionManager: TestSelectionManager; | |
36 | ||
37 | beforeEach(done => { | |
38 | jsdom.env('', (err, w) => { | |
39 | window = w; | |
40 | document = window.document; | |
41 | buffer = new CircularList<any>(100); | |
42 | selectionManager = new TestSelectionManager(null, buffer, rowContainer, null); | |
43 | done(); | |
44 | }); | |
45 | }); | |
46 | ||
47 | function stringToRow(text: string): [number, string, number][] { | |
48 | let result: [number, string, number][] = []; | |
49 | for (let i = 0; i < text.length; i++) { | |
50 | result.push([0, text.charAt(i), 1]); | |
51 | } | |
52 | return result; | |
53 | } | |
54 | ||
55 | describe('_selectWordAt', () => { | |
56 | it('should expand selection for normal width chars', () => { | |
57 | buffer.push(stringToRow('foo bar')); | |
58 | selectionManager.selectWordAt([0, 0]); | |
59 | assert.equal(selectionManager.selectionText, 'foo'); | |
60 | selectionManager.selectWordAt([1, 0]); | |
61 | assert.equal(selectionManager.selectionText, 'foo'); | |
62 | selectionManager.selectWordAt([2, 0]); | |
63 | assert.equal(selectionManager.selectionText, 'foo'); | |
64 | selectionManager.selectWordAt([3, 0]); | |
65 | assert.equal(selectionManager.selectionText, ' '); | |
66 | selectionManager.selectWordAt([4, 0]); | |
67 | assert.equal(selectionManager.selectionText, 'bar'); | |
68 | selectionManager.selectWordAt([5, 0]); | |
69 | assert.equal(selectionManager.selectionText, 'bar'); | |
70 | selectionManager.selectWordAt([6, 0]); | |
71 | assert.equal(selectionManager.selectionText, 'bar'); | |
72 | }); | |
73 | it('should expand selection for whitespace', () => { | |
74 | buffer.push(stringToRow('a b')); | |
75 | selectionManager.selectWordAt([0, 0]); | |
76 | assert.equal(selectionManager.selectionText, 'a'); | |
77 | selectionManager.selectWordAt([1, 0]); | |
78 | assert.equal(selectionManager.selectionText, ' '); | |
79 | selectionManager.selectWordAt([2, 0]); | |
80 | assert.equal(selectionManager.selectionText, ' '); | |
81 | selectionManager.selectWordAt([3, 0]); | |
82 | assert.equal(selectionManager.selectionText, ' '); | |
83 | selectionManager.selectWordAt([4, 0]); | |
84 | assert.equal(selectionManager.selectionText, 'b'); | |
85 | }); | |
86 | it('should expand selection for wide characters', () => { | |
87 | // Wide characters use a special format | |
88 | buffer.push([ | |
89 | [null, '中', 2], | |
90 | [null, '', 0], | |
91 | [null, '文', 2], | |
92 | [null, '', 0], | |
93 | [null, ' ', 1], | |
94 | [null, 'a', 1], | |
95 | [null, '中', 2], | |
96 | [null, '', 0], | |
97 | [null, '文', 2], | |
98 | [null, '', 0], | |
99 | [null, 'b', 1], | |
100 | [null, ' ', 1], | |
101 | [null, 'f', 1], | |
102 | [null, 'o', 1], | |
103 | [null, 'o', 1] | |
104 | ]); | |
105 | // Ensure wide characters take up 2 columns | |
106 | selectionManager.selectWordAt([0, 0]); | |
107 | assert.equal(selectionManager.selectionText, '中文'); | |
108 | selectionManager.selectWordAt([1, 0]); | |
109 | assert.equal(selectionManager.selectionText, '中文'); | |
110 | selectionManager.selectWordAt([2, 0]); | |
111 | assert.equal(selectionManager.selectionText, '中文'); | |
112 | selectionManager.selectWordAt([3, 0]); | |
113 | assert.equal(selectionManager.selectionText, '中文'); | |
114 | selectionManager.selectWordAt([4, 0]); | |
115 | assert.equal(selectionManager.selectionText, ' '); | |
116 | // Ensure wide characters work when wrapped in normal width characters | |
117 | selectionManager.selectWordAt([5, 0]); | |
118 | assert.equal(selectionManager.selectionText, 'a中文b'); | |
119 | selectionManager.selectWordAt([6, 0]); | |
120 | assert.equal(selectionManager.selectionText, 'a中文b'); | |
121 | selectionManager.selectWordAt([7, 0]); | |
122 | assert.equal(selectionManager.selectionText, 'a中文b'); | |
123 | selectionManager.selectWordAt([8, 0]); | |
124 | assert.equal(selectionManager.selectionText, 'a中文b'); | |
125 | selectionManager.selectWordAt([9, 0]); | |
126 | assert.equal(selectionManager.selectionText, 'a中文b'); | |
127 | selectionManager.selectWordAt([10, 0]); | |
128 | assert.equal(selectionManager.selectionText, 'a中文b'); | |
129 | selectionManager.selectWordAt([11, 0]); | |
130 | assert.equal(selectionManager.selectionText, ' '); | |
131 | // Ensure normal width characters work fine in a line containing wide characters | |
132 | selectionManager.selectWordAt([12, 0]); | |
133 | assert.equal(selectionManager.selectionText, 'foo'); | |
134 | selectionManager.selectWordAt([13, 0]); | |
135 | assert.equal(selectionManager.selectionText, 'foo'); | |
136 | selectionManager.selectWordAt([14, 0]); | |
137 | assert.equal(selectionManager.selectionText, 'foo'); | |
138 | }); | |
139 | }); | |
140 | }); |