| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {renderElementIntoDOM} from '../../../testing/DOMHelpers.js'; |
| import { |
| setupLocaleHooks, |
| } from '../../../testing/LocaleHelpers.js'; |
| import {html} from '../../lit/lit.js'; |
| import * as Dialogs from '../dialogs/dialogs.js'; |
| import * as RenderCoordinator from '../render_coordinator/render_coordinator.js'; |
| |
| import * as Menus from './menus.js'; |
| |
| async function createMenu(): Promise<Menus.SelectMenu.SelectMenu> { |
| const menuItems = [ |
| { |
| name: 'Option 1', |
| value: '1', |
| group: '', |
| }, |
| { |
| name: 'Option 2', |
| value: '2', |
| group: '', |
| }, |
| { |
| name: 'Option 3', |
| value: '3', |
| group: '', |
| }, |
| { |
| name: 'Option 4', |
| value: '4', |
| group: '', |
| }, |
| ]; |
| |
| const menu = new Menus.SelectMenu.SelectMenu(); |
| menu.position = Dialogs.Dialog.DialogVerticalPosition.BOTTOM; |
| menuItems.forEach(item => { |
| const selectMenuItem = new Menus.Menu.MenuItem(); |
| selectMenuItem.value = item.value; |
| selectMenuItem.textContent = item.name; |
| menu.appendChild(selectMenuItem); |
| }); |
| |
| await RenderCoordinator.done(); |
| return menu; |
| } |
| |
| describe('SelectMenu', () => { |
| setupLocaleHooks(); |
| it('will use the buttonTitle property if that is provided', async () => { |
| const menu = await createMenu(); |
| const firsItem = menu.querySelector('devtools-menu-item'); |
| assert.exists(firsItem); |
| menu.buttonTitle = 'Override Title'; |
| renderElementIntoDOM(menu); |
| await RenderCoordinator.done(); |
| assert.isNotNull(menu.shadowRoot); |
| const button = menu.shadowRoot.querySelector('devtools-select-menu-button'); |
| assert.exists(button); |
| assert.instanceOf(button, HTMLElement); |
| assert.strictEqual(button.innerText, 'Override Title'); |
| }); |
| |
| it('allows the buttonTitle to be a function', async () => { |
| const menu = await createMenu(); |
| const firsItem = menu.querySelector('devtools-menu-item'); |
| assert.exists(firsItem); |
| firsItem.selected = true; |
| menu.buttonTitle = () => html`Override Title`; |
| renderElementIntoDOM(menu); |
| await RenderCoordinator.done(); |
| assert.isNotNull(menu.shadowRoot); |
| const button = menu.shadowRoot.querySelector('devtools-select-menu-button'); |
| assert.exists(button); |
| assert.instanceOf(button, HTMLElement); |
| assert.strictEqual(button.innerText, 'Override Title'); |
| }); |
| |
| it('can render multiple options as selected at once', async () => { |
| const selectMenu = await createMenu(); |
| renderElementIntoDOM(selectMenu); |
| [...selectMenu.querySelectorAll('devtools-menu-item')][0].selected = true; |
| [...selectMenu.querySelectorAll('devtools-menu-item')][1].selected = true; |
| assert.isNotNull(selectMenu.shadowRoot); |
| const devtoolsMenu = selectMenu.shadowRoot.querySelector('devtools-menu'); |
| const devtoolsDialog = devtoolsMenu?.shadowRoot?.querySelector('devtools-dialog'); |
| await devtoolsDialog?.setDialogVisible(true); |
| const selectedItems = [...selectMenu.querySelectorAll('devtools-menu-item')].filter(item => item.selected); |
| assert.deepEqual(selectedItems.map(item => item.innerText), ['Option 1', 'Option 2']); |
| }); |
| }); |