blob: 1878a02fa2506da5f16158e5d898c8b81494d9f3 [file] [log] [blame]
// 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.ButtonTest');
goog.setTestOnly('goog.ui.ButtonTest');
goog.require('goog.dom');
goog.require('goog.dom.classlist');
goog.require('goog.events');
goog.require('goog.events.Event');
goog.require('goog.events.EventType');
goog.require('goog.events.KeyCodes');
goog.require('goog.events.KeyHandler');
goog.require('goog.testing.events');
goog.require('goog.testing.jsunit');
goog.require('goog.ui.Button');
goog.require('goog.ui.ButtonRenderer');
goog.require('goog.ui.ButtonSide');
goog.require('goog.ui.Component');
goog.require('goog.ui.NativeButtonRenderer');
var sandbox;
var button;
var clonedButtonDom;
var demoButtonElement;
function setUp() {
sandbox = goog.dom.getElement('sandbox');
button = new goog.ui.Button();
demoButtonElement = goog.dom.getElement('demoButton');
clonedButtonDom = demoButtonElement.cloneNode(true);
}
function tearDown() {
button.dispose();
demoButtonElement.parentNode.replaceChild(clonedButtonDom,
demoButtonElement);
goog.dom.removeChildren(sandbox);
}
function testConstructor() {
assertNotNull('Button must not be null', button);
assertEquals('Renderer must default to expected value',
goog.ui.NativeButtonRenderer.getInstance(), button.getRenderer());
var fakeDomHelper = {};
var testButton = new goog.ui.Button('Hello',
goog.ui.ButtonRenderer.getInstance(), fakeDomHelper);
assertEquals('Content must have expected value', 'Hello',
testButton.getContent());
assertEquals('Renderer must have expected value',
goog.ui.ButtonRenderer.getInstance(), testButton.getRenderer());
assertEquals('DOM helper must have expected value', fakeDomHelper,
testButton.getDomHelper());
testButton.dispose();
}
function testGetSetValue() {
assertUndefined('Button\'s value must default to undefined',
button.getValue());
button.setValue(17);
assertEquals('Button must have expected value', 17, button.getValue());
button.render(sandbox);
assertEquals('Button element must have expected value', '17',
button.getElement().value);
button.setValue('foo');
assertEquals('Button element must have updated value', 'foo',
button.getElement().value);
button.setValueInternal('bar');
assertEquals('Button must have new internal value', 'bar',
button.getValue());
assertEquals('Button element must be unchanged', 'foo',
button.getElement().value);
}
function testGetSetTooltip() {
assertUndefined('Button\'s tooltip must default to undefined',
button.getTooltip());
button.setTooltip('Hello');
assertEquals('Button must have expected tooltip', 'Hello',
button.getTooltip());
button.render(sandbox);
assertEquals('Button element must have expected title', 'Hello',
button.getElement().title);
button.setTooltip('Goodbye');
assertEquals('Button element must have updated title', 'Goodbye',
button.getElement().title);
button.setTooltipInternal('World');
assertEquals('Button must have new internal tooltip', 'World',
button.getTooltip());
assertEquals('Button element must be unchanged', 'Goodbye',
button.getElement().title);
}
function testSetCollapsed() {
assertNull('Button must not have any collapsed styling by default',
button.getExtraClassNames());
button.setCollapsed(goog.ui.ButtonSide.START);
assertSameElements('Button must have the start side collapsed',
['goog-button-collapse-left'], button.getExtraClassNames());
button.render(sandbox);
assertSameElements('Button element must have the start side collapsed',
['goog-button', 'goog-button-collapse-left'],
goog.dom.classlist.get(button.getElement()));
button.setCollapsed(goog.ui.ButtonSide.BOTH);
assertSameElements('Button must have both sides collapsed',
['goog-button-collapse-left', 'goog-button-collapse-right'],
button.getExtraClassNames());
assertSameElements('Button element must have both sides collapsed', [
'goog-button',
'goog-button-collapse-left',
'goog-button-collapse-right'
], goog.dom.classlist.get(button.getElement()));
}
function testDispose() {
assertFalse('Button must not have been disposed of', button.isDisposed());
button.render(sandbox);
button.setValue('foo');
button.setTooltip('bar');
button.dispose();
assertTrue('Button must have been disposed of', button.isDisposed());
assertUndefined('Button\'s value must have been deleted',
button.getValue());
assertUndefined('Button\'s tooltip must have been deleted',
button.getTooltip());
}
function testBasicButtonBehavior() {
var dispatchedActionCount = 0;
var handleAction = function() {
dispatchedActionCount++;
};
goog.events.listen(button, goog.ui.Component.EventType.ACTION,
handleAction);
button.decorate(demoButtonElement);
goog.testing.events.fireClickSequence(demoButtonElement);
assertEquals('Button must have dispatched ACTION on click', 1,
dispatchedActionCount);
dispatchedActionCount = 0;
var e = new goog.events.Event(goog.events.KeyHandler.EventType.KEY,
button);
e.keyCode = goog.events.KeyCodes.ENTER;
button.handleKeyEvent(e);
assertEquals('Enabled button must have dispatched ACTION on Enter key', 1,
dispatchedActionCount);
dispatchedActionCount = 0;
e = new goog.events.Event(goog.events.EventType.KEYUP, button);
e.keyCode = goog.events.KeyCodes.SPACE;
button.handleKeyEvent(e);
assertEquals('Enabled button must have dispatched ACTION on Space key', 1,
dispatchedActionCount);
goog.events.unlisten(button, goog.ui.Component.EventType.ACTION,
handleAction);
}
function testDisabledButtonBehavior() {
var dispatchedActionCount = 0;
var handleAction = function() {
dispatchedActionCount++;
};
goog.events.listen(button, goog.ui.Component.EventType.ACTION,
handleAction);
button.setEnabled(false);
dispatchedActionCount = 0;
button.handleKeyEvent({keyCode: goog.events.KeyCodes.ENTER});
assertEquals('Disabled button must not dispatch ACTION on Enter key',
0, dispatchedActionCount);
dispatchedActionCount = 0;
button.handleKeyEvent({
keyCode: goog.events.KeyCodes.SPACE,
type: goog.events.EventType.KEYUP
});
assertEquals('Disabled button must not have dispatched ACTION on Space',
0, dispatchedActionCount);
goog.events.unlisten(button, goog.ui.Component.EventType.ACTION,
handleAction);
}
function testSpaceFireActionOnKeyUp() {
var dispatchedActionCount = 0;
var handleAction = function() {
dispatchedActionCount++;
};
goog.events.listen(button, goog.ui.Component.EventType.ACTION,
handleAction);
dispatchedActionCount = 0;
e = new goog.events.Event(goog.events.KeyHandler.EventType.KEY, button);
e.keyCode = goog.events.KeyCodes.SPACE;
button.handleKeyEvent(e);
assertEquals('Button must not have dispatched ACTION on Space keypress',
0, dispatchedActionCount);
assertEquals('The default action (scrolling) must have been prevented ' +
'for Space keypress',
false,
e.returnValue_);
dispatchedActionCount = 0;
e = new goog.events.Event(goog.events.EventType.KEYUP, button);
e.keyCode = goog.events.KeyCodes.SPACE;
button.handleKeyEvent(e);
assertEquals('Button must have dispatched ACTION on Space keyup',
1, dispatchedActionCount);
goog.events.unlisten(button, goog.ui.Component.EventType.ACTION,
handleAction);
}
function testEnterFireActionOnKeyPress() {
var dispatchedActionCount = 0;
var handleAction = function() {
dispatchedActionCount++;
};
goog.events.listen(button, goog.ui.Component.EventType.ACTION,
handleAction);
dispatchedActionCount = 0;
e = new goog.events.Event(goog.events.KeyHandler.EventType.KEY, button);
e.keyCode = goog.events.KeyCodes.ENTER;
button.handleKeyEvent(e);
assertEquals('Button must have dispatched ACTION on Enter keypress',
1, dispatchedActionCount);
dispatchedActionCount = 0;
e = new goog.events.Event(goog.events.EventType.KEYUP, button);
e.keyCode = goog.events.KeyCodes.ENTER;
button.handleKeyEvent(e);
assertEquals('Button must not have dispatched ACTION on Enter keyup',
0, dispatchedActionCount);
goog.events.unlisten(button, goog.ui.Component.EventType.ACTION,
handleAction);
}
function testSetAriaLabel() {
assertNull('Button must not have aria label by default',
button.getAriaLabel());
button.setAriaLabel('Button 1');
button.render();
assertEquals('Button element must have expected aria-label', 'Button 1',
button.getElement().getAttribute('aria-label'));
button.setAriaLabel('Button 2');
assertEquals('Button element must have updated aria-label', 'Button 2',
button.getElement().getAttribute('aria-label'));
}
function testSetAriaLabel_decorate() {
assertNull('Button must not have aria label by default',
button.getAriaLabel());
button.setAriaLabel('Button 1');
button.decorate(demoButtonElement);
var el = button.getElementStrict();
assertEquals('Button element must have expected aria-label', 'Button 1',
el.getAttribute('aria-label'));
assertEquals('Button element must have expected aria-role', 'button',
el.getAttribute('role'));
button.setAriaLabel('Button 2');
assertEquals('Button element must have updated aria-label', 'Button 2',
el.getAttribute('aria-label'));
assertEquals('Button element must have expected aria-role', 'button',
el.getAttribute('role'));
}