{"version":3,"sources":["src/cdk/cdk-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","cdk","testing","rxjs","this","extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__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","TypeError","pop","length","push","__values","o","s","m","i","__read","r","ar","error","__spread","arguments","concat","autoChangeDetectionSubscription","autoChangeDetectionSubject","BehaviorSubject","isDisabled","defaultAutoChangeDetectionHandler","status","_a","onDetectChangesNow","handleAutoChangeDetectionStatus","handler","stopHandlingAutoChangeDetectionStatus","subscribe","unsubscribe","batchChangeDetection","fn","triggerBeforeAndAfter","_b","getValue","parallel","values","all","ComponentHarness","locatorFactory","host","rootElement","documentRootLocatorFactory","locatorFor","queries","_i","locatorForOptional","locatorForAll","forceStabilize","waitForTasksOutsideAngular","ContentContainerComponentHarness","_super","__extends","String","__","constructor","create","getChildLoader","selector","getRootHarnessLoader","getAllChildLoaders","getHarness","query","getAllHarnesses","rootHarnessLoader","HarnessPredicate","harnessType","options","_predicates","_descriptions","_addBaseOptions","stringMatches","pattern","test","add","description","predicate","addOption","name","option","undefined","_valueAsString","JSON","stringify","RegExp","toString","replace","item","filter","harnesses","results","_this","map","h","evaluate","harness","reduce","combined","current","getDescription","join","getSelector","_ancestor","hostSelector","trim","_splitAndEscapeSelector","ancestors","ancestorPlaceholders","_c","selectors","selectorPlaceholders","forEach","escapedAncestor","ancestor","_restoreSelector","escapedSelector","matchesSelector","placeholders","keep","replaceBy","split","part","index","TestKey","HarnessEnvironment","rawRootElement","createTestElement","createEnvironment","getDocumentRoot","_assertResultFound","_getAllHarnessesAndTestElements","_getDescriptionForLocatorForQueries","harnessLoaderFor","getAllRawElements","_getDescriptionForHarnessLoaderQuery","harnessLoaderForOptional","elements","harnessLoaderForAll","element","createComponentHarness","allQueries","harnessQueries","elementQueries","harnessTypes","rawElements","skipSelectorCheck","perElementMatches","_parseQueries","e_1","Set","queries_1","queries_1_1","e_1_1","size","rawElement","testElement","_getQueryResultForElement","_removeDuplicateQueryResults","testElementMatched","matchedHarnessTypes","dedupedMatches","results_1","results_1_1","e_2","has","e_2_1","queryDescriptions","Error","desc","_getDescriptionForTestElementQuery","_getDescriptionForComponentHarnessQuery","harnessPredicate","_getTextWithExcludedElements","excludeSelector","clone","cloneNode","exclusions","querySelectorAll","child","parentNode","removeChild","textContent","manualChangeDetection","defineProperty"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs')) :\n    typeof define === 'function' && define.amd ? define('@angular/cdk/testing', ['exports', 'rxjs'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.cdk = global.ng.cdk || {}, global.ng.cdk.testing = {}), global.rxjs));\n}(this, (function (exports, rxjs) { '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    /** Subject used to dispatch and listen for changes to the auto change detection status . */\n    var autoChangeDetectionSubject = new rxjs.BehaviorSubject({\n        isDisabled: false\n    });\n    /** The current subscription to `autoChangeDetectionSubject`. */\n    var autoChangeDetectionSubscription;\n    /**\n     * The default handler for auto change detection status changes. This handler will be used if the\n     * specific environment does not install its own.\n     * @param status The new auto change detection status.\n     */\n    function defaultAutoChangeDetectionHandler(status) {\n        var _a;\n        (_a = status.onDetectChangesNow) === null || _a === void 0 ? void 0 : _a.call(status);\n    }\n    /**\n     * Allows a test `HarnessEnvironment` to install its own handler for auto change detection status\n     * changes.\n     * @param handler The handler for the auto change detection status.\n     */\n    function handleAutoChangeDetectionStatus(handler) {\n        stopHandlingAutoChangeDetectionStatus();\n        autoChangeDetectionSubscription = autoChangeDetectionSubject.subscribe(handler);\n    }\n    /** Allows a `HarnessEnvironment` to stop handling auto change detection status changes. */\n    function stopHandlingAutoChangeDetectionStatus() {\n        autoChangeDetectionSubscription === null || autoChangeDetectionSubscription === void 0 ? void 0 : autoChangeDetectionSubscription.unsubscribe();\n        autoChangeDetectionSubscription = null;\n    }\n    /**\n     * Batches together triggering of change detection over the duration of the given function.\n     * @param fn The function to call with batched change detection.\n     * @param triggerBeforeAndAfter Optionally trigger change detection once before and after the batch\n     *   operation. If false, change detection will not be triggered.\n     * @return The result of the given function.\n     */\n    function batchChangeDetection(fn, triggerBeforeAndAfter) {\n        return __awaiter(this, void 0, void 0, function () {\n            return __generator(this, function (_b) {\n                switch (_b.label) {\n                    case 0:\n                        if (!autoChangeDetectionSubject.getValue().isDisabled) return [3 /*break*/, 2];\n                        return [4 /*yield*/, fn()];\n                    case 1: return [2 /*return*/, _b.sent()];\n                    case 2:\n                        // If nothing is handling change detection batching, install the default handler.\n                        if (!autoChangeDetectionSubscription) {\n                            handleAutoChangeDetectionStatus(defaultAutoChangeDetectionHandler);\n                        }\n                        if (!triggerBeforeAndAfter) return [3 /*break*/, 9];\n                        return [4 /*yield*/, new Promise(function (resolve) { return autoChangeDetectionSubject.next({\n                                isDisabled: true,\n                                onDetectChangesNow: resolve,\n                            }); })];\n                    case 3:\n                        _b.sent();\n                        _b.label = 4;\n                    case 4:\n                        _b.trys.push([4, , 6, 8]);\n                        return [4 /*yield*/, fn()];\n                    case 5: return [2 /*return*/, _b.sent()];\n                    case 6: return [4 /*yield*/, new Promise(function (resolve) { return autoChangeDetectionSubject.next({\n                            isDisabled: false,\n                            onDetectChangesNow: resolve,\n                        }); })];\n                    case 7:\n                        _b.sent();\n                        return [7 /*endfinally*/];\n                    case 8: return [3 /*break*/, 13];\n                    case 9:\n                        autoChangeDetectionSubject.next({ isDisabled: true });\n                        _b.label = 10;\n                    case 10:\n                        _b.trys.push([10, , 12, 13]);\n                        return [4 /*yield*/, fn()];\n                    case 11: return [2 /*return*/, _b.sent()];\n                    case 12:\n                        autoChangeDetectionSubject.next({ isDisabled: false });\n                        return [7 /*endfinally*/];\n                    case 13: return [2 /*return*/];\n                }\n            });\n        });\n    }\n    /**\n     * Disables the harness system's auto change detection for the duration of the given function.\n     * @param fn The function to disable auto change detection for.\n     * @return The result of the given function.\n     */\n    function manualChangeDetection(fn) {\n        return __awaiter(this, void 0, void 0, function () {\n            return __generator(this, function (_b) {\n                return [2 /*return*/, batchChangeDetection(fn, false)];\n            });\n        });\n    }\n    function parallel(values) {\n        return __awaiter(this, void 0, void 0, function () {\n            return __generator(this, function (_b) {\n                return [2 /*return*/, batchChangeDetection(function () { return Promise.all(values()); }, true)];\n            });\n        });\n    }\n\n    /**\n     * Base class for component harnesses that all component harness authors should extend. This base\n     * component harness provides the basic ability to locate element and sub-component harness. It\n     * should be inherited when defining user's own harness.\n     */\n    var ComponentHarness = /** @class */ (function () {\n        function ComponentHarness(locatorFactory) {\n            this.locatorFactory = locatorFactory;\n        }\n        /** Gets a `Promise` for the `TestElement` representing the host element of the component. */\n        ComponentHarness.prototype.host = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    return [2 /*return*/, this.locatorFactory.rootElement];\n                });\n            });\n        };\n        /**\n         * Gets a `LocatorFactory` for the document root element. This factory can be used to create\n         * locators for elements that a component creates outside of its own root element. (e.g. by\n         * appending to document.body).\n         */\n        ComponentHarness.prototype.documentRootLocatorFactory = function () {\n            return this.locatorFactory.documentRootLocatorFactory();\n        };\n        /**\n         * Creates an asynchronous locator function that can be used to find a `ComponentHarness` instance\n         * or element under the host element of this `ComponentHarness`.\n         * @param queries A list of queries specifying which harnesses and elements to search for:\n         *   - A `string` searches for elements matching the CSS selector specified by the string.\n         *   - A `ComponentHarness` constructor searches for `ComponentHarness` instances matching the\n         *     given class.\n         *   - A `HarnessPredicate` searches for `ComponentHarness` instances matching the given\n         *     predicate.\n         * @return An asynchronous locator function that searches for and returns a `Promise` for the\n         *   first element or harness matching the given search criteria. Matches are ordered first by\n         *   order in the DOM, and second by order in the queries list. If no matches are found, the\n         *   `Promise` rejects. The type that the `Promise` resolves to is a union of all result types for\n         *   each query.\n         *\n         * e.g. Given the following DOM: `<div id=\"d1\" /><div id=\"d2\" />`, and assuming\n         * `DivHarness.hostSelector === 'div'`:\n         * - `await ch.locatorFor(DivHarness, 'div')()` gets a `DivHarness` instance for `#d1`\n         * - `await ch.locatorFor('div', DivHarness)()` gets a `TestElement` instance for `#d1`\n         * - `await ch.locatorFor('span')()` throws because the `Promise` rejects.\n         */\n        ComponentHarness.prototype.locatorFor = function () {\n            var _b;\n            var queries = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                queries[_i] = arguments[_i];\n            }\n            return (_b = this.locatorFactory).locatorFor.apply(_b, __spread(queries));\n        };\n        /**\n         * Creates an asynchronous locator function that can be used to find a `ComponentHarness` instance\n         * or element under the host element of this `ComponentHarness`.\n         * @param queries A list of queries specifying which harnesses and elements to search for:\n         *   - A `string` searches for elements matching the CSS selector specified by the string.\n         *   - A `ComponentHarness` constructor searches for `ComponentHarness` instances matching the\n         *     given class.\n         *   - A `HarnessPredicate` searches for `ComponentHarness` instances matching the given\n         *     predicate.\n         * @return An asynchronous locator function that searches for and returns a `Promise` for the\n         *   first element or harness matching the given search criteria. Matches are ordered first by\n         *   order in the DOM, and second by order in the queries list. If no matches are found, the\n         *   `Promise` is resolved with `null`. The type that the `Promise` resolves to is a union of all\n         *   result types for each query or null.\n         *\n         * e.g. Given the following DOM: `<div id=\"d1\" /><div id=\"d2\" />`, and assuming\n         * `DivHarness.hostSelector === 'div'`:\n         * - `await ch.locatorForOptional(DivHarness, 'div')()` gets a `DivHarness` instance for `#d1`\n         * - `await ch.locatorForOptional('div', DivHarness)()` gets a `TestElement` instance for `#d1`\n         * - `await ch.locatorForOptional('span')()` gets `null`.\n         */\n        ComponentHarness.prototype.locatorForOptional = function () {\n            var _b;\n            var queries = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                queries[_i] = arguments[_i];\n            }\n            return (_b = this.locatorFactory).locatorForOptional.apply(_b, __spread(queries));\n        };\n        /**\n         * Creates an asynchronous locator function that can be used to find `ComponentHarness` instances\n         * or elements under the host element of this `ComponentHarness`.\n         * @param queries A list of queries specifying which harnesses and elements to search for:\n         *   - A `string` searches for elements matching the CSS selector specified by the string.\n         *   - A `ComponentHarness` constructor searches for `ComponentHarness` instances matching the\n         *     given class.\n         *   - A `HarnessPredicate` searches for `ComponentHarness` instances matching the given\n         *     predicate.\n         * @return An asynchronous locator function that searches for and returns a `Promise` for all\n         *   elements and harnesses matching the given search criteria. Matches are ordered first by\n         *   order in the DOM, and second by order in the queries list. If an element matches more than\n         *   one `ComponentHarness` class, the locator gets an instance of each for the same element. If\n         *   an element matches multiple `string` selectors, only one `TestElement` instance is returned\n         *   for that element. The type that the `Promise` resolves to is an array where each element is\n         *   the union of all result types for each query.\n         *\n         * e.g. Given the following DOM: `<div id=\"d1\" /><div id=\"d2\" />`, and assuming\n         * `DivHarness.hostSelector === 'div'` and `IdIsD1Harness.hostSelector === '#d1'`:\n         * - `await ch.locatorForAll(DivHarness, 'div')()` gets `[\n         *     DivHarness, // for #d1\n         *     TestElement, // for #d1\n         *     DivHarness, // for #d2\n         *     TestElement // for #d2\n         *   ]`\n         * - `await ch.locatorForAll('div', '#d1')()` gets `[\n         *     TestElement, // for #d1\n         *     TestElement // for #d2\n         *   ]`\n         * - `await ch.locatorForAll(DivHarness, IdIsD1Harness)()` gets `[\n         *     DivHarness, // for #d1\n         *     IdIsD1Harness, // for #d1\n         *     DivHarness // for #d2\n         *   ]`\n         * - `await ch.locatorForAll('span')()` gets `[]`.\n         */\n        ComponentHarness.prototype.locatorForAll = function () {\n            var _b;\n            var queries = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                queries[_i] = arguments[_i];\n            }\n            return (_b = this.locatorFactory).locatorForAll.apply(_b, __spread(queries));\n        };\n        /**\n         * Flushes change detection and async tasks in the Angular zone.\n         * In most cases it should not be necessary to call this manually. However, there may be some edge\n         * cases where it is needed to fully flush animation events.\n         */\n        ComponentHarness.prototype.forceStabilize = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    return [2 /*return*/, this.locatorFactory.forceStabilize()];\n                });\n            });\n        };\n        /**\n         * Waits for all scheduled or running async tasks to complete. This allows harness\n         * authors to wait for async tasks outside of the Angular zone.\n         */\n        ComponentHarness.prototype.waitForTasksOutsideAngular = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    return [2 /*return*/, this.locatorFactory.waitForTasksOutsideAngular()];\n                });\n            });\n        };\n        return ComponentHarness;\n    }());\n    /**\n     * Base class for component harnesses that authors should extend if they anticipate that consumers\n     * of the harness may want to access other harnesses within the `<ng-content>` of the component.\n     */\n    var ContentContainerComponentHarness = /** @class */ (function (_super) {\n        __extends(ContentContainerComponentHarness, _super);\n        function ContentContainerComponentHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ContentContainerComponentHarness.prototype.getChildLoader = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.getRootHarnessLoader()];\n                        case 1: return [2 /*return*/, (_b.sent()).getChildLoader(selector)];\n                    }\n                });\n            });\n        };\n        ContentContainerComponentHarness.prototype.getAllChildLoaders = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.getRootHarnessLoader()];\n                        case 1: return [2 /*return*/, (_b.sent()).getAllChildLoaders(selector)];\n                    }\n                });\n            });\n        };\n        ContentContainerComponentHarness.prototype.getHarness = function (query) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.getRootHarnessLoader()];\n                        case 1: return [2 /*return*/, (_b.sent()).getHarness(query)];\n                    }\n                });\n            });\n        };\n        ContentContainerComponentHarness.prototype.getAllHarnesses = function (query) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, this.getRootHarnessLoader()];\n                        case 1: return [2 /*return*/, (_b.sent()).getAllHarnesses(query)];\n                    }\n                });\n            });\n        };\n        /**\n         * Gets the root harness loader from which to start\n         * searching for content contained by this harness.\n         */\n        ContentContainerComponentHarness.prototype.getRootHarnessLoader = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    return [2 /*return*/, this.locatorFactory.rootHarnessLoader()];\n                });\n            });\n        };\n        return ContentContainerComponentHarness;\n    }(ComponentHarness));\n    /**\n     * A class used to associate a ComponentHarness class with predicates functions that can be used to\n     * filter instances of the class.\n     */\n    var HarnessPredicate = /** @class */ (function () {\n        function HarnessPredicate(harnessType, options) {\n            this.harnessType = harnessType;\n            this._predicates = [];\n            this._descriptions = [];\n            this._addBaseOptions(options);\n        }\n        /**\n         * Checks if the specified nullable string value matches the given pattern.\n         * @param value The nullable string value to check, or a Promise resolving to the\n         *   nullable string value.\n         * @param pattern The pattern the value is expected to match. If `pattern` is a string,\n         *   `value` is expected to match exactly. If `pattern` is a regex, a partial match is\n         *   allowed. If `pattern` is `null`, the value is expected to be `null`.\n         * @return Whether the value matches the pattern.\n         */\n        HarnessPredicate.stringMatches = function (value, pattern) {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, value];\n                        case 1:\n                            value = _b.sent();\n                            if (pattern === null) {\n                                return [2 /*return*/, value === null];\n                            }\n                            else if (value === null) {\n                                return [2 /*return*/, false];\n                            }\n                            return [2 /*return*/, typeof pattern === 'string' ? value === pattern : pattern.test(value)];\n                    }\n                });\n            });\n        };\n        /**\n         * Adds a predicate function to be run against candidate harnesses.\n         * @param description A description of this predicate that may be used in error messages.\n         * @param predicate An async predicate function.\n         * @return this (for method chaining).\n         */\n        HarnessPredicate.prototype.add = function (description, predicate) {\n            this._descriptions.push(description);\n            this._predicates.push(predicate);\n            return this;\n        };\n        /**\n         * Adds a predicate function that depends on an option value to be run against candidate\n         * harnesses. If the option value is undefined, the predicate will be ignored.\n         * @param name The name of the option (may be used in error messages).\n         * @param option The option value.\n         * @param predicate The predicate function to run if the option value is not undefined.\n         * @return this (for method chaining).\n         */\n        HarnessPredicate.prototype.addOption = function (name, option, predicate) {\n            if (option !== undefined) {\n                this.add(name + \" = \" + _valueAsString(option), function (item) { return predicate(item, option); });\n            }\n            return this;\n        };\n        /**\n         * Filters a list of harnesses on this predicate.\n         * @param harnesses The list of harnesses to filter.\n         * @return A list of harnesses that satisfy this predicate.\n         */\n        HarnessPredicate.prototype.filter = function (harnesses) {\n            return __awaiter(this, void 0, void 0, function () {\n                var results;\n                var _this = this;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            if (harnesses.length === 0) {\n                                return [2 /*return*/, []];\n                            }\n                            return [4 /*yield*/, parallel(function () { return harnesses.map(function (h) { return _this.evaluate(h); }); })];\n                        case 1:\n                            results = _b.sent();\n                            return [2 /*return*/, harnesses.filter(function (_, i) { return results[i]; })];\n                    }\n                });\n            });\n        };\n        /**\n         * Evaluates whether the given harness satisfies this predicate.\n         * @param harness The harness to check\n         * @return A promise that resolves to true if the harness satisfies this predicate,\n         *   and resolves to false otherwise.\n         */\n        HarnessPredicate.prototype.evaluate = function (harness) {\n            return __awaiter(this, void 0, void 0, function () {\n                var results;\n                var _this = this;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0: return [4 /*yield*/, parallel(function () { return _this._predicates.map(function (p) { return p(harness); }); })];\n                        case 1:\n                            results = _b.sent();\n                            return [2 /*return*/, results.reduce(function (combined, current) { return combined && current; }, true)];\n                    }\n                });\n            });\n        };\n        /** Gets a description of this predicate for use in error messages. */\n        HarnessPredicate.prototype.getDescription = function () {\n            return this._descriptions.join(', ');\n        };\n        /** Gets the selector used to find candidate elements. */\n        HarnessPredicate.prototype.getSelector = function () {\n            // We don't have to go through the extra trouble if there are no ancestors.\n            if (!this._ancestor) {\n                return (this.harnessType.hostSelector || '').trim();\n            }\n            var _b = __read(_splitAndEscapeSelector(this._ancestor), 2), ancestors = _b[0], ancestorPlaceholders = _b[1];\n            var _c = __read(_splitAndEscapeSelector(this.harnessType.hostSelector || ''), 2), selectors = _c[0], selectorPlaceholders = _c[1];\n            var result = [];\n            // We have to add the ancestor to each part of the host compound selector, otherwise we can get\n            // incorrect results. E.g. `.ancestor .a, .ancestor .b` vs `.ancestor .a, .b`.\n            ancestors.forEach(function (escapedAncestor) {\n                var ancestor = _restoreSelector(escapedAncestor, ancestorPlaceholders);\n                return selectors.forEach(function (escapedSelector) { return result.push(ancestor + \" \" + _restoreSelector(escapedSelector, selectorPlaceholders)); });\n            });\n            return result.join(', ');\n        };\n        /** Adds base options common to all harness types. */\n        HarnessPredicate.prototype._addBaseOptions = function (options) {\n            var _this = this;\n            this._ancestor = options.ancestor || '';\n            if (this._ancestor) {\n                this._descriptions.push(\"has ancestor matching selector \\\"\" + this._ancestor + \"\\\"\");\n            }\n            var selector = options.selector;\n            if (selector !== undefined) {\n                this.add(\"host matches selector \\\"\" + selector + \"\\\"\", function (item) { return __awaiter(_this, void 0, void 0, function () {\n                    return __generator(this, function (_b) {\n                        switch (_b.label) {\n                            case 0: return [4 /*yield*/, item.host()];\n                            case 1: return [2 /*return*/, (_b.sent()).matchesSelector(selector)];\n                        }\n                    });\n                }); });\n            }\n        };\n        return HarnessPredicate;\n    }());\n    /** Represent a value as a string for the purpose of logging. */\n    function _valueAsString(value) {\n        if (value === undefined) {\n            return 'undefined';\n        }\n        // `JSON.stringify` doesn't handle RegExp properly, so we need a custom replacer.\n        try {\n            return JSON.stringify(value, function (_, v) {\n                if (v instanceof RegExp) {\n                    return \"/\" + v.toString() + \"/\";\n                }\n                return typeof v === 'string' ? v.replace('/\\//g', '\\\\/') : v;\n            }).replace(/\"\\/\\//g, '\\\\/').replace(/\\/\\/\"/g, '\\\\/').replace(/\\\\\\//g, '/');\n        }\n        catch (_a) {\n            // `JSON.stringify` will throw if the object is cyclical,\n            // in this case the best we can do is report the value as `{...}`.\n            return '{...}';\n        }\n    }\n    /**\n     * Splits up a compound selector into its parts and escapes any quoted content. The quoted content\n     * has to be escaped, because it can contain commas which will throw throw us off when trying to\n     * split it.\n     * @param selector Selector to be split.\n     * @returns The escaped string where any quoted content is replaced with a placeholder. E.g.\n     * `[foo=\"bar\"]` turns into `[foo=__cdkPlaceholder-0__]`. Use `_restoreSelector` to restore\n     * the placeholders.\n     */\n    function _splitAndEscapeSelector(selector) {\n        var placeholders = [];\n        // Note that the regex doesn't account for nested quotes so something like `\"ab'cd'e\"` will be\n        // considered as two blocks. It's a bit of an edge case, but if we find that it's a problem,\n        // we can make it a bit smarter using a loop. Use this for now since it's more readable and\n        // compact. More complete implementation:\n        // https://github.com/angular/angular/blob/bd34bc9e89f18a/packages/compiler/src/shadow_css.ts#L655\n        var result = selector.replace(/([\"'][^[\"']*[\"'])/g, function (_, keep) {\n            var replaceBy = \"__cdkPlaceholder-\" + placeholders.length + \"__\";\n            placeholders.push(keep);\n            return replaceBy;\n        });\n        return [result.split(',').map(function (part) { return part.trim(); }), placeholders];\n    }\n    /** Restores a selector whose content was escaped in `_splitAndEscapeSelector`. */\n    function _restoreSelector(selector, placeholders) {\n        return selector.replace(/__cdkPlaceholder-(\\d+)__/g, function (_, index) { return placeholders[+index]; });\n    }\n\n    /**\n     * Base harness environment class that can be extended to allow `ComponentHarness`es to be used in\n     * different test environments (e.g. testbed, protractor, etc.). This class implements the\n     * functionality of both a `HarnessLoader` and `LocatorFactory`. This class is generic on the raw\n     * element type, `E`, used by the particular test environment.\n     */\n    var HarnessEnvironment = /** @class */ (function () {\n        function HarnessEnvironment(rawRootElement) {\n            this.rawRootElement = rawRootElement;\n            this.rootElement = this.createTestElement(rawRootElement);\n        }\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.documentRootLocatorFactory = function () {\n            return this.createEnvironment(this.getDocumentRoot());\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.locatorFor = function () {\n            var _this = this;\n            var queries = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                queries[_i] = arguments[_i];\n            }\n            return function () { return _assertResultFound(_this._getAllHarnessesAndTestElements(queries), _getDescriptionForLocatorForQueries(queries)); };\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.locatorForOptional = function () {\n            var _this = this;\n            var queries = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                queries[_i] = arguments[_i];\n            }\n            return function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0: return [4 /*yield*/, this._getAllHarnessesAndTestElements(queries)];\n                    case 1: return [2 /*return*/, (_a.sent())[0] || null];\n                }\n            }); }); };\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.locatorForAll = function () {\n            var _this = this;\n            var queries = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                queries[_i] = arguments[_i];\n            }\n            return function () { return _this._getAllHarnessesAndTestElements(queries); };\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.rootHarnessLoader = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this];\n                });\n            });\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.harnessLoaderFor = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = this.createEnvironment;\n                            return [4 /*yield*/, _assertResultFound(this.getAllRawElements(selector), [_getDescriptionForHarnessLoaderQuery(selector)])];\n                        case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.harnessLoaderForOptional = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                var elements;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getAllRawElements(selector)];\n                        case 1:\n                            elements = _a.sent();\n                            return [2 /*return*/, elements[0] ? this.createEnvironment(elements[0]) : null];\n                    }\n                });\n            });\n        };\n        // Implemented as part of the `LocatorFactory` interface.\n        HarnessEnvironment.prototype.harnessLoaderForAll = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                var elements;\n                var _this = this;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getAllRawElements(selector)];\n                        case 1:\n                            elements = _a.sent();\n                            return [2 /*return*/, elements.map(function (element) { return _this.createEnvironment(element); })];\n                    }\n                });\n            });\n        };\n        // Implemented as part of the `HarnessLoader` interface.\n        HarnessEnvironment.prototype.getHarness = function (query) {\n            return this.locatorFor(query)();\n        };\n        // Implemented as part of the `HarnessLoader` interface.\n        HarnessEnvironment.prototype.getAllHarnesses = function (query) {\n            return this.locatorForAll(query)();\n        };\n        // Implemented as part of the `HarnessLoader` interface.\n        HarnessEnvironment.prototype.getChildLoader = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = this.createEnvironment;\n                            return [4 /*yield*/, _assertResultFound(this.getAllRawElements(selector), [_getDescriptionForHarnessLoaderQuery(selector)])];\n                        case 1: return [2 /*return*/, _a.apply(this, [_b.sent()])];\n                    }\n                });\n            });\n        };\n        // Implemented as part of the `HarnessLoader` interface.\n        HarnessEnvironment.prototype.getAllChildLoaders = function (selector) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _this = this;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getAllRawElements(selector)];\n                        case 1: return [2 /*return*/, (_a.sent()).map(function (e) { return _this.createEnvironment(e); })];\n                    }\n                });\n            });\n        };\n        /** Creates a `ComponentHarness` for the given harness type with the given raw host element. */\n        HarnessEnvironment.prototype.createComponentHarness = function (harnessType, element) {\n            return new harnessType(this.createEnvironment(element));\n        };\n        /**\n         * Matches the given raw elements with the given list of element and harness queries to produce a\n         * list of matched harnesses and test elements.\n         */\n        HarnessEnvironment.prototype._getAllHarnessesAndTestElements = function (queries) {\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, allQueries, harnessQueries, elementQueries, harnessTypes, rawElements, skipSelectorCheck, perElementMatches;\n                var _this = this;\n                return __generator(this, function (_b) {\n                    switch (_b.label) {\n                        case 0:\n                            _a = _parseQueries(queries), allQueries = _a.allQueries, harnessQueries = _a.harnessQueries, elementQueries = _a.elementQueries, harnessTypes = _a.harnessTypes;\n                            return [4 /*yield*/, this.getAllRawElements(__spread(elementQueries, harnessQueries.map(function (predicate) { return predicate.getSelector(); })).join(','))];\n                        case 1:\n                            rawElements = _b.sent();\n                            skipSelectorCheck = (elementQueries.length === 0 && harnessTypes.size === 1) ||\n                                harnessQueries.length === 0;\n                            return [4 /*yield*/, parallel(function () { return rawElements.map(function (rawElement) { return __awaiter(_this, void 0, void 0, function () {\n                                    var testElement, allResultsForElement;\n                                    var _this = this;\n                                    return __generator(this, function (_a) {\n                                        switch (_a.label) {\n                                            case 0:\n                                                testElement = this.createTestElement(rawElement);\n                                                return [4 /*yield*/, parallel(\n                                                    // For each query, get `null` if it doesn't match, or a `TestElement` or\n                                                    // `ComponentHarness` as appropriate if it does match. This gives us everything that\n                                                    // matches the current raw element, but it may contain duplicate entries (e.g.\n                                                    // multiple `TestElement` or multiple `ComponentHarness` of the same type).\n                                                    function () { return allQueries.map(function (query) { return _this._getQueryResultForElement(query, rawElement, testElement, skipSelectorCheck); }); })];\n                                            case 1:\n                                                allResultsForElement = _a.sent();\n                                                return [2 /*return*/, _removeDuplicateQueryResults(allResultsForElement)];\n                                        }\n                                    });\n                                }); }); })];\n                        case 2:\n                            perElementMatches = _b.sent();\n                            return [2 /*return*/, [].concat.apply([], __spread(perElementMatches))];\n                    }\n                });\n            });\n        };\n        /**\n         * Check whether the given query matches the given element, if it does return the matched\n         * `TestElement` or `ComponentHarness`, if it does not, return null. In cases where the caller\n         * knows for sure that the query matches the element's selector, `skipSelectorCheck` can be used\n         * to skip verification and optimize performance.\n         */\n        HarnessEnvironment.prototype._getQueryResultForElement = function (query, rawElement, testElement, skipSelectorCheck) {\n            if (skipSelectorCheck === void 0) { skipSelectorCheck = false; }\n            return __awaiter(this, void 0, void 0, function () {\n                var _a, _b, harness;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0:\n                            if (!(typeof query === 'string')) return [3 /*break*/, 3];\n                            _a = skipSelectorCheck;\n                            if (_a) return [3 /*break*/, 2];\n                            return [4 /*yield*/, testElement.matchesSelector(query)];\n                        case 1:\n                            _a = (_c.sent());\n                            _c.label = 2;\n                        case 2: return [2 /*return*/, ((_a) ? testElement : null)];\n                        case 3:\n                            _b = skipSelectorCheck;\n                            if (_b) return [3 /*break*/, 5];\n                            return [4 /*yield*/, testElement.matchesSelector(query.getSelector())];\n                        case 4:\n                            _b = (_c.sent());\n                            _c.label = 5;\n                        case 5:\n                            if (!_b) return [3 /*break*/, 7];\n                            harness = this.createComponentHarness(query.harnessType, rawElement);\n                            return [4 /*yield*/, query.evaluate(harness)];\n                        case 6: return [2 /*return*/, (_c.sent()) ? harness : null];\n                        case 7: return [2 /*return*/, null];\n                    }\n                });\n            });\n        };\n        return HarnessEnvironment;\n    }());\n    /**\n     * Parses a list of queries in the format accepted by the `locatorFor*` methods into an easier to\n     * work with format.\n     */\n    function _parseQueries(queries) {\n        var e_1, _a;\n        var allQueries = [];\n        var harnessQueries = [];\n        var elementQueries = [];\n        var harnessTypes = new Set();\n        try {\n            for (var queries_1 = __values(queries), queries_1_1 = queries_1.next(); !queries_1_1.done; queries_1_1 = queries_1.next()) {\n                var query = queries_1_1.value;\n                if (typeof query === 'string') {\n                    allQueries.push(query);\n                    elementQueries.push(query);\n                }\n                else {\n                    var predicate = query instanceof HarnessPredicate ? query : new HarnessPredicate(query, {});\n                    allQueries.push(predicate);\n                    harnessQueries.push(predicate);\n                    harnessTypes.add(predicate.harnessType);\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (queries_1_1 && !queries_1_1.done && (_a = queries_1.return)) _a.call(queries_1);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        return { allQueries: allQueries, harnessQueries: harnessQueries, elementQueries: elementQueries, harnessTypes: harnessTypes };\n    }\n    /**\n     * Removes duplicate query results for a particular element. (e.g. multiple `TestElement`\n     * instances or multiple instances of the same `ComponentHarness` class.\n     */\n    function _removeDuplicateQueryResults(results) {\n        return __awaiter(this, void 0, void 0, function () {\n            var testElementMatched, matchedHarnessTypes, dedupedMatches, results_1, results_1_1, result;\n            var e_2, _a;\n            return __generator(this, function (_b) {\n                testElementMatched = false;\n                matchedHarnessTypes = new Set();\n                dedupedMatches = [];\n                try {\n                    for (results_1 = __values(results), results_1_1 = results_1.next(); !results_1_1.done; results_1_1 = results_1.next()) {\n                        result = results_1_1.value;\n                        if (!result) {\n                            continue;\n                        }\n                        if (result instanceof ComponentHarness) {\n                            if (!matchedHarnessTypes.has(result.constructor)) {\n                                matchedHarnessTypes.add(result.constructor);\n                                dedupedMatches.push(result);\n                            }\n                        }\n                        else if (!testElementMatched) {\n                            testElementMatched = true;\n                            dedupedMatches.push(result);\n                        }\n                    }\n                }\n                catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                finally {\n                    try {\n                        if (results_1_1 && !results_1_1.done && (_a = results_1.return)) _a.call(results_1);\n                    }\n                    finally { if (e_2) throw e_2.error; }\n                }\n                return [2 /*return*/, dedupedMatches];\n            });\n        });\n    }\n    /** Verifies that there is at least one result in an array. */\n    function _assertResultFound(results, queryDescriptions) {\n        return __awaiter(this, void 0, void 0, function () {\n            var result;\n            return __generator(this, function (_a) {\n                switch (_a.label) {\n                    case 0: return [4 /*yield*/, results];\n                    case 1:\n                        result = (_a.sent())[0];\n                        if (result == undefined) {\n                            throw Error(\"Failed to find element matching one of the following queries:\\n\" +\n                                queryDescriptions.map(function (desc) { return \"(\" + desc + \")\"; }).join(',\\n'));\n                        }\n                        return [2 /*return*/, result];\n                }\n            });\n        });\n    }\n    /** Gets a list of description strings from a list of queries. */\n    function _getDescriptionForLocatorForQueries(queries) {\n        return queries.map(function (query) { return typeof query === 'string' ?\n            _getDescriptionForTestElementQuery(query) : _getDescriptionForComponentHarnessQuery(query); });\n    }\n    /** Gets a description string for a `ComponentHarness` query. */\n    function _getDescriptionForComponentHarnessQuery(query) {\n        var harnessPredicate = query instanceof HarnessPredicate ? query : new HarnessPredicate(query, {});\n        var _a = harnessPredicate.harnessType, name = _a.name, hostSelector = _a.hostSelector;\n        var description = name + \" with host element matching selector: \\\"\" + hostSelector + \"\\\"\";\n        var constraints = harnessPredicate.getDescription();\n        return description + (constraints ?\n            \" satisfying the constraints: \" + harnessPredicate.getDescription() : '');\n    }\n    /** Gets a description string for a `TestElement` query. */\n    function _getDescriptionForTestElementQuery(selector) {\n        return \"TestElement for element matching selector: \\\"\" + selector + \"\\\"\";\n    }\n    /** Gets a description string for a `HarnessLoader` query. */\n    function _getDescriptionForHarnessLoaderQuery(selector) {\n        return \"HarnessLoader for element matching selector: \\\"\" + selector + \"\\\"\";\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    (function (TestKey) {\n        TestKey[TestKey[\"BACKSPACE\"] = 0] = \"BACKSPACE\";\n        TestKey[TestKey[\"TAB\"] = 1] = \"TAB\";\n        TestKey[TestKey[\"ENTER\"] = 2] = \"ENTER\";\n        TestKey[TestKey[\"SHIFT\"] = 3] = \"SHIFT\";\n        TestKey[TestKey[\"CONTROL\"] = 4] = \"CONTROL\";\n        TestKey[TestKey[\"ALT\"] = 5] = \"ALT\";\n        TestKey[TestKey[\"ESCAPE\"] = 6] = \"ESCAPE\";\n        TestKey[TestKey[\"PAGE_UP\"] = 7] = \"PAGE_UP\";\n        TestKey[TestKey[\"PAGE_DOWN\"] = 8] = \"PAGE_DOWN\";\n        TestKey[TestKey[\"END\"] = 9] = \"END\";\n        TestKey[TestKey[\"HOME\"] = 10] = \"HOME\";\n        TestKey[TestKey[\"LEFT_ARROW\"] = 11] = \"LEFT_ARROW\";\n        TestKey[TestKey[\"UP_ARROW\"] = 12] = \"UP_ARROW\";\n        TestKey[TestKey[\"RIGHT_ARROW\"] = 13] = \"RIGHT_ARROW\";\n        TestKey[TestKey[\"DOWN_ARROW\"] = 14] = \"DOWN_ARROW\";\n        TestKey[TestKey[\"INSERT\"] = 15] = \"INSERT\";\n        TestKey[TestKey[\"DELETE\"] = 16] = \"DELETE\";\n        TestKey[TestKey[\"F1\"] = 17] = \"F1\";\n        TestKey[TestKey[\"F2\"] = 18] = \"F2\";\n        TestKey[TestKey[\"F3\"] = 19] = \"F3\";\n        TestKey[TestKey[\"F4\"] = 20] = \"F4\";\n        TestKey[TestKey[\"F5\"] = 21] = \"F5\";\n        TestKey[TestKey[\"F6\"] = 22] = \"F6\";\n        TestKey[TestKey[\"F7\"] = 23] = \"F7\";\n        TestKey[TestKey[\"F8\"] = 24] = \"F8\";\n        TestKey[TestKey[\"F9\"] = 25] = \"F9\";\n        TestKey[TestKey[\"F10\"] = 26] = \"F10\";\n        TestKey[TestKey[\"F11\"] = 27] = \"F11\";\n        TestKey[TestKey[\"F12\"] = 28] = \"F12\";\n        TestKey[TestKey[\"META\"] = 29] = \"META\";\n    })(exports.TestKey || (exports.TestKey = {}));\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     * Gets text of element excluding certain selectors within the element.\n     * @param element Element to get text from,\n     * @param excludeSelector Selector identifying which elements to exclude,\n     */\n    function _getTextWithExcludedElements(element, excludeSelector) {\n        var _a;\n        var clone = element.cloneNode(true);\n        var exclusions = clone.querySelectorAll(excludeSelector);\n        for (var i = 0; i < exclusions.length; i++) {\n            var child = exclusions[i];\n            (_a = child.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(child);\n        }\n        return (clone.textContent || '').trim();\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    /**\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.ComponentHarness = ComponentHarness;\n    exports.ContentContainerComponentHarness = ContentContainerComponentHarness;\n    exports.HarnessEnvironment = HarnessEnvironment;\n    exports.HarnessPredicate = HarnessPredicate;\n    exports._getTextWithExcludedElements = _getTextWithExcludedElements;\n    exports.handleAutoChangeDetectionStatus = handleAutoChangeDetectionStatus;\n    exports.manualChangeDetection = manualChangeDetection;\n    exports.parallel = parallel;\n    exports.stopHandlingAutoChangeDetectionStatus = stopHandlingAutoChangeDetectionStatus;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=cdk-testing.umd.js.map\n"]}