{"version":3,"file":"ngx-com-components-tabs-testing.mjs","sources":["../../../projects/com/components/tabs/testing/tabs.harness.ts","../../../projects/com/components/tabs/testing/index.ts","../../../projects/com/components/tabs/testing/ngx-com-components-tabs-testing.ts"],"sourcesContent":["import {\n  ComponentHarness,\n  HarnessPredicate,\n  parallel,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Harness filters for ComTabHarness. */\nexport interface ComTabHarnessFilters extends BaseHarnessFilters {\n  /** Filter by the tab's label text. */\n  label?: string | RegExp;\n  /** Filter by whether the tab is selected. */\n  selected?: boolean;\n  /** Filter by whether the tab is disabled. */\n  disabled?: boolean;\n}\n\n/** Harness filters for ComTabGroupHarness. */\nexport type ComTabGroupHarnessFilters = BaseHarnessFilters;\n\n/**\n * Harness for interacting with an individual tab button in tests.\n */\nexport class ComTabHarness extends ComponentHarness {\n  static hostSelector = 'button[role=\"tab\"]';\n\n  private readonly closeButton = this.locatorForOptional('span[aria-hidden=\"true\"]');\n\n  /**\n   * Gets a HarnessPredicate for matching tab buttons.\n   * @param options Filter options.\n   */\n  static with(options: ComTabHarnessFilters = {}): HarnessPredicate<ComTabHarness> {\n    return new HarnessPredicate(ComTabHarness, options)\n      .addOption('label', options.label, async (harness, label) => {\n        const text = await harness.getLabel();\n        return HarnessPredicate.stringMatches(text, label);\n      })\n      .addOption('selected', options.selected, async (harness, selected) => {\n        return (await harness.isSelected()) === selected;\n      })\n      .addOption('disabled', options.disabled, async (harness, disabled) => {\n        return (await harness.isDisabled()) === disabled;\n      });\n  }\n\n  /** Gets the tab's label text. */\n  async getLabel(): Promise<string> {\n    const host = await this.host();\n    return host.text();\n  }\n\n  /** Whether the tab is currently selected. */\n  async isSelected(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-selected')) === 'true';\n  }\n\n  /** Whether the tab is disabled. */\n  async isDisabled(): Promise<boolean> {\n    const host = await this.host();\n    return host.getProperty<boolean>('disabled');\n  }\n\n  /** Clicks the tab to select it. */\n  async select(): Promise<void> {\n    const host = await this.host();\n    return host.click();\n  }\n\n  /** Gets the aria-controls attribute linking to the panel. */\n  async getAriaControls(): Promise<string | null> {\n    const host = await this.host();\n    return host.getAttribute('aria-controls');\n  }\n\n  /** Whether the tab is closable. */\n  async isClosable(): Promise<boolean> {\n    const closeBtn = await this.closeButton();\n    return closeBtn !== null;\n  }\n\n  /** Clicks the close button on the tab. Throws if not closable. */\n  async close(): Promise<void> {\n    const closeBtn = await this.closeButton();\n    if (!closeBtn) {\n      throw new Error('Tab is not closable');\n    }\n    return closeBtn.click();\n  }\n\n  /** Focuses the tab button. */\n  async focus(): Promise<void> {\n    const host = await this.host();\n    return host.focus();\n  }\n\n  /** Blurs the tab button. */\n  async blur(): Promise<void> {\n    const host = await this.host();\n    return host.blur();\n  }\n\n  /** Whether the tab button is focused. */\n  async isFocused(): Promise<boolean> {\n    const host = await this.host();\n    return host.isFocused();\n  }\n}\n\n/**\n * Harness for interacting with a ComTabGroup in tests.\n */\nexport class ComTabGroupHarness extends ComponentHarness {\n  static hostSelector = 'com-tab-group';\n\n  /**\n   * Gets a HarnessPredicate for matching tab groups.\n   * @param options Filter options.\n   */\n  static with(options: ComTabGroupHarnessFilters = {}): HarnessPredicate<ComTabGroupHarness> {\n    return new HarnessPredicate(ComTabGroupHarness, options);\n  }\n\n  /** Gets all tab buttons, optionally filtered. */\n  async getTabs(filters: ComTabHarnessFilters = {}): Promise<ComTabHarness[]> {\n    return this.locatorForAll(ComTabHarness.with(filters))();\n  }\n\n  /** Gets the currently selected tab. Throws if none is selected. */\n  async getSelectedTab(): Promise<ComTabHarness> {\n    const tabs = await this.getTabs({ selected: true });\n    if (tabs.length === 0) {\n      throw new Error('No selected tab found');\n    }\n    return tabs[0]!;\n  }\n\n  /** Selects a tab matching the given filter. */\n  async selectTab(filter: ComTabHarnessFilters): Promise<void> {\n    const tabs = await this.getTabs(filter);\n    if (tabs.length === 0) {\n      throw new Error(`Could not find tab matching filter: ${JSON.stringify(filter)}`);\n    }\n    return tabs[0]!.select();\n  }\n\n  /** Gets all tab label texts. */\n  async getTabLabels(): Promise<string[]> {\n    const tabs = await this.getTabs();\n    return parallel(() => tabs.map((t) => t.getLabel()));\n  }\n}\n","// Testing utilities for the tabs component\n\nexport {\n  ComTabHarness,\n  ComTabGroupHarness,\n} from './tabs.harness';\n\nexport type {\n  ComTabHarnessFilters,\n  ComTabGroupHarnessFilters,\n} from './tabs.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}