| /* |
| * Copyright 2011 Google Inc. |
| * |
| * 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. |
| */ |
| package com.google.gwt.user.client.ui; |
| |
| import com.google.gwt.core.client.Scheduler; |
| import com.google.gwt.core.client.Scheduler.ScheduledCommand; |
| import com.google.gwt.event.dom.client.ScrollEvent; |
| import com.google.gwt.event.dom.client.ScrollHandler; |
| import com.google.gwt.junit.DoNotRunWith; |
| import com.google.gwt.junit.Platform; |
| import com.google.gwt.user.client.Timer; |
| |
| /** |
| * Base tests the subclasses of {@link AbstractNativeScrollbar}. |
| * |
| * @param <S> the type of scrollbar |
| */ |
| public abstract class NativeScrollbarTestBase<S extends AbstractNativeScrollbar> extends |
| WidgetTestBase { |
| |
| /** |
| * A scroll handler used for testing. |
| */ |
| abstract static class TestScrollHandler implements ScrollHandler { |
| private boolean isFinished; |
| |
| public void finish() { |
| if (isFinished) { |
| fail("ScrollHandler already finished."); |
| } |
| this.isFinished = true; |
| } |
| |
| public boolean isFinished() { |
| return isFinished; |
| } |
| } |
| |
| /** |
| * The time to wait for a scroll event to fire, in milliseconds. |
| */ |
| private static final int SCROLL_EVENT_TIMEOUT = 1000; |
| |
| /** |
| * The test timeout in milliseconds. |
| */ |
| private static final int TEST_TIMEOUT = 5000; |
| |
| private S scrollbar; |
| |
| /** |
| * Test that changing the scrollbar size can affect the scroll position and |
| * fires a scroll event. |
| */ |
| @DoNotRunWith(Platform.HtmlUnitLayout) |
| public void testSetScrollbarSizeFiresScrollEvent() { |
| setScrollSize(scrollbar, 400); |
| assertEquals(400, getScrollSize(scrollbar)); |
| |
| // Wait for the scroll size to take effect. |
| delayTestFinish(TEST_TIMEOUT); |
| Scheduler.get().scheduleDeferred(new ScheduledCommand() { |
| public void execute() { |
| // Scroll to position 100. |
| setScrollPosition(scrollbar, 100); |
| assertEquals(100, getScrollPosition(scrollbar)); |
| |
| // Wait for the scroll position to take effect. |
| Scheduler.get().scheduleDeferred(new ScheduledCommand() { |
| public void execute() { |
| // Add a scroll handler. |
| final TestScrollHandler handler = new TestScrollHandler() { |
| public void onScroll(ScrollEvent event) { |
| finish(); |
| } |
| }; |
| scrollbar.addScrollHandler(handler); |
| |
| // Reduce scroll size to smaller than the scrollbar size. |
| setScrollbarSize(scrollbar, "400px"); |
| |
| // Wait for the new scroll size to take effect. |
| new Timer() { |
| @Override |
| public void run() { |
| assertEquals(0, getScrollPosition(scrollbar)); |
| assertTrue(handler.isFinished()); |
| finishTest(); |
| } |
| }.schedule(SCROLL_EVENT_TIMEOUT); |
| } |
| }); |
| } |
| }); |
| } |
| |
| @DoNotRunWith(Platform.HtmlUnitLayout) |
| public void testSetScrollPosition() { |
| // Add a scroll handler. |
| final TestScrollHandler handler = new TestScrollHandler() { |
| public void onScroll(ScrollEvent event) { |
| finish(); |
| } |
| }; |
| scrollbar.addScrollHandler(handler); |
| |
| // Scroll to a new position. |
| setScrollSize(scrollbar, 500); |
| |
| // Wait for the scroll size to take effect. |
| delayTestFinish(TEST_TIMEOUT); |
| Scheduler.get().scheduleDeferred(new ScheduledCommand() { |
| public void execute() { |
| // Set the scroll position. |
| setScrollPosition(scrollbar, 100); |
| assertEquals(100, getScrollPosition(scrollbar)); |
| assertEquals(0, getMinimumScrollPosition(scrollbar)); |
| assertEquals(300, getMaximumScrollPosition(scrollbar)); |
| |
| // Wait for the scroll event. |
| new Timer() { |
| @Override |
| public void run() { |
| assertTrue(handler.isFinished()); |
| finishTest(); |
| } |
| }.schedule(SCROLL_EVENT_TIMEOUT); |
| } |
| }); |
| } |
| |
| @DoNotRunWith(Platform.HtmlUnitLayout) |
| public void testSetScrollSize() { |
| setScrollSize(scrollbar, 500); |
| assertEquals(500, getScrollSize(scrollbar)); |
| } |
| |
| /** |
| * Test that changing the scroll size can affect the scroll position. |
| */ |
| @DoNotRunWith(Platform.HtmlUnitLayout) |
| public void testSetScrollSizeFiresScrollEvent() { |
| setScrollSize(scrollbar, 500); |
| assertEquals(500, getScrollSize(scrollbar)); |
| |
| // Wait for the scroll size to take effect. |
| delayTestFinish(TEST_TIMEOUT); |
| Scheduler.get().scheduleDeferred(new ScheduledCommand() { |
| public void execute() { |
| // Scroll to position 100. |
| setScrollPosition(scrollbar, 100); |
| assertEquals(100, getScrollPosition(scrollbar)); |
| |
| // Wait for the scroll position to take effect. |
| Scheduler.get().scheduleDeferred(new ScheduledCommand() { |
| public void execute() { |
| // Add a scroll handler. |
| final TestScrollHandler handler = new TestScrollHandler() { |
| public void onScroll(ScrollEvent event) { |
| finish(); |
| } |
| }; |
| scrollbar.addScrollHandler(handler); |
| |
| // Reduce scroll size to smaller than the scrollbar size. |
| setScrollSize(scrollbar, 50); |
| |
| // Wait for the new scroll size to take effect. |
| new Timer() { |
| @Override |
| public void run() { |
| assertEquals(0, getScrollPosition(scrollbar)); |
| assertTrue(handler.isFinished()); |
| finishTest(); |
| } |
| }.schedule(SCROLL_EVENT_TIMEOUT); |
| } |
| }); |
| } |
| }); |
| } |
| |
| /** |
| * Create a new scrollbar. |
| * |
| * @return the scrollbar |
| */ |
| protected abstract S createScrollbar(); |
| |
| /** |
| * Get the maximum position of the scrollbar in the direction of scrolling. |
| */ |
| protected abstract int getMaximumScrollPosition(S scrollbar); |
| |
| /** |
| * Get the minimum position of the scrollbar in the direction of scrolling. |
| */ |
| protected abstract int getMinimumScrollPosition(S scrollbar); |
| |
| /** |
| * Get the current position of the scrollbar in the direction of scrolling. |
| */ |
| protected abstract int getScrollPosition(S scrollbar); |
| |
| /** |
| * Get the size of the content within the scrollbar. |
| * |
| * @return the size in pixels |
| */ |
| protected abstract int getScrollSize(S scrollbar); |
| |
| @Override |
| protected void gwtSetUp() throws Exception { |
| super.gwtSetUp(); |
| |
| scrollbar = createScrollbar(); |
| setScrollbarSize(scrollbar, "200px"); |
| RootPanel.get().add(scrollbar); |
| } |
| |
| /** |
| * Set the size of the scrollbar in the direction of scrolling. |
| * |
| * @param size the height or widget, depending on the direction of scroll |
| */ |
| protected abstract void setScrollbarSize(S scrollbar, String size); |
| |
| /** |
| * Set the scroll position. |
| */ |
| protected abstract void setScrollPosition(S scrollbar, int position); |
| |
| /** |
| * Set the size of the content within the scrollbar. |
| * |
| * @param size the size in pixels |
| */ |
| protected abstract void setScrollSize(S scrollbar, int size); |
| } |