]> git.proxmox.com Git - mirror_xterm.js.git/blob - src/SelectionManager.test.ts
Have Terminal.hasSelection return false when no selection
[mirror_xterm.js.git] / src / SelectionManager.test.ts
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 import { SelectionModel } from './SelectionModel';
11
12 class TestSelectionManager extends SelectionManager {
13 constructor(
14 terminal: ITerminal,
15 buffer: CircularList<any>,
16 rowContainer: HTMLElement,
17 charMeasure: CharMeasure
18 ) {
19 super(terminal, buffer, rowContainer, charMeasure);
20 }
21
22 public get model(): SelectionModel { return this._model; }
23
24 public selectLineAt(line: number): void { this._selectLineAt(line); }
25 public selectWordAt(coords: [number, number]): void { this._selectWordAt(coords); }
26
27 // Disable DOM interaction
28 public enable(): void {}
29 public disable(): void {}
30 public refresh(): void {}
31 }
32
33 describe('SelectionManager', () => {
34 let window: Window;
35 let document: Document;
36
37 let terminal: ITerminal;
38 let buffer: CircularList<any>;
39 let rowContainer: HTMLElement;
40 let selectionManager: TestSelectionManager;
41
42 beforeEach(done => {
43 jsdom.env('', (err, w) => {
44 window = w;
45 document = window.document;
46 buffer = new CircularList<any>(100);
47 terminal = <any>{ cols: 80, rows: 2 };
48 selectionManager = new TestSelectionManager(terminal, buffer, rowContainer, null);
49 done();
50 });
51 });
52
53 function stringToRow(text: string): [number, string, number][] {
54 let result: [number, string, number][] = [];
55 for (let i = 0; i < text.length; i++) {
56 result.push([0, text.charAt(i), 1]);
57 }
58 return result;
59 }
60
61 describe('_selectWordAt', () => {
62 it('should expand selection for normal width chars', () => {
63 buffer.push(stringToRow('foo bar'));
64 selectionManager.selectWordAt([0, 0]);
65 assert.equal(selectionManager.selectionText, 'foo');
66 selectionManager.selectWordAt([1, 0]);
67 assert.equal(selectionManager.selectionText, 'foo');
68 selectionManager.selectWordAt([2, 0]);
69 assert.equal(selectionManager.selectionText, 'foo');
70 selectionManager.selectWordAt([3, 0]);
71 assert.equal(selectionManager.selectionText, ' ');
72 selectionManager.selectWordAt([4, 0]);
73 assert.equal(selectionManager.selectionText, 'bar');
74 selectionManager.selectWordAt([5, 0]);
75 assert.equal(selectionManager.selectionText, 'bar');
76 selectionManager.selectWordAt([6, 0]);
77 assert.equal(selectionManager.selectionText, 'bar');
78 });
79 it('should expand selection for whitespace', () => {
80 buffer.push(stringToRow('a b'));
81 selectionManager.selectWordAt([0, 0]);
82 assert.equal(selectionManager.selectionText, 'a');
83 selectionManager.selectWordAt([1, 0]);
84 assert.equal(selectionManager.selectionText, ' ');
85 selectionManager.selectWordAt([2, 0]);
86 assert.equal(selectionManager.selectionText, ' ');
87 selectionManager.selectWordAt([3, 0]);
88 assert.equal(selectionManager.selectionText, ' ');
89 selectionManager.selectWordAt([4, 0]);
90 assert.equal(selectionManager.selectionText, 'b');
91 });
92 it('should expand selection for wide characters', () => {
93 // Wide characters use a special format
94 buffer.push([
95 [null, '中', 2],
96 [null, '', 0],
97 [null, '文', 2],
98 [null, '', 0],
99 [null, ' ', 1],
100 [null, 'a', 1],
101 [null, '中', 2],
102 [null, '', 0],
103 [null, '文', 2],
104 [null, '', 0],
105 [null, 'b', 1],
106 [null, ' ', 1],
107 [null, 'f', 1],
108 [null, 'o', 1],
109 [null, 'o', 1]
110 ]);
111 // Ensure wide characters take up 2 columns
112 selectionManager.selectWordAt([0, 0]);
113 assert.equal(selectionManager.selectionText, '中文');
114 selectionManager.selectWordAt([1, 0]);
115 assert.equal(selectionManager.selectionText, '中文');
116 selectionManager.selectWordAt([2, 0]);
117 assert.equal(selectionManager.selectionText, '中文');
118 selectionManager.selectWordAt([3, 0]);
119 assert.equal(selectionManager.selectionText, '中文');
120 selectionManager.selectWordAt([4, 0]);
121 assert.equal(selectionManager.selectionText, ' ');
122 // Ensure wide characters work when wrapped in normal width characters
123 selectionManager.selectWordAt([5, 0]);
124 assert.equal(selectionManager.selectionText, 'a中文b');
125 selectionManager.selectWordAt([6, 0]);
126 assert.equal(selectionManager.selectionText, 'a中文b');
127 selectionManager.selectWordAt([7, 0]);
128 assert.equal(selectionManager.selectionText, 'a中文b');
129 selectionManager.selectWordAt([8, 0]);
130 assert.equal(selectionManager.selectionText, 'a中文b');
131 selectionManager.selectWordAt([9, 0]);
132 assert.equal(selectionManager.selectionText, 'a中文b');
133 selectionManager.selectWordAt([10, 0]);
134 assert.equal(selectionManager.selectionText, 'a中文b');
135 selectionManager.selectWordAt([11, 0]);
136 assert.equal(selectionManager.selectionText, ' ');
137 // Ensure normal width characters work fine in a line containing wide characters
138 selectionManager.selectWordAt([12, 0]);
139 assert.equal(selectionManager.selectionText, 'foo');
140 selectionManager.selectWordAt([13, 0]);
141 assert.equal(selectionManager.selectionText, 'foo');
142 selectionManager.selectWordAt([14, 0]);
143 assert.equal(selectionManager.selectionText, 'foo');
144 });
145 it('should select up to non-path characters that are commonly adjacent to paths', () => {
146 buffer.push(stringToRow(':ab:(cd)[ef]{gh}\'ij"'));
147 selectionManager.selectWordAt([0, 0]);
148 assert.equal(selectionManager.selectionText, ':ab');
149 selectionManager.selectWordAt([1, 0]);
150 assert.equal(selectionManager.selectionText, 'ab');
151 selectionManager.selectWordAt([2, 0]);
152 assert.equal(selectionManager.selectionText, 'ab');
153 selectionManager.selectWordAt([3, 0]);
154 assert.equal(selectionManager.selectionText, 'ab:');
155 selectionManager.selectWordAt([4, 0]);
156 assert.equal(selectionManager.selectionText, '(cd');
157 selectionManager.selectWordAt([5, 0]);
158 assert.equal(selectionManager.selectionText, 'cd');
159 selectionManager.selectWordAt([6, 0]);
160 assert.equal(selectionManager.selectionText, 'cd');
161 selectionManager.selectWordAt([7, 0]);
162 assert.equal(selectionManager.selectionText, 'cd)');
163 selectionManager.selectWordAt([8, 0]);
164 assert.equal(selectionManager.selectionText, '[ef');
165 selectionManager.selectWordAt([9, 0]);
166 assert.equal(selectionManager.selectionText, 'ef');
167 selectionManager.selectWordAt([10, 0]);
168 assert.equal(selectionManager.selectionText, 'ef');
169 selectionManager.selectWordAt([11, 0]);
170 assert.equal(selectionManager.selectionText, 'ef]');
171 selectionManager.selectWordAt([12, 0]);
172 assert.equal(selectionManager.selectionText, '{gh');
173 selectionManager.selectWordAt([13, 0]);
174 assert.equal(selectionManager.selectionText, 'gh');
175 selectionManager.selectWordAt([14, 0]);
176 assert.equal(selectionManager.selectionText, 'gh');
177 selectionManager.selectWordAt([15, 0]);
178 assert.equal(selectionManager.selectionText, 'gh}');
179 selectionManager.selectWordAt([16, 0]);
180 assert.equal(selectionManager.selectionText, '\'ij');
181 selectionManager.selectWordAt([17, 0]);
182 assert.equal(selectionManager.selectionText, 'ij');
183 selectionManager.selectWordAt([18, 0]);
184 assert.equal(selectionManager.selectionText, 'ij');
185 selectionManager.selectWordAt([19, 0]);
186 assert.equal(selectionManager.selectionText, 'ij"');
187 });
188 });
189
190 describe('_selectLineAt', () => {
191 it('should select the entire line', () => {
192 buffer.push(stringToRow('foo bar'));
193 selectionManager.selectLineAt(0);
194 assert.equal(selectionManager.selectionText, 'foo bar', 'The selected text is correct');
195 assert.deepEqual(selectionManager.model.finalSelectionStart, [0, 0]);
196 assert.deepEqual(selectionManager.model.finalSelectionEnd, [terminal.cols, 0], 'The actual selection spans the entire column');
197 });
198 });
199
200 describe('selectAll', () => {
201 it('should select the entire buffer, beyond the viewport', () => {
202 buffer.push(stringToRow('1'));
203 buffer.push(stringToRow('2'));
204 buffer.push(stringToRow('3'));
205 buffer.push(stringToRow('4'));
206 buffer.push(stringToRow('5'));
207 selectionManager.selectAll();
208 terminal.ybase = buffer.length - terminal.rows;
209 assert.equal(selectionManager.selectionText, '1\n2\n3\n4\n5');
210 });
211 });
212
213 describe('hasSelection', () => {
214 it('should return whether there is a selection', () => {
215 selectionManager.model.selectionStart = [0, 0];
216 selectionManager.model.selectionStartLength = 0;
217 assert.equal(selectionManager.hasSelection, false);
218 selectionManager.model.selectionEnd = [0, 0];
219 assert.equal(selectionManager.hasSelection, false);
220 selectionManager.model.selectionEnd = [1, 0];
221 assert.equal(selectionManager.hasSelection, true);
222 selectionManager.model.selectionEnd = [0, 1];
223 assert.equal(selectionManager.hasSelection, true);
224 selectionManager.model.selectionEnd = [1, 1];
225 assert.equal(selectionManager.hasSelection, true);
226 });
227 });
228 });