blob: 8f9a646aad4582d1e28371e53efb065bcc3da8e3 [file] [log] [blame]
/*
* Copyright 2008 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.event.logical.shared.BeforeSelectionEvent;
import com.google.gwt.event.logical.shared.BeforeSelectionHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import java.util.Iterator;
/**
* Tests the TabPanel.
*/
@SuppressWarnings("deprecation")
public class TabPanelTest extends GWTTestCase {
static class Adder implements HasWidgetsTester.WidgetAdder {
public void addChild(HasWidgets container, Widget child) {
((TabPanel) container).add(child, "foo");
}
}
private class TestSelectionHandler implements
BeforeSelectionHandler<Integer>, SelectionHandler<Integer> {
private boolean onBeforeSelectionFired;
private boolean onSelectionFired;
public void assertOnBeforeSelectionFired(boolean expected) {
assertEquals(expected, onBeforeSelectionFired);
}
public void assertOnSelectionFired(boolean expected) {
assertEquals(expected, onSelectionFired);
}
public void onBeforeSelection(BeforeSelectionEvent<Integer> event) {
assertFalse(onSelectionFired);
onBeforeSelectionFired = true;
}
public void onSelection(SelectionEvent<Integer> event) {
assertTrue(onBeforeSelectionFired);
onSelectionFired = true;
}
}
@Override
public String getModuleName() {
return "com.google.gwt.user.DebugTest";
}
/**
* Test that methods associated with animations delegate to the
* {@link DeckPanel}.
*/
public void testAnimationDelegation() {
TabPanel tabPanel = createTabPanel();
DeckPanel deck = tabPanel.getDeckPanel();
tabPanel.setAnimationEnabled(true);
assertTrue(tabPanel.isAnimationEnabled());
assertTrue(deck.isAnimationEnabled());
tabPanel.setAnimationEnabled(false);
assertFalse(tabPanel.isAnimationEnabled());
assertFalse(deck.isAnimationEnabled());
deck.setAnimationEnabled(true);
assertTrue(tabPanel.isAnimationEnabled());
assertTrue(deck.isAnimationEnabled());
}
public void testAttachDetachOrder() {
HasWidgetsTester.testAll(createTabPanel(), new Adder(), true);
}
public void testDebugId() {
TabPanel panel = createTabPanel();
Label content0 = new Label("content0");
Label tab0 = new Label("tab0");
panel.add(content0, tab0);
Label content1 = new Label("content1");
Label tab1 = new Label("tab1");
panel.add(content1, tab1);
Label content2 = new Label("content2");
Label tab2 = new Label("tab2");
panel.add(content2, tab2);
// Set the Debug ID
panel.ensureDebugId("myPanel");
UIObjectTest.assertDebugId("myPanel", panel.getElement());
UIObjectTest.assertDebugId("myPanel-bar", panel.getTabBar().getElement());
UIObjectTest.assertDebugId("myPanel-bottom",
panel.getDeckPanel().getElement());
// Check the tabs
HorizontalPanel hPanel = (HorizontalPanel) panel.getTabBar().getWidget();
Element tr = DOM.getFirstChild(hPanel.getBody());
UIObjectTest.assertDebugId("myPanel-bar-tab0",
DOM.getParent(tab0.getElement()));
UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper0", DOM.getChild(tr, 1));
UIObjectTest.assertDebugId("myPanel-bar-tab1",
DOM.getParent(tab1.getElement()));
UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper1", DOM.getChild(tr, 2));
UIObjectTest.assertDebugId("myPanel-bar-tab2",
DOM.getParent(tab2.getElement()));
UIObjectTest.assertDebugId("myPanel-bar-tab-wrapper2", DOM.getChild(tr, 3));
}
public void testInsertMultipleTimes() {
TabPanel p = createTabPanel();
TextBox tb = new TextBox();
p.add(tb, "Title");
p.add(tb, "Title");
p.add(tb, "Title3");
assertEquals(1, p.getWidgetCount());
assertEquals(0, p.getWidgetIndex(tb));
Iterator<Widget> i = p.iterator();
assertTrue(i.hasNext());
assertTrue(tb.equals(i.next()));
assertFalse(i.hasNext());
Label l = new Label();
p.add(l, "Title");
p.add(l, "Title");
p.add(l, "Title3");
assertEquals(2, p.getWidgetCount());
assertEquals(0, p.getWidgetIndex(tb));
assertEquals(1, p.getWidgetIndex(l));
p.insert(l, "Title", 0);
assertEquals(2, p.getWidgetCount());
assertEquals(0, p.getWidgetIndex(l));
assertEquals(1, p.getWidgetIndex(tb));
p.insert(l, "Title", 1);
assertEquals(2, p.getWidgetCount());
assertEquals(0, p.getWidgetIndex(l));
assertEquals(1, p.getWidgetIndex(tb));
p.insert(l, "Title", 2);
assertEquals(2, p.getWidgetCount());
assertEquals(0, p.getWidgetIndex(tb));
assertEquals(1, p.getWidgetIndex(l));
}
public void testInsertWithHTML() {
TabPanel p = createTabPanel();
Label l = new Label();
p.add(l, "three");
p.insert(new HTML("<b>hello</b>"), "two", true, 0);
p.insert(new HTML("goodbye"), "one", false, 0);
assertEquals(3, p.getWidgetCount());
}
/**
* Tests to ensure that arbitrary widgets can be added/inserted effectively.
*/
public void testInsertWithWidgets() {
TabPanel p = createTabPanel();
TextBox wa = new TextBox();
CheckBox wb = new CheckBox();
VerticalPanel wc = new VerticalPanel();
wc.add(new Label("First"));
wc.add(new Label("Second"));
p.add(new Label("Content C"), wc);
p.insert(new Label("Content B"), wb, 0);
p.insert(new Label("Content A"), wa, 0);
// Call these to ensure we don't throw an exception.
assertTrue(p.getTabBar().getTabHTML(0).length() > 0);
assertTrue(p.getTabBar().getTabHTML(1).length() > 0);
assertTrue(p.getTabBar().getTabHTML(2).length() > 0);
assertEquals(3, p.getWidgetCount());
}
public void testIsWidget() {
TabPanel p = createTabPanel();
IsWidgetImpl addText = new IsWidgetImpl(new Label("addText"));
IsWidgetImpl addHtml = new IsWidgetImpl(new Label("addHtml"));
IsWidgetImpl addWidget = new IsWidgetImpl(new Label("addWidget"));
IsWidgetImpl added = new IsWidgetImpl(new Label("added"));
IsWidgetImpl insText = new IsWidgetImpl(new Label("insText"));
IsWidgetImpl insHtml = new IsWidgetImpl(new Label("insHtml"));
IsWidgetImpl insWidget = new IsWidgetImpl(new Label("insWidget"));
IsWidgetImpl inserted = new IsWidgetImpl(new Label("inserted"));
p.add(addText, "added text");
p.add(addHtml, "<b>added html</b>", true);
p.add(addWidget, added);
p.insert(insText, "inserted text", 0);
p.insert(insHtml, "<b>inserted html</b>", true, 2);
p.insert(insWidget, inserted, 4);
assertEquals(6, p.getWidgetCount());
assertEquals(0, p.getWidgetIndex(insText));
assertEquals(1, p.getWidgetIndex(addText));
assertEquals(2, p.getWidgetIndex(insHtml));
assertEquals(3, p.getWidgetIndex(addHtml));
assertEquals(4, p.getWidgetIndex(insWidget));
assertEquals(5, p.getWidgetIndex(addWidget));
}
public void testIterator() {
TabPanel p = createTabPanel();
HTML foo = new HTML("foo");
HTML bar = new HTML("bar");
HTML baz = new HTML("baz");
p.add(foo, "foo");
p.add(bar, "bar");
p.add(baz, "baz");
// Iterate over the entire set and make sure it stops correctly.
Iterator<Widget> it = p.iterator();
assertTrue(it.hasNext());
assertTrue(it.next() == foo);
assertTrue(it.hasNext());
assertTrue(it.next() == bar);
assertTrue(it.hasNext());
assertTrue(it.next() == baz);
assertFalse(it.hasNext());
// Test removing using the iterator.
it = p.iterator();
it.next();
it.remove();
assertTrue(it.next() == bar);
assertTrue(p.getWidgetCount() == 2);
assertTrue(p.getWidget(0) == bar);
assertTrue(p.getWidget(1) == baz);
}
public void testSelectionEvents() {
TabPanel p = createTabPanel();
RootPanel.get().add(p);
p.add(new Button("foo"), "foo");
p.add(new Button("bar"), "bar");
// Make sure selecting a tab fires both events in the right order.
TestSelectionHandler handler = new TestSelectionHandler();
p.addBeforeSelectionHandler(handler);
p.addSelectionHandler(handler);
p.selectTab(1);
handler.assertOnBeforeSelectionFired(true);
handler.assertOnSelectionFired(true);
}
public void testSelectionEventsNoFire() {
TabPanel p = createTabPanel();
RootPanel.get().add(p);
p.add(new Button("foo"), "foo");
p.add(new Button("bar"), "bar");
TestSelectionHandler handler = new TestSelectionHandler();
p.addBeforeSelectionHandler(handler);
p.addSelectionHandler(handler);
p.selectTab(1, false);
handler.assertOnBeforeSelectionFired(false);
handler.assertOnSelectionFired(false);
}
public void testUnmodifiableDeckPanelSubclasses() {
TabPanel p = createTabPanel();
DeckPanel d = p.getDeckPanel();
try {
d.add(new Label("No"));
fail("Internal DeckPanel should not allow add() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
d.insert(new Label("No"), 0);
fail("Internal DeckPanel should not allow insert() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
d.clear();
fail("Internal DeckPanel should not allow clear() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
}
public void testUnmodifiableTabBarSubclasses() {
TabPanel p = createTabPanel();
TabBar b = p.getTabBar();
try {
b.addTab("no");
fail("Internal TabBar should not allow addTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
b.addTab("no", true);
fail("Internal TabBar should not allow addTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
b.addTab(new Label("no"));
fail("Internal TabBar should not allow addTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
b.insertTab("no", 0);
fail("Internal TabBar should not allow insertTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
b.insertTab("no", true, 0);
fail("Internal TabBar should not allow insertTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
b.insertTab(new Label("no"), 0);
fail("Internal TabBar should not allow insertTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
try {
b.removeTab(0);
fail("Internal TabBar should not allow removeTab() method");
} catch (UnsupportedOperationException e) {
// Expected behavior
}
}
/**
* Create a new, empty tab panel.
*/
protected TabPanel createTabPanel() {
return new TabPanel();
}
}