{"version":3,"file":"ngx-com-components-datepicker-testing.mjs","sources":["../../../projects/com/components/datepicker/testing/datepicker.harness.ts","../../../projects/com/components/datepicker/testing/index.ts","../../../projects/com/components/datepicker/testing/ngx-com-components-datepicker-testing.ts"],"sourcesContent":["import {\n  ComponentHarness,\n  HarnessPredicate,\n  TestKey,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters, TestElement } from '@angular/cdk/testing';\n\n/** Harness filters for ComDatepickerHarness. */\nexport interface ComDatepickerHarnessFilters extends BaseHarnessFilters {\n  /** Filter by the datepicker's placeholder text. */\n  placeholder?: string | RegExp;\n  /** Filter by whether the datepicker is disabled. */\n  disabled?: boolean;\n  /** Filter by whether the datepicker panel is open. */\n  open?: boolean;\n}\n\n/**\n * Harness for interacting with a ComDatepicker in tests.\n */\nexport class ComDatepickerHarness extends ComponentHarness {\n  static hostSelector = 'com-datepicker';\n\n  private readonly triggerGroup = this.locatorFor('div[role=\"group\"]');\n  private readonly input = this.locatorFor('input[type=\"text\"]');\n  private readonly clearButton = this.locatorForOptional('button[aria-label=\"Clear date\"]');\n  private readonly calendarButton = this.locatorFor('button[aria-label$=\"calendar\"]');\n\n  /**\n   * Gets a HarnessPredicate for matching datepickers.\n   * @param options Filter options.\n   */\n  static with(options: ComDatepickerHarnessFilters = {}): HarnessPredicate<ComDatepickerHarness> {\n    return new HarnessPredicate(ComDatepickerHarness, options)\n      .addOption('placeholder', options.placeholder, async (harness, placeholder) => {\n        const text = await harness.getPlaceholder();\n        return HarnessPredicate.stringMatches(text, placeholder);\n      })\n      .addOption('disabled', options.disabled, async (harness, disabled) => {\n        return (await harness.isDisabled()) === disabled;\n      })\n      .addOption('open', options.open, async (harness, open) => {\n        return (await harness.isOpen()) === open;\n      });\n  }\n\n  /** Whether the datepicker panel is currently open. */\n  async isOpen(): Promise<boolean> {\n    const trigger = await this.triggerGroup();\n    return (await trigger.getAttribute('aria-expanded')) === 'true';\n  }\n\n  /** Opens the datepicker panel if it is closed. */\n  async open(): Promise<void> {\n    if (!(await this.isOpen())) {\n      const btn = await this.calendarButton();\n      await btn.click();\n    }\n  }\n\n  /** Closes the datepicker panel if it is open. */\n  async close(): Promise<void> {\n    if (await this.isOpen()) {\n      const host = await this.host();\n      await host.sendKeys(TestKey.ESCAPE);\n    }\n  }\n\n  /** Whether the datepicker is disabled. */\n  async isDisabled(): Promise<boolean> {\n    const trigger = await this.triggerGroup();\n    return (await trigger.getAttribute('aria-disabled')) === 'true';\n  }\n\n  /** Whether the datepicker input has the required attribute. */\n  async isRequired(): Promise<boolean> {\n    const inputEl = await this.input();\n    return (await inputEl.getAttribute('aria-required')) === 'true';\n  }\n\n  /** Whether the datepicker input is in an invalid state. */\n  async isInvalid(): Promise<boolean> {\n    const inputEl = await this.input();\n    return (await inputEl.getAttribute('aria-invalid')) === 'true';\n  }\n\n  /** Gets the current value displayed in the input. */\n  async getInputValue(): Promise<string> {\n    const inputEl = await this.input();\n    return inputEl.getProperty<string>('value');\n  }\n\n  /** Sets the input value by clearing and typing the given text. */\n  async setInputValue(text: string): Promise<void> {\n    const inputEl = await this.input();\n    await inputEl.clear();\n    await inputEl.sendKeys(text);\n  }\n\n  /** Gets the placeholder text of the input. */\n  async getPlaceholder(): Promise<string> {\n    const inputEl = await this.input();\n    return (await inputEl.getAttribute('placeholder')) ?? '';\n  }\n\n  /** Whether the datepicker currently has a value (clear button is visible). */\n  async hasValue(): Promise<boolean> {\n    const clearBtn = await this.clearButton();\n    return clearBtn !== null;\n  }\n\n  /** Clears the current value by clicking the clear button. Throws if no value is set. */\n  async clear(): Promise<void> {\n    const clearBtn = await this.clearButton();\n    if (!clearBtn) {\n      throw new Error('Datepicker does not have a clearable value');\n    }\n    return clearBtn.click();\n  }\n\n  /** Gets the calendar panel element from the overlay. The datepicker must be open. */\n  async getCalendarPanel(): Promise<TestElement> {\n    if (!(await this.isOpen())) {\n      throw new Error('Datepicker panel is not open');\n    }\n    return this.documentRootLocatorFactory().locatorFor('com-calendar')();\n  }\n\n  /** Selects a day by its visible number. Opens the panel if closed. */\n  async selectDate(day: number): Promise<void> {\n    await this.open();\n    const rootLocator = this.documentRootLocatorFactory();\n    const dayButtons = await rootLocator.locatorForAll('div[role=\"dialog\"] com-calendar-cell button')();\n    for (const btn of dayButtons) {\n      const text = (await btn.text()).trim();\n      if (text === String(day)) {\n        await btn.click();\n        return;\n      }\n    }\n    throw new Error(`Could not find day cell with number: ${day}`);\n  }\n\n  /** Focuses the datepicker input. */\n  async focus(): Promise<void> {\n    const inputEl = await this.input();\n    return inputEl.focus();\n  }\n\n  /** Blurs the datepicker input. */\n  async blur(): Promise<void> {\n    const inputEl = await this.input();\n    return inputEl.blur();\n  }\n\n  /** Whether the datepicker input is currently focused. */\n  async isFocused(): Promise<boolean> {\n    const inputEl = await this.input();\n    return inputEl.isFocused();\n  }\n}\n","// Testing utilities for the datepicker component\n\nexport { ComDatepickerHarness } from './datepicker.harness';\n\nexport type { ComDatepickerHarnessFilters } from './datepicker.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}