!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@angular/cdk/testing"),require("@angular/cdk/coercion")):"function"==typeof define&&define.amd?define("@angular/material/menu/testing",["exports","@angular/cdk/testing","@angular/cdk/coercion"],e):e(((t=t||self).ng=t.ng||{},t.ng.material=t.ng.material||{},t.ng.material.menu=t.ng.material.menu||{},t.ng.material.menu.testing={}),t.ng.cdk.testing,t.ng.cdk.coercion)}(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 s(t){try{c(r.next(t))}catch(t){i(t)}}function u(t){try{c(r.throw(t))}catch(t){i(t)}}function c(t){t.done?o(t.value):function e(t){return t instanceof n?t:new n((function(e){e(t)}))}(t.value).then(s,u)}c((r=r.apply(t,e||[])).next())}))}function s(t,e){var n,r,o,i,s={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 c(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)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 s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=e.call(t,s)}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),s=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)s.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 s}function c(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(u(arguments[e]));return t}var a=function(t){function r(){var e=t.apply(this,c(arguments))||this;return e._documentRootLocator=e.documentRootLocatorFactory(),e}return o(r,t),r.prototype.isDisabled=function(){return i(this,void 0,void 0,(function(){var t,e;return s(this,(function(r){switch(r.label){case 0:return[4,this.host()];case 1:return t=r.sent().getAttribute("disabled"),e=n.coerceBooleanProperty,[4,t];case 2:return[2,e.apply(void 0,[r.sent()])]}}))}))},r.prototype.isOpen=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this._getMenuPanel()];case 1:return[2,!!t.sent()]}}))}))},r.prototype.getTriggerText=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().text()]}}))}))},r.prototype.focus=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().focus()]}}))}))},r.prototype.blur=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().blur()]}}))}))},r.prototype.isFocused=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().isFocused()]}}))}))},r.prototype.open=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.isOpen()];case 1:return t.sent()?[3,3]:[4,this.host()];case 2:return[2,t.sent().click()];case 3:return[2]}}))}))},r.prototype.close=function(){return i(this,void 0,void 0,(function(){var t;return s(this,(function(n){switch(n.label){case 0:return[4,this._getMenuPanel()];case 1:return(t=n.sent())?[2,t.sendKeys(e.TestKey.ESCAPE)]:[2]}}))}))},r.prototype.getItems=function(t){return i(this,void 0,void 0,(function(){var e;return s(this,(function(n){switch(n.label){case 0:return[4,this._getPanelId()];case 1:return(e=n.sent())?[2,this._documentRootLocator.locatorForAll(this._itemClass.with(Object.assign(Object.assign({},t||{}),{ancestor:"#"+e})))()]:[2,[]]}}))}))},r.prototype.clickItem=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return i(this,void 0,void 0,(function(){var n,r;return s(this,(function(o){switch(o.label){case 0:return[4,this.open()];case 1:return o.sent(),[4,this.getItems(t)];case 2:if(!(n=o.sent()).length)throw Error("Could not find item matching "+JSON.stringify(t));return e.length?[3,4]:[4,n[0].click()];case 3:return[2,o.sent()];case 4:return[4,n[0].getSubmenu()];case 5:if(!(r=o.sent()))throw Error("Item matching "+JSON.stringify(t)+" does not have a submenu");return[2,r.clickItem.apply(r,c(e))]}}))}))},r.prototype.getRootHarnessLoader=function(){return i(this,void 0,void 0,(function(){var t;return s(this,(function(e){switch(e.label){case 0:return[4,this._getPanelId()];case 1:return t=e.sent(),[2,this.documentRootLocatorFactory().harnessLoaderFor("#"+t)]}}))}))},r.prototype._getMenuPanel=function(){return i(this,void 0,void 0,(function(){var t;return s(this,(function(e){switch(e.label){case 0:return[4,this._getPanelId()];case 1:return[2,(t=e.sent())?this._documentRootLocator.locatorForOptional("#"+t)():null]}}))}))},r.prototype._getPanelId=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[4,t.sent().getAttribute("aria-controls")];case 2:return[2,t.sent()||null]}}))}))},r}(e.ContentContainerComponentHarness),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.isDisabled=function(){return i(this,void 0,void 0,(function(){var t,e;return s(this,(function(r){switch(r.label){case 0:return[4,this.host()];case 1:return t=r.sent().getAttribute("disabled"),e=n.coerceBooleanProperty,[4,t];case 2:return[2,e.apply(void 0,[r.sent()])]}}))}))},e.prototype.getText=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().text()]}}))}))},e.prototype.focus=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().focus()]}}))}))},e.prototype.blur=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().blur()]}}))}))},e.prototype.isFocused=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().isFocused()]}}))}))},e.prototype.click=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().click()]}}))}))},e.prototype.hasSubmenu=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.host()];case 1:return[2,t.sent().matchesSelector(this._menuClass.hostSelector)]}}))}))},e.prototype.getSubmenu=function(){return i(this,void 0,void 0,(function(){return s(this,(function(t){switch(t.label){case 0:return[4,this.hasSubmenu()];case 1:return t.sent()?[2,new this._menuClass(this.locatorFactory)]:[2,null]}}))}))},e}(e.ContentContainerComponentHarness),h=function(t){function n(){var e=t.apply(this,c(arguments))||this;return e._itemClass=f,e}return o(n,t),n.with=function(t){return void 0===t&&(t={}),new e.HarnessPredicate(n,t).addOption("triggerText",t.triggerText,(function(t,n){return e.HarnessPredicate.stringMatches(t.getTriggerText(),n)}))},n}(a);h.hostSelector=".mat-menu-trigger";var f=function(t){function n(){var e=t.apply(this,c(arguments))||this;return e._menuClass=h,e}return o(n,t),n.with=function(t){var r=this;return void 0===t&&(t={}),new e.HarnessPredicate(n,t).addOption("text",t.text,(function(t,n){return e.HarnessPredicate.stringMatches(t.getText(),n)})).addOption("hasSubmenu",t.hasSubmenu,(function(t,e){return i(r,void 0,void 0,(function(){return s(this,(function(n){switch(n.label){case 0:return[4,t.hasSubmenu()];case 1:return[2,n.sent()===e]}}))}))}))},n}(l);f.hostSelector=".mat-menu-item",
/**
     * @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.MatMenuHarness=h,t.MatMenuItemHarness=f,t._MatMenuHarnessBase=a,t._MatMenuItemHarnessBase=l,Object.defineProperty(t,"__esModule",{value:!0})}));