{"version":3,"sources":["src/material/material-input-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","input","testing","cdk","formField","control","this","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","constructor","create","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","pop","length","push","__read","o","m","r","i","ar","error","__spread","arguments","concat","MatInputHarness","_super","with","options","HarnessPredicate","addOption","harness","stringMatches","getValue","placeholder","getPlaceholder","isDisabled","_a","host","getProperty","isRequired","isReadonly","getName","getType","fallback","_b","parallel","getAttribute","getId","focus","blur","isFocused","setValue","newValue","inputEl","clear","sendKeys","setInputValue","MatFormFieldControlHarness","hostSelector","MatNativeOptionHarness","_this","text","title","_c","getText","index","getIndex","isSelected","ComponentHarness","MatNativeSelectHarness","isMultiple","getOptions","filter","locatorForAll","selectOptions","optionIndexes","Error","slice","undefined","map","option","defineProperty"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/testing'), require('@angular/material/form-field/testing/control')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/input/testing', ['exports', '@angular/cdk/testing', '@angular/material/form-field/testing/control'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.input = global.ng.material.input || {}, global.ng.material.input.testing = {}), global.ng.cdk.testing, global.ng.material.formField.testing.control));\n}(this, (function (exports, testing, control) { 'use strict';\n\n    /*! *****************************************************************************\n    Copyright (c) Microsoft Corporation.\n\n    Permission to use, copy, modify, and/or distribute this software for any\n    purpose with or without fee is hereby granted.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n    PERFORMANCE OF THIS SOFTWARE.\n    ***************************************************************************** */\n    /* global Reflect, Promise */\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b)\n                if (Object.prototype.hasOwnProperty.call(b, p))\n                    d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    function __extends(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    }\n    var __assign = function () {\n        __assign = Object.assign || function __assign(t) {\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\n                s = arguments[i];\n                for (var p in s)\n                    if (Object.prototype.hasOwnProperty.call(s, p))\n                        t[p] = s[p];\n            }\n            return t;\n        };\n        return __assign.apply(this, arguments);\n    };\n    function __rest(s, e) {\n        var t = {};\n        for (var p in s)\n            if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                t[p] = s[p];\n        if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                    t[p[i]] = s[p[i]];\n            }\n        return t;\n    }\n    function __decorate(decorators, target, key, desc) {\n        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n        if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n            r = Reflect.decorate(decorators, target, key, desc);\n        else\n            for (var i = decorators.length - 1; i >= 0; i--)\n                if (d = decorators[i])\n                    r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n        return c > 3 && r && Object.defineProperty(target, key, r), r;\n    }\n    function __param(paramIndex, decorator) {\n        return function (target, key) { decorator(target, key, paramIndex); };\n    }\n    function __metadata(metadataKey, metadataValue) {\n        if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\")\n            return Reflect.metadata(metadataKey, metadataValue);\n    }\n    function __awaiter(thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try {\n                step(generator.next(value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function rejected(value) { try {\n                step(generator[\"throw\"](value));\n            }\n            catch (e) {\n                reject(e);\n            } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    }\n    function __generator(thisArg, body) {\n        var _ = { label: 0, sent: function () { if (t[0] & 1)\n                throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n        return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function () { return this; }), g;\n        function verb(n) { return function (v) { return step([n, v]); }; }\n        function step(op) {\n            if (f)\n                throw new TypeError(\"Generator is already executing.\");\n            while (_)\n                try {\n                    if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)\n                        return t;\n                    if (y = 0, t)\n                        op = [op[0] & 2, t.value];\n                    switch (op[0]) {\n                        case 0:\n                        case 1:\n                            t = op;\n                            break;\n                        case 4:\n                            _.label++;\n                            return { value: op[1], done: false };\n                        case 5:\n                            _.label++;\n                            y = op[1];\n                            op = [0];\n                            continue;\n                        case 7:\n                            op = _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                        default:\n                            if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                                _ = 0;\n                                continue;\n                            }\n                            if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {\n                                _.label = op[1];\n                                break;\n                            }\n                            if (op[0] === 6 && _.label < t[1]) {\n                                _.label = t[1];\n                                t = op;\n                                break;\n                            }\n                            if (t && _.label < t[2]) {\n                                _.label = t[2];\n                                _.ops.push(op);\n                                break;\n                            }\n                            if (t[2])\n                                _.ops.pop();\n                            _.trys.pop();\n                            continue;\n                    }\n                    op = body.call(thisArg, _);\n                }\n                catch (e) {\n                    op = [6, e];\n                    y = 0;\n                }\n                finally {\n                    f = t = 0;\n                }\n            if (op[0] & 5)\n                throw op[1];\n            return { value: op[0] ? op[1] : void 0, done: true };\n        }\n    }\n    var __createBinding = Object.create ? (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });\n    }) : (function (o, m, k, k2) {\n        if (k2 === undefined)\n            k2 = k;\n        o[k2] = m[k];\n    });\n    function __exportStar(m, o) {\n        for (var p in m)\n            if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p))\n                __createBinding(o, m, p);\n    }\n    function __values(o) {\n        var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n        if (m)\n            return m.call(o);\n        if (o && typeof o.length === \"number\")\n            return {\n                next: function () {\n                    if (o && i >= o.length)\n                        o = void 0;\n                    return { value: o && o[i++], done: !o };\n                }\n            };\n        throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n    }\n    function __read(o, n) {\n        var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n        if (!m)\n            return o;\n        var i = m.call(o), r, ar = [], e;\n        try {\n            while ((n === void 0 || n-- > 0) && !(r = i.next()).done)\n                ar.push(r.value);\n        }\n        catch (error) {\n            e = { error: error };\n        }\n        finally {\n            try {\n                if (r && !r.done && (m = i[\"return\"]))\n                    m.call(i);\n            }\n            finally {\n                if (e)\n                    throw e.error;\n            }\n        }\n        return ar;\n    }\n    /** @deprecated */\n    function __spread() {\n        for (var ar = [], i = 0; i < arguments.length; i++)\n            ar = ar.concat(__read(arguments[i]));\n        return ar;\n    }\n    /** @deprecated */\n    function __spreadArrays() {\n        for (var s = 0, i = 0, il = arguments.length; i < il; i++)\n            s += arguments[i].length;\n        for (var r = Array(s), k = 0, i = 0; i < il; i++)\n            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n                r[k] = a[j];\n        return r;\n    }\n    function __spreadArray(to, from) {\n        for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n            to[j] = from[i];\n        return to;\n    }\n    function __await(v) {\n        return this instanceof __await ? (this.v = v, this) : new __await(v);\n    }\n    function __asyncGenerator(thisArg, _arguments, generator) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var g = generator.apply(thisArg, _arguments || []), i, q = [];\n        return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n        function verb(n) { if (g[n])\n            i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n        function resume(n, v) { try {\n            step(g[n](v));\n        }\n        catch (e) {\n            settle(q[0][3], e);\n        } }\n        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n        function fulfill(value) { resume(\"next\", value); }\n        function reject(value) { resume(\"throw\", value); }\n        function settle(f, v) { if (f(v), q.shift(), q.length)\n            resume(q[0][0], q[0][1]); }\n    }\n    function __asyncDelegator(o) {\n        var i, p;\n        return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\n    }\n    function __asyncValues(o) {\n        if (!Symbol.asyncIterator)\n            throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n        var m = o[Symbol.asyncIterator], i;\n        return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }\n    }\n    function __makeTemplateObject(cooked, raw) {\n        if (Object.defineProperty) {\n            Object.defineProperty(cooked, \"raw\", { value: raw });\n        }\n        else {\n            cooked.raw = raw;\n        }\n        return cooked;\n    }\n    ;\n    var __setModuleDefault = Object.create ? (function (o, v) {\n        Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    }) : function (o, v) {\n        o[\"default\"] = v;\n    };\n    function __importStar(mod) {\n        if (mod && mod.__esModule)\n            return mod;\n        var result = {};\n        if (mod != null)\n            for (var k in mod)\n                if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k))\n                    __createBinding(result, mod, k);\n        __setModuleDefault(result, mod);\n        return result;\n    }\n    function __importDefault(mod) {\n        return (mod && mod.__esModule) ? mod : { default: mod };\n    }\n    function __classPrivateFieldGet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to get private field on non-instance\");\n        }\n        return privateMap.get(receiver);\n    }\n    function __classPrivateFieldSet(receiver, privateMap, value) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError(\"attempted to set private field on non-instance\");\n        }\n        privateMap.set(receiver, value);\n        return value;\n    }\n\n    /** Harness for interacting with a standard Material inputs in tests. */\n    var MatInputHarness = /** @class */ (function (_super) {\n        __extends(MatInputHarness, _super);\n        function MatInputHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatInputHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which input instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatInputHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatInputHarness, options)\n                .addOption('value', options.value, function (harness, value) {\n                return testing.HarnessPredicate.stringMatches(harness.getValue(), value);\n            })\n                .addOption('placeholder', options.placeholder, function (harness, placeholder) {\n                return testing.HarnessPredicate.stringMatches(harness.getPlaceholder(), placeholder);\n            });\n        };\n        /** Whether the input is disabled. */\n        MatInputHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('disabled')];\n                    }\n                });\n            });\n        };\n        /** Whether the input is required. */\n        MatInputHarness.prototype.isRequired = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('required')];\n                    }\n                });\n            });\n        };\n        /** Whether the input is readonly. */\n        MatInputHarness.prototype.isReadonly = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('readOnly')];\n                    }\n                });\n            });\n        };\n        /** Gets the value of the input. */\n        MatInputHarness.prototype.getValue = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getProperty('value')];\n                        case 2: \n                        // The \"value\" property of the native input is never undefined.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        /** Gets the name of the input. */\n        MatInputHarness.prototype.getName = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getProperty('name')];\n                        case 2: \n                        // The \"name\" property of the native input is never undefined.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        /**\n         * Gets the type of the input. Returns \"textarea\" if the input is\n         * a textarea.\n         */\n        MatInputHarness.prototype.getType = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getProperty('type')];\n                        case 2: \n                        // The \"type\" property of the native input is never undefined.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        /** Gets the placeholder of the input. */\n        MatInputHarness.prototype.getPlaceholder = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var host, _a, nativePlaceholder, fallback;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            host = _b.sent();\n                            return [4 /*yield*/, testing.parallel(function () { return [\n                                    host.getProperty('placeholder'),\n                                    host.getAttribute('data-placeholder')\n                                ]; })];\n                        case 2:\n                            _a = __read.apply(void 0, [_b.sent(), 2]), nativePlaceholder = _a[0], fallback = _a[1];\n                            return [2 /*return*/, nativePlaceholder || fallback || ''];\n                    }\n                });\n            });\n        };\n        /** Gets the id of the input. */\n        MatInputHarness.prototype.getId = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getProperty('id')];\n                        case 2: \n                        // The input directive always assigns a unique id to the input in\n                        // case no id has been explicitly specified.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        /**\n         * Focuses the input and returns a promise that indicates when the\n         * action is complete.\n         */\n        MatInputHarness.prototype.focus = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).focus()];\n                    }\n                });\n            });\n        };\n        /**\n         * Blurs the input and returns a promise that indicates when the\n         * action is complete.\n         */\n        MatInputHarness.prototype.blur = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).blur()];\n                    }\n                });\n            });\n        };\n        /** Whether the input is focused. */\n        MatInputHarness.prototype.isFocused = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).isFocused()];\n                    }\n                });\n            });\n        };\n        /**\n         * Sets the value of the input. The value will be set by simulating\n         * keypresses that correspond to the given value.\n         */\n        MatInputHarness.prototype.setValue = function (newValue) {\n            return __awaiter(this, void 0, void 0, function () {\n                var inputEl;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            inputEl = _a.sent();\n                            return [4 /*yield*/, inputEl.clear()];\n                        case 2:\n                            _a.sent();\n                            if (!newValue) return [3 /*break*/, 4];\n                            return [4 /*yield*/, inputEl.sendKeys(newValue)];\n                        case 3:\n                            _a.sent();\n                            _a.label = 4;\n                        case 4:\n                            if (!inputEl.setInputValue) return [3 /*break*/, 6];\n                            return [4 /*yield*/, inputEl.setInputValue(newValue)];\n                        case 5:\n                            _a.sent();\n                            _a.label = 6;\n                        case 6: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatInputHarness;\n    }(control.MatFormFieldControlHarness));\n    // TODO: We do not want to handle `select` elements with `matNativeControl` because\n    // not all methods of this harness work reasonably for native select elements.\n    // For more details. See: https://github.com/angular/components/pull/18221.\n    MatInputHarness.hostSelector = '[matInput], input[matNativeControl], textarea[matNativeControl]';\n\n    /** Harness for interacting with a native `option` in tests. */\n    var MatNativeOptionHarness = /** @class */ (function (_super) {\n        __extends(MatNativeOptionHarness, _super);\n        function MatNativeOptionHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatNativeOptionHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which option instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatNativeOptionHarness.with = function (options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatNativeOptionHarness, options)\n                .addOption('text', options.text, function (harness, title) { return __awaiter(_this, void 0, void 0, function () { var _a, _b; return __generator(this, function (_c) {\n                switch (_c.label) {\n                    case 0:\n                        _b = (_a = testing.HarnessPredicate).stringMatches;\n                        return [4 /*yield*/, harness.getText()];\n                    case 1: return [2 /*return*/, _b.apply(_a, [_c.sent(), title])];\n                }\n            }); }); })\n                .addOption('index', options.index, function (harness, index) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0: return [4 /*yield*/, harness.getIndex()];\n                    case 1: return [2 /*return*/, (_a.sent()) === index];\n                }\n            }); }); })\n                .addOption('isSelected', options.isSelected, function (harness, isSelected) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0: return [4 /*yield*/, harness.isSelected()];\n                    case 1: return [2 /*return*/, (_a.sent()) === isSelected];\n                }\n            }); }); });\n        };\n        /** Gets the option's label text. */\n        MatNativeOptionHarness.prototype.getText = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('label')];\n                    }\n                });\n            });\n        };\n        /** Index of the option within the native `select` element. */\n        MatNativeOptionHarness.prototype.getIndex = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('index')];\n                    }\n                });\n            });\n        };\n        /** Gets whether the option is disabled. */\n        MatNativeOptionHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('disabled')];\n                    }\n                });\n            });\n        };\n        /** Gets whether the option is selected. */\n        MatNativeOptionHarness.prototype.isSelected = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('selected')];\n                    }\n                });\n            });\n        };\n        return MatNativeOptionHarness;\n    }(testing.ComponentHarness));\n    /** Selector used to locate option instances. */\n    MatNativeOptionHarness.hostSelector = 'select[matNativeControl] option';\n\n    /** Harness for interacting with a native `select` in tests. */\n    var MatNativeSelectHarness = /** @class */ (function (_super) {\n        __extends(MatNativeSelectHarness, _super);\n        function MatNativeSelectHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatNativeSelectHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which select instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatNativeSelectHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatNativeSelectHarness, options);\n        };\n        /** Gets a boolean promise indicating if the select is disabled. */\n        MatNativeSelectHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('disabled')];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the select is required. */\n        MatNativeSelectHarness.prototype.isRequired = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('required')];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the select is in multi-selection mode. */\n        MatNativeSelectHarness.prototype.isMultiple = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).getProperty('multiple')];\n                    }\n                });\n            });\n        };\n        /** Gets the name of the select. */\n        MatNativeSelectHarness.prototype.getName = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getProperty('name')];\n                        case 2: \n                        // The \"name\" property of the native select is never undefined.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        /** Gets the id of the select. */\n        MatNativeSelectHarness.prototype.getId = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).getProperty('id')];\n                        case 2: \n                        // We're guaranteed to have an id, because the `matNativeControl` always assigns one.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        /** Focuses the select and returns a void promise that indicates when the action is complete. */\n        MatNativeSelectHarness.prototype.focus = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).focus()];\n                    }\n                });\n            });\n        };\n        /** Blurs the select and returns a void promise that indicates when the action is complete. */\n        MatNativeSelectHarness.prototype.blur = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).blur()];\n                    }\n                });\n            });\n        };\n        /** Whether the select is focused. */\n        MatNativeSelectHarness.prototype.isFocused = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1: return [2 /*return*/, (_a.sent()).isFocused()];\n                    }\n                });\n            });\n        };\n        /** Gets the options inside the select panel. */\n        MatNativeSelectHarness.prototype.getOptions = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this.locatorForAll(MatNativeOptionHarness.with(filter))()];\n                });\n            });\n        };\n        /**\n         * Selects 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        MatNativeSelectHarness.prototype.selectOptions = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, isMultiple, options, _b, host, optionIndexes;\n                var _this = this;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0: return [4 /*yield*/, testing.parallel(function () {\n                                return [_this.isMultiple(), _this.getOptions(filter)];\n                            })];\n                        case 1:\n                            _a = __read.apply(void 0, [_c.sent(), 2]), isMultiple = _a[0], options = _a[1];\n                            if (options.length === 0) {\n                                throw Error('Select does not have options matching the specified filter');\n                            }\n                            return [4 /*yield*/, testing.parallel(function () { return [\n                                    _this.host(),\n                                    testing.parallel(function () { return options.slice(0, isMultiple ? undefined : 1).map(function (option) { return option.getIndex(); }); })\n                                ]; })];\n                        case 2:\n                            _b = __read.apply(void 0, [_c.sent(), 2]), host = _b[0], optionIndexes = _b[1];\n                            // @breaking-change 12.0.0 Error can be removed once `selectOptions` is a required method.\n                            if (!host.selectOptions) {\n                                throw Error('TestElement implementation does not support the selectOptions ' +\n                                    'method which is required for this function.');\n                            }\n                            return [4 /*yield*/, host.selectOptions.apply(host, __spread(optionIndexes))];\n                        case 3:\n                            _c.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatNativeSelectHarness;\n    }(control.MatFormFieldControlHarness));\n    MatNativeSelectHarness.hostSelector = 'select[matNativeControl]';\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    /**\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    exports.MatInputHarness = MatInputHarness;\n    exports.MatNativeOptionHarness = MatNativeOptionHarness;\n    exports.MatNativeSelectHarness = MatNativeSelectHarness;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-input-testing.umd.js.map\n"]}