parent
edfee5c945
commit
aa810777e3
|
@ -7,6 +7,7 @@ import * as assert from 'assert';
|
|||
import { DisposableStore } from 'vs/base/common/lifecycle';
|
||||
import { assertType } from 'vs/base/common/types';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { Selection } from 'vs/editor/common/core/selection';
|
||||
import { TextModel } from 'vs/editor/common/model/textModel';
|
||||
|
@ -27,6 +28,7 @@ const testProvider = {
|
|||
};
|
||||
}
|
||||
};
|
||||
|
||||
suite('CodeActionModel', () => {
|
||||
|
||||
const languageId = 'foo-lang';
|
||||
|
@ -51,51 +53,15 @@ suite('CodeActionModel', () => {
|
|||
markerService.dispose();
|
||||
});
|
||||
|
||||
test('Oracle -> marker added', done => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider);
|
||||
disposables.add(reg);
|
||||
test('Oracle -> marker added', async () => {
|
||||
let done: () => void;
|
||||
const donePromise = new Promise<void>(resolve => {
|
||||
done = resolve;
|
||||
});
|
||||
await runWithFakedTimers({ useFakeTimers: true }, () => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider);
|
||||
disposables.add(reg);
|
||||
|
||||
const contextKeys = new MockContextKeyService();
|
||||
const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined));
|
||||
disposables.add(model.onDidChangeState((e: CodeActionsState.State) => {
|
||||
assertType(e.type === CodeActionsState.Type.Triggered);
|
||||
|
||||
assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto);
|
||||
assert.ok(e.actions);
|
||||
|
||||
e.actions.then(fixes => {
|
||||
model.dispose();
|
||||
assert.strictEqual(fixes.validActions.length, 1);
|
||||
done();
|
||||
}, done);
|
||||
}));
|
||||
|
||||
// start here
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
|
||||
});
|
||||
|
||||
test('Oracle -> position changed', () => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider);
|
||||
disposables.add(reg);
|
||||
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
|
||||
editor.setPosition({ lineNumber: 2, column: 1 });
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const contextKeys = new MockContextKeyService();
|
||||
const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined));
|
||||
disposables.add(model.onDidChangeState((e: CodeActionsState.State) => {
|
||||
|
@ -103,18 +69,62 @@ suite('CodeActionModel', () => {
|
|||
|
||||
assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto);
|
||||
assert.ok(e.actions);
|
||||
|
||||
e.actions.then(fixes => {
|
||||
model.dispose();
|
||||
assert.strictEqual(fixes.validActions.length, 1);
|
||||
resolve(undefined);
|
||||
}, reject);
|
||||
done();
|
||||
}, done);
|
||||
}));
|
||||
|
||||
// start here
|
||||
editor.setPosition({ lineNumber: 1, column: 1 });
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
return donePromise;
|
||||
});
|
||||
});
|
||||
|
||||
test('Lightbulb is in the wrong place, #29933', async function () {
|
||||
test('Oracle -> position changed', async () => {
|
||||
await runWithFakedTimers({ useFakeTimers: true }, () => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider);
|
||||
disposables.add(reg);
|
||||
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
|
||||
editor.setPosition({ lineNumber: 2, column: 1 });
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const contextKeys = new MockContextKeyService();
|
||||
const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined));
|
||||
disposables.add(model.onDidChangeState((e: CodeActionsState.State) => {
|
||||
assertType(e.type === CodeActionsState.Type.Triggered);
|
||||
|
||||
assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto);
|
||||
assert.ok(e.actions);
|
||||
e.actions.then(fixes => {
|
||||
model.dispose();
|
||||
assert.strictEqual(fixes.validActions.length, 1);
|
||||
resolve(undefined);
|
||||
}, reject);
|
||||
}));
|
||||
// start here
|
||||
editor.setPosition({ lineNumber: 1, column: 1 });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('Lightbulb is in the wrong place, #29933', async () => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, {
|
||||
provideCodeActions(_doc, _range): modes.CodeActionList {
|
||||
return { actions: [], dispose() { /* noop*/ } };
|
||||
|
@ -122,68 +132,78 @@ suite('CodeActionModel', () => {
|
|||
});
|
||||
disposables.add(reg);
|
||||
|
||||
editor.getModel()!.setValue('// @ts-check\n2\ncon\n');
|
||||
await runWithFakedTimers({ useFakeTimers: true }, async () => {
|
||||
editor.getModel()!.setValue('// @ts-check\n2\ncon\n');
|
||||
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 3, startColumn: 1, endLineNumber: 3, endColumn: 4,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 3, startColumn: 1, endLineNumber: 3, endColumn: 4,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
|
||||
// case 1 - drag selection over multiple lines -> range of enclosed marker, position or marker
|
||||
await new Promise(resolve => {
|
||||
// case 1 - drag selection over multiple lines -> range of enclosed marker, position or marker
|
||||
await new Promise(resolve => {
|
||||
const contextKeys = new MockContextKeyService();
|
||||
const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined));
|
||||
disposables.add(model.onDidChangeState((e: CodeActionsState.State) => {
|
||||
assertType(e.type === CodeActionsState.Type.Triggered);
|
||||
|
||||
assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto);
|
||||
const selection = <Selection>e.rangeOrSelection;
|
||||
assert.strictEqual(selection.selectionStartLineNumber, 1);
|
||||
assert.strictEqual(selection.selectionStartColumn, 1);
|
||||
assert.strictEqual(selection.endLineNumber, 4);
|
||||
assert.strictEqual(selection.endColumn, 1);
|
||||
assert.strictEqual(e.position.lineNumber, 3);
|
||||
assert.strictEqual(e.position.column, 1);
|
||||
model.dispose();
|
||||
resolve(undefined);
|
||||
}, 5));
|
||||
|
||||
editor.setSelection({ startLineNumber: 1, startColumn: 1, endLineNumber: 4, endColumn: 1 });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('Oracle -> should only auto trigger once for cursor and marker update right after each other', async () => {
|
||||
let done: () => void;
|
||||
const donePromise = new Promise<void>(resolve => {
|
||||
done = resolve;
|
||||
});
|
||||
await runWithFakedTimers({ useFakeTimers: true }, () => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider);
|
||||
disposables.add(reg);
|
||||
|
||||
let triggerCount = 0;
|
||||
const contextKeys = new MockContextKeyService();
|
||||
const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined));
|
||||
disposables.add(model.onDidChangeState((e: CodeActionsState.State) => {
|
||||
assertType(e.type === CodeActionsState.Type.Triggered);
|
||||
|
||||
assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto);
|
||||
const selection = <Selection>e.rangeOrSelection;
|
||||
assert.strictEqual(selection.selectionStartLineNumber, 1);
|
||||
assert.strictEqual(selection.selectionStartColumn, 1);
|
||||
assert.strictEqual(selection.endLineNumber, 4);
|
||||
assert.strictEqual(selection.endColumn, 1);
|
||||
assert.strictEqual(e.position.lineNumber, 3);
|
||||
assert.strictEqual(e.position.column, 1);
|
||||
model.dispose();
|
||||
resolve(undefined);
|
||||
}, 5));
|
||||
++triggerCount;
|
||||
|
||||
// give time for second trigger before completing test
|
||||
setTimeout(() => {
|
||||
model.dispose();
|
||||
assert.strictEqual(triggerCount, 1);
|
||||
done();
|
||||
}, 0);
|
||||
}, 5 /*delay*/));
|
||||
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
|
||||
editor.setSelection({ startLineNumber: 1, startColumn: 1, endLineNumber: 4, endColumn: 1 });
|
||||
|
||||
return donePromise;
|
||||
});
|
||||
});
|
||||
|
||||
test('Oracle -> should only auto trigger once for cursor and marker update right after each other', done => {
|
||||
const reg = modes.CodeActionProviderRegistry.register(languageId, testProvider);
|
||||
disposables.add(reg);
|
||||
|
||||
let triggerCount = 0;
|
||||
const contextKeys = new MockContextKeyService();
|
||||
const model = disposables.add(new CodeActionModel(editor, markerService, contextKeys, undefined));
|
||||
disposables.add(model.onDidChangeState((e: CodeActionsState.State) => {
|
||||
assertType(e.type === CodeActionsState.Type.Triggered);
|
||||
|
||||
assert.strictEqual(e.trigger.type, modes.CodeActionTriggerType.Auto);
|
||||
++triggerCount;
|
||||
|
||||
// give time for second trigger before completing test
|
||||
setTimeout(() => {
|
||||
model.dispose();
|
||||
assert.strictEqual(triggerCount, 1);
|
||||
done();
|
||||
}, 0);
|
||||
}, 5 /*delay*/));
|
||||
|
||||
markerService.changeOne('fake', uri, [{
|
||||
startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 6,
|
||||
message: 'error',
|
||||
severity: 1,
|
||||
code: '',
|
||||
source: ''
|
||||
}]);
|
||||
|
||||
editor.setSelection({ startLineNumber: 1, startColumn: 1, endLineNumber: 4, endColumn: 1 });
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue