Path: blob/main/src/vs/platform/actions/test/common/menuService.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 { DisposableStore } from '../../../../base/common/lifecycle.js';7import { generateUuid } from '../../../../base/common/uuid.js';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';9import { isIMenuItem, MenuId, MenuRegistry } from '../../common/actions.js';10import { MenuService } from '../../common/menuService.js';11import { NullCommandService } from '../../../commands/test/common/nullCommandService.js';12import { MockContextKeyService, MockKeybindingService } from '../../../keybinding/test/common/mockKeybindingService.js';13import { InMemoryStorageService } from '../../../storage/common/storage.js';1415// --- service instances1617const contextKeyService = new class extends MockContextKeyService {18override contextMatchesRules() {19return true;20}21};2223// --- tests2425suite('MenuService', function () {2627let menuService: MenuService;28const disposables = new DisposableStore();29let testMenuId: MenuId;3031setup(function () {32menuService = new MenuService(NullCommandService, new MockKeybindingService(), new InMemoryStorageService());33testMenuId = new MenuId(`testo/${generateUuid()}`);34disposables.clear();35});3637teardown(function () {38disposables.clear();39});4041ensureNoDisposablesAreLeakedInTestSuite();4243test('group sorting', function () {4445disposables.add(MenuRegistry.appendMenuItem(testMenuId, {46command: { id: 'one', title: 'FOO' },47group: '0_hello'48}));4950disposables.add(MenuRegistry.appendMenuItem(testMenuId, {51command: { id: 'two', title: 'FOO' },52group: 'hello'53}));5455disposables.add(MenuRegistry.appendMenuItem(testMenuId, {56command: { id: 'three', title: 'FOO' },57group: 'Hello'58}));5960disposables.add(MenuRegistry.appendMenuItem(testMenuId, {61command: { id: 'four', title: 'FOO' },62group: ''63}));6465disposables.add(MenuRegistry.appendMenuItem(testMenuId, {66command: { id: 'five', title: 'FOO' },67group: 'navigation'68}));6970const groups = disposables.add(menuService.createMenu(testMenuId, contextKeyService)).getActions();7172assert.strictEqual(groups.length, 5);73const [one, two, three, four, five] = groups;7475assert.strictEqual(one[0], 'navigation');76assert.strictEqual(two[0], '0_hello');77assert.strictEqual(three[0], 'hello');78assert.strictEqual(four[0], 'Hello');79assert.strictEqual(five[0], '');80});8182test('in group sorting, by title', function () {8384disposables.add(MenuRegistry.appendMenuItem(testMenuId, {85command: { id: 'a', title: 'aaa' },86group: 'Hello'87}));8889disposables.add(MenuRegistry.appendMenuItem(testMenuId, {90command: { id: 'b', title: 'fff' },91group: 'Hello'92}));9394disposables.add(MenuRegistry.appendMenuItem(testMenuId, {95command: { id: 'c', title: 'zzz' },96group: 'Hello'97}));9899const groups = disposables.add(menuService.createMenu(testMenuId, contextKeyService)).getActions();100101assert.strictEqual(groups.length, 1);102const [, actions] = groups[0];103104assert.strictEqual(actions.length, 3);105const [one, two, three] = actions;106assert.strictEqual(one.id, 'a');107assert.strictEqual(two.id, 'b');108assert.strictEqual(three.id, 'c');109});110111test('in group sorting, by title and order', function () {112113disposables.add(MenuRegistry.appendMenuItem(testMenuId, {114command: { id: 'a', title: 'aaa' },115group: 'Hello',116order: 10117}));118119disposables.add(MenuRegistry.appendMenuItem(testMenuId, {120command: { id: 'b', title: 'fff' },121group: 'Hello'122}));123124disposables.add(MenuRegistry.appendMenuItem(testMenuId, {125command: { id: 'c', title: 'zzz' },126group: 'Hello',127order: -1128}));129130disposables.add(MenuRegistry.appendMenuItem(testMenuId, {131command: { id: 'd', title: 'yyy' },132group: 'Hello',133order: -1134}));135136const groups = disposables.add(menuService.createMenu(testMenuId, contextKeyService)).getActions();137138assert.strictEqual(groups.length, 1);139const [, actions] = groups[0];140141assert.strictEqual(actions.length, 4);142const [one, two, three, four] = actions;143assert.strictEqual(one.id, 'd');144assert.strictEqual(two.id, 'c');145assert.strictEqual(three.id, 'b');146assert.strictEqual(four.id, 'a');147});148149150test('in group sorting, special: navigation', function () {151152disposables.add(MenuRegistry.appendMenuItem(testMenuId, {153command: { id: 'a', title: 'aaa' },154group: 'navigation',155order: 1.3156}));157158disposables.add(MenuRegistry.appendMenuItem(testMenuId, {159command: { id: 'b', title: 'fff' },160group: 'navigation',161order: 1.2162}));163164disposables.add(MenuRegistry.appendMenuItem(testMenuId, {165command: { id: 'c', title: 'zzz' },166group: 'navigation',167order: 1.1168}));169170const groups = disposables.add(menuService.createMenu(testMenuId, contextKeyService)).getActions();171172assert.strictEqual(groups.length, 1);173const [[, actions]] = groups;174175assert.strictEqual(actions.length, 3);176const [one, two, three] = actions;177assert.strictEqual(one.id, 'c');178assert.strictEqual(two.id, 'b');179assert.strictEqual(three.id, 'a');180});181182test('special MenuId palette', function () {183184disposables.add(MenuRegistry.appendMenuItem(MenuId.CommandPalette, {185command: { id: 'a', title: 'Explicit' }186}));187188disposables.add(MenuRegistry.addCommand({ id: 'b', title: 'Implicit' }));189190let foundA = false;191let foundB = false;192for (const item of MenuRegistry.getMenuItems(MenuId.CommandPalette)) {193if (isIMenuItem(item)) {194if (item.command.id === 'a') {195assert.strictEqual(item.command.title, 'Explicit');196foundA = true;197}198if (item.command.id === 'b') {199assert.strictEqual(item.command.title, 'Implicit');200foundB = true;201}202}203}204assert.strictEqual(foundA, true);205assert.strictEqual(foundB, true);206});207208test('Extension contributed submenus missing with errors in output #155030', function () {209210const id = generateUuid();211const menu = new MenuId(id);212213assert.throws(() => new MenuId(id));214assert.ok(menu === MenuId.for(id));215});216});217218219