blob: 9879ad2f4836c790df87eedc41cb763781e4e599 [file] [log] [blame]
/*
* 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);
}