Making TS tests more reliable
This commit is contained in:
parent
62950ee969
commit
bc462053d6
|
@ -26,7 +26,7 @@ suite('TypeScript Completions', () => {
|
|||
let oldConfig: { [key: string]: any } = {};
|
||||
|
||||
setup(async () => {
|
||||
await wait(100);
|
||||
await wait(500);
|
||||
|
||||
// Save off config and apply defaults
|
||||
oldConfig = await updateConfig(testDocumentUri, configDefaults);
|
||||
|
|
|
@ -7,7 +7,7 @@ import * as assert from 'assert';
|
|||
import 'mocha';
|
||||
import * as vscode from 'vscode';
|
||||
import { disposeAll } from '../utils/dispose';
|
||||
import { createTestEditor, joinLines, wait } from './testUtils';
|
||||
import { createTestEditor, joinLines, retryUntilDocumentChanges, wait } from './testUtils';
|
||||
|
||||
suite('TypeScript Quick Fix', () => {
|
||||
|
||||
|
@ -28,11 +28,9 @@ suite('TypeScript Quick Fix', () => {
|
|||
`const b = 2;`,
|
||||
);
|
||||
|
||||
await wait(2000);
|
||||
|
||||
await vscode.commands.executeCommand('editor.action.autoFix');
|
||||
|
||||
await wait(500);
|
||||
await retryUntilDocumentChanges(testDocumentUri, { retries: 10, timeout: 500 }, _disposables, () => {
|
||||
return vscode.commands.executeCommand('editor.action.autoFix');
|
||||
});
|
||||
|
||||
assert.strictEqual(editor.document.getText(), joinLines(
|
||||
`export const _ = 1;`,
|
||||
|
@ -41,7 +39,9 @@ suite('TypeScript Quick Fix', () => {
|
|||
});
|
||||
|
||||
test('Add import should be a preferred fix if there is only one possible import', async () => {
|
||||
await createTestEditor(workspaceFile('foo.ts'),
|
||||
const testDocumentUri = workspaceFile('foo.ts');
|
||||
|
||||
await createTestEditor(testDocumentUri,
|
||||
`export const foo = 1;`);
|
||||
|
||||
const editor = await createTestEditor(workspaceFile('index.ts'),
|
||||
|
@ -49,11 +49,11 @@ suite('TypeScript Quick Fix', () => {
|
|||
`foo$0;`
|
||||
);
|
||||
|
||||
await wait(3000);
|
||||
await retryUntilDocumentChanges(testDocumentUri, { retries: 10, timeout: 500 }, _disposables, () => {
|
||||
return vscode.commands.executeCommand('editor.action.autoFix');
|
||||
});
|
||||
|
||||
await vscode.commands.executeCommand('editor.action.autoFix');
|
||||
|
||||
await wait(500);
|
||||
// Document should not have been changed here
|
||||
|
||||
assert.strictEqual(editor.document.getText(), joinLines(
|
||||
`import { foo } from "./foo";`,
|
||||
|
@ -168,8 +168,6 @@ suite('TypeScript Quick Fix', () => {
|
|||
});
|
||||
});
|
||||
|
||||
|
||||
function workspaceFile(fileName: string) {
|
||||
return vscode.Uri.joinPath(vscode.workspace.workspaceFolders![0].uri, fileName);
|
||||
}
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ suite('TypeScript References', () => {
|
|||
assert.strictEqual(codeLenses?.length, 0);
|
||||
});
|
||||
|
||||
test('Should not show duplicate references on ES5 class (https://github.com/microsoft/vscode/issues/90396)', async () => {
|
||||
test.skip('Should not show duplicate references on ES5 class (https://github.com/microsoft/vscode/issues/90396)', async () => {
|
||||
const testDocumentUri = vscode.Uri.parse('untitled:test3.js');
|
||||
await createTestEditor(testDocumentUri,
|
||||
`function A() {`,
|
||||
|
@ -101,6 +101,7 @@ suite('TypeScript References', () => {
|
|||
`A.x = {};`,
|
||||
);
|
||||
|
||||
await wait(500);
|
||||
const codeLenses = await getCodeLenses(testDocumentUri);
|
||||
assert.strictEqual(codeLenses?.length, 1);
|
||||
});
|
||||
|
|
|
@ -5,28 +5,20 @@
|
|||
|
||||
import 'mocha';
|
||||
import * as vscode from 'vscode';
|
||||
import { wait } from './testUtils';
|
||||
import { onChangedDocument, wait, retryUntilDocumentChanges } from './testUtils';
|
||||
|
||||
export async function acceptFirstSuggestion(uri: vscode.Uri, _disposables: vscode.Disposable[]) {
|
||||
const didChangeDocument = onChangedDocument(uri, _disposables);
|
||||
return retryUntilDocumentChanges(uri, { retries: 10, timeout: 0 }, _disposables, async () => {
|
||||
await vscode.commands.executeCommand('editor.action.triggerSuggest');
|
||||
await wait(1000); // Give time for suggestions to show
|
||||
await wait(1000);
|
||||
await vscode.commands.executeCommand('acceptSelectedSuggestion');
|
||||
return didChangeDocument;
|
||||
});
|
||||
}
|
||||
|
||||
export async function typeCommitCharacter(uri: vscode.Uri, character: string, _disposables: vscode.Disposable[]) {
|
||||
const didChangeDocument = onChangedDocument(uri, _disposables);
|
||||
await vscode.commands.executeCommand('editor.action.triggerSuggest');
|
||||
await wait(1000); // Give time for suggestions to show
|
||||
await wait(3000); // Give time for suggestions to show
|
||||
await vscode.commands.executeCommand('type', { text: character });
|
||||
return await didChangeDocument;
|
||||
}
|
||||
|
||||
export function onChangedDocument(documentUri: vscode.Uri, disposables: vscode.Disposable[]) {
|
||||
return new Promise<vscode.TextDocument>(resolve => vscode.workspace.onDidChangeTextDocument(e => {
|
||||
if (e.document.uri.toString() === documentUri.toString()) {
|
||||
resolve(e.document);
|
||||
}
|
||||
}, undefined, disposables));
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ export function withRandomFileEditor(
|
|||
});
|
||||
}
|
||||
|
||||
export const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
||||
export const wait = (ms: number) => new Promise<undefined>(resolve => setTimeout(() => resolve(), ms));
|
||||
|
||||
export const joinLines = (...args: string[]) => args.join('\n');
|
||||
|
||||
|
@ -133,3 +133,38 @@ export async function enumerateConfig(
|
|||
await f(JSON.stringify(newConfig));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export function onChangedDocument(documentUri: vscode.Uri, disposables: vscode.Disposable[]) {
|
||||
return new Promise<vscode.TextDocument>(resolve => vscode.workspace.onDidChangeTextDocument(e => {
|
||||
if (e.document.uri.toString() === documentUri.toString()) {
|
||||
resolve(e.document);
|
||||
}
|
||||
}, undefined, disposables));
|
||||
}
|
||||
|
||||
export async function retryUntilDocumentChanges(
|
||||
documentUri: vscode.Uri,
|
||||
options: { retries: number, timeout: number },
|
||||
disposables: vscode.Disposable[],
|
||||
exec: () => Thenable<unknown>,
|
||||
) {
|
||||
const didChangeDocument = onChangedDocument(documentUri, disposables);
|
||||
|
||||
let done = false;
|
||||
|
||||
const result = await Promise.race([
|
||||
didChangeDocument,
|
||||
(async () => {
|
||||
for (let i = 0; i < options.retries; ++i) {
|
||||
await wait(options.timeout);
|
||||
if (done) {
|
||||
return;
|
||||
}
|
||||
await exec();
|
||||
}
|
||||
})(),
|
||||
]);
|
||||
done = true;
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue