// Copyright 2008 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. goog.provide('goog.ui.MenuTest'); goog.setTestOnly('goog.ui.MenuTest'); goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.math.Coordinate'); goog.require('goog.testing.events'); goog.require('goog.testing.jsunit'); goog.require('goog.ui.Component'); goog.require('goog.ui.Menu'); var menu; var clonedMenuDom; function setUp() { clonedMenuDom = goog.dom.getElement('demoMenu').cloneNode(true); menu = new goog.ui.Menu(); } function tearDown() { menu.dispose(); var element = goog.dom.getElement('demoMenu'); element.parentNode.replaceChild(clonedMenuDom, element); } /** @bug 1463524 */ function testMouseupDoesntActivateMenuItemImmediately() { menu.decorate(goog.dom.getElement('demoMenu')); var fakeEvent = {clientX: 42, clientY: 42}; var itemElem = goog.dom.getElement('menuItem2'); var coords = new goog.math.Coordinate(42, 42); var menuItem = menu.getChildAt(1); var actionDispatched = false; goog.events.listen(menuItem, goog.ui.Component.EventType.ACTION, function(e) { actionDispatched = true; }); menu.setVisible(true, false, fakeEvent); // Makes the menu item active so it can be selected on mouseup. menuItem.setActive(true); goog.testing.events.fireMouseUpEvent(itemElem, undefined, coords); assertFalse( 'ACTION should not be dispatched after the initial mouseup', actionDispatched); goog.testing.events.fireMouseUpEvent(itemElem, undefined, coords); assertTrue( 'ACTION should be dispatched after the second mouseup', actionDispatched); } function testHoverBehavior() { menu.decorate(goog.dom.getElement('demoMenu')); goog.testing.events.fireMouseOverEvent( goog.dom.getElement('menuItem2'), document.body); assertEquals(1, menu.getHighlightedIndex()); menu.exitDocument(); assertEquals(-1, menu.getHighlightedIndex()); } function testIndirectionDecoration() { menu.decorate(goog.dom.getElement('complexMenu')); goog.testing.events.fireMouseOverEvent( goog.dom.getElement('complexItem3'), document.body); assertEquals(2, menu.getHighlightedIndex()); menu.exitDocument(); assertEquals(-1, menu.getHighlightedIndex()); } function testSetHighlightedIndex() { menu.decorate(goog.dom.getElement('scrollableMenu')); assertEquals(0, menu.getElement().scrollTop); // Scroll down var element = goog.dom.getElement('scrollableMenuItem4'); menu.setHighlightedIndex(3); assertTrue(element.offsetTop >= menu.getElement().scrollTop); assertTrue( element.offsetTop <= menu.getElement().scrollTop + menu.getElement().offsetHeight); // Scroll up element = goog.dom.getElement('scrollableMenuItem3'); menu.setHighlightedIndex(2); assertTrue(element.offsetTop >= menu.getElement().scrollTop); assertTrue( element.offsetTop <= menu.getElement().scrollTop + menu.getElement().offsetHeight); menu.exitDocument(); assertEquals(-1, menu.getHighlightedIndex()); }