Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/common/model/modelEditOperation.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import assert from 'assert';
6
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
7
import { ISingleEditOperation } from '../../../common/core/editOperation.js';
8
import { Range } from '../../../common/core/range.js';
9
import { TextModel } from '../../../common/model/textModel.js';
10
import { createTextModel } from '../testTextModel.js';
11
12
suite('Editor Model - Model Edit Operation', () => {
13
const LINE1 = 'My First Line';
14
const LINE2 = '\t\tMy Second Line';
15
const LINE3 = ' Third Line';
16
const LINE4 = '';
17
const LINE5 = '1';
18
19
let model: TextModel;
20
21
setup(() => {
22
const text =
23
LINE1 + '\r\n' +
24
LINE2 + '\n' +
25
LINE3 + '\n' +
26
LINE4 + '\r\n' +
27
LINE5;
28
model = createTextModel(text);
29
});
30
31
teardown(() => {
32
model.dispose();
33
});
34
35
ensureNoDisposablesAreLeakedInTestSuite();
36
37
function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation {
38
const range = new Range(
39
selectionLineNumber,
40
selectionColumn,
41
positionLineNumber,
42
positionColumn
43
);
44
45
return {
46
range: range,
47
text: text,
48
forceMoveMarkers: false
49
};
50
}
51
52
function assertSingleEditOp(singleEditOp: ISingleEditOperation, editedLines: string[]) {
53
const editOp = [singleEditOp];
54
55
const inverseEditOp = model.applyEdits(editOp, true);
56
57
assert.strictEqual(model.getLineCount(), editedLines.length);
58
for (let i = 0; i < editedLines.length; i++) {
59
assert.strictEqual(model.getLineContent(i + 1), editedLines[i]);
60
}
61
62
const originalOp = model.applyEdits(inverseEditOp, true);
63
64
assert.strictEqual(model.getLineCount(), 5);
65
assert.strictEqual(model.getLineContent(1), LINE1);
66
assert.strictEqual(model.getLineContent(2), LINE2);
67
assert.strictEqual(model.getLineContent(3), LINE3);
68
assert.strictEqual(model.getLineContent(4), LINE4);
69
assert.strictEqual(model.getLineContent(5), LINE5);
70
71
const simplifyEdit = (edit: ISingleEditOperation) => {
72
return {
73
range: edit.range,
74
text: edit.text,
75
forceMoveMarkers: edit.forceMoveMarkers || false
76
};
77
};
78
assert.deepStrictEqual(originalOp.map(simplifyEdit), editOp.map(simplifyEdit));
79
}
80
81
test('Insert inline', () => {
82
assertSingleEditOp(
83
createSingleEditOp('a', 1, 1),
84
[
85
'aMy First Line',
86
LINE2,
87
LINE3,
88
LINE4,
89
LINE5
90
]
91
);
92
});
93
94
test('Replace inline/inline 1', () => {
95
assertSingleEditOp(
96
createSingleEditOp(' incredibly awesome', 1, 3),
97
[
98
'My incredibly awesome First Line',
99
LINE2,
100
LINE3,
101
LINE4,
102
LINE5
103
]
104
);
105
});
106
107
test('Replace inline/inline 2', () => {
108
assertSingleEditOp(
109
createSingleEditOp(' with text at the end.', 1, 14),
110
[
111
'My First Line with text at the end.',
112
LINE2,
113
LINE3,
114
LINE4,
115
LINE5
116
]
117
);
118
});
119
120
test('Replace inline/inline 3', () => {
121
assertSingleEditOp(
122
createSingleEditOp('My new First Line.', 1, 1, 1, 14),
123
[
124
'My new First Line.',
125
LINE2,
126
LINE3,
127
LINE4,
128
LINE5
129
]
130
);
131
});
132
133
test('Replace inline/multi line 1', () => {
134
assertSingleEditOp(
135
createSingleEditOp('My new First Line.', 1, 1, 3, 15),
136
[
137
'My new First Line.',
138
LINE4,
139
LINE5
140
]
141
);
142
});
143
144
test('Replace inline/multi line 2', () => {
145
assertSingleEditOp(
146
createSingleEditOp('My new First Line.', 1, 2, 3, 15),
147
[
148
'MMy new First Line.',
149
LINE4,
150
LINE5
151
]
152
);
153
});
154
155
test('Replace inline/multi line 3', () => {
156
assertSingleEditOp(
157
createSingleEditOp('My new First Line.', 1, 2, 3, 2),
158
[
159
'MMy new First Line. Third Line',
160
LINE4,
161
LINE5
162
]
163
);
164
});
165
166
test('Replace muli line/multi line', () => {
167
assertSingleEditOp(
168
createSingleEditOp('1\n2\n3\n4\n', 1, 1),
169
[
170
'1',
171
'2',
172
'3',
173
'4',
174
LINE1,
175
LINE2,
176
LINE3,
177
LINE4,
178
LINE5
179
]
180
);
181
});
182
});
183
184