// 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); }