]> git.proxmox.com Git - mirror_xterm.js.git/blob - src/SelectionModel.test.ts
Fix bug when selection end is less than start
[mirror_xterm.js.git] / src / SelectionModel.test.ts
1 /**
2 * @license MIT
3 */
4 import { assert } from 'chai';
5 import { ITerminal } from './Interfaces';
6 import { SelectionModel } from './SelectionModel';
7
8 class TestSelectionModel extends SelectionModel {
9 constructor(
10 terminal: ITerminal
11 ) {
12 super(terminal);
13 }
14
15 public areSelectionValuesReversed(): boolean { return this._areSelectionValuesReversed(); }
16 }
17
18 describe('SelectionManager', () => {
19 let window: Window;
20 let document: Document;
21
22 let terminal: ITerminal;
23 let model: TestSelectionModel;
24
25 beforeEach(() => {
26 terminal = <any>{ cols: 80, rows: 2, ybase: 0 };
27 model = new TestSelectionModel(terminal);
28 });
29
30 describe('clearSelection', () => {
31 it('should clear the final selection', () => {
32 model.selectionStart = [0, 0];
33 model.selectionEnd = [10, 2];
34 assert.deepEqual(model.finalSelectionStart, [0, 0]);
35 assert.deepEqual(model.finalSelectionEnd, [10, 2]);
36 model.clearSelection();
37 assert.deepEqual(model.finalSelectionStart, null);
38 assert.deepEqual(model.finalSelectionEnd, null);
39 });
40 });
41
42 describe('_areSelectionValuesReversed', () => {
43 it('should return true when the selection end is before selection start', () => {
44 model.selectionStart = [1, 0];
45 model.selectionEnd = [0, 0];
46 assert.equal(model.areSelectionValuesReversed(), true);
47 model.selectionStart = [10, 2];
48 model.selectionEnd = [0, 0];
49 assert.equal(model.areSelectionValuesReversed(), true);
50 });
51 it('should return false when the selection end is after selection start', () => {
52 model.selectionStart = [0, 0];
53 model.selectionEnd = [1, 0];
54 assert.equal(model.areSelectionValuesReversed(), false);
55 model.selectionStart = [0, 0];
56 model.selectionEnd = [10, 2];
57 assert.equal(model.areSelectionValuesReversed(), false);
58 });
59 });
60
61 describe('onTrim', () => {
62 it('should trim a portion of the selection when a part of it is trimmed', () => {
63 model.selectionStart = [0, 0];
64 model.selectionEnd = [10, 2];
65 model.onTrim(1);
66 assert.deepEqual(model.finalSelectionStart, [0, 0]);
67 assert.deepEqual(model.finalSelectionEnd, [10, 1]);
68 model.onTrim(1);
69 assert.deepEqual(model.finalSelectionStart, [0, 0]);
70 assert.deepEqual(model.finalSelectionEnd, [10, 0]);
71 });
72 it('should clear selection when it is trimmed in its entirety', () => {
73 model.selectionStart = [0, 0];
74 model.selectionEnd = [10, 0];
75 model.onTrim(1);
76 assert.deepEqual(model.finalSelectionStart, null);
77 assert.deepEqual(model.finalSelectionEnd, null);
78 });
79 });
80
81 describe('finalSelectionStart', () => {
82 it('should return the start of the buffer if select all is active', () => {
83 model.isSelectAllActive = true;
84 assert.deepEqual(model.finalSelectionStart, [0, 0]);
85 });
86 it('should return selection start if there is no selection end', () => {
87 model.selectionStart = [2, 2];
88 assert.deepEqual(model.finalSelectionStart, [2, 2]);
89 });
90 it('should return selection end if values are reversed', () => {
91 model.selectionStart = [2, 2];
92 model.selectionEnd = [3, 2];
93 assert.deepEqual(model.finalSelectionStart, [2, 2]);
94 model.selectionEnd = [1, 2];
95 assert.deepEqual(model.finalSelectionStart, [1, 2]);
96 });
97 });
98
99 describe('finalSelectionEnd', () => {
100 it('should return the end of the buffer if select all is active', () => {
101 model.isSelectAllActive = true;
102 assert.deepEqual(model.finalSelectionEnd, [80, 1]);
103 });
104 it('should return null if there is no selection start', () => {
105 assert.equal(model.finalSelectionEnd, null);
106 model.selectionEnd = [1, 2];
107 assert.equal(model.finalSelectionEnd, null);
108 });
109 it('should return selection start + length if there is no selection end', () => {
110 model.selectionStart = [2, 2];
111 model.selectionStartLength = 2;
112 assert.deepEqual(model.finalSelectionEnd, [4, 2]);
113 });
114 it('should return selection start + length if values are reversed', () => {
115 model.selectionStart = [2, 2];
116 model.selectionStartLength = 2;
117 model.selectionEnd = [2, 1];
118 assert.deepEqual(model.finalSelectionEnd, [4, 2]);
119 });
120 it('should return selection start + length if selection end is inside the start selection', () => {
121 model.selectionStart = [2, 2];
122 model.selectionStartLength = 2;
123 model.selectionEnd = [3, 2];
124 assert.deepEqual(model.finalSelectionEnd, [4, 2]);
125 });
126 it('should return selection end if selection end is after selection start + length', () => {
127 model.selectionStart = [2, 2];
128 model.selectionStartLength = 2;
129 model.selectionEnd = [5, 2];
130 assert.deepEqual(model.finalSelectionEnd, [5, 2]);
131 });
132 });
133 });