{"version":3,"sources":["src/material/material-select-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","select","testing","cdk","formField","control","core","this","testing$1","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","_MatSelectHarnessBase","_super","_this","_documentRootLocator","documentRootLocatorFactory","_backdrop","locatorFor","isDisabled","_a","host","hasClass","_prefix","isValid","isRequired","isEmpty","isMultiple","getValueText","text","focus","blur","isFocused","getOptions","filter","_b","_c","_d","_e","_f","_g","_h","_j","locatorForAll","_optionClass","with","assign","_getPanelSelector","ancestor","getOptionGroups","_optionGroupClass","isOpen","locatorForOptional","open","click","clickOptions","options","parallel","Error","map","option","close","getAttribute","MatFormFieldControlHarness","MatSelectHarness","MatOptionHarness","MatOptgroupHarness","HarnessPredicate","hostSelector","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'), require('@angular/material/core/testing')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/select/testing', ['exports', '@angular/cdk/testing', '@angular/material/form-field/testing/control', '@angular/material/core/testing'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.select = global.ng.material.select || {}, global.ng.material.select.testing = {}), global.ng.cdk.testing, global.ng.material.formField.testing.control, global.ng.material.core.testing));\n}(this, (function (exports, testing, control, testing$1) { '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    var _MatSelectHarnessBase = /** @class */ (function (_super) {\n        __extends(_MatSelectHarnessBase, _super);\n        function _MatSelectHarnessBase() {\n            var _this = _super.apply(this, __spread(arguments)) || this;\n            _this._documentRootLocator = _this.documentRootLocatorFactory();\n            _this._backdrop = _this._documentRootLocator.locatorFor('.cdk-overlay-backdrop');\n            return _this;\n        }\n        /** Gets a boolean promise indicating if the select is disabled. */\n        _MatSelectHarnessBase.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()).hasClass(this._prefix + \"-select-disabled\")];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the select is valid. */\n        _MatSelectHarnessBase.prototype.isValid = 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()).hasClass('ng-invalid')];\n                        case 2: return [2 /*return*/, !(_a.sent())];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the select is required. */\n        _MatSelectHarnessBase.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()).hasClass(this._prefix + \"-select-required\")];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the select is empty (no value is selected). */\n        _MatSelectHarnessBase.prototype.isEmpty = 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()).hasClass(this._prefix + \"-select-empty\")];\n                    }\n                });\n            });\n        };\n        /** Gets a boolean promise indicating if the select is in multi-selection mode. */\n        _MatSelectHarnessBase.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()).hasClass(this._prefix + \"-select-multiple\")];\n                    }\n                });\n            });\n        };\n        /** Gets a promise for the select's value text. */\n        _MatSelectHarnessBase.prototype.getValueText = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var value;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.locatorFor(\".\" + this._prefix + \"-select-value\")()];\n                        case 1:\n                            value = _a.sent();\n                            return [2 /*return*/, value.text()];\n                    }\n                });\n            });\n        };\n        /** Focuses the select and returns a void promise that indicates when the action is complete. */\n        _MatSelectHarnessBase.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        _MatSelectHarnessBase.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        _MatSelectHarnessBase.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        _MatSelectHarnessBase.prototype.getOptions = function (filter) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, _b, _c, _d, _e, _f, _g, _h;\n                return __generator(this, function (_j) {\n                    switch (_j.label) {\n                        case 0:\n                            _b = (_a = this._documentRootLocator).locatorForAll;\n                            _d = (_c = this._optionClass).with;\n                            _f = (_e = Object).assign;\n                            _g = [Object.assign({}, (filter || {}))];\n                            _h = {};\n                            return [4 /*yield*/, this._getPanelSelector()];\n                        case 1: return [2 /*return*/, _b.apply(_a, [_d.apply(_c, [_f.apply(_e, _g.concat([(_h.ancestor = _j.sent(), _h)]))])])()];\n                    }\n                });\n            });\n        };\n        /** Gets the groups of options inside the panel. */\n        _MatSelectHarnessBase.prototype.getOptionGroups = function (filter) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, _b, _c, _d, _e, _f, _g, _h;\n                return __generator(this, function (_j) {\n                    switch (_j.label) {\n                        case 0:\n                            _b = (_a = this._documentRootLocator).locatorForAll;\n                            _d = (_c = this._optionGroupClass).with;\n                            _f = (_e = Object).assign;\n                            _g = [Object.assign({}, (filter || {}))];\n                            _h = {};\n                            return [4 /*yield*/, this._getPanelSelector()];\n                        case 1: return [2 /*return*/, _b.apply(_a, [_d.apply(_c, [_f.apply(_e, _g.concat([(_h.ancestor = _j.sent(), _h)]))])])()];\n                    }\n                });\n            });\n        };\n        /** Gets whether the select is open. */\n        _MatSelectHarnessBase.prototype.isOpen = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, _b;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0:\n                            _b = (_a = this._documentRootLocator).locatorForOptional;\n                            return [4 /*yield*/, this._getPanelSelector()];\n                        case 1: return [4 /*yield*/, _b.apply(_a, [_c.sent()])()];\n                        case 2: return [2 /*return*/, !!(_c.sent())];\n                    }\n                });\n            });\n        };\n        /** Opens the select's panel. */\n        _MatSelectHarnessBase.prototype.open = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var trigger;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.isOpen()];\n                        case 1:\n                            if (!!(_a.sent())) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.locatorFor(\".\" + this._prefix + \"-select-trigger\")()];\n                        case 2:\n                            trigger = _a.sent();\n                            return [2 /*return*/, trigger.click()];\n                        case 3: return [2 /*return*/];\n                    }\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        _MatSelectHarnessBase.prototype.clickOptions = function (filter) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, isMultiple, options;\n                var _this = this;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.open()];\n                        case 1:\n                            _b.sent();\n                            return [4 /*yield*/, testing.parallel(function () { return [_this.isMultiple(), _this.getOptions(filter)]; })];\n                        case 2:\n                            _a = __read.apply(void 0, [_b.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                            if (!isMultiple) return [3 /*break*/, 4];\n                            return [4 /*yield*/, testing.parallel(function () { return options.map(function (option) { return option.click(); }); })];\n                        case 3:\n                            _b.sent();\n                            return [3 /*break*/, 6];\n                        case 4: return [4 /*yield*/, options[0].click()];\n                        case 5:\n                            _b.sent();\n                            _b.label = 6;\n                        case 6: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Closes the select's panel. */\n        _MatSelectHarnessBase.prototype.close = 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.isOpen()];\n                        case 1:\n                            if (!_a.sent()) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this._backdrop()];\n                        case 2: \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 [2 /*return*/, (_a.sent()).click()];\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Gets the selector that should be used to find this select's panel. */\n        _MatSelectHarnessBase.prototype._getPanelSelector = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var id;\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()).getAttribute('id')];\n                        case 2:\n                            id = _a.sent();\n                            return [2 /*return*/, \"#\" + id + \"-panel\"];\n                    }\n                });\n            });\n        };\n        return _MatSelectHarnessBase;\n    }(control.MatFormFieldControlHarness));\n    /** Harness for interacting with a standard mat-select in tests. */\n    var MatSelectHarness = /** @class */ (function (_super) {\n        __extends(MatSelectHarness, _super);\n        function MatSelectHarness() {\n            var _this = _super.apply(this, __spread(arguments)) || this;\n            _this._prefix = 'mat';\n            _this._optionClass = testing$1.MatOptionHarness;\n            _this._optionGroupClass = testing$1.MatOptgroupHarness;\n            return _this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatSelectHarness` 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        MatSelectHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatSelectHarness, options);\n        };\n        return MatSelectHarness;\n    }(_MatSelectHarnessBase));\n    MatSelectHarness.hostSelector = '.mat-select';\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.MatSelectHarness = MatSelectHarness;\n    exports._MatSelectHarnessBase = _MatSelectHarnessBase;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-select-testing.umd.js.map\n"]}