diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts index ae238b40501..8efc9619cc9 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts @@ -40,6 +40,8 @@ import { CTX_INLINE_CHAT_USER_DID_EDIT, EditMode, IInlineChatService, InlineChat import { InlineChatServiceImpl } from 'vs/workbench/contrib/inlineChat/common/inlineChatServiceImpl'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { TestWorkerService } from './testWorkerService'; +import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; suite('InteractiveChatController', function () { class TestController extends InlineChatController { @@ -106,6 +108,7 @@ suite('InteractiveChatController', function () { configurationService.setUserConfiguration('editor', {}); const serviceCollection = new ServiceCollection( + [IEditorWorkerService, new SyncDescriptor(TestWorkerService)], [IContextKeyService, contextKeyService], [IInlineChatService, inlineChatService], [IDiffProviderFactoryService, new SyncDescriptor(TestDiffProviderFactoryService)], @@ -263,7 +266,7 @@ suite('InteractiveChatController', function () { const session = inlineChatSessionService.getSession(editor, editor.getModel()!.uri); assert.ok(session); - assert.deepStrictEqual(session.wholeRange.value, new Range(1, 1, 1, 6)); + assert.deepStrictEqual(session.wholeRange.value, new Range(1, 1, 1, 10 /* line length */)); editor.setSelection(new Range(2, 1, 2, 1)); editor.trigger('test', 'type', { text: 'a' }); @@ -299,19 +302,19 @@ suite('InteractiveChatController', function () { store.add(d); ctrl = instaService.createInstance(TestController, editor); const p = ctrl.waitFor(TestController.INIT_SEQUENCE); - const r = ctrl.run({ message: 'Hello', autoSend: false }); + const r = ctrl.run({ message: 'GENGEN', autoSend: false }); await p; const session = inlineChatSessionService.getSession(editor, editor.getModel()!.uri); assert.ok(session); - assert.deepStrictEqual(session.wholeRange.value, new Range(3, 1, 3, 3)); + assert.deepStrictEqual(session.wholeRange.value, new Range(3, 1, 3, 3)); // initial ctrl.acceptInput(); await ctrl.waitFor([State.MAKE_REQUEST, State.APPLY_RESPONSE, State.SHOW_RESPONSE, State.WAIT_FOR_INPUT]); - assert.deepStrictEqual(session.wholeRange.value, new Range(4, 1, 4, 3)); + assert.deepStrictEqual(session.wholeRange.value, new Range(1, 1, 4, 3)); await ctrl.cancelSession(); await r; diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts index 0c6a58b4036..53b0cb87519 100644 --- a/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts +++ b/src/vs/workbench/contrib/inlineChat/test/browser/inlineChatSession.test.ts @@ -41,12 +41,8 @@ import { assertType } from 'vs/base/common/types'; import { InlineChatServiceImpl } from 'vs/workbench/contrib/inlineChat/common/inlineChatServiceImpl'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; -import { DiffAlgorithmName, IEditorWorkerService, ILineChange } from 'vs/editor/common/services/editorWorker'; -import { IDocumentDiff, IDocumentDiffProviderOptions } from 'vs/editor/common/diff/documentDiffProvider'; -import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; -import { LineRange } from 'vs/editor/common/core/lineRange'; -import { MovedText } from 'vs/editor/common/diff/linesDiffComputer'; -import { LineRangeMapping, DetailedLineRangeMapping, RangeMapping } from 'vs/editor/common/diff/rangeMapping'; +import { IEditorWorkerService } from 'vs/editor/common/services/editorWorker'; +import { TestWorkerService } from './testWorkerService'; suite('ReplyResponse', function () { @@ -86,69 +82,6 @@ suite('ReplyResponse', function () { }); }); -class TestWorkerService extends mock() { - - private readonly _worker = new EditorSimpleWorker(null!, null); - - constructor(@IModelService private readonly _modelService: IModelService) { - super(); - } - - override async computeDiff(original: URI, modified: URI, options: IDocumentDiffProviderOptions, algorithm: DiffAlgorithmName): Promise { - - const originalModel = this._modelService.getModel(original); - const modifiedModel = this._modelService.getModel(modified); - - assertType(originalModel); - assertType(modifiedModel); - - this._worker.acceptNewModel({ - url: originalModel.uri.toString(), - versionId: originalModel.getVersionId(), - lines: originalModel.getLinesContent(), - EOL: originalModel.getEOL(), - }); - - this._worker.acceptNewModel({ - url: modifiedModel.uri.toString(), - versionId: modifiedModel.getVersionId(), - lines: modifiedModel.getLinesContent(), - EOL: modifiedModel.getEOL(), - }); - - const result = await this._worker.computeDiff(originalModel.uri.toString(), modifiedModel.uri.toString(), options, algorithm); - if (!result) { - return result; - } - // Convert from space efficient JSON data to rich objects. - const diff: IDocumentDiff = { - identical: result.identical, - quitEarly: result.quitEarly, - changes: toLineRangeMappings(result.changes), - moves: result.moves.map(m => new MovedText( - new LineRangeMapping(new LineRange(m[0], m[1]), new LineRange(m[2], m[3])), - toLineRangeMappings(m[4]) - )) - }; - return diff; - - function toLineRangeMappings(changes: readonly ILineChange[]): readonly DetailedLineRangeMapping[] { - return changes.map( - (c) => new DetailedLineRangeMapping( - new LineRange(c[0], c[1]), - new LineRange(c[2], c[3]), - c[4]?.map( - (c) => new RangeMapping( - new Range(c[0], c[1], c[2], c[3]), - new Range(c[4], c[5], c[6], c[7]) - ) - ) - ) - ); - } - } -} - suite('InlineChatSession', function () { const store = new DisposableStore(); diff --git a/src/vs/workbench/contrib/inlineChat/test/browser/testWorkerService.ts b/src/vs/workbench/contrib/inlineChat/test/browser/testWorkerService.ts new file mode 100644 index 00000000000..d9b64666384 --- /dev/null +++ b/src/vs/workbench/contrib/inlineChat/test/browser/testWorkerService.ts @@ -0,0 +1,84 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { URI } from 'vs/base/common/uri'; +import { mock } from 'vs/base/test/common/mock'; +import { Range } from 'vs/editor/common/core/range'; +import { IModelService } from 'vs/editor/common/services/model'; +import { assertType } from 'vs/base/common/types'; +import { DiffAlgorithmName, IEditorWorkerService, ILineChange } from 'vs/editor/common/services/editorWorker'; +import { IDocumentDiff, IDocumentDiffProviderOptions } from 'vs/editor/common/diff/documentDiffProvider'; +import { EditorSimpleWorker } from 'vs/editor/common/services/editorSimpleWorker'; +import { LineRange } from 'vs/editor/common/core/lineRange'; +import { MovedText } from 'vs/editor/common/diff/linesDiffComputer'; +import { LineRangeMapping, DetailedLineRangeMapping, RangeMapping } from 'vs/editor/common/diff/rangeMapping'; +import { TextEdit } from 'vs/editor/common/languages'; + + +export class TestWorkerService extends mock() { + + private readonly _worker = new EditorSimpleWorker(null!, null); + + constructor(@IModelService private readonly _modelService: IModelService) { + super(); + } + + override async computeMoreMinimalEdits(resource: URI, edits: TextEdit[] | null | undefined, pretty?: boolean | undefined): Promise { + return undefined; + } + + override async computeDiff(original: URI, modified: URI, options: IDocumentDiffProviderOptions, algorithm: DiffAlgorithmName): Promise { + + const originalModel = this._modelService.getModel(original); + const modifiedModel = this._modelService.getModel(modified); + + assertType(originalModel); + assertType(modifiedModel); + + this._worker.acceptNewModel({ + url: originalModel.uri.toString(), + versionId: originalModel.getVersionId(), + lines: originalModel.getLinesContent(), + EOL: originalModel.getEOL(), + }); + + this._worker.acceptNewModel({ + url: modifiedModel.uri.toString(), + versionId: modifiedModel.getVersionId(), + lines: modifiedModel.getLinesContent(), + EOL: modifiedModel.getEOL(), + }); + + const result = await this._worker.computeDiff(originalModel.uri.toString(), modifiedModel.uri.toString(), options, algorithm); + if (!result) { + return result; + } + // Convert from space efficient JSON data to rich objects. + const diff: IDocumentDiff = { + identical: result.identical, + quitEarly: result.quitEarly, + changes: toLineRangeMappings(result.changes), + moves: result.moves.map(m => new MovedText( + new LineRangeMapping(new LineRange(m[0], m[1]), new LineRange(m[2], m[3])), + toLineRangeMappings(m[4]) + )) + }; + return diff; + + function toLineRangeMappings(changes: readonly ILineChange[]): readonly DetailedLineRangeMapping[] { + return changes.map( + (c) => new DetailedLineRangeMapping( + new LineRange(c[0], c[1]), + new LineRange(c[2], c[3]), + c[4]?.map( + (c) => new RangeMapping( + new Range(c[0], c[1], c[2], c[3]), + new Range(c[4], c[5], c[6], c[7]) + ) + ) + ) + ); + } + } +}