{"version":3,"file":"ngx-com-components-segmented-control-testing.mjs","sources":["../../../projects/com/components/segmented-control/testing/segmented-control.harness.ts","../../../projects/com/components/segmented-control/testing/index.ts","../../../projects/com/components/segmented-control/testing/ngx-com-components-segmented-control-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 ComSegmentHarness. */\nexport interface ComSegmentHarnessFilters extends BaseHarnessFilters {\n  /** Filter by the segment's label text. */\n  label?: string | RegExp;\n  /** Filter by whether the segment is selected. */\n  selected?: boolean;\n  /** Filter by whether the segment is disabled. */\n  disabled?: boolean;\n}\n\n/** Harness filters for ComSegmentedControlHarness. */\nexport interface ComSegmentedControlHarnessFilters extends BaseHarnessFilters {\n  /** Filter by the control's aria-label. */\n  ariaLabel?: string | RegExp;\n}\n\n/**\n * Harness for interacting with an individual segment button in tests.\n */\nexport class ComSegmentHarness extends ComponentHarness {\n  static hostSelector = 'button[role=\"radio\"]';\n\n  /**\n   * Gets a HarnessPredicate for matching segments.\n   * @param options Filter options.\n   */\n  static with(options: ComSegmentHarnessFilters = {}): HarnessPredicate<ComSegmentHarness> {\n    return new HarnessPredicate(ComSegmentHarness, 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 segment's label text. Uses aria-label if present, otherwise text content. */\n  async getLabel(): Promise<string> {\n    const host = await this.host();\n    const ariaLabel = await host.getAttribute('aria-label');\n    if (ariaLabel) {\n      return ariaLabel;\n    }\n    return host.text();\n  }\n\n  /** Whether the segment is currently selected. */\n  async isSelected(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-checked')) === 'true';\n  }\n\n  /** Whether the segment is disabled. */\n  async isDisabled(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-disabled')) === 'true' ||\n      (await host.getProperty<boolean>('disabled'));\n  }\n\n  /** Clicks the segment to select it. Throws if disabled. */\n  async select(): Promise<void> {\n    if (await this.isDisabled()) {\n      throw new Error('Cannot select a disabled segment');\n    }\n    const host = await this.host();\n    return host.click();\n  }\n\n  /** Focuses the segment button. */\n  async focus(): Promise<void> {\n    const host = await this.host();\n    return host.focus();\n  }\n\n  /** Blurs the segment button. */\n  async blur(): Promise<void> {\n    const host = await this.host();\n    return host.blur();\n  }\n\n  /** Whether the segment 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 ComSegmentedControl in tests.\n */\nexport class ComSegmentedControlHarness extends ComponentHarness {\n  static hostSelector = 'com-segmented-control';\n\n  private readonly radioGroup = this.locatorFor('div[role=\"radiogroup\"]');\n\n  /**\n   * Gets a HarnessPredicate for matching segmented controls.\n   * @param options Filter options.\n   */\n  static with(options: ComSegmentedControlHarnessFilters = {}): HarnessPredicate<ComSegmentedControlHarness> {\n    return new HarnessPredicate(ComSegmentedControlHarness, options)\n      .addOption('ariaLabel', options.ariaLabel, async (harness, ariaLabel) => {\n        const label = await harness.getAriaLabel();\n        return HarnessPredicate.stringMatches(label, ariaLabel);\n      });\n  }\n\n  /** Gets all segment buttons, optionally filtered. */\n  async getSegments(filters: ComSegmentHarnessFilters = {}): Promise<ComSegmentHarness[]> {\n    return this.locatorForAll(ComSegmentHarness.with(filters))();\n  }\n\n  /** Gets the currently selected segment, or null if none is selected. */\n  async getSelectedSegment(): Promise<ComSegmentHarness | null> {\n    const segments = await this.getSegments({ selected: true });\n    return segments[0] ?? null;\n  }\n\n  /** Selects a segment matching the given filter. */\n  async selectSegment(filter: ComSegmentHarnessFilters): Promise<void> {\n    const segments = await this.getSegments(filter);\n    if (segments.length === 0) {\n      throw new Error(`Could not find segment matching filter: ${JSON.stringify(filter)}`);\n    }\n    return segments[0]!.select();\n  }\n\n  /** Gets all segment label texts. */\n  async getSegmentLabels(): Promise<string[]> {\n    const segments = await this.getSegments();\n    return parallel(() => segments.map((s) => s.getLabel()));\n  }\n\n  /** Gets the radiogroup's aria-label. */\n  async getAriaLabel(): Promise<string | null> {\n    const group = await this.radioGroup();\n    return group.getAttribute('aria-label');\n  }\n}\n","// Testing utilities for the segmented-control component\n\nexport {\n  ComSegmentHarness,\n  ComSegmentedControlHarness,\n} from './segmented-control.harness';\n\nexport type {\n  ComSegmentHarnessFilters,\n  ComSegmentedControlHarnessFilters,\n} from './segmented-control.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}