Skip to content

Commit 2cb0cc1

Browse files
ulugbeknaCopilot
andcommitted
nes: test: cover Windows paths with spaces
Add Windows-only assertions for custom patch prediction and response resolution so the Copilot Windows CI job can validate issue #325491 with native URI behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c3a3ef53-5b3f-4816-a695-a90acc9caa11
1 parent d6f8eda commit 2cb0cc1

2 files changed

Lines changed: 51 additions & 0 deletions

File tree

extensions/copilot/src/extension/xtab/test/node/xtabPatchResponseHandler.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { NoNextEditReason, StreamedEdit } from '../../../../platform/inlineEdits
99
import { TestLogService } from '../../../../platform/testing/common/testLogService';
1010
import { AsyncIterUtils } from '../../../../util/common/asyncIterableUtils';
1111
import { AsyncIterableSource } from '../../../../util/vs/base/common/async';
12+
import { isWindows } from '../../../../util/vs/base/common/platform';
13+
import { URI } from '../../../../util/vs/base/common/uri';
1214
import { LineReplacement } from '../../../../util/vs/editor/common/core/edits/lineEdit';
1315
import { Position } from '../../../../util/vs/editor/common/core/position';
1416
import { LineRange } from '../../../../util/vs/editor/common/core/ranges/lineRange';
@@ -97,6 +99,37 @@ relative/path/to/another_file.js:42
9799
expect(patches).toEqual(patchText);
98100
});
99101

102+
it.skipIf(!isWindows)('applies a patch for a Windows path whose parent folder contains a space', async () => {
103+
const workspaceRoot = URI.file('C:\\workspace');
104+
const documentId = DocumentId.create(URI.file('C:\\workspace\\space folder\\test.py').toString());
105+
const document = new CurrentDocument(new StringText('def my_function'), new Position(1, 16));
106+
const lines = AsyncIterUtils.fromArray([
107+
'space folder/test.py:0',
108+
'-def my_function',
109+
'+def my_function():',
110+
'+ pass',
111+
]);
112+
113+
const { edits } = await consumeHandleResponse(
114+
lines,
115+
document,
116+
documentId,
117+
workspaceRoot,
118+
undefined,
119+
new TestLogService(),
120+
);
121+
122+
expect(edits.map(edit => ({
123+
targetDocument: edit.targetDocument.toString(),
124+
lineRange: edit.edit.lineRange.toString(),
125+
newLines: edit.edit.newLines,
126+
}))).toEqual([{
127+
targetDocument: 'file:///c%3A/workspace/space%20folder/test.py',
128+
lineRange: '[1,2)',
129+
newLines: ['def my_function():', ' pass'],
130+
}]);
131+
});
132+
100133
it('discard a patch if no valid header', async () => {
101134
const patchText = `myFile.ts:
102135
+New line 1

extensions/copilot/src/extension/xtab/test/node/xtabProvider.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { DeferredPromise } from '../../../../util/vs/base/common/async';
3030
import { CancellationToken, CancellationTokenSource } from '../../../../util/vs/base/common/cancellation';
3131
import { Emitter, Event } from '../../../../util/vs/base/common/event';
3232
import { DisposableStore } from '../../../../util/vs/base/common/lifecycle';
33+
import { isWindows } from '../../../../util/vs/base/common/platform';
3334
import { URI } from '../../../../util/vs/base/common/uri';
3435
import { LineEdit, LineReplacement } from '../../../../util/vs/editor/common/core/edits/lineEdit';
3536
import { StringEdit, StringReplacement } from '../../../../util/vs/editor/common/core/edits/stringEdit';
@@ -523,6 +524,23 @@ describe('getPredictionContents', () => {
523524
expect(result.endsWith(':')).toBe(true);
524525
});
525526

527+
it.skipIf(!isWindows)('preserves spaces in a workspace-relative Windows path', () => {
528+
const lines = ['def my_function'];
529+
const text = new StringText(lines.join('\n'));
530+
const workspaceRoot = URI.file('C:\\workspace');
531+
const doc = new StatelessNextEditDocument(
532+
DocumentId.create(URI.file('C:\\workspace\\space folder\\test.py').toString()),
533+
workspaceRoot,
534+
LanguageId.create('python'),
535+
lines,
536+
LineEdit.empty,
537+
text,
538+
new Edits(StringEdit, []),
539+
);
540+
541+
expect(call(lines, ResponseFormat.CustomDiffPatch, { doc })).toBe('space folder/test.py:');
542+
});
543+
526544
it('returns correct content for CustomDiffPatch without workspace root', () => {
527545
const result = call(editWindowLines, ResponseFormat.CustomDiffPatch);
528546
expect(result.endsWith(':')).toBe(true);

0 commit comments

Comments
 (0)