Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/prompt/node/test/positionOffsetTransformer.spec.ts
13405 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
6
import assert from 'assert';
7
import { beforeEach, suite, test } from 'vitest';
8
import { PositionOffsetTransformer } from '../../../../platform/editing/common/positionOffsetTransformer';
9
import { Position, Range, TextEdit } from '../../../../vscodeTypes';
10
11
suite('PositionOffsetTransformer', () => {
12
const sampleText = `line1\nline2\nline3`;
13
14
let transformer: PositionOffsetTransformer;
15
16
beforeEach(() => {
17
transformer = new PositionOffsetTransformer(sampleText);
18
});
19
20
test('should initialize correctly', () => {
21
assert.equal(transformer.getLineCount(), 3);
22
});
23
24
test('should get correct offset for a position', () => {
25
const position = new Position(1, 2);
26
const offset = transformer.getOffset(position);
27
assert.equal(offset, 8); // 6 (line1\n) + 2 (line2)
28
});
29
30
test('should get correct position for an offset', () => {
31
const offset = 8;
32
const position = transformer.getPosition(offset);
33
assert.equal(position.line, 1);
34
assert.equal(position.character, 2);
35
});
36
37
test('should convert range to offset range and back', () => {
38
const range = new Range(new Position(0, 1), new Position(1, 2));
39
const offsetRange = transformer.toOffsetRange(range);
40
assert.equal(offsetRange.start, 1);
41
assert.equal(offsetRange.endExclusive, 8);
42
43
const newRange = transformer.toRange(offsetRange);
44
assert.equal(newRange.start.line, 0);
45
assert.equal(newRange.start.character, 1);
46
assert.equal(newRange.end.line, 1);
47
assert.equal(newRange.end.character, 2);
48
});
49
50
test('should apply offset edits correctly', () => {
51
const edits = [
52
new TextEdit(new Range(new Position(0, 0), new Position(0, 5)), 'Hello'),
53
new TextEdit(new Range(new Position(1, 0), new Position(1, 5)), 'World')
54
];
55
const offsetEdit = transformer.toOffsetEdit(edits);
56
transformer.applyOffsetEdits(offsetEdit);
57
58
const newText = transformer.getText();
59
assert.equal(newText, 'Hello\nWorld\nline3');
60
});
61
62
test('should validate position correctly', () => {
63
const invalidPosition = new Position(10, 10);
64
const validPosition = transformer.validatePosition(invalidPosition);
65
assert.equal(validPosition.line, 2);
66
assert.equal(validPosition.character, 5);
67
});
68
69
test('should validate range correctly', () => {
70
const invalidRange = new Range(new Position(10, 10), new Position(20, 20));
71
const validRange = transformer.validateRange(invalidRange);
72
assert.equal(validRange.start.line, 2);
73
assert.equal(validRange.start.character, 5);
74
assert.equal(validRange.end.line, 2);
75
assert.equal(validRange.end.character, 5);
76
});
77
78
test('should apply offset edits with insertion correctly', () => {
79
const edits = [
80
new TextEdit(new Range(new Position(0, 5), new Position(0, 5)), 'Hello '),
81
new TextEdit(new Range(new Position(1, 5), new Position(1, 5)), ' World')
82
];
83
const offsetEdit = transformer.toOffsetEdit(edits);
84
transformer.applyOffsetEdits(offsetEdit);
85
86
const newText = transformer.getText();
87
assert.equal(newText, 'line1Hello \nline2 World\nline3');
88
89
// Additional assertions
90
assert.equal(transformer.getPosition(11).line, 0);
91
assert.equal(transformer.getPosition(11).character, 11);
92
assert.equal(transformer.getPosition(12).line, 1);
93
assert.equal(transformer.getPosition(12).character, 0);
94
assert.equal(transformer.getOffset(new Position(1, 0)), 12);
95
assert.equal(transformer.getOffset(new Position(0, 11)), 11);
96
});
97
98
test('should apply offset edits with deletion correctly', () => {
99
const edits = [
100
new TextEdit(new Range(new Position(0, 0), new Position(0, 5)), ''),
101
new TextEdit(new Range(new Position(1, 0), new Position(1, 5)), '')
102
];
103
const offsetEdit = transformer.toOffsetEdit(edits);
104
transformer.applyOffsetEdits(offsetEdit);
105
106
const newText = transformer.getText();
107
assert.equal(newText, '\n\nline3');
108
109
// Additional assertions
110
assert.equal(transformer.getPosition(0).line, 0);
111
assert.equal(transformer.getPosition(0).character, 0);
112
assert.equal(transformer.getPosition(1).line, 1);
113
assert.equal(transformer.getPosition(1).character, 0);
114
assert.equal(transformer.getOffset(new Position(0, 0)), 0);
115
assert.equal(transformer.getOffset(new Position(1, 0)), 1);
116
assert.equal(transformer.getOffset(new Position(2, 0)), 2);
117
});
118
119
test('should apply offset edits with mixed edits correctly', () => {
120
const edits = [
121
new TextEdit(new Range(new Position(0, 0), new Position(0, 5)), 'Hello'),
122
new TextEdit(new Range(new Position(1, 0), new Position(1, 5)), 'World'),
123
new TextEdit(new Range(new Position(2, 0), new Position(2, 5)), 'Test')
124
];
125
const offsetEdit = transformer.toOffsetEdit(edits);
126
transformer.applyOffsetEdits(offsetEdit);
127
128
const newText = transformer.getText();
129
assert.equal(newText, 'Hello\nWorld\nTest');
130
131
// Additional assertions
132
assert.equal(transformer.getPosition(5).line, 0);
133
assert.equal(transformer.getPosition(5).character, 5);
134
assert.equal(transformer.getPosition(6).line, 1);
135
assert.equal(transformer.getPosition(6).character, 0);
136
assert.equal(transformer.getOffset(new Position(1, 0)), 6);
137
});
138
139
test('should apply offset edits with multi-line insertion correctly', () => {
140
const edits = [
141
new TextEdit(new Range(new Position(0, 5), new Position(0, 5)), '\nInserted\nText\n')
142
];
143
const offsetEdit = transformer.toOffsetEdit(edits);
144
transformer.applyOffsetEdits(offsetEdit);
145
146
const newText = transformer.getText();
147
assert.equal(newText, 'line1\nInserted\nText\n\nline2\nline3');
148
149
// Additional assertions
150
assert.equal(transformer.getPosition(6).line, 1);
151
assert.equal(transformer.getPosition(6).character, 0);
152
assert.equal(transformer.getPosition(14).line, 1);
153
assert.equal(transformer.getPosition(14).character, 8);
154
assert.equal(transformer.getPosition(15).line, 2);
155
assert.equal(transformer.getPosition(15).character, 0);
156
assert.equal(transformer.getOffset(new Position(1, 0)), 6);
157
assert.equal(transformer.getOffset(new Position(1, 8)), 14);
158
assert.equal(transformer.getOffset(new Position(2, 0)), 15);
159
});
160
161
test('should apply offset edits with multi-line insertion correctly with CRLF', () => {
162
const sampleTextWithCRLF = `line1\r\nline2\r\nline3`;
163
transformer = new PositionOffsetTransformer(sampleTextWithCRLF);
164
165
const edits = [
166
new TextEdit(new Range(new Position(0, 5), new Position(0, 5)), '\r\nInserted\r\nText\r\n')
167
];
168
const offsetEdit = transformer.toOffsetEdit(edits);
169
transformer.applyOffsetEdits(offsetEdit);
170
171
const newText = transformer.getText();
172
assert.equal(newText, 'line1\r\nInserted\r\nText\r\n\r\nline2\r\nline3');
173
174
// Additional assertions
175
assert.equal(transformer.getPosition(7).line, 1);
176
assert.equal(transformer.getPosition(7).character, 0);
177
assert.equal(transformer.getPosition(15).line, 1);
178
assert.equal(transformer.getPosition(15).character, 8);
179
assert.equal(transformer.getPosition(17).line, 2);
180
assert.equal(transformer.getPosition(17).character, 0);
181
assert.equal(transformer.getOffset(new Position(1, 0)), 7);
182
assert.equal(transformer.getOffset(new Position(1, 8)), 15);
183
assert.equal(transformer.getOffset(new Position(2, 0)), 17);
184
});
185
});
186
187