]> git.proxmox.com Git - mirror_xterm.js.git/blob - src/SelectionManager.test.ts
Merge remote-tracking branch 'ups/master' into 207_selection_manager
[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
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 });