{"version":3,"file":"radio-testing.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/material/radio/testing/radio-harness.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.dev/license\n */\n\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {\n  ComponentHarness,\n  ComponentHarnessConstructor,\n  HarnessPredicate,\n} from '@angular/cdk/testing';\nimport {RadioButtonHarnessFilters, RadioGroupHarnessFilters} from './radio-harness-filters';\n\n/** Harness for interacting with a mat-radio-group in tests. */\nexport class MatRadioGroupHarness extends ComponentHarness {\n  /** The selector for the host element of a `MatRadioGroup` instance. */\n  static hostSelector = '.mat-mdc-radio-group';\n\n  private _buttonClass = MatRadioButtonHarness;\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a radio group with specific\n   * attributes.\n   * @param options Options for filtering which radio group instances are considered a match.\n   * @return a `HarnessPredicate` configured with the given options.\n   */\n  static with<T extends MatRadioGroupHarness>(\n    this: ComponentHarnessConstructor<T>,\n    options: RadioGroupHarnessFilters = {},\n  ): HarnessPredicate<T> {\n    return new HarnessPredicate(this, options).addOption(\n      'name',\n      options.name,\n      MatRadioGroupHarness._checkRadioGroupName,\n    );\n  }\n\n  /** Gets the name of the radio-group. */\n  async getName(): Promise<string | null> {\n    const hostName = await this._getGroupNameFromHost();\n    // It's not possible to always determine the \"name\" of a radio-group by reading\n    // the attribute. This is because the radio-group does not set the \"name\" as an\n    // element attribute if the \"name\" value is set through a binding.\n    if (hostName !== null) {\n      return hostName;\n    }\n    // In case we couldn't determine the \"name\" of a radio-group by reading the\n    // \"name\" attribute, we try to determine the \"name\" of the group by going\n    // through all radio buttons.\n    const radioNames = await this._getNamesFromRadioButtons();\n    if (!radioNames.length) {\n      return null;\n    }\n    if (!this._checkRadioNamesInGroupEqual(radioNames)) {\n      throw Error('Radio buttons in radio-group have mismatching names.');\n    }\n    return radioNames[0]!;\n  }\n\n  /** Gets the id of the radio-group. */\n  async getId(): Promise<string | null> {\n    return (await this.host()).getProperty<string | null>('id');\n  }\n\n  /** Gets the checked radio-button in a radio-group. */\n  async getCheckedRadioButton(): Promise<MatRadioButtonHarness | null> {\n    for (let radioButton of await this.getRadioButtons()) {\n      if (await radioButton.isChecked()) {\n        return radioButton;\n      }\n    }\n    return null;\n  }\n\n  /** Gets the checked value of the radio-group. */\n  async getCheckedValue(): Promise<string | null> {\n    const checkedRadio = await this.getCheckedRadioButton();\n    if (!checkedRadio) {\n      return null;\n    }\n    return checkedRadio.getValue();\n  }\n\n  /**\n   * Gets a list of radio buttons which are part of the radio-group.\n   * @param filter Optionally filters which radio buttons are included.\n   */\n  async getRadioButtons(filter?: RadioButtonHarnessFilters): Promise<MatRadioButtonHarness[]> {\n    return this.locatorForAll(this._buttonClass.with(filter))();\n  }\n\n  /**\n   * Checks a radio button in this group.\n   * @param filter An optional filter to apply to the child radio buttons. The first tab matching\n   *     the filter will be selected.\n   */\n  async checkRadioButton(filter?: RadioButtonHarnessFilters): Promise<void> {\n    const radioButtons = await this.getRadioButtons(filter);\n    if (!radioButtons.length) {\n      throw Error(`Could not find radio button matching ${JSON.stringify(filter)}`);\n    }\n    return radioButtons[0].check();\n  }\n\n  /** Gets the name attribute of the host element. */\n  private async _getGroupNameFromHost() {\n    return (await this.host()).getAttribute('name');\n  }\n\n  /** Gets a list of the name attributes of all child radio buttons. */\n  private async _getNamesFromRadioButtons(): Promise<string[]> {\n    const groupNames: string[] = [];\n    for (let radio of await this.getRadioButtons()) {\n      const radioName = await radio.getName();\n      if (radioName !== null) {\n        groupNames.push(radioName);\n      }\n    }\n    return groupNames;\n  }\n\n  /** Checks if the specified radio names are all equal. */\n  private _checkRadioNamesInGroupEqual(radioNames: string[]): boolean {\n    let groupName: string | null = null;\n    for (let radioName of radioNames) {\n      if (groupName === null) {\n        groupName = radioName;\n      } else if (groupName !== radioName) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Checks if a radio-group harness has the given name. Throws if a radio-group with\n   * matching name could be found but has mismatching radio-button names.\n   */\n  protected static async _checkRadioGroupName(harness: MatRadioGroupHarness, name: string) {\n    // Check if there is a radio-group which has the \"name\" attribute set\n    // to the expected group name. It's not possible to always determine\n    // the \"name\" of a radio-group by reading the attribute. This is because\n    // the radio-group does not set the \"name\" as an element attribute if the\n    // \"name\" value is set through a binding.\n    if ((await harness._getGroupNameFromHost()) === name) {\n      return true;\n    }\n    // Check if there is a group with radio-buttons that all have the same\n    // expected name. This implies that the group has the given name. It's\n    // not possible to always determine the name of a radio-group through\n    // the attribute because there is\n    const radioNames = await harness._getNamesFromRadioButtons();\n    if (radioNames.indexOf(name) === -1) {\n      return false;\n    }\n    if (!harness._checkRadioNamesInGroupEqual(radioNames)) {\n      throw Error(\n        `The locator found a radio-group with name \"${name}\", but some ` +\n          `radio-button's within the group have mismatching names, which is invalid.`,\n      );\n    }\n    return true;\n  }\n}\n\n/** Harness for interacting with a mat-radio-button in tests. */\nexport class MatRadioButtonHarness extends ComponentHarness {\n  /** The selector for the host element of a `MatRadioButton` instance. */\n  static hostSelector = '.mat-mdc-radio-button';\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a radio button with specific\n   * attributes.\n   * @param options Options for filtering which radio button instances are considered a match.\n   * @return a `HarnessPredicate` configured with the given options.\n   */\n  static with<T extends MatRadioButtonHarness>(\n    this: ComponentHarnessConstructor<T>,\n    options: RadioButtonHarnessFilters = {},\n  ): HarnessPredicate<T> {\n    return new HarnessPredicate(this, options)\n      .addOption('label', options.label, (harness, label) =>\n        HarnessPredicate.stringMatches(harness.getLabelText(), label),\n      )\n      .addOption('name', options.name, async (harness, name) => (await harness.getName()) === name)\n      .addOption(\n        'checked',\n        options.checked,\n        async (harness, checked) => (await harness.isChecked()) == checked,\n      );\n  }\n\n  protected _textLabel = this.locatorFor('label');\n  protected _clickLabel = this._textLabel;\n  private _input = this.locatorFor('input');\n\n  /** Whether the radio-button is checked. */\n  async isChecked(): Promise<boolean> {\n    const checked = (await this._input()).getProperty<boolean>('checked');\n    return coerceBooleanProperty(await checked);\n  }\n\n  /** Whether the radio-button is disabled. */\n  async isDisabled(): Promise<boolean> {\n    const input = await this._input();\n    const disabled = await input.getAttribute('disabled');\n\n    if (disabled !== null) {\n      return coerceBooleanProperty(disabled);\n    }\n\n    return (await input.getAttribute('aria-disabled')) === 'true';\n  }\n\n  /** Whether the radio-button is required. */\n  async isRequired(): Promise<boolean> {\n    const required = (await this._input()).getAttribute('required');\n    return coerceBooleanProperty(await required);\n  }\n\n  /** Gets the radio-button's name. */\n  async getName(): Promise<string | null> {\n    return (await this._input()).getAttribute('name');\n  }\n\n  /** Gets the radio-button's id. */\n  async getId(): Promise<string | null> {\n    return (await this.host()).getProperty<string>('id');\n  }\n\n  /**\n   * Gets the value of the radio-button. The radio-button value will be converted to a string.\n   *\n   * Note: This means that for radio-button's with an object as a value `[object Object]` is\n   * intentionally returned.\n   */\n  async getValue(): Promise<string | null> {\n    return (await this._input()).getProperty('value');\n  }\n\n  /** Gets the radio-button's label text. */\n  async getLabelText(): Promise<string> {\n    return (await this._textLabel()).text();\n  }\n\n  /** Focuses the radio-button. */\n  async focus(): Promise<void> {\n    return (await this._input()).focus();\n  }\n\n  /** Blurs the radio-button. */\n  async blur(): Promise<void> {\n    return (await this._input()).blur();\n  }\n\n  /** Whether the radio-button is focused. */\n  async isFocused(): Promise<boolean> {\n    return (await this._input()).isFocused();\n  }\n\n  /**\n   * Puts the radio-button in a checked state by clicking it if it is currently unchecked,\n   * or doing nothing if it is already checked.\n   */\n  async check(): Promise<void> {\n    if (!(await this.isChecked())) {\n      return (await this._clickLabel()).click();\n    }\n  }\n}\n"],"names":["MatRadioGroupHarness","ComponentHarness","hostSelector","_buttonClass","MatRadioButtonHarness","with","options","HarnessPredicate","addOption","name","_checkRadioGroupName","getName","hostName","_getGroupNameFromHost","radioNames","_getNamesFromRadioButtons","length","_checkRadioNamesInGroupEqual","Error","getId","host","getProperty","getCheckedRadioButton","radioButton","getRadioButtons","isChecked","getCheckedValue","checkedRadio","getValue","filter","locatorForAll","checkRadioButton","radioButtons","JSON","stringify","check","getAttribute","groupNames","radio","radioName","push","groupName","harness","indexOf","label","stringMatches","getLabelText","checked","_textLabel","locatorFor","_clickLabel","_input","coerceBooleanProperty","isDisabled","input","disabled","isRequired","required","text","focus","blur","isFocused","click"],"mappings":"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"}