{"version":3,"file":"testing.mjs","sources":["../../../../../../../src/material/select/testing/select-harness.ts","../../../../../../../src/material/select/testing/public-api.ts","../../../../../../../src/material/select/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  HarnessPredicate,\n  parallel,\n} from '@angular/cdk/testing';\nimport {\n  MatOptionHarness,\n  MatOptgroupHarness,\n  OptionHarnessFilters,\n  OptgroupHarnessFilters,\n} from '@angular/material/core/testing';\nimport {MatFormFieldControlHarness} from '@angular/material/form-field/testing/control';\nimport {SelectHarnessFilters} from './select-harness-filters';\n\nexport abstract class _MatSelectHarnessBase<\n  OptionType extends ComponentHarnessConstructor<Option> & {\n    with: (options?: OptionFilters) => HarnessPredicate<Option>;\n  },\n  Option extends ComponentHarness & {click(): Promise<void>},\n  OptionFilters extends BaseHarnessFilters,\n  OptionGroupType extends ComponentHarnessConstructor<OptionGroup> & {\n    with: (options?: OptionGroupFilters) => HarnessPredicate<OptionGroup>;\n  },\n  OptionGroup extends ComponentHarness,\n  OptionGroupFilters extends BaseHarnessFilters,\n> extends MatFormFieldControlHarness {\n  protected abstract _prefix: string;\n  protected abstract _optionClass: OptionType;\n  protected abstract _optionGroupClass: OptionGroupType;\n  private _documentRootLocator = this.documentRootLocatorFactory();\n  private _backdrop = this._documentRootLocator.locatorFor('.cdk-overlay-backdrop');\n\n  /** Gets a boolean promise indicating if the select is disabled. */\n  async isDisabled(): Promise<boolean> {\n    return (await this.host()).hasClass(`${this._prefix}-select-disabled`);\n  }\n\n  /** Gets a boolean promise indicating if the select is valid. */\n  async isValid(): Promise<boolean> {\n    return !(await (await this.host()).hasClass('ng-invalid'));\n  }\n\n  /** Gets a boolean promise indicating if the select is required. */\n  async isRequired(): Promise<boolean> {\n    return (await this.host()).hasClass(`${this._prefix}-select-required`);\n  }\n\n  /** Gets a boolean promise indicating if the select is empty (no value is selected). */\n  async isEmpty(): Promise<boolean> {\n    return (await this.host()).hasClass(`${this._prefix}-select-empty`);\n  }\n\n  /** Gets a boolean promise indicating if the select is in multi-selection mode. */\n  async isMultiple(): Promise<boolean> {\n    return (await this.host()).hasClass(`${this._prefix}-select-multiple`);\n  }\n\n  /** Gets a promise for the select's value text. */\n  async getValueText(): Promise<string> {\n    const value = await this.locatorFor(`.${this._prefix}-select-value`)();\n    return value.text();\n  }\n\n  /** Focuses the select and returns a void promise that indicates when the action is complete. */\n  async focus(): Promise<void> {\n    return (await this.host()).focus();\n  }\n\n  /** Blurs the select and returns a void promise that indicates when the action is complete. */\n  async blur(): Promise<void> {\n    return (await this.host()).blur();\n  }\n\n  /** Whether the select is focused. */\n  async isFocused(): Promise<boolean> {\n    return (await this.host()).isFocused();\n  }\n\n  /** Gets the options inside the select panel. */\n  async getOptions(filter?: Omit<OptionFilters, 'ancestor'>): Promise<Option[]> {\n    return this._documentRootLocator.locatorForAll(\n      this._optionClass.with({\n        ...(filter || {}),\n        ancestor: await this._getPanelSelector(),\n      } as OptionFilters),\n    )();\n  }\n\n  /** Gets the groups of options inside the panel. */\n  async getOptionGroups(filter?: Omit<OptionGroupFilters, 'ancestor'>): Promise<OptionGroup[]> {\n    return this._documentRootLocator.locatorForAll(\n      this._optionGroupClass.with({\n        ...(filter || {}),\n        ancestor: await this._getPanelSelector(),\n      } as OptionGroupFilters),\n    )() as Promise<OptionGroup[]>;\n  }\n\n  /** Gets whether the select is open. */\n  async isOpen(): Promise<boolean> {\n    return !!(await this._documentRootLocator.locatorForOptional(await this._getPanelSelector())());\n  }\n\n  /** Opens the select's panel. */\n  async open(): Promise<void> {\n    if (!(await this.isOpen())) {\n      const trigger = await this.locatorFor(`.${this._prefix}-select-trigger`)();\n      return trigger.click();\n    }\n  }\n\n  /**\n   * Clicks the options that match the passed-in filter. If the select is in multi-selection\n   * mode all options will be clicked, otherwise the harness will pick the first matching option.\n   */\n  async clickOptions(filter?: OptionFilters): Promise<void> {\n    await this.open();\n\n    const [isMultiple, options] = await parallel(() => [\n      this.isMultiple(),\n      this.getOptions(filter),\n    ]);\n\n    if (options.length === 0) {\n      throw Error('Select does not have options matching the specified filter');\n    }\n\n    if (isMultiple) {\n      await parallel(() => options.map(option => option.click()));\n    } else {\n      await options[0].click();\n    }\n  }\n\n  /** Closes the select's panel. */\n  async close(): Promise<void> {\n    if (await this.isOpen()) {\n      // This is the most consistent way that works both in both single and multi-select modes,\n      // but it assumes that only one overlay is open at a time. We should be able to make it\n      // a bit more precise after #16645 where we can dispatch an ESCAPE press to the host instead.\n      return (await this._backdrop()).click();\n    }\n  }\n\n  /** Gets the selector that should be used to find this select's panel. */\n  private async _getPanelSelector(): Promise<string> {\n    const id = await (await this.host()).getAttribute('id');\n    return `#${id}-panel`;\n  }\n}\n\n/** Harness for interacting with an MDC-based mat-select in tests. */\nexport class MatSelectHarness extends _MatSelectHarnessBase<\n  typeof MatOptionHarness,\n  MatOptionHarness,\n  OptionHarnessFilters,\n  typeof MatOptgroupHarness,\n  MatOptgroupHarness,\n  OptgroupHarnessFilters\n> {\n  static hostSelector = '.mat-mdc-select';\n  protected _prefix = 'mat-mdc';\n  protected _optionClass = MatOptionHarness;\n  protected _optionGroupClass = MatOptgroupHarness;\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a select with specific attributes.\n   * @param options Options for filtering which select instances are considered a match.\n   * @return a `HarnessPredicate` configured with the given options.\n   */\n  static with<T extends MatSelectHarness>(\n    this: ComponentHarnessConstructor<T>,\n    options: SelectHarnessFilters = {},\n  ): HarnessPredicate<T> {\n    return new HarnessPredicate(this, options).addOption(\n      'disabled',\n      options.disabled,\n      async (harness, disabled) => {\n        return (await harness.isDisabled()) === disabled;\n      },\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 './select-harness';\nexport * from './select-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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"}