/* * Copyright 2009 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 java.util.Iterator; /** * Base tests for classes that extend {@link Panel} * * TODO: add circular containment test. * * @param <T> the panel type */ public abstract class PanelTestBase<T extends Panel> extends WidgetTestBase { public void testIsWidget() { T panel = createPanel(); IsWidgetImpl l = new IsWidgetImpl(new Label("l")); panel.add(l); Iterator<Widget> iterator = panel.iterator(); assertSame(l.w, iterator.next()); assertFalse(iterator.hasNext()); panel.remove(l); assertFalse(panel.iterator().hasNext()); } public void testIndexedPanel() { T panel = createPanel(); if (!(panel instanceof IndexedPanel)) { return; } assertTrue("Expect all IndexedPanels to implement ForIsWidget", panel instanceof IndexedPanel.ForIsWidget); IndexedPanel.ForIsWidget w = (IndexedPanel.ForIsWidget) panel; IsWidgetImpl l1 = new IsWidgetImpl(new Label("l1")); IsWidgetImpl l2 = new IsWidgetImpl(new Label("l2")); IsWidgetImpl l3 = new IsWidgetImpl(new Label("l3")); IsWidgetImpl l4 = new IsWidgetImpl(new Label("l4")); panel.add(l1); panel.add(l2); panel.add(l3); panel.add(l4); assertEquals(4, w.getWidgetCount()); assertEquals(0, w.getWidgetIndex(l1.w)); assertEquals(0, w.getWidgetIndex(l1)); assertEquals(1, w.getWidgetIndex(l2)); assertEquals(2, w.getWidgetIndex(l3)); assertEquals(3, w.getWidgetIndex(l4)); assertTrue(w.remove(2)); assertEquals(3, w.getWidgetCount()); assertEquals(0, w.getWidgetIndex(l1.w)); assertEquals(0, w.getWidgetIndex(l1)); assertEquals(1, w.getWidgetIndex(l2)); assertEquals(-1, w.getWidgetIndex(l3)); assertEquals(2, w.getWidgetIndex(l4)); assertTrue(w.remove(2)); assertEquals(2, w.getWidgetCount()); assertEquals(0, w.getWidgetIndex(l1.w)); assertEquals(0, w.getWidgetIndex(l1)); assertEquals(1, w.getWidgetIndex(l2)); assertEquals(-1, w.getWidgetIndex(l3)); assertEquals(-1, w.getWidgetIndex(l4)); assertTrue(w.remove(0)); assertEquals(1, w.getWidgetCount()); assertEquals(-1, w.getWidgetIndex(l1.w)); assertEquals(-1, w.getWidgetIndex(l1)); assertEquals(0, w.getWidgetIndex(l2)); assertEquals(-1, w.getWidgetIndex(l3)); assertEquals(-1, w.getWidgetIndex(l4)); assertTrue(w.remove(0)); assertEquals(0, w.getWidgetCount()); assertFalse(panel.iterator().hasNext()); } public void testInsertPanel() { T panel = createPanel(); if (!(panel instanceof InsertPanel)) { return; } assertTrue("Expect all InsertPanel to implement ForIsWidget", panel instanceof InsertPanel.ForIsWidget); InsertPanel.ForIsWidget w = (InsertPanel.ForIsWidget) panel; IsWidgetImpl l1 = new IsWidgetImpl(new Label("l1")); IsWidgetImpl l2 = new IsWidgetImpl(new Label("l2")); IsWidgetImpl l3 = new IsWidgetImpl(new Label("l3")); IsWidgetImpl l4 = new IsWidgetImpl(new Label("l4")); w.add(l1); w.add(l2.w); w.insert(l3, 1); w.insert(l4.w, 3); w.insert(l1, 3); w.insert(l2.w, 0); Widget[] expected = new Widget[] { l2.w, l3.w, l1.w, l4.w, }; Iterator<Widget> iterator = panel.iterator(); for (Widget e : expected) { Widget next = iterator.next(); assertSame("Expected " + e + ", saw " + next, e, next); } assertFalse(iterator.hasNext()); } public void testAttachDetachOrder() { HasWidgetsTester.testAll(createPanel(), new HasWidgetsTester.DefaultWidgetAdder(), supportsMultipleWidgets()); } public void testOnAttach() { // Used to call onDetach when not attached. Widget someWidget = new TextBox(); Panel panel1 = createPanel(); // new and unattached Panel panel2 = createPanel(); // new and unattached panel1.add(someWidget); panel2.add(someWidget); // Make sure that the RootPanel does not throw an exception. RootPanel.get().setParent(null); RootPanel.get().setParent(null); } public void testRemoveWithError() { // Create a widget that will throw an exception onUnload. BadWidget badWidget = new BadWidget(); badWidget.setFailOnUnload(true); // Add the widget to a panel. Panel panel = createPanel(); panel.add(badWidget); assertFalse(badWidget.isAttached()); // Attach the widget. RootPanel.get().add(panel); assertTrue(badWidget.isAttached()); // Remove the widget from the panel. try { panel.remove(badWidget); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } assertFalse(badWidget.isAttached()); assertNull(badWidget.getParent()); assertNull(badWidget.getElement().getParentElement()); // Detach the panel to ensure that it doesn't throw an exception. RootPanel.get().remove(panel); } protected abstract T createPanel(); /** * Check if the panel in test supports multiple (unbounded) widgets. * * @return true if multiple widgets are supported */ protected boolean supportsMultipleWidgets() { return true; } }