!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("@angular/cdk/testing")):"function"==typeof define&&define.amd?define("@angular/material/table/testing",["exports","@angular/cdk/testing"],n):n(((t=t||self).ng=t.ng||{},t.ng.material=t.ng.material||{},t.ng.material.table=t.ng.material.table||{},t.ng.material.table.testing={}),t.ng.cdk.testing)}(this,(function(t,n){"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.
    ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var e in n)Object.prototype.hasOwnProperty.call(n,e)&&(t[e]=n[e])})(t,n)};function r(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}function o(t,n,e,r){return new(e||(e=Promise))((function(o,i){function u(t){try{l(r.next(t))}catch(t){i(t)}}function a(t){try{l(r.throw(t))}catch(t){i(t)}}function l(t){t.done?o(t.value):function n(t){return t instanceof e?t:new e((function(n){n(t)}))}(t.value).then(u,a)}l((r=r.apply(t,n||[])).next())}))}function i(t,n){var e,r,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function l(i){if(e)throw new TypeError("Generator is already executing.");for(;u;)try{if(e=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,r=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!((o=(o=u.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){u.label=i[1];break}if(6===i[0]&&u.label<o[1]){u.label=o[1],o=i;break}if(o&&u.label<o[2]){u.label=o[2],u.ops.push(i);break}o[2]&&u.ops.pop(),u.trys.pop();continue}i=n.call(t,u)}catch(t){i=[6,t],r=0}finally{e=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}function u(t,n){var e="function"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var r,o,i=e.call(t),u=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)u.push(r.value)}catch(t){o={error:t}}finally{try{r&&!r.done&&(e=i.return)&&e.call(i)}finally{if(o)throw o.error}}return u}var a=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return r(n,t),n.with=function(t){return void 0===t&&(t={}),s(n,t)},n.prototype.getText=function(){return o(this,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().text()]}}))}))},n.prototype.getColumnName=function(){return o(this,void 0,void 0,(function(){var t,n;return i(this,(function(e){switch(e.label){case 0:return[4,this.host()];case 1:return[4,e.sent().getAttribute("class")];case 2:if((t=e.sent())&&(n=t.split(" ").map((function(t){return t.trim()})).find((function(t){return t.startsWith("mat-column-")}))))return[2,n.split("mat-column-")[1]];throw Error("Could not determine column name of cell.")}}))}))},n}(n.ContentContainerComponentHarness);a.hostSelector=".mat-cell";var l=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return r(n,t),n.with=function(t){return void 0===t&&(t={}),s(n,t)},n}(a);l.hostSelector=".mat-header-cell";var c=function(t){function n(){return null!==t&&t.apply(this,arguments)||this}return r(n,t),n.with=function(t){return void 0===t&&(t={}),s(n,t)},n}(a);function s(t,e){return new n.HarnessPredicate(t,e).addOption("text",e.text,(function(t,e){return n.HarnessPredicate.stringMatches(t.getText(),e)})).addOption("columnName",e.columnName,(function(t,e){return n.HarnessPredicate.stringMatches(t.getColumnName(),e)}))}c.hostSelector=".mat-footer-cell";var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.with=function(t){return void 0===t&&(t={}),new n.HarnessPredicate(e,t)},e.prototype.getCells=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.locatorForAll(a.with(t))()]}))}))},e.prototype.getCellTextByIndex=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,d(this,t)]}))}))},e.prototype.getCellTextByColumnName=function(){return o(this,void 0,void 0,(function(){return i(this,(function(t){return[2,v(this)]}))}))},e}(n.ComponentHarness);f.hostSelector=".mat-row";var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.with=function(t){return void 0===t&&(t={}),new n.HarnessPredicate(e,t)},e.prototype.getCells=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.locatorForAll(l.with(t))()]}))}))},e.prototype.getCellTextByIndex=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,d(this,t)]}))}))},e.prototype.getCellTextByColumnName=function(){return o(this,void 0,void 0,(function(){return i(this,(function(t){return[2,v(this)]}))}))},e}(n.ComponentHarness);h.hostSelector=".mat-header-row";var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.with=function(t){return void 0===t&&(t={}),new n.HarnessPredicate(e,t)},e.prototype.getCells=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.locatorForAll(c.with(t))()]}))}))},e.prototype.getCellTextByIndex=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,d(this,t)]}))}))},e.prototype.getCellTextByColumnName=function(){return o(this,void 0,void 0,(function(){return i(this,(function(t){return[2,v(this)]}))}))},e}(n.ComponentHarness);function d(t,e){return o(this,void 0,void 0,(function(){var r;return i(this,(function(o){switch(o.label){case 0:return[4,t.getCells(e)];case 1:return r=o.sent(),[2,n.parallel((function(){return r.map((function(t){return t.getText()}))}))]}}))}))}function v(t){return o(this,void 0,void 0,(function(){var e,r;return i(this,(function(o){switch(o.label){case 0:return e={},[4,t.getCells()];case 1:return r=o.sent(),[4,n.parallel((function(){return r.map((function(t){return n.parallel((function(){return[t.getColumnName(),t.getText()]}))}))}))];case 2:return o.sent().forEach((function(t){var n=u(t,2);return e[n[0]]=n[1]})),[2,e]}}))}))}p.hostSelector=".mat-footer-row";var y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.with=function(t){return void 0===t&&(t={}),new n.HarnessPredicate(e,t)},e.prototype.getHeaderRows=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.locatorForAll(h.with(t))()]}))}))},e.prototype.getRows=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.locatorForAll(f.with(t))()]}))}))},e.prototype.getFooterRows=function(t){return void 0===t&&(t={}),o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.locatorForAll(p.with(t))()]}))}))},e.prototype.getCellTextByIndex=function(){return o(this,void 0,void 0,(function(){var t;return i(this,(function(e){switch(e.label){case 0:return[4,this.getRows()];case 1:return t=e.sent(),[2,n.parallel((function(){return t.map((function(t){return t.getCellTextByIndex()}))}))]}}))}))},e.prototype.getCellTextByColumnName=function(){return o(this,void 0,void 0,(function(){var t,e,r,o,a,l,c,s,f=this;return i(this,(function(i){switch(i.label){case 0:return[4,n.parallel((function(){return[f.getHeaderRows(),f.getFooterRows(),f.getRows()]}))];case 1:return t=u.apply(void 0,[i.sent(),3]),e=t[0],r=t[1],o=t[2],a={},[4,n.parallel((function(){return[n.parallel((function(){return e.map((function(t){return t.getCellTextByColumnName()}))})),n.parallel((function(){return r.map((function(t){return t.getCellTextByColumnName()}))})),n.parallel((function(){return o.map((function(t){return t.getCellTextByColumnName()}))}))]}))];case 2:return l=u.apply(void 0,[i.sent(),3]),c=l[0],s=l[1],l[2].forEach((function(t){Object.keys(t).forEach((function(n){var e=t[n];a[n]||(a[n]={headerText:m(c,n),footerText:m(s,n),text:[]}),a[n].text.push(e)}))})),[2,a]}}))}))},e}(n.ContentContainerComponentHarness);function m(t,n){var e=[];return t.forEach((function(t){Object.keys(t).forEach((function(r){r===n&&e.push(t[r])}))})),e}
/**
     * @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
     */y.hostSelector=".mat-table",t.MatCellHarness=a,t.MatFooterCellHarness=c,t.MatFooterRowHarness=p,t.MatHeaderCellHarness=l,t.MatHeaderRowHarness=h,t.MatRowHarness=f,t.MatTableHarness=y,Object.defineProperty(t,"__esModule",{value:!0})}));