blob: 952051666ae57ba05e76d0bb74967185ecb4fb45 [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.ContainerScrollerTest');
goog.setTestOnly('goog.ui.ContainerScrollerTest');
goog.require('goog.dom');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.events');
goog.require('goog.testing.jsunit');
goog.require('goog.ui.Container');
goog.require('goog.ui.ContainerScroller');
var sandbox;
var sandboxHtml;
var container;
var mockClock;
var scroller;
function setUpPage() {
sandbox = goog.dom.getElement('sandbox');
sandboxHtml = sandbox.innerHTML;
}
function setUp() {
container = new goog.ui.Container();
container.decorate(sandbox);
container.getElement().scrollTop = 0;
mockClock = new goog.testing.MockClock(true);
scroller = null;
}
function tearDown() {
container.dispose();
if (scroller) {
scroller.dispose();
}
// Tick one second to clear all the extra registered events.
mockClock.tick(1000);
mockClock.uninstall();
sandbox.innerHTML = sandboxHtml;
}
function testHighlightFirstStaysAtTop() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(0).setHighlighted(true);
assertEquals(0, container.getElement().scrollTop);
}
function testHighlightSecondStaysAtTop() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(1).setHighlighted(true);
assertEquals(0, container.getElement().scrollTop);
}
function testHighlightSecondLastScrollsNearTheBottom() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(8).setHighlighted(true);
assertEquals('Since scrolling is lazy, when highlighting the second' +
' last, the item should be the last visible one.',
80, container.getElement().scrollTop);
}
function testHighlightLastScrollsToBottom() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(9).setHighlighted(true);
assertEquals(100, container.getElement().scrollTop);
}
function testScrollRestoreIfStillVisible() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(9).setHighlighted(true);
var scrollTop = container.getElement().scrollTop;
container.setVisible(false);
container.setVisible(true);
assertEquals('Scroll position should be the same after restore, if it ' +
'still makes highlighted item visible',
scrollTop, container.getElement().scrollTop);
}
function testNoScrollRestoreIfNotVisible() {
scroller = new goog.ui.ContainerScroller(container);
container.getElement().scrollTop = 100;
container.setVisible(false);
container.getChildAt(0).setHighlighted(true);
container.setVisible(true);
assertNotEquals('Scroll position should not be the same after restore, if ' +
'the scroll position when the menu was hidden no longer ' +
'makes the highlighted item visible when the container is ' +
'shown again',
100, container.getElement().scrollTop);
}
function testCenterOnHighlightedOnFirstOpen() {
container.setVisible(false);
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(4).setHighlighted(true);
container.setVisible(true);
// #2 should be at the top when 4 is centered, meaning a scroll top
// of 40 pixels.
assertEquals(
'On the very first display of the scroller, the item should be ' +
'centered, rather than just assured in view.',
40, container.getElement().scrollTop);
}
function testHighlightsAreIgnoredInResponseToScrolling() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(9).setHighlighted(true);
goog.testing.events.fireMouseOverEvent(
goog.dom.getElement('control-5'),
goog.dom.getElement('control-9'));
assertEquals('Mouseovers due to scrolls should be ignored',
9, container.getHighlightedIndex());
}
function testHighlightsAreNotIgnoredWhenNotScrolling() {
scroller = new goog.ui.ContainerScroller(container);
container.getChildAt(5).setHighlighted(true);
mockClock.tick(1000);
goog.testing.events.fireMouseOutEvent(
goog.dom.getElement('control-5'),
goog.dom.getElement('control-6'));
goog.testing.events.fireMouseOverEvent(
goog.dom.getElement('control-6'),
goog.dom.getElement('control-5'));
assertEquals('Mousovers not due to scrolls should not be ignored',
6, container.getHighlightedIndex());
}
function testFastSynchronousHighlightsNotIgnored() {
scroller = new goog.ui.ContainerScroller(container);
// Whereas subsequent highlights from mouseovers due to a scroll, should
// be ignored, they should not ignored if they are made synchronusly
// from the code and not from a mouseover. Imagine how bad it would be
// if you could only set the highligted index a certain number of
// times in the same execution context.
container.getChildAt(9).setHighlighted(true);
container.getChildAt(1).setHighlighted(true);
assertEquals('Synchronous highlights should NOT be ignored.',
1, container.getHighlightedIndex());
container.getChildAt(8).setHighlighted(true);
assertEquals('Synchronous highlights should NOT be ignored.',
8, container.getHighlightedIndex());
}
function testInitialItemIsCentered() {
container.getChildAt(4).setHighlighted(true);
scroller = new goog.ui.ContainerScroller(container);
// #2 should be at the top when 4 is centered, meaning a scroll top
// of 40 pixels.
assertEquals(
'On the very first attachment of the scroller, the item should be ' +
'centered, rather than just assured in view.',
40, container.getElement().scrollTop);
}
function testInitialItemIsCenteredTopItem() {
container.getChildAt(0).setHighlighted(true);
scroller = new goog.ui.ContainerScroller(container);
assertEquals(0, container.getElement().scrollTop);
}
function testHidingMenuItemsDoesntAffectContainerScroller() {
scroller = new goog.ui.ContainerScroller(container);
container.getElement = function() {
fail('getElement() must not be called when a control in the container is ' +
'being hidden');
};
container.getChildAt(0).setVisible(false);
}