{"version":3,"file":"ngx-com-components-sort-testing.mjs","sources":["../../../projects/com/components/sort/testing/sort.harness.ts","../../../projects/com/components/sort/testing/index.ts","../../../projects/com/components/sort/testing/ngx-com-components-sort-testing.ts"],"sourcesContent":["import {\n  ComponentHarness,\n  HarnessPredicate,\n  parallel,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Sort direction as exposed by the aria-sort attribute. */\nexport type SortHeaderSortDirection = 'ascending' | 'descending' | 'none';\n\n/** Harness filters for ComSortHeaderHarness. */\nexport interface ComSortHeaderHarnessFilters extends BaseHarnessFilters {\n  /** Filter by the header's text content. */\n  label?: string | RegExp;\n  /** Filter by the column id (comSortHeader attribute value). */\n  id?: string | RegExp;\n  /** Filter by the current sort direction. */\n  sortDirection?: SortHeaderSortDirection;\n}\n\n/** Harness filters for ComSortHarness. */\nexport type ComSortHarnessFilters = BaseHarnessFilters;\n\n/**\n * Harness for interacting with a sort header in tests.\n */\nexport class ComSortHeaderHarness extends ComponentHarness {\n  static hostSelector = '[comSortHeader]';\n\n  /**\n   * Gets a HarnessPredicate for matching sort headers.\n   * @param options Filter options.\n   */\n  static with(options: ComSortHeaderHarnessFilters = {}): HarnessPredicate<ComSortHeaderHarness> {\n    return new HarnessPredicate(ComSortHeaderHarness, options)\n      .addOption('label', options.label, async (harness, label) => {\n        const text = await harness.getLabel();\n        return HarnessPredicate.stringMatches(text, label);\n      })\n      .addOption('id', options.id, async (harness, id) => {\n        const headerId = await harness.getId();\n        return HarnessPredicate.stringMatches(headerId, id);\n      })\n      .addOption('sortDirection', options.sortDirection, async (harness, sortDirection) => {\n        return (await harness.getSortDirection()) === sortDirection;\n      });\n  }\n\n  /** Gets the header's text content. */\n  async getLabel(): Promise<string> {\n    const host = await this.host();\n    return host.text();\n  }\n\n  /** Gets the column id (comSortHeader attribute value). */\n  async getId(): Promise<string> {\n    const host = await this.host();\n    const id = await host.getAttribute('comSortHeader');\n    return id ?? '';\n  }\n\n  /** Gets the current sort direction from aria-sort. */\n  async getSortDirection(): Promise<SortHeaderSortDirection> {\n    const host = await this.host();\n    const ariaSort = await host.getAttribute('aria-sort');\n    if (ariaSort === 'ascending' || ariaSort === 'descending') {\n      return ariaSort;\n    }\n    return 'none';\n  }\n\n  /** Whether this header is actively sorted (direction is not 'none'). */\n  async isActive(): Promise<boolean> {\n    return (await this.getSortDirection()) !== 'none';\n  }\n\n  /** Whether this header is disabled. */\n  async isDisabled(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-disabled')) === 'true';\n  }\n\n  /** Clicks the header to cycle sort direction. */\n  async click(): Promise<void> {\n    const host = await this.host();\n    return host.click();\n  }\n\n  /** Focuses the header element. */\n  async focus(): Promise<void> {\n    const host = await this.host();\n    return host.focus();\n  }\n\n  /** Blurs the header element. */\n  async blur(): Promise<void> {\n    const host = await this.host();\n    return host.blur();\n  }\n\n  /** Whether the header element 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 sort container in tests.\n */\nexport class ComSortHarness extends ComponentHarness {\n  static hostSelector = '[comSort]';\n\n  /**\n   * Gets a HarnessPredicate for matching sort containers.\n   * @param options Filter options.\n   */\n  static with(options: ComSortHarnessFilters = {}): HarnessPredicate<ComSortHarness> {\n    return new HarnessPredicate(ComSortHarness, options);\n  }\n\n  /** Gets all sort headers, optionally filtered. */\n  async getSortHeaders(filters: ComSortHeaderHarnessFilters = {}): Promise<ComSortHeaderHarness[]> {\n    return this.locatorForAll(ComSortHeaderHarness.with(filters))();\n  }\n\n  /** Gets the actively sorted header, or null if none is sorted. */\n  async getActiveHeader(): Promise<ComSortHeaderHarness | null> {\n    const headers = await this.getSortHeaders();\n    const activeFlags = await parallel(() => headers.map((h) => h.isActive()));\n    const index = activeFlags.indexOf(true);\n    return index >= 0 ? headers[index]! : null;\n  }\n}\n","// Testing utilities for the sort component\n\nexport {\n  ComSortHarness,\n  ComSortHeaderHarness,\n} from './sort.harness';\n\nexport type {\n  SortHeaderSortDirection,\n  ComSortHarnessFilters,\n  ComSortHeaderHarnessFilters,\n} from './sort.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}