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