{"version":3,"sources":["src/material/material-tabs-testing.umd.js"],"names":["global","factory","exports","module","require","define","amd","self","ng","material","tabs","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","MatTabHarness","_super","arguments","with","options","HarnessPredicate","addOption","harness","stringMatches","getLabel","_a","host","text","getAriaLabel","getAttribute","getAriaLabelledby","isSelected","isDisabled","select","click","getTextContent","contentId","_getContentId","documentRootLocatorFactory","locatorFor","getHarnessLoaderForContent","getRootHarnessLoader","harnessLoaderFor","ContentContainerComponentHarness","hostSelector","MatTabGroupHarness","_this","selectedTabLabel","selectedTab","_b","_c","getSelectedTab","getTabs","filter","locatorForAll","i","parallel","map","Error","selectTab","JSON","stringify","ComponentHarness","MatTabLinkHarness","isActive","hasClass","MatTabNavBarHarness","getLinks","getActiveLink","links","clickLink","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/tabs/testing', ['exports', '@angular/cdk/testing'], factory) :\n    (global = global || self, factory((global.ng = global.ng || {}, global.ng.material = global.ng.material || {}, global.ng.material.tabs = global.ng.material.tabs || {}, global.ng.material.tabs.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 Angular Material tab-label in tests. */\n    var MatTabHarness = /** @class */ (function (_super) {\n        __extends(MatTabHarness, _super);\n        function MatTabHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatTabHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which tab instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatTabHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatTabHarness, options)\n                .addOption('label', options.label, function (harness, label) { return testing.HarnessPredicate.stringMatches(harness.getLabel(), label); });\n        };\n        /** Gets the label of the tab. */\n        MatTabHarness.prototype.getLabel = 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                    }\n                });\n            });\n        };\n        /** Gets the aria-label of the tab. */\n        MatTabHarness.prototype.getAriaLabel = 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()).getAttribute('aria-label')];\n                    }\n                });\n            });\n        };\n        /** Gets the value of the \"aria-labelledby\" attribute. */\n        MatTabHarness.prototype.getAriaLabelledby = 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()).getAttribute('aria-labelledby')];\n                    }\n                });\n            });\n        };\n        /** Whether the tab is selected. */\n        MatTabHarness.prototype.isSelected = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var hostEl;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            hostEl = _a.sent();\n                            return [4 /*yield*/, hostEl.getAttribute('aria-selected')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Whether the tab is disabled. */\n        MatTabHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var hostEl;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            hostEl = _a.sent();\n                            return [4 /*yield*/, hostEl.getAttribute('aria-disabled')];\n                        case 2: return [2 /*return*/, (_a.sent()) === 'true'];\n                    }\n                });\n            });\n        };\n        /** Selects the given tab by clicking on the label. Tab cannot be selected if disabled. */\n        MatTabHarness.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.host()];\n                        case 1: return [4 /*yield*/, (_a.sent()).click()];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        /** Gets the text content of the tab. */\n        MatTabHarness.prototype.getTextContent = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var contentId, contentEl;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._getContentId()];\n                        case 1:\n                            contentId = _a.sent();\n                            return [4 /*yield*/, this.documentRootLocatorFactory().locatorFor(\"#\" + contentId)()];\n                        case 2:\n                            contentEl = _a.sent();\n                            return [2 /*return*/, contentEl.text()];\n                    }\n                });\n            });\n        };\n        /**\n         * Gets a `HarnessLoader` that can be used to load harnesses for components within the tab's\n         * content area.\n         * @deprecated Use `getHarness` or `getChildLoader` instead.\n         * @breaking-change 12.0.0\n         */\n        MatTabHarness.prototype.getHarnessLoaderForContent = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                return __generator(this, function (_a) {\n                    return [2 /*return*/, this.getRootHarnessLoader()];\n                });\n            });\n        };\n        MatTabHarness.prototype.getRootHarnessLoader = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var contentId;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this._getContentId()];\n                        case 1:\n                            contentId = _a.sent();\n                            return [2 /*return*/, this.documentRootLocatorFactory().harnessLoaderFor(\"#\" + contentId)];\n                    }\n                });\n            });\n        };\n        /** Gets the element id for the content of the current tab. */\n        MatTabHarness.prototype._getContentId = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var hostEl;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            hostEl = _a.sent();\n                            return [4 /*yield*/, hostEl.getAttribute('aria-controls')];\n                        case 2: \n                        // Tabs never have an empty \"aria-controls\" attribute.\n                        return [2 /*return*/, (_a.sent())];\n                    }\n                });\n            });\n        };\n        return MatTabHarness;\n    }(testing.ContentContainerComponentHarness));\n    /** The selector for the host element of a `MatTab` instance. */\n    MatTabHarness.hostSelector = '.mat-tab-label';\n\n    /** Harness for interacting with a standard mat-tab-group in tests. */\n    var MatTabGroupHarness = /** @class */ (function (_super) {\n        __extends(MatTabGroupHarness, _super);\n        function MatTabGroupHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatTabGroupHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which tab group instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatTabGroupHarness.with = function (options) {\n            var _this = this;\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatTabGroupHarness, options)\n                .addOption('selectedTabLabel', options.selectedTabLabel, function (harness, label) { return __awaiter(_this, void 0, void 0, function () {\n                var selectedTab, _a, _b;\n                return __generator(this, function (_c) {\n                    switch (_c.label) {\n                        case 0: return [4 /*yield*/, harness.getSelectedTab()];\n                        case 1:\n                            selectedTab = _c.sent();\n                            _b = (_a = testing.HarnessPredicate).stringMatches;\n                            return [4 /*yield*/, selectedTab.getLabel()];\n                        case 2: return [2 /*return*/, _b.apply(_a, [_c.sent(), label])];\n                    }\n                });\n            }); });\n        };\n        /**\n         * Gets the list of tabs in the tab group.\n         * @param filter Optionally filters which tabs are included.\n         */\n        MatTabGroupHarness.prototype.getTabs = 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(MatTabHarness.with(filter))()];\n                });\n            });\n        };\n        /** Gets the selected tab of the tab group. */\n        MatTabGroupHarness.prototype.getSelectedTab = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var tabs, isSelected, i;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getTabs()];\n                        case 1:\n                            tabs = _a.sent();\n                            return [4 /*yield*/, testing.parallel(function () { return tabs.map(function (t) { return t.isSelected(); }); })];\n                        case 2:\n                            isSelected = _a.sent();\n                            for (i = 0; i < tabs.length; i++) {\n                                if (isSelected[i]) {\n                                    return [2 /*return*/, tabs[i]];\n                                }\n                            }\n                            throw new Error('No selected tab could be found.');\n                    }\n                });\n            });\n        };\n        /**\n         * Selects a tab in this tab group.\n         * @param filter An optional filter to apply to the child tabs. The first tab matching the filter\n         *     will be selected.\n         */\n        MatTabGroupHarness.prototype.selectTab = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                var tabs;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getTabs(filter)];\n                        case 1:\n                            tabs = _a.sent();\n                            if (!tabs.length) {\n                                throw Error(\"Cannot find mat-tab matching filter \" + JSON.stringify(filter));\n                            }\n                            return [4 /*yield*/, tabs[0].select()];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatTabGroupHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatTabGroup` instance. */\n    MatTabGroupHarness.hostSelector = '.mat-tab-group';\n\n    /** Harness for interacting with a standard Angular Material tab link in tests. */\n    var MatTabLinkHarness = /** @class */ (function (_super) {\n        __extends(MatTabLinkHarness, _super);\n        function MatTabLinkHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatTabLinkHarness` that meets\n         * certain criteria.\n         * @param options Options for filtering which tab link instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatTabLinkHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatTabLinkHarness, options)\n                .addOption('label', options.label, function (harness, label) { return testing.HarnessPredicate.stringMatches(harness.getLabel(), label); });\n        };\n        /** Gets the label of the link. */\n        MatTabLinkHarness.prototype.getLabel = 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                    }\n                });\n            });\n        };\n        /** Whether the link is active. */\n        MatTabLinkHarness.prototype.isActive = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var host;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            host = _a.sent();\n                            return [2 /*return*/, host.hasClass('mat-tab-label-active')];\n                    }\n                });\n            });\n        };\n        /** Whether the link is disabled. */\n        MatTabLinkHarness.prototype.isDisabled = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var host;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.host()];\n                        case 1:\n                            host = _a.sent();\n                            return [2 /*return*/, host.hasClass('mat-tab-disabled')];\n                    }\n                });\n            });\n        };\n        /** Clicks on the link. */\n        MatTabLinkHarness.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 [4 /*yield*/, (_a.sent()).click()];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatTabLinkHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatTabLink` instance. */\n    MatTabLinkHarness.hostSelector = '.mat-tab-link';\n\n    /** Harness for interacting with a standard mat-tab-nav-bar in tests. */\n    var MatTabNavBarHarness = /** @class */ (function (_super) {\n        __extends(MatTabNavBarHarness, _super);\n        function MatTabNavBarHarness() {\n            return _super !== null && _super.apply(this, arguments) || this;\n        }\n        /**\n         * Gets a `HarnessPredicate` that can be used to search for a `MatTabNavBar` that meets\n         * certain criteria.\n         * @param options Options for filtering which tab nav bar instances are considered a match.\n         * @return a `HarnessPredicate` configured with the given options.\n         */\n        MatTabNavBarHarness.with = function (options) {\n            if (options === void 0) { options = {}; }\n            return new testing.HarnessPredicate(MatTabNavBarHarness, options);\n        };\n        /**\n         * Gets the list of links in the nav bar.\n         * @param filter Optionally filters which links are included.\n         */\n        MatTabNavBarHarness.prototype.getLinks = 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(MatTabLinkHarness.with(filter))()];\n                });\n            });\n        };\n        /** Gets the active link in the nav bar. */\n        MatTabNavBarHarness.prototype.getActiveLink = function () {\n            return __awaiter(this, void 0, void 0, function () {\n                var links, isActive, i;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getLinks()];\n                        case 1:\n                            links = _a.sent();\n                            return [4 /*yield*/, testing.parallel(function () { return links.map(function (t) { return t.isActive(); }); })];\n                        case 2:\n                            isActive = _a.sent();\n                            for (i = 0; i < links.length; i++) {\n                                if (isActive[i]) {\n                                    return [2 /*return*/, links[i]];\n                                }\n                            }\n                            throw new Error('No active link could be found.');\n                    }\n                });\n            });\n        };\n        /**\n         * Clicks a link inside the nav bar.\n         * @param filter An optional filter to apply to the child link. The first link matching the filter\n         *     will be clicked.\n         */\n        MatTabNavBarHarness.prototype.clickLink = function (filter) {\n            if (filter === void 0) { filter = {}; }\n            return __awaiter(this, void 0, void 0, function () {\n                var tabs;\n                return __generator(this, function (_a) {\n                    switch (_a.label) {\n                        case 0: return [4 /*yield*/, this.getLinks(filter)];\n                        case 1:\n                            tabs = _a.sent();\n                            if (!tabs.length) {\n                                throw Error(\"Cannot find mat-tab-link matching filter \" + JSON.stringify(filter));\n                            }\n                            return [4 /*yield*/, tabs[0].click()];\n                        case 2:\n                            _a.sent();\n                            return [2 /*return*/];\n                    }\n                });\n            });\n        };\n        return MatTabNavBarHarness;\n    }(testing.ComponentHarness));\n    /** The selector for the host element of a `MatTabNavBar` instance. */\n    MatTabNavBarHarness.hostSelector = '.mat-tab-nav-bar';\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.MatTabGroupHarness = MatTabGroupHarness;\n    exports.MatTabHarness = MatTabHarness;\n    exports.MatTabLinkHarness = MatTabLinkHarness;\n    exports.MatTabNavBarHarness = MatTabNavBarHarness;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=material-tabs-testing.umd.js.map\n"]}