{"version":3,"sources":["src/material/material-chips-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","chips","testing","cdk","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","MatChipRemoveHarness","_super","arguments","with","options","HarnessPredicate","click","_a","host","ComponentHarness","hostSelector","MatChipHarness","_this","addOption","text","harness","stringMatches","getText","selected","isSelected","exclude","hasClass","isDisabled","select","toggle","deselect","sendKeys","remove","TestKey","DELETE","getRemoveButton","filter","locatorFor","MatChipInputHarness","getValue","placeholder","getPlaceholder","getProperty","isRequired","focus","blur","isFocused","setValue","newValue","inputEl","clear","sendSeparatorKey","key","_MatChipListHarnessBase","getAttribute","isInvalid","isMultiple","getOrientation","MatChipListHarness","getChips","locatorForAll","selectChips","Error","JSON","stringify","parallel","map","chip","getInput","inputId","documentRootLocatorFactory","assign","selector","MatChipOptionHarness","MatChipListboxHarness","defineProperty"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/testing')) :\n    typeof define === 'function' && define.amd ? define('@angular/material/chips/testing', ['exports', '@angular/cdk/testing'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.chips = global.ng.material.chips || {}, global.ng.material.chips.testing = {}), global.ng.cdk.testing));\n}(this, (function (exports, testing) { '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 chip remove button in tests. */\n    var MatChipRemoveHarness = /** @class */ (function (_super) {\n        __extends(MatChipRemoveHarness, _super);\n        function MatChipRemoveHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatChipRemoveHarness` 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        MatChipRemoveHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatChipRemoveHarness, options);\n        };\n        /** Clicks the remove button. */\n        MatChipRemoveHarness.prototype.click = 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()).click()];\n                    }\n                });\n            });\n        };\n        return MatChipRemoveHarness;\n    }(testing.ComponentHarness));\n    MatChipRemoveHarness.hostSelector = '.mat-chip-remove';\n\n    /** Harness for interacting with a standard selectable Angular Material chip in tests. */\n    var MatChipHarness = /** @class */ (function (_super) {\n        __extends(MatChipHarness, _super);\n        function MatChipHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatChipHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which chip instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatChipHarness.with = function (options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatChipHarness, options)\n                .addOption('text', options.text, function (harness, label) { return testing.HarnessPredicate.stringMatches(harness.getText(), label); })\n                .addOption('selected', options.selected, function (harness, selected) { 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()) === selected];\n                }\n            }); }); });\n        };\n        /** Gets the text of the chip. */\n        MatChipHarness.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()).text({\n                                exclude: '.mat-chip-avatar, .mat-chip-trailing-icon, .mat-icon'\n                            })];\n                    }\n                });\n            });\n        };\n        /**\n         * Whether the chip is selected.\n         * @deprecated Use `MatChipOptionHarness.isSelected` instead.\n         * @breaking-change 12.0.0\n         */\n        MatChipHarness.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()).hasClass('mat-chip-selected')];\n                    }\n                });\n            });\n        };\n        /** Whether the chip is disabled. */\n        MatChipHarness.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('mat-chip-disabled')];\n                    }\n                });\n            });\n        };\n        /**\n         * Selects the given chip. Only applies if it's selectable.\n         * @deprecated Use `MatChipOptionHarness.select` instead.\n         * @breaking-change 12.0.0\n         */\n        MatChipHarness.prototype.select = 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.isSelected()];\n                        case 1:\n                            if (!!(_a.sent())) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.toggle()];\n                        case 2:\n                            _a.sent();\n                            _a.label = 3;\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /**\n         * Deselects the given chip. Only applies if it's selectable.\n         * @deprecated Use `MatChipOptionHarness.deselect` instead.\n         * @breaking-change 12.0.0\n         */\n        MatChipHarness.prototype.deselect = 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.isSelected()];\n                        case 1:\n                            if (!_a.sent()) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.toggle()];\n                        case 2:\n                            _a.sent();\n                            _a.label = 3;\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /**\n         * Toggles the selected state of the given chip. Only applies if it's selectable.\n         * @deprecated Use `MatChipOptionHarness.toggle` instead.\n         * @breaking-change 12.0.0\n         */\n        MatChipHarness.prototype.toggle = 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()).sendKeys(' ')];\n                    }\n                });\n            });\n        };\n        /** Removes the given chip. Only applies if it's removable. */\n        MatChipHarness.prototype.remove = 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()).sendKeys(testing.TestKey.DELETE)];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /**\n         * Gets the remove button inside of a chip.\n         * @param filter Optionally filters which chips are included.\n         */\n        MatChipHarness.prototype.getRemoveButton = 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.locatorFor(MatChipRemoveHarness.with(filter))()];\n                });\n            });\n        };\n        return MatChipHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatChip` instance. */\n    MatChipHarness.hostSelector = '.mat-chip';\n\n    /** Harness for interacting with a standard Material chip inputs in tests. */\n    var MatChipInputHarness = /** @class */ (function (_super) {\n        __extends(MatChipInputHarness, _super);\n        function MatChipInputHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatChipInputHarness` 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        MatChipInputHarness.with = function (options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatChipInputHarness, options)\n                .addOption('value', options.value, function (harness, value) { return __awaiter(_this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, harness.getValue()];\n                        case 1: return [2 /*return*/, (_a.sent()) === value];\n                    }\n                });\n            }); })\n                .addOption('placeholder', options.placeholder, function (harness, placeholder) { return __awaiter(_this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, harness.getPlaceholder()];\n                        case 1: return [2 /*return*/, (_a.sent()) === placeholder];\n                    }\n                });\n            }); });\n        };\n        /** Whether the input is disabled. */\n        MatChipInputHarness.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        MatChipInputHarness.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 the value of the input. */\n        MatChipInputHarness.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 placeholder of the input. */\n        MatChipInputHarness.prototype.getPlaceholder = 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('placeholder')];\n                        case 2: 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        MatChipInputHarness.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        MatChipInputHarness.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        MatChipInputHarness.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        MatChipInputHarness.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: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Sends a chip separator key to the input element. */\n        MatChipInputHarness.prototype.sendSeparatorKey = function (key) {\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 [2 /*return*/, inputEl.sendKeys(key)];\n                    }\n                });\n            });\n        };\n        return MatChipInputHarness;\n    }(testing.ComponentHarness));\n    MatChipInputHarness.hostSelector = '.mat-chip-input';\n\n    /** Base class for chip list harnesses. */\n    var _MatChipListHarnessBase = /** @class */ (function (_super) {\n        __extends(_MatChipListHarnessBase, _super);\n        function _MatChipListHarnessBase() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /** Gets whether the chip list is disabled. */\n        _MatChipListHarnessBase.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 [4 /*yield*/, (_a.sent()).getAttribute('aria-disabled')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Gets whether the chip list is required. */\n        _MatChipListHarnessBase.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 [4 /*yield*/, (_a.sent()).getAttribute('aria-required')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Gets whether the chip list is invalid. */\n        _MatChipListHarnessBase.prototype.isInvalid = 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()).getAttribute('aria-invalid')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Gets whether the chip list is in multi selection mode. */\n        _MatChipListHarnessBase.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 [4 /*yield*/, (_a.sent()).getAttribute('aria-multiselectable')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Gets whether the orientation of the chip list. */\n        _MatChipListHarnessBase.prototype.getOrientation = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var orientation;\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('aria-orientation')];\n                        case 2:\n                            orientation = _a.sent();\n                            return [2 /*return*/, orientation === 'vertical' ? 'vertical' : 'horizontal'];\n                    }\n                });\n            });\n        };\n        return _MatChipListHarnessBase;\n    }(testing.ComponentHarness));\n    /** Harness for interacting with a standard chip list in tests. */\n    var MatChipListHarness = /** @class */ (function (_super) {\n        __extends(MatChipListHarness, _super);\n        function MatChipListHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatChipListHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which chip list instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatChipListHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatChipListHarness, options);\n        };\n        /**\n         * Gets the list of chips inside the chip list.\n         * @param filter Optionally filters which chips are included.\n         */\n        MatChipListHarness.prototype.getChips = 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(MatChipHarness.with(filter))()];\n                });\n            });\n        };\n        /**\n         * Selects a chip inside the chip list.\n         * @param filter An optional filter to apply to the child chips.\n         *    All the chips matching the filter will be selected.\n         * @deprecated Use `MatChipListboxHarness.selectChips` instead.\n         * @breaking-change 12.0.0\n         */\n        MatChipListHarness.prototype.selectChips = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                var chips;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getChips(filter)];\n                        case 1:\n                            chips = _a.sent();\n                            if (!chips.length) {\n                                throw Error(\"Cannot find chip matching filter \" + JSON.stringify(filter));\n                            }\n                            return [4 /*yield*/, testing.parallel(function () { return chips.map(function (chip) { return chip.select(); }); })];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /**\n         * Gets the `MatChipInput` inside the chip list.\n         * @param filter Optionally filters which chip input is included.\n         */\n        MatChipListHarness.prototype.getInput = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                var inputId;\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('data-mat-chip-input')];\n                        case 2:\n                            inputId = _a.sent();\n                            if (!inputId) {\n                                throw Error(\"Chip list is not associated with an input\");\n                            }\n                            return [2 /*return*/, this.documentRootLocatorFactory().locatorFor(MatChipInputHarness.with(Object.assign(Object.assign({}, filter), { selector: \"#\" + inputId })))()];\n                    }\n                });\n            });\n        };\n        return MatChipListHarness;\n    }(_MatChipListHarnessBase));\n    /** The selector for the host element of a `MatChipList` instance. */\n    MatChipListHarness.hostSelector = '.mat-chip-list';\n\n    var MatChipOptionHarness = /** @class */ (function (_super) {\n        __extends(MatChipOptionHarness, _super);\n        function MatChipOptionHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatChipOptionHarness`\n         * that meets certain criteria.\n         * @param options Options for filtering which chip instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatChipOptionHarness.with = function (options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatChipOptionHarness, options)\n                .addOption('text', options.text, function (harness, label) { return testing.HarnessPredicate.stringMatches(harness.getText(), label); })\n                .addOption('selected', options.selected, function (harness, selected) { 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()) === selected];\n                }\n            }); }); });\n        };\n        /** Whether the chip is selected. */\n        MatChipOptionHarness.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()).hasClass('mat-chip-selected')];\n                    }\n                });\n            });\n        };\n        /** Selects the given chip. Only applies if it's selectable. */\n        MatChipOptionHarness.prototype.select = 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.isSelected()];\n                        case 1:\n                            if (!!(_a.sent())) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.toggle()];\n                        case 2:\n                            _a.sent();\n                            _a.label = 3;\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Deselects the given chip. Only applies if it's selectable. */\n        MatChipOptionHarness.prototype.deselect = 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.isSelected()];\n                        case 1:\n                            if (!_a.sent()) return [3 /*break*/, 3];\n                            return [4 /*yield*/, this.toggle()];\n                        case 2:\n                            _a.sent();\n                            _a.label = 3;\n                        case 3: return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Toggles the selected state of the given chip. */\n        MatChipOptionHarness.prototype.toggle = 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()).sendKeys(' ')];\n                    }\n                });\n            });\n        };\n        return MatChipOptionHarness;\n    }(MatChipHarness));\n    /** The selector for the host element of a selectable chip instance. */\n    MatChipOptionHarness.hostSelector = '.mat-chip';\n\n    /** Harness for interacting with a standard selectable chip list in tests. */\n    var MatChipListboxHarness = /** @class */ (function (_super) {\n        __extends(MatChipListboxHarness, _super);\n        function MatChipListboxHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatChipListHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which chip list instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatChipListboxHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatChipListboxHarness, options);\n        };\n        /**\n         * Gets the list of chips inside the chip list.\n         * @param filter Optionally filters which chips are included.\n         */\n        MatChipListboxHarness.prototype.getChips = 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(MatChipOptionHarness.with(filter))()];\n                });\n            });\n        };\n        /**\n         * Selects a chip inside the chip list.\n         * @param filter An optional filter to apply to the child chips.\n         *    All the chips matching the filter will be selected.\n         */\n        MatChipListboxHarness.prototype.selectChips = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                var chips;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getChips(filter)];\n                        case 1:\n                            chips = _a.sent();\n                            if (!chips.length) {\n                                throw Error(\"Cannot find chip matching filter \" + JSON.stringify(filter));\n                            }\n                            return [4 /*yield*/, testing.parallel(function () { return chips.map(function (chip) { return chip.select(); }); })];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatChipListboxHarness;\n    }(_MatChipListHarnessBase));\n    /** The selector for the host element of a `MatChipList` instance. */\n    MatChipListboxHarness.hostSelector = '.mat-chip-list';\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.MatChipHarness = MatChipHarness;\n    exports.MatChipInputHarness = MatChipInputHarness;\n    exports.MatChipListHarness = MatChipListHarness;\n    exports.MatChipListboxHarness = MatChipListboxHarness;\n    exports.MatChipOptionHarness = MatChipOptionHarness;\n    exports.MatChipRemoveHarness = MatChipRemoveHarness;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-chips-testing.umd.js.map\n"]}