// Copyright 2009 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.SelectionMenuButtonTest'); goog.setTestOnly('goog.ui.SelectionMenuButtonTest'); goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.testing.events'); goog.require('goog.testing.jsunit'); goog.require('goog.ui.Component'); goog.require('goog.ui.SelectionMenuButton'); var selectionMenuButton; var clonedSelectionMenuButtonDom; function setUp() { clonedSelectionMenuButtonDom = goog.dom.getElement('demoSelectionMenuButton').cloneNode(true); selectionMenuButton = new goog.ui.SelectionMenuButton(); } function tearDown() { selectionMenuButton.dispose(); var element = goog.dom.getElement('demoSelectionMenuButton'); element.parentNode.replaceChild(clonedSelectionMenuButtonDom, element); } /** * Open the menu and click on the menu item inside. */ function testBasicButtonBehavior() { var node = goog.dom.getElement('demoSelectionMenuButton'); selectionMenuButton.decorate(node); goog.testing.events.fireClickSequence(node); assertTrue('Menu must open after click', selectionMenuButton.isOpen()); var menuItemClicked = 0; var lastMenuItemClicked = null; goog.events.listen( selectionMenuButton.getMenu(), goog.ui.Component.EventType.ACTION, function(e) { menuItemClicked++; lastMenuItemClicked = e.target; }); var menuItem2 = goog.dom.getElement('menuItem2'); goog.testing.events.fireClickSequence(menuItem2); assertFalse( 'Menu must close on clicking when open', selectionMenuButton.isOpen()); assertEquals('Number of menu items clicked should be 1', 1, menuItemClicked); assertEquals( 'menuItem2 should be the last menuitem clicked', menuItem2, lastMenuItemClicked.getElement()); } /** * Tests that the checkbox fires the same events as the first 2 items. */ function testCheckboxFireEvents() { var node = goog.dom.getElement('demoSelectionMenuButton'); selectionMenuButton.decorate(node); var menuItemClicked = 0; var lastMenuItemClicked = null; goog.events.listen( selectionMenuButton.getMenu(), goog.ui.Component.EventType.ACTION, function(e) { menuItemClicked++; lastMenuItemClicked = e.target; }); var checkbox = goog.dom.getElement('demoCheckbox'); assertFalse('Checkbox must be unchecked (i.e. unselected)', checkbox.checked); checkbox.checked = true; goog.testing.events.fireClickSequence(checkbox); assertFalse( 'Menu must be closed when clicking checkbox', selectionMenuButton.isOpen()); assertEquals('Number of menu items clicked should be 1', 1, menuItemClicked); assertEquals( 'menuItem1 should be the last menuitem clicked', goog.dom.getElement('menuItem1'), lastMenuItemClicked.getElement()); checkbox.checked = false; goog.testing.events.fireClickSequence(checkbox); assertFalse( 'Menu must be closed when clicking checkbox', selectionMenuButton.isOpen()); assertEquals('Number of menu items clicked should be 2', 2, menuItemClicked); assertEquals( 'menuItem2 should be the last menuitem clicked', goog.dom.getElement('menuItem2'), lastMenuItemClicked.getElement()); } /** * Tests that the checkbox state gets updated when the first 2 events fire */ function testCheckboxReceiveEvents() { var node = goog.dom.getElement('demoSelectionMenuButton'); selectionMenuButton.decorate(node); var checkbox = goog.dom.getElement('demoCheckbox'); assertFalse('Checkbox must be unchecked (i.e. unselected)', checkbox.checked); goog.testing.events.fireClickSequence(goog.dom.getElement('menuItem1')); assertTrue('Checkbox must be checked (i.e. selected)', checkbox.checked); goog.testing.events.fireClickSequence(goog.dom.getElement('menuItem2')); assertFalse('Checkbox must be unchecked (i.e. unselected)', checkbox.checked); } /** * Tests that set/getSelectionState correctly changes the state */ function testSelectionState() { var node = goog.dom.getElement('demoSelectionMenuButton'); selectionMenuButton.decorate(node); var checkbox = goog.dom.getElement('demoCheckbox'); assertFalse('Checkbox must be unchecked (i.e. unselected)', checkbox.checked); selectionMenuButton.setSelectionState( goog.ui.SelectionMenuButton.SelectionState.ALL); assertTrue('Checkbox should be checked when selecting all', checkbox.checked); assertEquals( 'selectionState should be ALL', selectionMenuButton.getSelectionState(), goog.ui.SelectionMenuButton.SelectionState.ALL); selectionMenuButton.setSelectionState( goog.ui.SelectionMenuButton.SelectionState.NONE); assertFalse( 'Checkbox should be checked when selecting all', checkbox.checked); assertEquals( 'selectionState should be NONE', selectionMenuButton.getSelectionState(), goog.ui.SelectionMenuButton.SelectionState.NONE); selectionMenuButton.setSelectionState( goog.ui.SelectionMenuButton.SelectionState.SOME); assertTrue('Checkbox should be checked when selecting all', checkbox.checked); assertEquals( 'selectionState should be SOME', selectionMenuButton.getSelectionState(), goog.ui.SelectionMenuButton.SelectionState.SOME); } /** * Tests that the checkbox gets disabled when the button is disabled */ function testCheckboxDisabled() { var node = goog.dom.getElement('demoSelectionMenuButton'); selectionMenuButton.decorate(node); var checkbox = goog.dom.getElement('demoCheckbox'); assertFalse('Checkbox must be enabled', checkbox.disabled); selectionMenuButton.setEnabled(false); assertTrue('Checkbox must be disabled', checkbox.disabled); selectionMenuButton.setEnabled(true); assertFalse('Checkbox must be enabled', checkbox.disabled); } /** * Tests that clicking the checkbox does not open the menu */ function testCheckboxClickMenuClosed() { var node = goog.dom.getElement('demoSelectionMenuButton'); selectionMenuButton.decorate(node); var checkbox = goog.dom.getElement('demoCheckbox'); goog.testing.events.fireMouseDownEvent(checkbox); assertFalse( 'Menu must be closed when mousedown checkbox', selectionMenuButton.isOpen()); goog.testing.events.fireMouseUpEvent(checkbox); assertFalse( 'Menu must remain closed when mouseup checkbox', selectionMenuButton.isOpen()); selectionMenuButton.setOpen(true); goog.testing.events.fireClickSequence(checkbox); assertFalse( 'Menu must close when clickin checkbox', selectionMenuButton.isOpen()); }