Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix tests, use real diff (slow) #203022

Merged
merged 1 commit into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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)],
Expand Down Expand Up @@ -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' });
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 () {
Expand Down Expand Up @@ -86,69 +82,6 @@ suite('ReplyResponse', function () {
});
});

class TestWorkerService extends mock<IEditorWorkerService>() {

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<IDocumentDiff | null> {

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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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<IEditorWorkerService>() {

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<TextEdit[] | undefined> {
return undefined;
}

override async computeDiff(original: URI, modified: URI, options: IDocumentDiffProviderOptions, algorithm: DiffAlgorithmName): Promise<IDocumentDiff | null> {

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])
)
)
)
);
}
}
}