Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/test/browser/ui/menu/menubar.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { $, ModifierKeyEmitter } from '../../../../browser/dom.js';
8
import { unthemedMenuStyles } from '../../../../browser/ui/menu/menu.js';
9
import { MenuBar } from '../../../../browser/ui/menu/menubar.js';
10
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../common/utils.js';
11
12
function getButtonElementByAriaLabel(menubarElement: HTMLElement, ariaLabel: string): HTMLElement | null {
13
let i;
14
for (i = 0; i < menubarElement.childElementCount; i++) {
15
16
if (menubarElement.children[i].getAttribute('aria-label') === ariaLabel) {
17
return menubarElement.children[i] as HTMLElement;
18
}
19
}
20
21
return null;
22
}
23
24
function getTitleDivFromButtonDiv(menuButtonElement: HTMLElement): HTMLElement | null {
25
let i;
26
for (i = 0; i < menuButtonElement.childElementCount; i++) {
27
if (menuButtonElement.children[i].classList.contains('menubar-menu-title')) {
28
return menuButtonElement.children[i] as HTMLElement;
29
}
30
}
31
32
return null;
33
}
34
35
function getMnemonicFromTitleDiv(menuTitleDiv: HTMLElement): string | null {
36
let i;
37
for (i = 0; i < menuTitleDiv.childElementCount; i++) {
38
if (menuTitleDiv.children[i].tagName.toLocaleLowerCase() === 'mnemonic') {
39
return menuTitleDiv.children[i].textContent;
40
}
41
}
42
43
return null;
44
}
45
46
function validateMenuBarItem(menubar: MenuBar, menubarContainer: HTMLElement, label: string, readableLabel: string, mnemonic: string) {
47
menubar.push([
48
{
49
actions: [],
50
label: label
51
}
52
]);
53
54
const buttonElement = getButtonElementByAriaLabel(menubarContainer, readableLabel);
55
assert(buttonElement !== null, `Button element not found for ${readableLabel} button.`);
56
57
const titleDiv = getTitleDivFromButtonDiv(buttonElement);
58
assert(titleDiv !== null, `Title div not found for ${readableLabel} button.`);
59
60
const mnem = getMnemonicFromTitleDiv(titleDiv);
61
assert.strictEqual(mnem, mnemonic, 'Mnemonic not correct');
62
}
63
64
suite('Menubar', () => {
65
ensureNoDisposablesAreLeakedInTestSuite();
66
const container = $('.container');
67
68
const withMenuMenubar = (callback: (menubar: MenuBar) => void) => {
69
const menubar = new MenuBar(container, {
70
enableMnemonics: true,
71
visibility: 'visible'
72
}, unthemedMenuStyles);
73
74
callback(menubar);
75
76
menubar.dispose();
77
ModifierKeyEmitter.disposeInstance();
78
};
79
80
test('English File menu renders mnemonics', function () {
81
withMenuMenubar(menubar => {
82
validateMenuBarItem(menubar, container, '&File', 'File', 'F');
83
});
84
});
85
86
test('Russian File menu renders mnemonics', function () {
87
withMenuMenubar(menubar => {
88
validateMenuBarItem(menubar, container, '&Файл', 'Файл', 'Ф');
89
});
90
});
91
92
test('Chinese File menu renders mnemonics', function () {
93
withMenuMenubar(menubar => {
94
validateMenuBarItem(menubar, container, '文件(&F)', '文件', 'F');
95
});
96
});
97
});
98
99