!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/cdk/testing"),require("@angular/material/grid-list")):"function"==typeof define&&define.amd?define("@angular/material/grid-list/testing",["exports","@angular/cdk/testing","@angular/material/grid-list"],e):e(((t=t||self).ng=t.ng||{},t.ng.material=t.ng.material||{},t.ng.material.gridList=t.ng.material.gridList||{},t.ng.material.gridList.testing={}),t.ng.cdk.testing,t.ng.material.gridList)}(this,(function(t,e,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 r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,e)};function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}function i(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{s(r.next(t))}catch(t){i(t)}}function u(t){try{s(r.throw(t))}catch(t){i(t)}}function s(t){t.done?o(t.value):function e(t){return t instanceof n?t:new n((function(e){e(t)}))}(t.value).then(a,u)}s((r=r.apply(t,e||[])).next())}))}function a(t,e){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function s(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=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 a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=e.call(t,a)}catch(t){i=[6,t],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function u(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(t){o={error:t}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function s(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(u(arguments[e]));return t}var c=function(t){function n(){var e=t.apply(this,s(arguments))||this;return e._header=e.locatorForOptional(".mat-grid-tile-header"),e._footer=e.locatorForOptional(".mat-grid-tile-footer"),e._avatar=e.locatorForOptional(".mat-grid-avatar"),e}return o(n,t),n.with=function(t){return void 0===t&&(t={}),new e.HarnessPredicate(n,t).addOption("headerText",t.headerText,(function(t,n){return e.HarnessPredicate.stringMatches(t.getHeaderText(),n)})).addOption("footerText",t.footerText,(function(t,n){return e.HarnessPredicate.stringMatches(t.getFooterText(),n)}))},n.prototype.getRowspan=function(){return i(this,void 0,void 0,(function(){var t;return a(this,(function(e){switch(e.label){case 0:return t=Number,[4,this.host()];case 1:return[4,e.sent().getAttribute("rowspan")];case 2:return[2,t.apply(void 0,[e.sent()])]}}))}))},n.prototype.getColspan=function(){return i(this,void 0,void 0,(function(){var t;return a(this,(function(e){switch(e.label){case 0:return t=Number,[4,this.host()];case 1:return[4,e.sent().getAttribute("colspan")];case 2:return[2,t.apply(void 0,[e.sent()])]}}))}))},n.prototype.hasHeader=function(){return i(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,this._header()];case 1:return[2,null!==t.sent()]}}))}))},n.prototype.hasFooter=function(){return i(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,this._footer()];case 1:return[2,null!==t.sent()]}}))}))},n.prototype.hasAvatar=function(){return i(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,this._avatar()];case 1:return[2,null!==t.sent()]}}))}))},n.prototype.getHeaderText=function(){return i(this,void 0,void 0,(function(){var t;return a(this,(function(e){switch(e.label){case 0:return[4,this._header()];case 1:return[2,(t=e.sent())?t.text():null]}}))}))},n.prototype.getFooterText=function(){return i(this,void 0,void 0,(function(){var t;return a(this,(function(e){switch(e.label){case 0:return[4,this._footer()];case 1:return[2,(t=e.sent())?t.text():null]}}))}))},n}(e.ContentContainerComponentHarness);c.hostSelector=".mat-grid-tile";var l=function(t){function r(){var e=t.apply(this,s(arguments))||this;return e._tileCoordinator=new n.ɵTileCoordinator,e}return o(r,t),r.with=function(t){return void 0===t&&(t={}),new e.HarnessPredicate(r,t)},r.prototype.getTiles=function(t){return void 0===t&&(t={}),i(this,void 0,void 0,(function(){return a(this,(function(e){switch(e.label){case 0:return[4,this.locatorForAll(c.with(t))()];case 1:return[2,e.sent()]}}))}))},r.prototype.getColumns=function(){return i(this,void 0,void 0,(function(){var t;return a(this,(function(e){switch(e.label){case 0:return t=Number,[4,this.host()];case 1:return[4,e.sent().getAttribute("cols")];case 2:return[2,t.apply(void 0,[e.sent()])]}}))}))},r.prototype.getTileAtPosition=function(t){var n=t.row,r=t.column;return i(this,void 0,void 0,(function(){var t,o,i,s,c,l,f,p,h,d,v=this;return a(this,(function(a){switch(a.label){case 0:return[4,e.parallel((function(){return[v.getTiles(),v.getColumns()]}))];case 1:return t=u.apply(void 0,[a.sent(),2]),i=t[1],s=(o=t[0]).map((function(t){return e.parallel((function(){return[t.getColspan(),t.getRowspan()]}))})),[4,e.parallel((function(){return s}))];case 2:for(c=a.sent().map((function(t){var e=u(t,2);return{colspan:e[0],rowspan:e[1]}})),this._tileCoordinator.update(i,c),l=0;l<this._tileCoordinator.positions.length;l++)if(h=(p=c[l]).rowspan,d=p.colspan,r>=(f=this._tileCoordinator.positions[l]).col&&r<=f.col+d-1&&n>=f.row&&n<=f.row+h-1)return[2,o[l]];throw Error("Could not find tile at given position.")}}))}))},r}(e.ComponentHarness);l.hostSelector=".mat-grid-list",
/**
     * @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
     */
t.MatGridListHarness=l,t.MatGridTileHarness=c,Object.defineProperty(t,"__esModule",{value:!0})}));