Speed up tests with take timers

For #135075
This commit is contained in:
Matt Bierner 2021-11-19 16:23:05 -08:00
parent edfee5c945
commit aa810777e3
No known key found for this signature in database
GPG key ID: 099C331567E11888

View file

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