blob: 58b638d97e92256a41eb3820546c968f2ae73c0d [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.MenuItemRendererTest');
goog.setTestOnly('goog.ui.MenuItemRendererTest');
goog.require('goog.a11y.aria');
goog.require('goog.a11y.aria.Role');
goog.require('goog.a11y.aria.State');
goog.require('goog.dom');
goog.require('goog.dom.classlist');
goog.require('goog.testing.jsunit');
goog.require('goog.testing.ui.rendererasserts');
goog.require('goog.ui.Component');
goog.require('goog.ui.MenuItem');
goog.require('goog.ui.MenuItemRenderer');
var sandbox;
var item, renderer;
function setUp() {
sandbox = goog.dom.getElement('sandbox');
item = new goog.ui.MenuItem('Hello');
renderer = goog.ui.MenuItemRenderer.getInstance();
}
function tearDown() {
item.dispose();
goog.dom.removeChildren(sandbox);
}
function testMenuItemRenderer() {
assertNotNull('Instance must not be null', renderer);
assertEquals('Singleton getter must always return same instance',
renderer, goog.ui.MenuItemRenderer.getInstance());
}
function testCreateDom() {
var element = renderer.createDom(item);
assertNotNull('Element must not be null', element);
assertSameElements('Element must have the expected class names',
['goog-menuitem'], goog.dom.classlist.get(element));
assertEquals('Element must have exactly one child element', 1,
element.childNodes.length);
assertHTMLEquals('Child element must have the expected structure',
'<div class="goog-menuitem-content">Hello</div>',
element.innerHTML);
}
function testCreateDomWithHoverState() {
item.setHighlighted(true);
var element = renderer.createDom(item);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-menuitem-highlight'],
goog.dom.classlist.get(element));
}
function testCreateDomForCheckableItem() {
item.setSupportedState(goog.ui.Component.State.CHECKED, true);
item.render();
var element = item.getElement();
assertNotNull(element);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-option'],
goog.dom.classlist.get(element));
assertEquals('Element must have ARIA role menuitemcheckbox',
goog.a11y.aria.Role.MENU_ITEM_CHECKBOX,
goog.a11y.aria.getRole(element));
item.setChecked(true);
assertTrue('Item must be checked', item.isChecked());
assertSameElements('Checked item must have the expected class names',
['goog-menuitem', 'goog-option', 'goog-option-selected'],
goog.dom.classlist.get(element));
assertEquals('Item must have checked ARIA state', 'true',
goog.a11y.aria.getState(element, goog.a11y.aria.State.CHECKED));
}
function testCreateUpdateDomForCheckableItem() {
// Render the item first, then update its supported states to include CHECKED.
item.render();
var element = item.getElement();
item.setSupportedState(goog.ui.Component.State.CHECKED, true);
assertNotNull(element);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-option'],
goog.dom.classlist.get(element));
assertEquals('Element must have ARIA role menuitemcheckbox',
goog.a11y.aria.Role.MENU_ITEM_CHECKBOX,
goog.a11y.aria.getRole(element));
// Now actually check the item.
item.setChecked(true);
assertTrue('Item must be checked', item.isChecked());
assertSameElements('Checked item must have the expected class names',
['goog-menuitem', 'goog-option', 'goog-option-selected'],
goog.dom.classlist.get(element));
assertEquals('Item must have checked ARIA state', 'true',
goog.a11y.aria.getState(element, goog.a11y.aria.State.CHECKED));
}
function testCreateDomForSelectableItem() {
item.setSupportedState(goog.ui.Component.State.SELECTED, true);
item.render();
var element = item.getElement();
assertNotNull(element);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-option'],
goog.dom.classlist.get(element));
assertEquals('Element must have ARIA role menuitemradio',
goog.a11y.aria.Role.MENU_ITEM_RADIO,
goog.a11y.aria.getRole(element));
item.setSelected(true);
assertTrue('Item must be selected', item.isSelected());
assertSameElements('Selected item must have the expected class names',
['goog-menuitem', 'goog-option', 'goog-option-selected'],
goog.dom.classlist.get(element));
assertEquals('Item must have selected ARIA state', 'true',
goog.a11y.aria.getState(element, goog.a11y.aria.State.CHECKED));
}
function testCreateUpdateDomForSelectableItem() {
// Render the item first, then update its supported states to include
// SELECTED.
item.render();
var element = item.getElement();
item.setSupportedState(goog.ui.Component.State.SELECTED, true);
assertNotNull(element);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-option'],
goog.dom.classlist.get(element));
assertEquals('Element must have ARIA role menuitemradio',
goog.a11y.aria.Role.MENU_ITEM_RADIO,
goog.a11y.aria.getRole(element));
// Now actually select the item.
item.setSelected(true);
assertTrue('Item must be selected', item.isSelected());
assertSameElements('Selected item must have the expected class names',
['goog-menuitem', 'goog-option', 'goog-option-selected'],
goog.dom.classlist.get(element));
assertEquals('Item must have selected ARIA state', 'true',
goog.a11y.aria.getState(element, goog.a11y.aria.State.CHECKED));
}
function testGetContentElement() {
assertNull('Content element must be the null initially',
item.getContentElement());
item.createDom();
assertEquals('Content element must be the element\'s first child',
item.getElement().firstChild, item.getContentElement());
}
function testDecorate() {
sandbox.innerHTML = '<div id="foo">Hello</div>';
var foo = goog.dom.getElement('foo');
var element = renderer.decorate(item, foo);
assertSameElements('Element must have the expected class names',
['goog-menuitem'], goog.dom.classlist.get(element));
assertEquals('Element must have exactly one child element', 1,
element.childNodes.length);
assertHTMLEquals('Child element must have the expected structure',
'<div class="goog-menuitem-content">Hello</div>',
element.innerHTML);
}
function testDecorateWithContentStructure() {
sandbox.innerHTML =
'<div id="foo"><div class="goog-menuitem-content">Hello</div></div>';
var foo = goog.dom.getElement('foo');
var element = renderer.decorate(item, foo);
assertSameElements('Element must have the expected class names',
['goog-menuitem'], goog.dom.classlist.get(element));
assertEquals('Element must have exactly one child element', 1,
element.childNodes.length);
assertHTMLEquals('Child element must have the expected structure',
'<div class="goog-menuitem-content">Hello</div>',
element.innerHTML);
}
function testDecorateWithHoverState() {
sandbox.innerHTML =
'<div id="foo" class="goog-menuitem-highlight">Hello</div>';
var foo = goog.dom.getElement('foo');
assertFalse('Item must not be highlighted', item.isHighlighted());
var element = renderer.decorate(item, foo);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-menuitem-highlight'],
goog.dom.classlist.get(element));
assertTrue('Item must be highlighted', item.isHighlighted());
}
function testDecorateCheckableItem() {
sandbox.innerHTML = '<div id="foo" class="goog-option">Hello</div>';
var foo = goog.dom.getElement('foo');
assertFalse('Item must not be checkable',
item.isSupportedState(goog.ui.Component.State.CHECKED));
var element = renderer.decorate(item, foo);
assertSameElements('Element must have the expected class names',
['goog-menuitem', 'goog-option'], goog.dom.classlist.get(element));
assertTrue('Item must be checkable',
item.isSupportedState(goog.ui.Component.State.CHECKED));
assertHTMLEquals('Child element must have the expected structure',
'<div class="goog-menuitem-content">' +
'<div class="goog-menuitem-checkbox"></div>Hello</div>',
element.innerHTML);
}
function testSetContent() {
item.setSupportedState(goog.ui.Component.State.CHECKED, true);
var element = renderer.createDom(item);
assertHTMLEquals('Child element must have the expected structure',
'<div class="goog-menuitem-content">' +
'<div class="goog-menuitem-checkbox"></div>Hello</div>',
element.innerHTML);
renderer.setContent(element, 'Goodbye');
assertHTMLEquals('Child element must have the expected structure',
'<div class="goog-menuitem-content">' +
'<div class="goog-menuitem-checkbox"></div>Goodbye</div>',
element.innerHTML);
}
function testDoesntCallGetCssClassInConstructor() {
goog.testing.ui.rendererasserts.
assertNoGetCssClassCallsInConstructor(goog.ui.MenuItemRenderer);
}