Path: blob/main/src/vs/base/test/browser/ui/menu/menubar.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 { $, ModifierKeyEmitter } from '../../../../browser/dom.js';7import { unthemedMenuStyles } from '../../../../browser/ui/menu/menu.js';8import { MenuBar } from '../../../../browser/ui/menu/menubar.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../common/utils.js';1011function getButtonElementByAriaLabel(menubarElement: HTMLElement, ariaLabel: string): HTMLElement | null {12let i;13for (i = 0; i < menubarElement.childElementCount; i++) {1415if (menubarElement.children[i].getAttribute('aria-label') === ariaLabel) {16return menubarElement.children[i] as HTMLElement;17}18}1920return null;21}2223function getTitleDivFromButtonDiv(menuButtonElement: HTMLElement): HTMLElement | null {24let i;25for (i = 0; i < menuButtonElement.childElementCount; i++) {26if (menuButtonElement.children[i].classList.contains('menubar-menu-title')) {27return menuButtonElement.children[i] as HTMLElement;28}29}3031return null;32}3334function getMnemonicFromTitleDiv(menuTitleDiv: HTMLElement): string | null {35let i;36for (i = 0; i < menuTitleDiv.childElementCount; i++) {37if (menuTitleDiv.children[i].tagName.toLocaleLowerCase() === 'mnemonic') {38return menuTitleDiv.children[i].textContent;39}40}4142return null;43}4445function validateMenuBarItem(menubar: MenuBar, menubarContainer: HTMLElement, label: string, readableLabel: string, mnemonic: string) {46menubar.push([47{48actions: [],49label: label50}51]);5253const buttonElement = getButtonElementByAriaLabel(menubarContainer, readableLabel);54assert(buttonElement !== null, `Button element not found for ${readableLabel} button.`);5556const titleDiv = getTitleDivFromButtonDiv(buttonElement);57assert(titleDiv !== null, `Title div not found for ${readableLabel} button.`);5859const mnem = getMnemonicFromTitleDiv(titleDiv);60assert.strictEqual(mnem, mnemonic, 'Mnemonic not correct');61}6263suite('Menubar', () => {64ensureNoDisposablesAreLeakedInTestSuite();65const container = $('.container');6667const withMenuMenubar = (callback: (menubar: MenuBar) => void) => {68const menubar = new MenuBar(container, {69enableMnemonics: true,70visibility: 'visible'71}, unthemedMenuStyles);7273callback(menubar);7475menubar.dispose();76ModifierKeyEmitter.disposeInstance();77};7879test('English File menu renders mnemonics', function () {80withMenuMenubar(menubar => {81validateMenuBarItem(menubar, container, '&File', 'File', 'F');82});83});8485test('Russian File menu renders mnemonics', function () {86withMenuMenubar(menubar => {87validateMenuBarItem(menubar, container, '&Файл', 'Файл', 'Ф');88});89});9091test('Chinese File menu renders mnemonics', function () {92withMenuMenubar(menubar => {93validateMenuBarItem(menubar, container, '文件(&F)', '文件', 'F');94});95});96});979899