import { __awaiter } from 'tslib'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { ComponentHarness, HarnessPredicate } from '@angular/cdk/testing'; /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ class _MatRadioGroupHarnessBase extends ComponentHarness { /** Gets the name of the radio-group. */ getName() { return __awaiter(this, void 0, void 0, function* () { const hostName = yield this._getGroupNameFromHost(); // It's not possible to always determine the "name" of a radio-group by reading // the attribute. This is because the radio-group does not set the "name" as an // element attribute if the "name" value is set through a binding. if (hostName !== null) { return hostName; } // In case we couldn't determine the "name" of a radio-group by reading the // "name" attribute, we try to determine the "name" of the group by going // through all radio buttons. const radioNames = yield this._getNamesFromRadioButtons(); if (!radioNames.length) { return null; } if (!this._checkRadioNamesInGroupEqual(radioNames)) { throw Error('Radio buttons in radio-group have mismatching names.'); } return radioNames[0]; }); } /** Gets the id of the radio-group. */ getId() { return __awaiter(this, void 0, void 0, function* () { return (yield this.host()).getProperty('id'); }); } /** Gets the checked radio-button in a radio-group. */ getCheckedRadioButton() { return __awaiter(this, void 0, void 0, function* () { for (let radioButton of yield this.getRadioButtons()) { if (yield radioButton.isChecked()) { return radioButton; } } return null; }); } /** Gets the checked value of the radio-group. */ getCheckedValue() { return __awaiter(this, void 0, void 0, function* () { const checkedRadio = yield this.getCheckedRadioButton(); if (!checkedRadio) { return null; } return checkedRadio.getValue(); }); } /** * Gets a list of radio buttons which are part of the radio-group. * @param filter Optionally filters which radio buttons are included. */ getRadioButtons(filter) { return __awaiter(this, void 0, void 0, function* () { return this.locatorForAll(this._buttonClass.with(filter))(); }); } /** * Checks a radio button in this group. * @param filter An optional filter to apply to the child radio buttons. The first tab matching * the filter will be selected. */ checkRadioButton(filter) { return __awaiter(this, void 0, void 0, function* () { const radioButtons = yield this.getRadioButtons(filter); if (!radioButtons.length) { throw Error(`Could not find radio button matching ${JSON.stringify(filter)}`); } return radioButtons[0].check(); }); } /** Gets the name attribute of the host element. */ _getGroupNameFromHost() { return __awaiter(this, void 0, void 0, function* () { return (yield this.host()).getAttribute('name'); }); } /** Gets a list of the name attributes of all child radio buttons. */ _getNamesFromRadioButtons() { return __awaiter(this, void 0, void 0, function* () { const groupNames = []; for (let radio of yield this.getRadioButtons()) { const radioName = yield radio.getName(); if (radioName !== null) { groupNames.push(radioName); } } return groupNames; }); } /** Checks if the specified radio names are all equal. */ _checkRadioNamesInGroupEqual(radioNames) { let groupName = null; for (let radioName of radioNames) { if (groupName === null) { groupName = radioName; } else if (groupName !== radioName) { return false; } } return true; } /** * Checks if a radio-group harness has the given name. Throws if a radio-group with * matching name could be found but has mismatching radio-button names. */ static _checkRadioGroupName(harness, name) { return __awaiter(this, void 0, void 0, function* () { // Check if there is a radio-group which has the "name" attribute set // to the expected group name. It's not possible to always determine // the "name" of a radio-group by reading the attribute. This is because // the radio-group does not set the "name" as an element attribute if the // "name" value is set through a binding. if ((yield harness._getGroupNameFromHost()) === name) { return true; } // Check if there is a group with radio-buttons that all have the same // expected name. This implies that the group has the given name. It's // not possible to always determine the name of a radio-group through // the attribute because there is const radioNames = yield harness._getNamesFromRadioButtons(); if (radioNames.indexOf(name) === -1) { return false; } if (!harness._checkRadioNamesInGroupEqual(radioNames)) { throw Error(`The locator found a radio-group with name "${name}", but some ` + `radio-button's within the group have mismatching names, which is invalid.`); } return true; }); } } /** Harness for interacting with a standard mat-radio-group in tests. */ class MatRadioGroupHarness extends _MatRadioGroupHarnessBase { constructor() { super(...arguments); this._buttonClass = MatRadioButtonHarness; } /** * Gets a `HarnessPredicate` that can be used to search for a `MatRadioGroupHarness` that meets * certain criteria. * @param options Options for filtering which radio group instances are considered a match. * @return a `HarnessPredicate` configured with the given options. */ static with(options = {}) { return new HarnessPredicate(MatRadioGroupHarness, options) .addOption('name', options.name, this._checkRadioGroupName); } } /** The selector for the host element of a `MatRadioGroup` instance. */ MatRadioGroupHarness.hostSelector = '.mat-radio-group'; class _MatRadioButtonHarnessBase extends ComponentHarness { constructor() { super(...arguments); this._input = this.locatorFor('input'); } /** Whether the radio-button is checked. */ isChecked() { return __awaiter(this, void 0, void 0, function* () { const checked = (yield this._input()).getProperty('checked'); return coerceBooleanProperty(yield checked); }); } /** Whether the radio-button is disabled. */ isDisabled() { return __awaiter(this, void 0, void 0, function* () { const disabled = (yield this._input()).getAttribute('disabled'); return coerceBooleanProperty(yield disabled); }); } /** Whether the radio-button is required. */ isRequired() { return __awaiter(this, void 0, void 0, function* () { const required = (yield this._input()).getAttribute('required'); return coerceBooleanProperty(yield required); }); } /** Gets the radio-button's name. */ getName() { return __awaiter(this, void 0, void 0, function* () { return (yield this._input()).getAttribute('name'); }); } /** Gets the radio-button's id. */ getId() { return __awaiter(this, void 0, void 0, function* () { return (yield this.host()).getProperty('id'); }); } /** * Gets the value of the radio-button. The radio-button value will be converted to a string. * * Note: This means that for radio-button's with an object as a value `[object Object]` is * intentionally returned. */ getValue() { return __awaiter(this, void 0, void 0, function* () { return (yield this._input()).getProperty('value'); }); } /** Gets the radio-button's label text. */ getLabelText() { return __awaiter(this, void 0, void 0, function* () { return (yield this._textLabel()).text(); }); } /** Focuses the radio-button. */ focus() { return __awaiter(this, void 0, void 0, function* () { return (yield this._input()).focus(); }); } /** Blurs the radio-button. */ blur() { return __awaiter(this, void 0, void 0, function* () { return (yield this._input()).blur(); }); } /** Whether the radio-button is focused. */ isFocused() { return __awaiter(this, void 0, void 0, function* () { return (yield this._input()).isFocused(); }); } /** * Puts the radio-button in a checked state by clicking it if it is currently unchecked, * or doing nothing if it is already checked. */ check() { return __awaiter(this, void 0, void 0, function* () { if (!(yield this.isChecked())) { return (yield this._clickLabel()).click(); } }); } } /** Harness for interacting with a standard mat-radio-button in tests. */ class MatRadioButtonHarness extends _MatRadioButtonHarnessBase { constructor() { super(...arguments); this._textLabel = this.locatorFor('.mat-radio-label-content'); this._clickLabel = this.locatorFor('.mat-radio-label'); } /** * Gets a `HarnessPredicate` that can be used to search for a `MatRadioButtonHarness` that meets * certain criteria. * @param options Options for filtering which radio button instances are considered a match. * @return a `HarnessPredicate` configured with the given options. */ static with(options = {}) { return new HarnessPredicate(MatRadioButtonHarness, options) .addOption('label', options.label, (harness, label) => HarnessPredicate.stringMatches(harness.getLabelText(), label)) .addOption('name', options.name, (harness, name) => __awaiter(this, void 0, void 0, function* () { return (yield harness.getName()) === name; })); } } /** The selector for the host element of a `MatRadioButton` instance. */ MatRadioButtonHarness.hostSelector = '.mat-radio-button'; /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ export { MatRadioButtonHarness, MatRadioGroupHarness, _MatRadioButtonHarnessBase, _MatRadioGroupHarnessBase }; //# sourceMappingURL=testing.js.map