| <!doctype html> |
| <!-- |
| @license |
| Copyright (c) 2015 The Polymer Project Authors. All rights reserved. |
| This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
| The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
| Code distributed by Google as part of the polymer project is also |
| subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
| --> |
| <html> |
| <head> |
| |
| <title>paper-submenu tests</title> |
| |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes"> |
| |
| <script src="../../webcomponentsjs/webcomponents-lite.js"></script> |
| |
| <script src="../../web-component-tester/browser.js"></script> |
| <script src="../../iron-test-helpers/mock-interactions.js"></script> |
| |
| <link rel="import" href="../../paper-item/paper-item.html"> |
| <link rel="import" href="../paper-menu.html"> |
| <link rel="import" href="../paper-submenu.html"> |
| |
| </head> |
| <style> |
| paper-item { |
| font-weight: normal; |
| } |
| </style> |
| <body> |
| |
| <test-fixture id="basic"> |
| <template> |
| <paper-menu> |
| <paper-submenu> |
| <paper-item class="menu-trigger">Topic 1</paper-item> |
| <paper-menu class="menu-content"> |
| <paper-item>item 1.1</paper-item> |
| <paper-item>item 1.2</paper-item> |
| <paper-item>item 1.3</paper-item> |
| </paper-menu> |
| </paper-submenu> |
| <paper-submenu> |
| <paper-item class="menu-trigger">Topic 2</paper-item> |
| <paper-menu class="menu-content"> |
| <paper-item>item 2.1</paper-item> |
| <paper-item>item 2.2</paper-item> |
| <paper-item>item 2.3</paper-item> |
| </paper-menu> |
| </paper-submenu> |
| <paper-submenu disabled> |
| <paper-item class="menu-trigger">Topic 3</paper-item> |
| <paper-menu class="menu-content"> |
| <paper-item>item 3.1</paper-item> |
| <paper-item>item 3.2</paper-item> |
| <paper-item>item 3.3</paper-item> |
| </paper-menu> |
| </paper-submenu> |
| </paper-menu> |
| </template> |
| </test-fixture> |
| |
| <test-fixture id="opened"> |
| <template> |
| <paper-menu> |
| <paper-submenu class="menu-content" opened> |
| <paper-item class="menu-trigger">My submenu is opened to start!</paper-item> |
| <paper-menu class="menu-content"> |
| <paper-item>Triggered item</paper-item> |
| </paper-menu> |
| </paper-submenu> |
| </paper-menu> |
| </template> |
| </test-fixture> |
| |
| <script> |
| |
| suite('<paper-submenu>', function() { |
| var menu, |
| sub1, sub2, sub3, |
| collapse1, collapse2, collapse3, |
| trigger1, trigger2, trigger3; |
| |
| setup(function() { |
| menu = fixture('basic'); |
| |
| sub1 = menu.querySelectorAll('paper-submenu')[0]; |
| sub2 = menu.querySelectorAll('paper-submenu')[1]; |
| sub3 = menu.querySelectorAll('paper-submenu')[2]; |
| |
| collapse1 = Polymer.dom(sub1.root).querySelector('iron-collapse'); |
| collapse2 = Polymer.dom(sub2.root).querySelector('iron-collapse'); |
| collapse3 = Polymer.dom(sub3.root).querySelector('iron-collapse'); |
| |
| trigger1 = sub1.querySelector('.menu-trigger'); |
| trigger2 = sub2.querySelector('.menu-trigger'); |
| trigger3 = sub3.querySelector('.menu-trigger'); |
| }); |
| |
| test('selecting an item expands the submenu', function() { |
| assert.isFalse(collapse1.opened); |
| assert.isFalse(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| |
| MockInteractions.tap(trigger1); |
| |
| assert.isTrue(collapse1.opened); |
| assert.isFalse(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| }); |
| |
| test('selecting a different item closes the previously opened submenu', function() { |
| assert.isFalse(collapse1.opened); |
| assert.isFalse(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| |
| MockInteractions.tap(trigger1); |
| |
| assert.isTrue(collapse1.opened); |
| assert.isFalse(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| |
| MockInteractions.tap(trigger2); |
| |
| assert.isFalse(collapse1.opened); |
| assert.isTrue(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| }); |
| |
| test('cannot open a disabled submenu', function() { |
| assert.isFalse(collapse1.opened); |
| assert.isFalse(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| |
| MockInteractions.tap(trigger3); |
| |
| assert.isFalse(collapse1.opened); |
| assert.isFalse(collapse2.opened); |
| assert.isFalse(collapse3.opened); |
| }); |
| |
| test('selecting an item styles it and the parent', function() { |
| var boldDiv = document.createElement('div'); |
| boldDiv.style.fontWeight = 'bold'; |
| document.body.appendChild(boldDiv); |
| |
| var normalDiv = document.createElement('div'); |
| normalDiv.style.fontWeight = 'normal'; |
| document.body.appendChild(normalDiv); |
| |
| assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| |
| var item1 = sub1.querySelector('.menu-content').querySelector('paper-item'); |
| |
| MockInteractions.tap(trigger1); |
| // Nothing is initially selected. |
| assert.equal(getComputedStyle(item1).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| MockInteractions.tap(item1); |
| |
| assert.equal(getComputedStyle(item1).fontWeight, getComputedStyle(boldDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(boldDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| }); |
| |
| test('selecting a new item de-styles the previous one', function() { |
| var boldDiv = document.createElement('div'); |
| boldDiv.style.fontWeight = 'bold'; |
| document.body.appendChild(boldDiv); |
| |
| var normalDiv = document.createElement('div'); |
| normalDiv.style.fontWeight = 'normal'; |
| document.body.appendChild(normalDiv); |
| |
| assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| |
| var item1 = sub1.querySelector('.menu-content').querySelector('paper-item'); |
| var item2 = sub2.querySelector('.menu-content').querySelector('paper-item'); |
| |
| MockInteractions.tap(trigger1); |
| MockInteractions.tap(item1); |
| MockInteractions.tap(trigger2); |
| MockInteractions.tap(item2); |
| |
| // Both children are still selected even though the first one is hidden. |
| assert.equal(getComputedStyle(item1).fontWeight, getComputedStyle(boldDiv).fontWeight); |
| assert.equal(getComputedStyle(item2).fontWeight, getComputedStyle(boldDiv).fontWeight); |
| |
| assert.equal(getComputedStyle(trigger1).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger2).fontWeight, getComputedStyle(boldDiv).fontWeight); |
| assert.equal(getComputedStyle(trigger3).fontWeight, getComputedStyle(normalDiv).fontWeight); |
| }); |
| |
| test('focus a submenu should redirect focus to the trigger', function(done) { |
| MockInteractions.focus(sub1); |
| flush(function() { |
| assert.equal(sub1.shadowRoot ? sub1.shadowRoot.activeElement : |
| document.activeElement, sub1.__trigger); |
| done(); |
| }); |
| }); |
| }); |
| |
| suite('<paper-submenu opened>', function() { |
| var opened; |
| var submenu; |
| var collapse; |
| |
| var fail = function(msg) { |
| return function() { |
| throw new Error(msg); |
| }; |
| }; |
| |
| setup(function() { |
| opened = fixture('opened'); |
| submenu = opened.querySelector('paper-submenu'); |
| collapse = Polymer.dom(submenu.root).querySelector('iron-collapse'); |
| }); |
| |
| test('opened binding + .menu-trigger tap', function() { |
| assert.isTrue(submenu.opened); |
| |
| var trigger = submenu.querySelector('.menu-trigger'); |
| MockInteractions.tap(trigger); |
| assert.isFalse(submenu.opened); |
| |
| MockInteractions.tap(trigger); |
| assert.isTrue(submenu.opened); |
| }); |
| |
| test('opened binding + open()/close()', function() { |
| assert.isTrue(submenu.opened); |
| |
| submenu.close(); |
| assert.isFalse(submenu.opened); |
| assert.isFalse(collapse.opened); |
| |
| submenu.open(); |
| assert.isTrue(submenu.opened); |
| assert.isTrue(collapse.opened); |
| }); |
| |
| test('opened binding + toggle()', function() { |
| assert.isTrue(submenu.opened); |
| |
| submenu.toggle(); |
| assert.isFalse(submenu.opened); |
| assert.isFalse(collapse.opened); |
| |
| submenu.toggle(); |
| assert.isTrue(submenu.opened); |
| assert.isTrue(collapse.opened); |
| }); |
| |
| test('opened binding + open() x 2', function() { |
| assert.isTrue(submenu.opened); |
| |
| opened.addEventListener('paper-submenu-open', fail('duplicate open')); |
| |
| submenu.open(); // Opening when already opened should not fire(). |
| }); |
| |
| test('opened binding + close() x 2', function() { |
| submenu.close(); |
| assert.isFalse(submenu.opened); |
| |
| opened.addEventListener('paper-submenu-close', fail('duplicate close')); |
| |
| submenu.close(); // Closing again when !opened should not fire(). |
| }); |
| }); |
| </script> |
| |
| </body> |
| </html> |