mirror of
https://github.com/Microsoft/vscode
synced 2024-10-01 08:50:48 +00:00
eng: add a lint rule for ensureNoDisposablesAreLeakedInTestSuite (#200089)
Adds a lint rule that ensures ensureNoDisposablesAreLeakedInTestSuite is called in suites. It grandfathers in existing files that were lacking the call entirely. This PR also includes manual fixes to files that used the function already but were missing it in one or more suites, which the lint rule detects.
This commit is contained in:
parent
4728954baa
commit
16c469a671
38
.eslintplugin/code-ensure-no-disposables-leak-in-test.ts
Normal file
38
.eslintplugin/code-ensure-no-disposables-leak-in-test.ts
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as eslint from 'eslint';
|
||||
import { Node } from 'estree';
|
||||
|
||||
export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rule.RuleModule {
|
||||
|
||||
readonly meta: eslint.Rule.RuleMetaData = {
|
||||
type: 'problem',
|
||||
messages: {
|
||||
ensure: 'Suites should include a call to `ensureNoDisposablesAreLeakedInTestSuite()` to ensure no disposables are leaked in tests.'
|
||||
}
|
||||
};
|
||||
|
||||
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
|
||||
const config = <{ exclude: string[] }>context.options[0];
|
||||
|
||||
const needle = context.getFilename().replace(/\\/g, '/');
|
||||
if (config.exclude.some((e) => needle.endsWith(e))) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return {
|
||||
[`Program > ExpressionStatement > CallExpression[callee.name='suite']`]: (node: Node) => {
|
||||
const src = context.getSourceCode().getText(node)
|
||||
if (!src.includes('ensureNoDisposablesAreLeakedInTestSuite(')) {
|
||||
context.report({
|
||||
node,
|
||||
messageId: 'ensure',
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
};
|
220
.eslintrc.json
220
.eslintrc.json
|
@ -136,6 +136,226 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"src/vs/**/*.test.ts"
|
||||
],
|
||||
"rules": {
|
||||
"local/code-ensure-no-disposables-leak-in-test": [
|
||||
"warn",
|
||||
{
|
||||
// Files should (only) be removed from the list they adopt the leak detector
|
||||
"exclude": [
|
||||
"src/vs/base/parts/sandbox/test/electron-sandbox/globals.test.ts",
|
||||
"src/vs/base/test/browser/browser.test.ts",
|
||||
"src/vs/base/test/browser/comparers.test.ts",
|
||||
"src/vs/base/test/browser/dom.test.ts",
|
||||
"src/vs/base/test/browser/formattedTextRenderer.test.ts",
|
||||
"src/vs/base/test/browser/hash.test.ts",
|
||||
"src/vs/base/test/browser/iconLabels.test.ts",
|
||||
"src/vs/base/test/browser/indexedDB.test.ts",
|
||||
"src/vs/base/test/browser/ui/contextview/contextview.test.ts",
|
||||
"src/vs/base/test/browser/ui/menu/menubar.test.ts",
|
||||
"src/vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts",
|
||||
"src/vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts",
|
||||
"src/vs/base/test/common/arrays.test.ts",
|
||||
"src/vs/base/test/common/arraysFind.test.ts",
|
||||
"src/vs/base/test/common/assert.test.ts",
|
||||
"src/vs/base/test/common/cache.test.ts",
|
||||
"src/vs/base/test/common/charCode.test.ts",
|
||||
"src/vs/base/test/common/collections.test.ts",
|
||||
"src/vs/base/test/common/color.test.ts",
|
||||
"src/vs/base/test/common/console.test.ts",
|
||||
"src/vs/base/test/common/decorators.test.ts",
|
||||
"src/vs/base/test/common/diff/diff.test.ts",
|
||||
"src/vs/base/test/common/errors.test.ts",
|
||||
"src/vs/base/test/common/filters.perf.test.ts",
|
||||
"src/vs/base/test/common/filters.test.ts",
|
||||
"src/vs/base/test/common/iconLabels.test.ts",
|
||||
"src/vs/base/test/common/iterator.test.ts",
|
||||
"src/vs/base/test/common/json.test.ts",
|
||||
"src/vs/base/test/common/jsonEdit.test.ts",
|
||||
"src/vs/base/test/common/jsonFormatter.test.ts",
|
||||
"src/vs/base/test/common/keybindings.test.ts",
|
||||
"src/vs/base/test/common/keyCodes.test.ts",
|
||||
"src/vs/base/test/common/lazy.test.ts",
|
||||
"src/vs/base/test/common/linkedList.test.ts",
|
||||
"src/vs/base/test/common/linkedText.test.ts",
|
||||
"src/vs/base/test/common/map.test.ts",
|
||||
"src/vs/base/test/common/markdownString.test.ts",
|
||||
"src/vs/base/test/common/marshalling.test.ts",
|
||||
"src/vs/base/test/common/mime.test.ts",
|
||||
"src/vs/base/test/common/naturalLanguage/korean.test.ts",
|
||||
"src/vs/base/test/common/network.test.ts",
|
||||
"src/vs/base/test/common/normalization.test.ts",
|
||||
"src/vs/base/test/common/objects.test.ts",
|
||||
"src/vs/base/test/common/observable.test.ts",
|
||||
"src/vs/base/test/common/path.test.ts",
|
||||
"src/vs/base/test/common/prefixTree.test.ts",
|
||||
"src/vs/base/test/common/resources.test.ts",
|
||||
"src/vs/base/test/common/resourceTree.test.ts",
|
||||
"src/vs/base/test/common/scrollable.test.ts",
|
||||
"src/vs/base/test/common/skipList.test.ts",
|
||||
"src/vs/base/test/common/strings.test.ts",
|
||||
"src/vs/base/test/common/stripComments.test.ts",
|
||||
"src/vs/base/test/common/ternarySearchtree.test.ts",
|
||||
"src/vs/base/test/common/tfIdf.test.ts",
|
||||
"src/vs/base/test/common/types.test.ts",
|
||||
"src/vs/base/test/common/uri.test.ts",
|
||||
"src/vs/base/test/common/uuid.test.ts",
|
||||
"src/vs/base/test/node/crypto.test.ts",
|
||||
"src/vs/base/test/node/css.build.test.ts",
|
||||
"src/vs/base/test/node/id.test.ts",
|
||||
"src/vs/base/test/node/nodeStreams.test.ts",
|
||||
"src/vs/base/test/node/port.test.ts",
|
||||
"src/vs/base/test/node/powershell.test.ts",
|
||||
"src/vs/base/test/node/snapshot.test.ts",
|
||||
"src/vs/base/test/node/unc.test.ts",
|
||||
"src/vs/code/test/electron-sandbox/issue/testReporterModel.test.ts",
|
||||
"src/vs/editor/contrib/codeAction/test/browser/codeActionKeybindingResolver.test.ts",
|
||||
"src/vs/editor/contrib/codeAction/test/browser/codeActionModel.test.ts",
|
||||
"src/vs/editor/contrib/dropOrPasteInto/test/browser/editSort.test.ts",
|
||||
"src/vs/editor/contrib/folding/test/browser/foldingModel.test.ts",
|
||||
"src/vs/editor/contrib/folding/test/browser/foldingRanges.test.ts",
|
||||
"src/vs/editor/contrib/folding/test/browser/indentFold.test.ts",
|
||||
"src/vs/editor/contrib/folding/test/browser/indentRangeProvider.test.ts",
|
||||
"src/vs/editor/contrib/gotoSymbol/test/browser/referencesModel.test.ts",
|
||||
"src/vs/editor/contrib/smartSelect/test/browser/smartSelect.test.ts",
|
||||
"src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts",
|
||||
"src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts",
|
||||
"src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts",
|
||||
"src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts",
|
||||
"src/vs/editor/contrib/suggest/test/browser/suggestMemory.test.ts",
|
||||
"src/vs/editor/test/common/services/languageService.test.ts",
|
||||
"src/vs/editor/test/node/classification/typescript.test.ts",
|
||||
"src/vs/editor/test/node/diffing/defaultLinesDiffComputer.test.ts",
|
||||
"src/vs/editor/test/node/diffing/fixtures.test.ts",
|
||||
"src/vs/platform/configuration/test/common/configuration.test.ts",
|
||||
"src/vs/platform/configuration/test/common/configurationModels.test.ts",
|
||||
"src/vs/platform/configuration/test/common/configurationRegistry.test.ts",
|
||||
"src/vs/platform/contextkey/test/common/contextkey.test.ts",
|
||||
"src/vs/platform/contextkey/test/common/parser.test.ts",
|
||||
"src/vs/platform/contextkey/test/common/scanner.test.ts",
|
||||
"src/vs/platform/dialogs/test/common/dialog.test.ts",
|
||||
"src/vs/platform/environment/test/node/argv.test.ts",
|
||||
"src/vs/platform/environment/test/node/userDataPath.test.ts",
|
||||
"src/vs/platform/extensionManagement/test/common/configRemotes.test.ts",
|
||||
"src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts",
|
||||
"src/vs/platform/extensions/test/common/extensionValidator.test.ts",
|
||||
"src/vs/platform/externalTerminal/electron-main/externalTerminalService.test.ts",
|
||||
"src/vs/platform/instantiation/test/common/graph.test.ts",
|
||||
"src/vs/platform/instantiation/test/common/instantiationService.test.ts",
|
||||
"src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts",
|
||||
"src/vs/platform/keybinding/test/common/keybindingLabels.test.ts",
|
||||
"src/vs/platform/keybinding/test/common/keybindingResolver.test.ts",
|
||||
"src/vs/platform/markers/test/common/markerService.test.ts",
|
||||
"src/vs/platform/opener/test/common/opener.test.ts",
|
||||
"src/vs/platform/progress/test/common/progress.test.ts",
|
||||
"src/vs/platform/registry/test/common/platform.test.ts",
|
||||
"src/vs/platform/remote/test/common/remoteHosts.test.ts",
|
||||
"src/vs/platform/telemetry/test/browser/1dsAppender.test.ts",
|
||||
"src/vs/platform/telemetry/test/browser/telemetryService.test.ts",
|
||||
"src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts",
|
||||
"src/vs/platform/undoRedo/test/common/undoRedoService.test.ts",
|
||||
"src/vs/platform/userDataSync/test/common/extensionsMerge.test.ts",
|
||||
"src/vs/platform/userDataSync/test/common/globalStateMerge.test.ts",
|
||||
"src/vs/platform/userDataSync/test/common/settingsMerge.test.ts",
|
||||
"src/vs/platform/userDataSync/test/common/snippetsMerge.test.ts",
|
||||
"src/vs/platform/userDataSync/test/common/userDataProfilesManifestMerge.test.ts",
|
||||
"src/vs/platform/workspace/test/common/workspace.test.ts",
|
||||
"src/vs/platform/workspaces/test/common/workspaces.test.ts",
|
||||
"src/vs/platform/workspaces/test/electron-main/workspaces.test.ts",
|
||||
"src/vs/server/test/node/serverConnectionToken.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHost.api.impl.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostApiCommands.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostBulkEdits.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostCommands.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostDocumentSaveParticipant.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostMessagerService.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostTelemetry.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostTextEditor.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostTypeConverter.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostTypes.test.ts",
|
||||
"src/vs/workbench/api/test/browser/extHostWorkspace.test.ts",
|
||||
"src/vs/workbench/api/test/browser/mainThreadConfiguration.test.ts",
|
||||
"src/vs/workbench/api/test/browser/mainThreadDocuments.test.ts",
|
||||
"src/vs/workbench/api/test/common/extensionHostMain.test.ts",
|
||||
"src/vs/workbench/api/test/common/extHostExtensionActivator.test.ts",
|
||||
"src/vs/workbench/api/test/node/extHostTunnelService.test.ts",
|
||||
"src/vs/workbench/contrib/bulkEdit/test/browser/bulkCellEdits.test.ts",
|
||||
"src/vs/workbench/contrib/chat/test/common/chatWordCounter.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/browser/callStack.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/browser/repl.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/common/debugModel.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/node/debugger.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/node/streamDebugAdapter.test.ts",
|
||||
"src/vs/workbench/contrib/debug/test/node/terminals.test.ts",
|
||||
"src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts",
|
||||
"src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts",
|
||||
"src/vs/workbench/contrib/extensions/test/electron-sandbox/extension.test.ts",
|
||||
"src/vs/workbench/contrib/files/test/browser/explorerFileNestingTrie.test.ts",
|
||||
"src/vs/workbench/contrib/files/test/browser/explorerModel.test.ts",
|
||||
"src/vs/workbench/contrib/files/test/browser/explorerView.test.ts",
|
||||
"src/vs/workbench/contrib/files/test/browser/fileActions.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/cellDnd.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/contrib/contributedStatusBarItemController.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/contrib/executionStatusBarItem.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/contrib/layoutActions.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/contrib/outputCopyTests.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/notebookBrowser.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/notebookExecutionService.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/notebookExecutionStateService.test.ts",
|
||||
"src/vs/workbench/contrib/notebook/test/browser/notebookTextModel.test.ts",
|
||||
"src/vs/workbench/contrib/search/test/common/cacheState.test.ts",
|
||||
"src/vs/workbench/contrib/search/test/common/extractRange.test.ts",
|
||||
"src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts",
|
||||
"src/vs/workbench/contrib/snippets/test/browser/snippetsRegistry.test.ts",
|
||||
"src/vs/workbench/contrib/snippets/test/browser/snippetsRewrite.test.ts",
|
||||
"src/vs/workbench/contrib/tags/test/node/workspaceTags.test.ts",
|
||||
"src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts",
|
||||
"src/vs/workbench/contrib/tasks/test/common/taskConfiguration.test.ts",
|
||||
"src/vs/workbench/contrib/terminal/test/browser/terminalActions.test.ts",
|
||||
"src/vs/workbench/contrib/themes/test/node/colorRegistryExport.test.ts",
|
||||
"src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts",
|
||||
"src/vs/workbench/contrib/welcomeGettingStarted/test/browser/gettingStartedMarkdownRenderer.test.ts",
|
||||
"src/vs/workbench/services/commands/test/common/commandService.test.ts",
|
||||
"src/vs/workbench/services/configuration/test/common/configurationModels.test.ts",
|
||||
"src/vs/workbench/services/configurationResolver/test/electron-sandbox/configurationResolverService.test.ts",
|
||||
"src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts",
|
||||
"src/vs/workbench/services/editor/test/browser/editorResolverService.test.ts",
|
||||
"src/vs/workbench/services/extensions/test/common/extensionDescriptionRegistry.test.ts",
|
||||
"src/vs/workbench/services/keybinding/test/browser/keybindingIO.test.ts",
|
||||
"src/vs/workbench/services/keybinding/test/node/fallbackKeyboardMapper.test.ts",
|
||||
"src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts",
|
||||
"src/vs/workbench/services/keybinding/test/node/windowsKeyboardMapper.test.ts",
|
||||
"src/vs/workbench/services/preferences/test/browser/preferencesService.test.ts",
|
||||
"src/vs/workbench/services/preferences/test/common/preferencesValidation.test.ts",
|
||||
"src/vs/workbench/services/search/test/browser/queryBuilder.test.ts",
|
||||
"src/vs/workbench/services/search/test/common/ignoreFile.test.ts",
|
||||
"src/vs/workbench/services/search/test/common/queryBuilder.test.ts",
|
||||
"src/vs/workbench/services/search/test/common/replace.test.ts",
|
||||
"src/vs/workbench/services/search/test/common/search.test.ts",
|
||||
"src/vs/workbench/services/search/test/common/searchHelpers.test.ts",
|
||||
"src/vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts",
|
||||
"src/vs/workbench/services/search/test/node/ripgrepTextSearchEngineUtils.test.ts",
|
||||
"src/vs/workbench/services/search/test/node/textSearchManager.test.ts",
|
||||
"src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts",
|
||||
"src/vs/workbench/services/textfile/test/common/textFileService.io.test.ts",
|
||||
"src/vs/workbench/services/textMate/test/browser/arrayOperation.test.ts",
|
||||
"src/vs/workbench/services/themes/test/node/tokenStyleResolving.test.ts",
|
||||
"src/vs/workbench/services/userActivity/test/browser/domActivityTracker.test.ts",
|
||||
"src/vs/workbench/services/workspaces/test/browser/workspaces.test.ts",
|
||||
"src/vs/workbench/services/workspaces/test/common/workspaceTrust.test.ts",
|
||||
"src/vs/workbench/test/browser/quickAccess.test.ts",
|
||||
"src/vs/workbench/test/browser/webview.test.ts"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"**/vscode.d.ts",
|
||||
|
|
|
@ -571,6 +571,8 @@ flakySuite('IPC, create handle', () => {
|
|||
|
||||
suite('WebSocketNodeSocket', () => {
|
||||
|
||||
const ds = ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
function toUint8Array(data: number[]): Uint8Array {
|
||||
const result = new Uint8Array(data.length);
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
|
@ -724,15 +726,15 @@ suite('WebSocketNodeSocket', () => {
|
|||
server.close();
|
||||
|
||||
const webSocketNodeSocket = new WebSocketNodeSocket(new NodeSocket(socket), true, null, false);
|
||||
webSocketNodeSocket.onData((data) => {
|
||||
ds.add(webSocketNodeSocket.onData((data) => {
|
||||
receivingSideOnDataCallCount++;
|
||||
receivingSideTotalBytes += data.byteLength;
|
||||
});
|
||||
}));
|
||||
|
||||
webSocketNodeSocket.onClose(() => {
|
||||
ds.add(webSocketNodeSocket.onClose(() => {
|
||||
webSocketNodeSocket.dispose();
|
||||
receivingSideSocketClosedBarrier.open();
|
||||
});
|
||||
}));
|
||||
});
|
||||
|
||||
const socket = connect({
|
||||
|
|
|
@ -361,6 +361,8 @@ suite('RangeMap', () => {
|
|||
|
||||
suite('RangeMap with top padding', () => {
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('empty', () => {
|
||||
const rangeMap = new RangeMap(10);
|
||||
assert.strictEqual(rangeMap.size, 10);
|
||||
|
|
|
@ -250,12 +250,14 @@ suite('CompressibleObjectTree', function () {
|
|||
disposeTemplate(): void { }
|
||||
}
|
||||
|
||||
const ds = ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('empty', function () {
|
||||
const container = document.createElement('div');
|
||||
container.style.width = '200px';
|
||||
container.style.height = '200px';
|
||||
|
||||
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
|
||||
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
|
||||
tree.layout(200);
|
||||
|
||||
assert.strictEqual(getRowsTextContent(container).length, 0);
|
||||
|
@ -266,7 +268,7 @@ suite('CompressibleObjectTree', function () {
|
|||
container.style.width = '200px';
|
||||
container.style.height = '200px';
|
||||
|
||||
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
|
||||
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
|
||||
tree.layout(200);
|
||||
|
||||
tree.setChildren(null, [
|
||||
|
@ -289,7 +291,7 @@ suite('CompressibleObjectTree', function () {
|
|||
container.style.width = '200px';
|
||||
container.style.height = '200px';
|
||||
|
||||
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
|
||||
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
|
||||
tree.layout(200);
|
||||
|
||||
tree.setChildren(null, [
|
||||
|
@ -341,7 +343,7 @@ suite('CompressibleObjectTree', function () {
|
|||
container.style.width = '200px';
|
||||
container.style.height = '200px';
|
||||
|
||||
const tree = new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]);
|
||||
const tree = ds.add(new CompressibleObjectTree<number>('test', container, new Delegate(), [new Renderer()]));
|
||||
tree.layout(200);
|
||||
|
||||
tree.setChildren(null, [
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -184,6 +184,8 @@ suite('History Navigator', () => {
|
|||
|
||||
suite('History Navigator 2', () => {
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('constructor', () => {
|
||||
const testObject = new HistoryNavigator2(['1', '2', '3', '4']);
|
||||
|
||||
|
|
|
@ -13,8 +13,9 @@ class Disposable implements IDisposable {
|
|||
dispose() { this.isDisposed = true; }
|
||||
}
|
||||
|
||||
// Leaks are allowed here since we test lifecycle stuff:
|
||||
// eslint-disable-next-line local/code-ensure-no-disposables-leak-in-test
|
||||
suite('Lifecycle', () => {
|
||||
|
||||
test('dispose single disposable', () => {
|
||||
const disposable = new Disposable();
|
||||
|
||||
|
@ -129,6 +130,8 @@ suite('Lifecycle', () => {
|
|||
});
|
||||
|
||||
suite('DisposableStore', () => {
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('dispose should call all child disposes even if a child throws on dispose', () => {
|
||||
const disposedValues = new Set<number>();
|
||||
|
||||
|
@ -221,6 +224,8 @@ suite('DisposableStore', () => {
|
|||
});
|
||||
|
||||
suite('Reference Collection', () => {
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
class Collection extends ReferenceCollection<number> {
|
||||
private _count = 0;
|
||||
get count() { return this._count; }
|
||||
|
|
|
@ -83,6 +83,8 @@ function fromRange(rng: Range): number[] {
|
|||
}
|
||||
|
||||
suite('Multicursor selection', () => {
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
const serviceCollection = new ServiceCollection();
|
||||
serviceCollection.set(IStorageService, new InMemoryStorageService());
|
||||
|
||||
|
|
|
@ -348,6 +348,8 @@ suite('NativeExtensionsScanerService Test', () => {
|
|||
|
||||
suite('ExtensionScannerInput', () => {
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('compare inputs - location', () => {
|
||||
const anInput = (location: URI, mtime: number | undefined) => new ExtensionScannerInput(location, mtime, undefined, undefined, false, undefined, ExtensionType.User, true, true, '1.1.1', undefined, undefined, true, undefined, {});
|
||||
|
||||
|
|
|
@ -4,25 +4,25 @@
|
|||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as assert from 'assert';
|
||||
import { IFileService, FileChangeType, IFileChange, IFileSystemProviderWithFileReadWriteCapability, IStat, FileType, FileSystemProviderCapabilities, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileOpenOptions, IFileSystemProviderWithFileReadStreamCapability, IFileReadStreamOptions } from 'vs/platform/files/common/files';
|
||||
import { FileService } from 'vs/platform/files/common/fileService';
|
||||
import { NullLogService } from 'vs/platform/log/common/log';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider';
|
||||
import { dirname, isEqual, joinPath } from 'vs/base/common/resources';
|
||||
import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { DisposableStore, IDisposable, Disposable } from 'vs/base/common/lifecycle';
|
||||
import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
|
||||
import { AbstractNativeEnvironmentService } from 'vs/platform/environment/common/environmentService';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import product from 'vs/platform/product/common/product';
|
||||
import { IUserDataProfilesService, UserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
|
||||
import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService';
|
||||
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { dirname, isEqual, joinPath } from 'vs/base/common/resources';
|
||||
import { ReadableStreamEvents } from 'vs/base/common/stream';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { AbstractNativeEnvironmentService } from 'vs/platform/environment/common/environmentService';
|
||||
import { FileService } from 'vs/platform/files/common/fileService';
|
||||
import { FileChangeType, FileSystemProviderCapabilities, FileType, IFileChange, IFileOpenOptions, IFileReadStreamOptions, IFileService, IFileSystemProviderWithFileReadStreamCapability, IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability, IStat } from 'vs/platform/files/common/files';
|
||||
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
|
||||
import { NullLogService } from 'vs/platform/log/common/log';
|
||||
import product from 'vs/platform/product/common/product';
|
||||
import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService';
|
||||
import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataProvider';
|
||||
import { IUserDataProfilesService, UserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
|
||||
|
||||
const ROOT = URI.file('tests').with({ scheme: 'vscode-tests' });
|
||||
|
||||
|
@ -315,7 +315,7 @@ class TestFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapa
|
|||
suite('FileUserDataProvider - Watching', () => {
|
||||
|
||||
let testObject: FileUserDataProvider;
|
||||
const disposables = new DisposableStore();
|
||||
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
|
||||
const rootFileResource = joinPath(ROOT, 'User');
|
||||
const rootUserDataResource = rootFileResource.with({ scheme: Schemas.vscodeUserData });
|
||||
|
||||
|
@ -332,8 +332,6 @@ suite('FileUserDataProvider - Watching', () => {
|
|||
testObject = disposables.add(new FileUserDataProvider(rootFileResource.scheme, new TestFileSystemProvider(fileEventEmitter.event), Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, new NullLogService()));
|
||||
});
|
||||
|
||||
teardown(() => disposables.clear());
|
||||
|
||||
test('file added change event', done => {
|
||||
disposables.add(testObject.watch(rootUserDataResource, { excludes: [], recursive: false }));
|
||||
const expected = joinPath(rootUserDataResource, 'settings.json');
|
||||
|
@ -427,7 +425,7 @@ suite('FileUserDataProvider - Watching', () => {
|
|||
test('event is not triggered if not watched', async () => {
|
||||
const target = joinPath(rootFileResource, 'settings.json');
|
||||
let triggered = false;
|
||||
testObject.onDidChangeFile(() => triggered = true);
|
||||
disposables.add(testObject.onDidChangeFile(() => triggered = true));
|
||||
fileEventEmitter.fire([{
|
||||
resource: target,
|
||||
type: FileChangeType.DELETED
|
||||
|
@ -441,7 +439,7 @@ suite('FileUserDataProvider - Watching', () => {
|
|||
disposables.add(testObject.watch(rootUserDataResource, { excludes: [], recursive: false }));
|
||||
const target = joinPath(dirname(rootFileResource), 'settings.json');
|
||||
let triggered = false;
|
||||
testObject.onDidChangeFile(() => triggered = true);
|
||||
disposables.add(testObject.onDidChangeFile(() => triggered = true));
|
||||
fileEventEmitter.fire([{
|
||||
resource: target,
|
||||
type: FileChangeType.DELETED
|
||||
|
|
|
@ -417,6 +417,9 @@ suite('UserDataSyncRequestsSession', () => {
|
|||
async loadCertificates() { return []; }
|
||||
};
|
||||
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('too many requests are thrown when limit exceeded', async () => {
|
||||
const testObject = new RequestsSession(1, 500, requestService, new NullLogService());
|
||||
await testObject.request('url', {}, CancellationToken.None);
|
||||
|
|
|
@ -441,6 +441,8 @@ suite('ExtHostDocumentData updates line mapping', () => {
|
|||
testLineMappingDirectionAfterEvents(lines, '\r\n', AssertDocumentLineMappingDirection.OffsetToPosition, e);
|
||||
}
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('line mapping', () => {
|
||||
testLineMappingAfterEvents([
|
||||
'This is line one',
|
||||
|
|
|
@ -122,6 +122,8 @@ suite('ChatModel', () => {
|
|||
});
|
||||
|
||||
suite('Response', () => {
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('content, markdown', async () => {
|
||||
const response = new Response([]);
|
||||
response.updateContent({ content: 'text', kind: 'content' });
|
||||
|
|
|
@ -305,6 +305,8 @@ suite('NotebookCommon', () => {
|
|||
|
||||
suite('CellUri', function () {
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('parse, generate (file-scheme)', function () {
|
||||
|
||||
const nb = URI.parse('file:///bar/følder/file.nb');
|
||||
|
@ -348,6 +350,8 @@ suite('CellUri', function () {
|
|||
|
||||
suite('CellRange', function () {
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('Cell range to index', function () {
|
||||
assert.deepStrictEqual(cellRangesToIndexes([]), []);
|
||||
assert.deepStrictEqual(cellRangesToIndexes([{ start: 0, end: 0 }]), []);
|
||||
|
@ -398,6 +402,7 @@ suite('CellRange', function () {
|
|||
});
|
||||
|
||||
suite('NotebookWorkingCopyTypeIdentifier', function () {
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('works', function () {
|
||||
const viewType = 'testViewType';
|
||||
|
|
|
@ -15,12 +15,15 @@ import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/uti
|
|||
import { DisposableStore } from 'vs/base/common/lifecycle';
|
||||
|
||||
suite('NotebookSelection', () => {
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('focus is never empty', function () {
|
||||
const selectionCollection = new NotebookCellSelectionCollection();
|
||||
assert.deepStrictEqual(selectionCollection.focus, { start: 0, end: 0 });
|
||||
|
||||
selectionCollection.setState(null, [], true, 'model');
|
||||
assert.deepStrictEqual(selectionCollection.focus, { start: 0, end: 0 });
|
||||
selectionCollection.dispose();
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -28,6 +28,8 @@ suite('URI Label', () => {
|
|||
labelService = new LabelService(TestEnvironmentService, new TestContextService(), new TestPathService(URI.file('/foobar')), new TestRemoteAgentService(), storageService, new TestLifecycleService());
|
||||
});
|
||||
|
||||
ensureNoDisposablesAreLeakedInTestSuite();
|
||||
|
||||
test('custom scheme', function () {
|
||||
labelService.registerFormatter({
|
||||
scheme: 'vscode',
|
||||
|
|
Loading…
Reference in a new issue