{"version":3,"file":"testing.mjs","sources":["../../../../../../../src/material/form-field/testing/error-harness.ts","../../../../../../../src/material/form-field/testing/form-field-harness.ts","../../../../../../../src/material/form-field/testing/public-api.ts","../../../../../../../src/material/form-field/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} from '@angular/cdk/testing';\n\n/** A set of criteria that can be used to filter a list of error harness instances. */\nexport interface ErrorHarnessFilters extends BaseHarnessFilters {\n  /** Only find instances whose text matches the given value. */\n  text?: string | RegExp;\n}\n\nexport abstract class _MatErrorHarnessBase extends ComponentHarness {\n  /** Gets a promise for the error's label text. */\n  async getText(): Promise<string> {\n    return (await this.host()).text();\n  }\n\n  protected static _getErrorPredicate<T extends MatErrorHarness>(\n    type: ComponentHarnessConstructor<T>,\n    options: ErrorHarnessFilters,\n  ): HarnessPredicate<T> {\n    return new HarnessPredicate(type, options).addOption('text', options.text, (harness, text) =>\n      HarnessPredicate.stringMatches(harness.getText(), text),\n    );\n  }\n}\n\n/** Harness for interacting with an MDC-based `mat-error` in tests. */\nexport class MatErrorHarness extends _MatErrorHarnessBase {\n  static hostSelector = '.mat-mdc-form-field-error';\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for an error with specific\n   * attributes.\n   * @param options Options for filtering which error instances are considered a match.\n   * @return a `HarnessPredicate` configured with the given options.\n   */\n  static with<T extends MatErrorHarness>(\n    this: ComponentHarnessConstructor<T>,\n    options: ErrorHarnessFilters = {},\n  ): HarnessPredicate<T> {\n    return _MatErrorHarnessBase._getErrorPredicate(this, options);\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\nimport {\n  AsyncFactoryFn,\n  ComponentHarness,\n  ComponentHarnessConstructor,\n  HarnessPredicate,\n  HarnessQuery,\n  parallel,\n  TestElement,\n} from '@angular/cdk/testing';\nimport {ErrorHarnessFilters, MatErrorHarness} from './error-harness';\nimport {MatInputHarness} from '@angular/material/input/testing';\nimport {MatFormFieldControlHarness} from '@angular/material/form-field/testing/control';\nimport {MatSelectHarness} from '@angular/material/select/testing';\nimport {\n  MatDatepickerInputHarness,\n  MatDateRangeInputHarness,\n} from '@angular/material/datepicker/testing';\nimport {FormFieldHarnessFilters} from './form-field-harness-filters';\n\ninterface ErrorBase extends ComponentHarness {\n  getText(): Promise<string>;\n}\n\nexport abstract class _MatFormFieldHarnessBase<\n  ControlHarness extends MatFormFieldControlHarness,\n  ErrorType extends ComponentHarnessConstructor<ErrorBase> & {\n    with: (options?: ErrorHarnessFilters) => HarnessPredicate<ErrorBase>;\n  },\n> extends ComponentHarness {\n  protected abstract _prefixContainer: AsyncFactoryFn<TestElement | null>;\n  protected abstract _suffixContainer: AsyncFactoryFn<TestElement | null>;\n  protected abstract _label: AsyncFactoryFn<TestElement | null>;\n  protected abstract _hints: AsyncFactoryFn<TestElement[]>;\n  protected abstract _inputControl: AsyncFactoryFn<ControlHarness | null>;\n  protected abstract _selectControl: AsyncFactoryFn<ControlHarness | null>;\n  protected abstract _datepickerInputControl: AsyncFactoryFn<ControlHarness | null>;\n  protected abstract _dateRangeInputControl: AsyncFactoryFn<ControlHarness | null>;\n  protected abstract _errorHarness: ErrorType;\n\n  /** Gets the appearance of the form-field. */\n  abstract getAppearance(): Promise<string>;\n\n  /** Whether the label is currently floating. */\n  abstract isLabelFloating(): Promise<boolean>;\n\n  /** Whether the form-field has a label. */\n  abstract hasLabel(): Promise<boolean>;\n\n  /** Gets the label of the form-field. */\n  async getLabel(): Promise<string | null> {\n    const labelEl = await this._label();\n    return labelEl ? labelEl.text() : null;\n  }\n\n  /** Whether the form-field has errors. */\n  async hasErrors(): Promise<boolean> {\n    return (await this.getTextErrors()).length > 0;\n  }\n\n  /** Whether the form-field is disabled. */\n  async isDisabled(): Promise<boolean> {\n    return (await this.host()).hasClass('mat-form-field-disabled');\n  }\n\n  /** Whether the form-field is currently autofilled. */\n  async isAutofilled(): Promise<boolean> {\n    return (await this.host()).hasClass('mat-form-field-autofilled');\n  }\n\n  /**\n   * Gets the harness of the control that is bound to the form-field. Only\n   * default controls such as \"MatInputHarness\" and \"MatSelectHarness\" are\n   * supported.\n   */\n  async getControl(): Promise<ControlHarness | null>;\n\n  /**\n   * Gets the harness of the control that is bound to the form-field. Searches\n   * for a control that matches the specified harness type.\n   */\n  async getControl<X extends MatFormFieldControlHarness>(\n    type: ComponentHarnessConstructor<X>,\n  ): Promise<X | null>;\n\n  /**\n   * Gets the harness of the control that is bound to the form-field. Searches\n   * for a control that matches the specified harness predicate.\n   */\n  async getControl<X extends MatFormFieldControlHarness>(\n    type: HarnessPredicate<X>,\n  ): Promise<X | null>;\n\n  // Implementation of the \"getControl\" method overload signatures.\n  async getControl<X extends MatFormFieldControlHarness>(type?: HarnessQuery<X>) {\n    if (type) {\n      return this.locatorForOptional(type)();\n    }\n    const [select, input, datepickerInput, dateRangeInput] = await parallel(() => [\n      this._selectControl(),\n      this._inputControl(),\n      this._datepickerInputControl(),\n      this._dateRangeInputControl(),\n    ]);\n\n    // Match the datepicker inputs first since they can also have a `MatInput`.\n    return datepickerInput || dateRangeInput || select || input;\n  }\n\n  /** Gets the theme color of the form-field. */\n  async getThemeColor(): Promise<'primary' | 'accent' | 'warn'> {\n    const hostEl = await this.host();\n    const [isAccent, isWarn] = await parallel(() => {\n      return [hostEl.hasClass('mat-accent'), hostEl.hasClass('mat-warn')];\n    });\n    if (isAccent) {\n      return 'accent';\n    } else if (isWarn) {\n      return 'warn';\n    }\n    return 'primary';\n  }\n\n  /** Gets error messages which are currently displayed in the form-field. */\n  async getTextErrors(): Promise<string[]> {\n    const errors = await this.getErrors();\n    return parallel(() => errors.map(e => e.getText()));\n  }\n\n  /** Gets all of the error harnesses in the form field. */\n  async getErrors(filter: ErrorHarnessFilters = {}): Promise<MatErrorHarness[]> {\n    return this.locatorForAll(this._errorHarness.with(filter))();\n  }\n\n  /** Gets hint messages which are currently displayed in the form-field. */\n  async getTextHints(): Promise<string[]> {\n    const hints = await this._hints();\n    return parallel(() => hints.map(e => e.text()));\n  }\n\n  /** Gets the text inside the prefix element. */\n  async getPrefixText(): Promise<string> {\n    const prefix = await this._prefixContainer();\n    return prefix ? prefix.text() : '';\n  }\n\n  /** Gets the text inside the suffix element. */\n  async getSuffixText(): Promise<string> {\n    const suffix = await this._suffixContainer();\n    return suffix ? suffix.text() : '';\n  }\n\n  /**\n   * Whether the form control has been touched. Returns \"null\"\n   * if no form control is set up.\n   */\n  async isControlTouched(): Promise<boolean | null> {\n    if (!(await this._hasFormControl())) {\n      return null;\n    }\n    return (await this.host()).hasClass('ng-touched');\n  }\n\n  /**\n   * Whether the form control is dirty. Returns \"null\"\n   * if no form control is set up.\n   */\n  async isControlDirty(): Promise<boolean | null> {\n    if (!(await this._hasFormControl())) {\n      return null;\n    }\n    return (await this.host()).hasClass('ng-dirty');\n  }\n\n  /**\n   * Whether the form control is valid. Returns \"null\"\n   * if no form control is set up.\n   */\n  async isControlValid(): Promise<boolean | null> {\n    if (!(await this._hasFormControl())) {\n      return null;\n    }\n    return (await this.host()).hasClass('ng-valid');\n  }\n\n  /**\n   * Whether the form control is pending validation. Returns \"null\"\n   * if no form control is set up.\n   */\n  async isControlPending(): Promise<boolean | null> {\n    if (!(await this._hasFormControl())) {\n      return null;\n    }\n    return (await this.host()).hasClass('ng-pending');\n  }\n\n  /** Checks whether the form-field control has set up a form control. */\n  private async _hasFormControl(): Promise<boolean> {\n    const hostEl = await this.host();\n    // If no form \"NgControl\" is bound to the form-field control, the form-field\n    // is not able to forward any control status classes. Therefore if either the\n    // \"ng-touched\" or \"ng-untouched\" class is set, we know that it has a form control\n    const [isTouched, isUntouched] = await parallel(() => [\n      hostEl.hasClass('ng-touched'),\n      hostEl.hasClass('ng-untouched'),\n    ]);\n    return isTouched || isUntouched;\n  }\n}\n\n// TODO(devversion): support support chip list harness\n/** Possible harnesses of controls which can be bound to a form-field. */\nexport type FormFieldControlHarness =\n  | MatInputHarness\n  | MatSelectHarness\n  | MatDatepickerInputHarness\n  | MatDateRangeInputHarness;\n\n/** Harness for interacting with a MDC-based form-field's in tests. */\nexport class MatFormFieldHarness extends _MatFormFieldHarnessBase<\n  FormFieldControlHarness,\n  typeof MatErrorHarness\n> {\n  static hostSelector = '.mat-mdc-form-field';\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a form field with specific\n   * attributes.\n   * @param options Options for filtering which form field instances are considered a match.\n   * @return a `HarnessPredicate` configured with the given options.\n   */\n  static with<T extends MatFormFieldHarness>(\n    this: ComponentHarnessConstructor<T>,\n    options: FormFieldHarnessFilters = {},\n  ): HarnessPredicate<T> {\n    return new HarnessPredicate(this, options)\n      .addOption('floatingLabelText', options.floatingLabelText, async (harness, text) =>\n        HarnessPredicate.stringMatches(await harness.getLabel(), text),\n      )\n      .addOption(\n        'hasErrors',\n        options.hasErrors,\n        async (harness, hasErrors) => (await harness.hasErrors()) === hasErrors,\n      )\n      .addOption(\n        'isValid',\n        options.isValid,\n        async (harness, isValid) => (await harness.isControlValid()) === isValid,\n      );\n  }\n\n  protected _prefixContainer = this.locatorForOptional('.mat-mdc-form-field-text-prefix');\n  protected _suffixContainer = this.locatorForOptional('.mat-mdc-form-field-text-suffix');\n  protected _label = this.locatorForOptional('.mdc-floating-label');\n  protected _hints = this.locatorForAll('.mat-mdc-form-field-hint');\n  protected _inputControl = this.locatorForOptional(MatInputHarness);\n  protected _selectControl = this.locatorForOptional(MatSelectHarness);\n  protected _datepickerInputControl = this.locatorForOptional(MatDatepickerInputHarness);\n  protected _dateRangeInputControl = this.locatorForOptional(MatDateRangeInputHarness);\n  protected _errorHarness = MatErrorHarness;\n  private _mdcTextField = this.locatorFor('.mat-mdc-text-field-wrapper');\n\n  /** Gets the appearance of the form-field. */\n  async getAppearance(): Promise<'fill' | 'outline'> {\n    const textFieldEl = await this._mdcTextField();\n    if (await textFieldEl.hasClass('mdc-text-field--outlined')) {\n      return 'outline';\n    }\n    return 'fill';\n  }\n\n  /** Whether the form-field has a label. */\n  async hasLabel(): Promise<boolean> {\n    return (await this._label()) !== null;\n  }\n\n  /** Whether the label is currently floating. */\n  async isLabelFloating(): Promise<boolean> {\n    const labelEl = await this._label();\n    return labelEl !== null ? await labelEl.hasClass('mdc-floating-label--float-above') : false;\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\n// Re-export the base control harness from the \"form-field/testing/control\" entry-point. To\n// avoid circular dependencies, harnesses for form-field controls (i.e. input, select)\n// need to import the base form-field control harness through a separate entry-point.\nexport {MatFormFieldControlHarness} from '@angular/material/form-field/testing/control';\n\nexport * from './form-field-harness-filters';\nexport * from './form-field-harness';\nexport * from './error-harness';\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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"}