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';
12 class TestSelectionManager extends SelectionManager {
15 buffer: CircularList<any>,
16 rowContainer: HTMLElement,
17 charMeasure: CharMeasure
19 super(terminal, buffer, rowContainer, charMeasure);
22 public get model(): SelectionModel { return this._model; }
24 public selectLineAt(line: number): void { this._selectLineAt(line); }
25 public selectWordAt(coords: [number, number]): void { this._selectWordAt(coords); }
27 // Disable DOM interaction
28 public enable(): void {}
29 public disable(): void {}
30 public refresh(): void {}
33 describe('SelectionManager', () => {
36 let document: Document;
38 let terminal: ITerminal;
39 let buffer: CircularList<any>;
40 let rowContainer: HTMLElement;
41 let selectionManager: TestSelectionManager;
44 dom = new jsdom.JSDOM('');
46 document = window.document;
47 buffer = new CircularList<any>(100);
48 terminal = <any>{ cols: 80, rows: 2 };
49 selectionManager = new TestSelectionManager(terminal, buffer, rowContainer, null);
52 function stringToRow(text: string): [number, string, number][] {
53 let result: [number, string, number][] = [];
54 for (let i = 0; i < text.length; i++) {
55 result.push([0, text.charAt(i), 1]);
60 describe('_selectWordAt', () => {
61 it('should expand selection for normal width chars', () => {
62 buffer.push(stringToRow('foo bar'));
63 selectionManager.selectWordAt([0, 0]);
64 assert.equal(selectionManager.selectionText, 'foo');
65 selectionManager.selectWordAt([1, 0]);
66 assert.equal(selectionManager.selectionText, 'foo');
67 selectionManager.selectWordAt([2, 0]);
68 assert.equal(selectionManager.selectionText, 'foo');
69 selectionManager.selectWordAt([3, 0]);
70 assert.equal(selectionManager.selectionText, ' ');
71 selectionManager.selectWordAt([4, 0]);
72 assert.equal(selectionManager.selectionText, 'bar');
73 selectionManager.selectWordAt([5, 0]);
74 assert.equal(selectionManager.selectionText, 'bar');
75 selectionManager.selectWordAt([6, 0]);
76 assert.equal(selectionManager.selectionText, 'bar');
78 it('should expand selection for whitespace', () => {
79 buffer.push(stringToRow('a b'));
80 selectionManager.selectWordAt([0, 0]);
81 assert.equal(selectionManager.selectionText, 'a');
82 selectionManager.selectWordAt([1, 0]);
83 assert.equal(selectionManager.selectionText, ' ');
84 selectionManager.selectWordAt([2, 0]);
85 assert.equal(selectionManager.selectionText, ' ');
86 selectionManager.selectWordAt([3, 0]);
87 assert.equal(selectionManager.selectionText, ' ');
88 selectionManager.selectWordAt([4, 0]);
89 assert.equal(selectionManager.selectionText, 'b');
91 it('should expand selection for wide characters', () => {
92 // Wide characters use a special format
110 // Ensure wide characters take up 2 columns
111 selectionManager.selectWordAt([0, 0]);
112 assert.equal(selectionManager.selectionText, '中文');
113 selectionManager.selectWordAt([1, 0]);
114 assert.equal(selectionManager.selectionText, '中文');
115 selectionManager.selectWordAt([2, 0]);
116 assert.equal(selectionManager.selectionText, '中文');
117 selectionManager.selectWordAt([3, 0]);
118 assert.equal(selectionManager.selectionText, '中文');
119 selectionManager.selectWordAt([4, 0]);
120 assert.equal(selectionManager.selectionText, ' ');
121 // Ensure wide characters work when wrapped in normal width characters
122 selectionManager.selectWordAt([5, 0]);
123 assert.equal(selectionManager.selectionText, 'a中文b');
124 selectionManager.selectWordAt([6, 0]);
125 assert.equal(selectionManager.selectionText, 'a中文b');
126 selectionManager.selectWordAt([7, 0]);
127 assert.equal(selectionManager.selectionText, 'a中文b');
128 selectionManager.selectWordAt([8, 0]);
129 assert.equal(selectionManager.selectionText, 'a中文b');
130 selectionManager.selectWordAt([9, 0]);
131 assert.equal(selectionManager.selectionText, 'a中文b');
132 selectionManager.selectWordAt([10, 0]);
133 assert.equal(selectionManager.selectionText, 'a中文b');
134 selectionManager.selectWordAt([11, 0]);
135 assert.equal(selectionManager.selectionText, ' ');
136 // Ensure normal width characters work fine in a line containing wide characters
137 selectionManager.selectWordAt([12, 0]);
138 assert.equal(selectionManager.selectionText, 'foo');
139 selectionManager.selectWordAt([13, 0]);
140 assert.equal(selectionManager.selectionText, 'foo');
141 selectionManager.selectWordAt([14, 0]);
142 assert.equal(selectionManager.selectionText, 'foo');
144 it('should select up to non-path characters that are commonly adjacent to paths', () => {
145 buffer.push(stringToRow('(cd)[ef]{gh}\'ij"'));
146 selectionManager.selectWordAt([0, 0]);
147 assert.equal(selectionManager.selectionText, '(cd');
148 selectionManager.selectWordAt([1, 0]);
149 assert.equal(selectionManager.selectionText, 'cd');
150 selectionManager.selectWordAt([2, 0]);
151 assert.equal(selectionManager.selectionText, 'cd');
152 selectionManager.selectWordAt([3, 0]);
153 assert.equal(selectionManager.selectionText, 'cd)');
154 selectionManager.selectWordAt([4, 0]);
155 assert.equal(selectionManager.selectionText, '[ef');
156 selectionManager.selectWordAt([5, 0]);
157 assert.equal(selectionManager.selectionText, 'ef');
158 selectionManager.selectWordAt([6, 0]);
159 assert.equal(selectionManager.selectionText, 'ef');
160 selectionManager.selectWordAt([7, 0]);
161 assert.equal(selectionManager.selectionText, 'ef]');
162 selectionManager.selectWordAt([8, 0]);
163 assert.equal(selectionManager.selectionText, '{gh');
164 selectionManager.selectWordAt([9, 0]);
165 assert.equal(selectionManager.selectionText, 'gh');
166 selectionManager.selectWordAt([10, 0]);
167 assert.equal(selectionManager.selectionText, 'gh');
168 selectionManager.selectWordAt([11, 0]);
169 assert.equal(selectionManager.selectionText, 'gh}');
170 selectionManager.selectWordAt([12, 0]);
171 assert.equal(selectionManager.selectionText, '\'ij');
172 selectionManager.selectWordAt([13, 0]);
173 assert.equal(selectionManager.selectionText, 'ij');
174 selectionManager.selectWordAt([14, 0]);
175 assert.equal(selectionManager.selectionText, 'ij');
176 selectionManager.selectWordAt([15, 0]);
177 assert.equal(selectionManager.selectionText, 'ij"');
181 describe('_selectLineAt', () => {
182 it('should select the entire line', () => {
183 buffer.push(stringToRow('foo bar'));
184 selectionManager.selectLineAt(0);
185 assert.equal(selectionManager.selectionText, 'foo bar', 'The selected text is correct');
186 assert.deepEqual(selectionManager.model.finalSelectionStart, [0, 0]);
187 assert.deepEqual(selectionManager.model.finalSelectionEnd, [terminal.cols, 0], 'The actual selection spans the entire column');
191 describe('selectAll', () => {
192 it('should select the entire buffer, beyond the viewport', () => {
193 buffer.push(stringToRow('1'));
194 buffer.push(stringToRow('2'));
195 buffer.push(stringToRow('3'));
196 buffer.push(stringToRow('4'));
197 buffer.push(stringToRow('5'));
198 selectionManager.selectAll();
199 terminal.ybase = buffer.length - terminal.rows;
200 assert.equal(selectionManager.selectionText, '1\n2\n3\n4\n5');
204 describe('hasSelection', () => {
205 it('should return whether there is a selection', () => {
206 selectionManager.model.selectionStart = [0, 0];
207 selectionManager.model.selectionStartLength = 0;
208 assert.equal(selectionManager.hasSelection, false);
209 selectionManager.model.selectionEnd = [0, 0];
210 assert.equal(selectionManager.hasSelection, false);
211 selectionManager.model.selectionEnd = [1, 0];
212 assert.equal(selectionManager.hasSelection, true);
213 selectionManager.model.selectionEnd = [0, 1];
214 assert.equal(selectionManager.hasSelection, true);
215 selectionManager.model.selectionEnd = [1, 1];
216 assert.equal(selectionManager.hasSelection, true);