@angular/material
Version:
Angular Material
1 lines • 14.2 kB
Source Map (JSON)
{"version":3,"file":"testing.mjs","sources":["../../../../../../../src/material/menu/testing/menu-harness.ts","../../../../../../../src/material/menu/testing/public-api.ts","../../../../../../../src/material/menu/testing/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n BaseHarnessFilters,\n ComponentHarness,\n ComponentHarnessConstructor,\n ContentContainerComponentHarness,\n HarnessLoader,\n HarnessPredicate,\n TestElement,\n TestKey,\n} from '@angular/cdk/testing';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MenuHarnessFilters, MenuItemHarnessFilters} from './menu-harness-filters';\n\nexport abstract class _MatMenuHarnessBase<\n ItemType extends ComponentHarnessConstructor<Item> & {\n with: (options?: ItemFilters) => HarnessPredicate<Item>;\n },\n Item extends ComponentHarness & {\n click(): Promise<void>;\n getSubmenu(): Promise<_MatMenuHarnessBase<ItemType, Item, ItemFilters> | null>;\n },\n ItemFilters extends BaseHarnessFilters,\n> extends ContentContainerComponentHarness<string> {\n private _documentRootLocator = this.documentRootLocatorFactory();\n protected abstract _itemClass: ItemType;\n\n // TODO: potentially extend MatLegacyButtonHarness\n\n /** Whether the menu is disabled. */\n async isDisabled(): Promise<boolean> {\n const disabled = (await this.host()).getAttribute('disabled');\n return coerceBooleanProperty(await disabled);\n }\n\n /** Whether the menu is open. */\n async isOpen(): Promise<boolean> {\n return !!(await this._getMenuPanel());\n }\n\n /** Gets the text of the menu's trigger element. */\n async getTriggerText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Focuses the menu. */\n async focus(): Promise<void> {\n return (await this.host()).focus();\n }\n\n /** Blurs the menu. */\n async blur(): Promise<void> {\n return (await this.host()).blur();\n }\n\n /** Whether the menu is focused. */\n async isFocused(): Promise<boolean> {\n return (await this.host()).isFocused();\n }\n\n /** Opens the menu. */\n async open(): Promise<void> {\n if (!(await this.isOpen())) {\n return (await this.host()).click();\n }\n }\n\n /** Closes the menu. */\n async close(): Promise<void> {\n const panel = await this._getMenuPanel();\n if (panel) {\n return panel.sendKeys(TestKey.ESCAPE);\n }\n }\n\n /**\n * Gets a list of `MatMenuItemHarness` representing the items in the menu.\n * @param filters Optionally filters which menu items are included.\n */\n async getItems(filters?: Omit<ItemFilters, 'ancestor'>): Promise<Item[]> {\n const panelId = await this._getPanelId();\n if (panelId) {\n return this._documentRootLocator.locatorForAll(\n this._itemClass.with({\n ...(filters || {}),\n ancestor: `#${panelId}`,\n } as ItemFilters),\n )();\n }\n return [];\n }\n\n /**\n * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.\n * @param itemFilter A filter used to represent which item in the menu should be clicked. The\n * first matching menu item will be clicked.\n * @param subItemFilters A list of filters representing the items to click in any subsequent\n * sub-menus. The first item in the sub-menu matching the corresponding filter in\n * `subItemFilters` will be clicked.\n */\n async clickItem(\n itemFilter: Omit<ItemFilters, 'ancestor'>,\n ...subItemFilters: Omit<ItemFilters, 'ancestor'>[]\n ): Promise<void> {\n await this.open();\n const items = await this.getItems(itemFilter);\n if (!items.length) {\n throw Error(`Could not find item matching ${JSON.stringify(itemFilter)}`);\n }\n\n if (!subItemFilters.length) {\n return await items[0].click();\n }\n\n const menu = await items[0].getSubmenu();\n if (!menu) {\n throw Error(`Item matching ${JSON.stringify(itemFilter)} does not have a submenu`);\n }\n return menu.clickItem(...(subItemFilters as [Omit<ItemFilters, 'ancestor'>]));\n }\n\n protected override async getRootHarnessLoader(): Promise<HarnessLoader> {\n const panelId = await this._getPanelId();\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);\n }\n\n /** Gets the menu panel associated with this menu. */\n private async _getMenuPanel(): Promise<TestElement | null> {\n const panelId = await this._getPanelId();\n return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;\n }\n\n /** Gets the id of the menu panel associated with this menu. */\n private async _getPanelId(): Promise<string | null> {\n const panelId = await (await this.host()).getAttribute('aria-controls');\n return panelId || null;\n }\n}\n\nexport abstract class _MatMenuItemHarnessBase<\n MenuType extends ComponentHarnessConstructor<Menu>,\n Menu extends ComponentHarness,\n> extends ContentContainerComponentHarness<string> {\n protected abstract _menuClass: MenuType;\n\n /** Whether the menu is disabled. */\n async isDisabled(): Promise<boolean> {\n const disabled = (await this.host()).getAttribute('disabled');\n return coerceBooleanProperty(await disabled);\n }\n\n /** Gets the text of the menu item. */\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Focuses the menu item. */\n async focus(): Promise<void> {\n return (await this.host()).focus();\n }\n\n /** Blurs the menu item. */\n async blur(): Promise<void> {\n return (await this.host()).blur();\n }\n\n /** Whether the menu item is focused. */\n async isFocused(): Promise<boolean> {\n return (await this.host()).isFocused();\n }\n\n /** Clicks the menu item. */\n async click(): Promise<void> {\n return (await this.host()).click();\n }\n\n /** Whether this item has a submenu. */\n async hasSubmenu(): Promise<boolean> {\n return (await this.host()).matchesSelector(this._menuClass.hostSelector);\n }\n\n /** Gets the submenu associated with this menu item, or null if none. */\n async getSubmenu(): Promise<Menu | null> {\n if (await this.hasSubmenu()) {\n return new this._menuClass(this.locatorFactory);\n }\n return null;\n }\n}\n\n/** Harness for interacting with an MDC-based mat-menu in tests. */\nexport class MatMenuHarness extends _MatMenuHarnessBase<\n typeof MatMenuItemHarness,\n MatMenuItemHarness,\n MenuItemHarnessFilters\n> {\n /** The selector for the host element of a `MatMenu` instance. */\n static hostSelector = '.mat-mdc-menu-trigger';\n protected _itemClass = MatMenuItemHarness;\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a menu with specific attributes.\n * @param options Options for filtering which menu instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatMenuHarness>(\n this: ComponentHarnessConstructor<T>,\n options: MenuHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options).addOption(\n 'triggerText',\n options.triggerText,\n (harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text),\n );\n }\n}\n\n/** Harness for interacting with an MDC-based mat-menu-item in tests. */\nexport class MatMenuItemHarness extends _MatMenuItemHarnessBase<\n typeof MatMenuHarness,\n MatMenuHarness\n> {\n /** The selector for the host element of a `MatMenuItem` instance. */\n static hostSelector = '.mat-mdc-menu-item';\n protected _menuClass = MatMenuHarness;\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a menu item with specific attributes.\n * @param options Options for filtering which menu item instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatMenuItemHarness>(\n this: ComponentHarnessConstructor<T>,\n options: MenuItemHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options)\n .addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n )\n .addOption(\n 'hasSubmenu',\n options.hasSubmenu,\n async (harness, hasSubmenu) => (await harness.hasSubmenu()) === hasSubmenu,\n );\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport * from './menu-harness';\nexport * from './menu-harness-filters';\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}