Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/prompts/node/test/projectedText.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 { describe, expect, it } from 'vitest';
7
import { StringEdit } from '../../../../util/vs/editor/common/core/edits/stringEdit';
8
import { ProjectedText } from '../inline/summarizedDocument/projectedText';
9
10
describe('projectedText', () => {
11
12
it('tryRebase should rebase', async () => {
13
const originalText = 'abc012def3456gh789ijkl';
14
const text0 = new ProjectedText(originalText, StringEdit.fromJson([
15
{ pos: 0, len: 3, txt: '' },
16
{ pos: 6, len: 3, txt: '' },
17
{ pos: 13, len: 2, txt: '' },
18
{ pos: 18, len: 4, txt: '' },
19
]));
20
expect(text0.text).toBe('0123456789');
21
22
const res1 = text0.tryRebase(StringEdit.fromJson([{ pos: 4, len: 1, txt: 'ABC' }]));
23
expect(res1).toBeDefined();
24
const { edit: edit1, text: text1 } = res1!;
25
expect(edit1.replacements.length).toBe(1);
26
expect(edit1.replacements[0].replaceRange.start).toBe(1);
27
expect(edit1.replacements[0].replaceRange.endExclusive).toBe(2);
28
expect(edit1.replacements[0].newText).toBe('ABC');
29
expect(text1.originalText).toBe('abc0ABC2def3456gh789ijkl');
30
expect(text1.text).toBe('0ABC23456789');
31
32
const res2 = text1.tryRebase(StringEdit.fromJson([{ pos: 12, len: 2, txt: 'D' }]));
33
expect(res2).toBeDefined();
34
const { edit: edit2, text: text2 } = res2!;
35
expect(edit2.replacements.length).toBe(1);
36
expect(edit2.replacements[0].replaceRange.start).toBe(6);
37
expect(edit2.replacements[0].replaceRange.endExclusive).toBe(8);
38
expect(edit2.replacements[0].newText).toBe('D');
39
expect(text2.originalText).toBe('abc0ABC2def3D6gh789ijkl');
40
expect(text2.text).toBe('0ABC23D6789');
41
42
const res3 = text2.tryRebase(StringEdit.fromJson([{ pos: 17, len: 0, txt: 'EFGH' }]));
43
expect(res3).toBeDefined();
44
const { edit: edit3, text: text3 } = res3!;
45
expect(edit3.replacements.length).toBe(1);
46
expect(edit3.replacements[0].replaceRange.start).toBe(9);
47
expect(edit3.replacements[0].replaceRange.endExclusive).toBe(9);
48
expect(edit3.replacements[0].newText).toBe('EFGH');
49
expect(text3.originalText).toBe('abc0ABC2def3D6gh7EFGH89ijkl');
50
expect(text3.text).toBe('0ABC23D67EFGH89');
51
});
52
53
it('tryRebase should rebase (mixed order edits)', async () => {
54
const originalText = 'abc012def3456gh789ijkl';
55
const text0 = new ProjectedText(originalText, StringEdit.fromJson([
56
{ pos: 0, len: 3, txt: '' },
57
{ pos: 6, len: 3, txt: '' },
58
{ pos: 13, len: 2, txt: '' },
59
{ pos: 18, len: 4, txt: '' },
60
]));
61
expect(text0.text).toBe('0123456789');
62
63
const res2 = text0.tryRebase(StringEdit.fromJson([{ pos: 10, len: 2, txt: 'D' }]));
64
expect(res2).toBeDefined();
65
const { edit: edit2, text: text2 } = res2!;
66
expect(edit2.replacements.length).toBe(1);
67
expect(edit2.replacements[0].replaceRange.start).toBe(4);
68
expect(edit2.replacements[0].replaceRange.endExclusive).toBe(6);
69
expect(edit2.replacements[0].newText).toBe('D');
70
expect(text2.originalText).toBe('abc012def3D6gh789ijkl');
71
expect(text2.text).toBe('0123D6789');
72
73
const res1 = text2.tryRebase(StringEdit.fromJson([{ pos: 4, len: 1, txt: 'ABC' }]));
74
expect(res1).toBeDefined();
75
const { edit: edit1, text: text1 } = res1!;
76
expect(edit1.replacements.length).toBe(1);
77
expect(edit1.replacements[0].replaceRange.start).toBe(1);
78
expect(edit1.replacements[0].replaceRange.endExclusive).toBe(2);
79
expect(edit1.replacements[0].newText).toBe('ABC');
80
expect(text1.originalText).toBe('abc0ABC2def3D6gh789ijkl');
81
expect(text1.text).toBe('0ABC23D6789');
82
83
const res3 = text1.tryRebase(StringEdit.fromJson([{ pos: 17, len: 0, txt: 'EFGH' }]));
84
expect(res3).toBeDefined();
85
const { edit: edit3, text: text3 } = res3!;
86
expect(edit3.replacements.length).toBe(1);
87
expect(edit3.replacements[0].replaceRange.start).toBe(9);
88
expect(edit3.replacements[0].replaceRange.endExclusive).toBe(9);
89
expect(edit3.replacements[0].newText).toBe('EFGH');
90
expect(text3.originalText).toBe('abc0ABC2def3D6gh7EFGH89ijkl');
91
expect(text3.text).toBe('0ABC23D67EFGH89');
92
});
93
94
it('tryRebase should detect conflicts', async () => {
95
const originalText = 'abc012def3456gh789ijkl';
96
const text0 = new ProjectedText(originalText, StringEdit.fromJson([
97
{ pos: 0, len: 3, txt: '' },
98
{ pos: 6, len: 3, txt: '' },
99
{ pos: 13, len: 2, txt: '' },
100
{ pos: 18, len: 4, txt: '' },
101
]));
102
expect(text0.text).toBe('0123456789');
103
104
const res1 = text0.tryRebase(StringEdit.fromJson([{ pos: 4, len: 1, txt: 'ABC' }]));
105
expect(res1).toBeDefined();
106
const { edit: edit1, text: text1 } = res1!;
107
expect(edit1.replacements.length).toBe(1);
108
expect(edit1.replacements[0].replaceRange.start).toBe(1);
109
expect(edit1.replacements[0].replaceRange.endExclusive).toBe(2);
110
expect(edit1.replacements[0].newText).toBe('ABC');
111
expect(text1.originalText).toBe('abc0ABC2def3456gh789ijkl');
112
expect(text1.text).toBe('0ABC23456789');
113
114
const res2 = text1.tryRebase(StringEdit.fromJson([{ pos: 21, len: 2, txt: 'D' }]));
115
expect(res2).toBeUndefined();
116
});
117
});
118
119