Path: blob/main/src/vs/workbench/api/test/browser/mainThreadCommands.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { MainThreadCommands } from '../../browser/mainThreadCommands.js';7import { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';8import { SingleProxyRPCProtocol } from '../common/testRPCProtocol.js';9import { IExtensionService } from '../../../services/extensions/common/extensions.js';10import { mock } from '../../../../base/test/common/mock.js';11import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';1213suite('MainThreadCommands', function () {1415ensureNoDisposablesAreLeakedInTestSuite();1617test('dispose on unregister', function () {1819const commands = new MainThreadCommands(SingleProxyRPCProtocol(null), undefined!, new class extends mock<IExtensionService>() { });20assert.strictEqual(CommandsRegistry.getCommand('foo'), undefined);2122// register23commands.$registerCommand('foo');24assert.ok(CommandsRegistry.getCommand('foo'));2526// unregister27commands.$unregisterCommand('foo');28assert.strictEqual(CommandsRegistry.getCommand('foo'), undefined);2930commands.dispose();3132});3334test('unregister all on dispose', function () {3536const commands = new MainThreadCommands(SingleProxyRPCProtocol(null), undefined!, new class extends mock<IExtensionService>() { });37assert.strictEqual(CommandsRegistry.getCommand('foo'), undefined);3839commands.$registerCommand('foo');40commands.$registerCommand('bar');4142assert.ok(CommandsRegistry.getCommand('foo'));43assert.ok(CommandsRegistry.getCommand('bar'));4445commands.dispose();4647assert.strictEqual(CommandsRegistry.getCommand('foo'), undefined);48assert.strictEqual(CommandsRegistry.getCommand('bar'), undefined);49});5051test('activate and throw when needed', async function () {5253const activations: string[] = [];54const runs: string[] = [];5556const commands = new MainThreadCommands(57SingleProxyRPCProtocol(null),58new class extends mock<ICommandService>() {59override executeCommand<T>(id: string): Promise<T | undefined> {60runs.push(id);61return Promise.resolve(undefined);62}63},64new class extends mock<IExtensionService>() {65override activateByEvent(id: string) {66activations.push(id);67return Promise.resolve();68}69}70);7172// case 1: arguments and retry73try {74activations.length = 0;75await commands.$executeCommand('bazz', [1, 2, { n: 3 }], true);76assert.ok(false);77} catch (e) {78assert.deepStrictEqual(activations, ['onCommand:bazz']);79assert.strictEqual((<Error>e).message, '$executeCommand:retry');80}8182// case 2: no arguments and retry83runs.length = 0;84await commands.$executeCommand('bazz', [], true);85assert.deepStrictEqual(runs, ['bazz']);8687// case 3: arguments and no retry88runs.length = 0;89await commands.$executeCommand('bazz', [1, 2, true], false);90assert.deepStrictEqual(runs, ['bazz']);9192commands.dispose();93});94});959697