blob: 13d195be4a1aa88b69078c5326b8f2660d45825d [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.dom.client.Element;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.ui.HasWidgetsTester.WidgetAdder;
/**
* Tests {@link CaptionPanel}.
*/
public class CaptionPanelTest extends GWTTestCase {
private static final String html = "<b>hello</b><i>world</i>";
@Override
public String getModuleName() {
return "com.google.gwt.user.User";
}
public void testHasWidgets() {
WidgetAdder adder = new HasWidgetsTester.DefaultWidgetAdder();
// With no caption.
HasWidgetsTester.testAll(new CaptionPanel(), adder, false);
// With a text caption.
HasWidgetsTester.testAll(new CaptionPanel("some text"), adder, false);
// With a complex HTML caption.
HasWidgetsTester.testAll(new CaptionPanel(
"<legend>not the <i>actual</i> legend<legend>", true), adder, false);
}
public void testCaptionAcceptsEmptyStringAndRemovesLegendElement() {
// Ctor/HTML.
{
CaptionPanel panel = new CaptionPanel("");
assertEquals("", panel.getCaptionHTML());
assertNull(panel.getElement().getFirstChild());
}
// Setter/HTML.
{
CaptionPanel panel = new CaptionPanel("not null");
assertEquals("not null", panel.getCaptionHTML());
panel.setCaptionHTML("");
assertEquals("", panel.getCaptionHTML());
assertNull(panel.getElement().getFirstChild());
}
// Setter/Text.
{
CaptionPanel panel = new CaptionPanel("not null");
assertEquals("not null", panel.getCaptionHTML());
panel.setCaptionText("");
assertEquals("", panel.getCaptionHTML());
assertNull(panel.getElement().getFirstChild());
}
}
// TODO(bruce): re-active when we ensure that assertions are enabled during unit test runs
// /**
// * When the caption is null, it needs to be actually removed from the DOM (to
// * compensate for browser bugs). This formulation requires no widget to have
// * been set first.
// */
// public void testCaptionAssertsAgainstNull() {
// // Ctor.
// {
// try {
// new CaptionPanel(null);
// fail("Should've asserted!");
// } catch (AssertionError e) {
// // good to make it here
// }
// }
//
// // Setter/HTML.
// {
// try {
// CaptionPanel panel = new CaptionPanel("stuff");
// panel.setCaptionHTML(null);
// fail("Should've asserted!");
// } catch (AssertionError e) {
// // good to make it here
// }
// }
//
// // Setter/Text.
// {
// try {
// CaptionPanel panel = new CaptionPanel("stuff");
// panel.setCaptionText(null);
// fail("Should've asserted!");
// } catch (AssertionError e) {
// // good to make it here
// }
// }
// }
public void testCtorAsHtmlFlag() {
String s = "this is <b>not</b> null";
// Ctor/Text.
{
CaptionPanel panel = new CaptionPanel(s, false);
// Check without regard to the case of tags; some browsers change tag case
// against your will.
assertEqualsIgnoreCase(s, panel.getCaptionText());
assertNotEquals(s, panel.getCaptionHTML());
}
// Ctor/HTML.
{
CaptionPanel panel = new CaptionPanel(s, true);
assertEquals("this is not null", panel.getCaptionText());
assertEqualsIgnoreCase(s, panel.getCaptionHTML());
}
}
private void assertEqualsIgnoreCase(String expected, String actual) {
String expectedLc = expected != null ? expected.toLowerCase() : null;
String actualLc = actual != null ? actual.toLowerCase() : null;
assertEquals(expectedLc, actualLc);
}
/**
* Browsers all seem escape text differently, so we use this function to deal
* with cases where we can't say exactly *what* reading element HTML will
* return, but we can say for sure that at least it's different somehow than
* some original text (due to escaping).
*/
private void assertNotEquals(String mustNotBe, String actual) {
assertFalse(mustNotBe != null ? mustNotBe.equals(actual) : actual == null);
}
public void testDefaultCaptionIsEmptyString() {
CaptionPanel panel = new CaptionPanel();
assertEquals("", panel.getCaptionText());
assertEquals("", panel.getCaptionHTML());
// Wigets may be supported in the future.
// assertNull(panel.getCaptionWidget());
assertNull(panel.getElement().getFirstChild());
}
public void testGetSetHTMLCaption() {
CaptionPanel panel = new CaptionPanel();
panel.setCaptionHTML("<b>bold</b>");
assertEqualsIgnoreCase("<b>bold</b>", panel.getCaptionHTML());
assertEquals("bold", panel.getCaptionText());
}
public void testGetSetTextCaption() {
String s = "this is <b>not</b> null";
CaptionPanel panel = new CaptionPanel();
panel.setCaptionText(s);
assertEquals(s, panel.getCaptionText());
assertNotEquals(s, panel.getCaptionHTML());
}
public void testOneArgCtorIsTextCaption() {
String s = "this is <b>not</b> null";
CaptionPanel panel = new CaptionPanel(s);
assertEquals(s, panel.getCaptionText());
assertNotEquals(s, panel.getCaptionHTML());
}
public void testGetSetContentWidget() {
{
// No Widget set in the default ctor.
CaptionPanel panel = new CaptionPanel("no widget");
assertNull(panel.getContentWidget());
}
{
// Set widget and remove() it.
CaptionPanel panel = new CaptionPanel("no widget yet");
assertNull(panel.getContentWidget());
HTML widget = new HTML("widget");
panel.setContentWidget(widget);
assertSame(widget, panel.getContentWidget());
panel.remove(widget);
assertNull(panel.getContentWidget());
}
{
// Set widget and clear() it.
CaptionPanel panel = new CaptionPanel("no widget yet");
assertNull(panel.getContentWidget());
HTML widget = new HTML("widget");
panel.setContentWidget(widget);
assertSame(widget, panel.getContentWidget());
panel.clear();
assertNull(panel.getContentWidget());
}
{
// Set widget and replace it.
CaptionPanel panel = new CaptionPanel("no widget yet");
assertNull(panel.getContentWidget());
HTML widget1 = new HTML("widget1");
panel.setContentWidget(widget1);
assertSame(widget1, panel.getContentWidget());
HTML widget2 = new HTML("widget2");
panel.setContentWidget(widget2);
assertSame(widget2, panel.getContentWidget());
}
}
public void testGetSetCaptionAmidstContentWidget() {
CaptionPanel panel = new CaptionPanel("caption");
HTML widget = new HTML("widget");
panel.setContentWidget(widget);
assertEquals("caption", panel.getCaptionText());
assertSame(widget, panel.getContentWidget());
{
// Set the caption to an empty string and verify that the legend element
// is removed
panel.setCaptionText("");
assertEquals("", panel.getCaptionText());
assertSame(widget, panel.getContentWidget());
Element panelFirstChild = panel.getElement().getFirstChildElement();
// The legend element ought to be removed from the DOM at this point.
assertNotEquals("legend", panelFirstChild.getTagName().toLowerCase());
// (Perhaps redundantly) check that the one child is the content widget.
assertSame(panelFirstChild, widget.getElement());
assertNull(panelFirstChild.getNextSibling());
}
{
// Set the caption to a non-empty string and verify that the legend
// element is readded to the
// 0th index
panel.setCaptionText("new caption");
assertEquals("new caption", panel.getCaptionText());
assertSame(widget, panel.getContentWidget());
Element panelFirstChild = panel.getElement().getFirstChildElement();
// The legend element ought to be the 0th element in the DOM at this
// point.
assertTrue("legend".equalsIgnoreCase(panelFirstChild.getTagName()));
// Check that the second child is the content widget.
assertSame(panelFirstChild.getNextSibling(), widget.getElement());
}
{
// Set the caption to a non-empty string and verify that the legend
// element remains at the 0th
// index
panel.setCaptionText("newer caption");
assertEquals("newer caption", panel.getCaptionText());
assertSame(widget, panel.getContentWidget());
Element panelFirstChild = panel.getElement().getFirstChildElement();
// The legend element ought to be the 0th element in the DOM at this
// point.
assertTrue("legend".equalsIgnoreCase(panelFirstChild.getTagName()));
// Check that the second child is the content widget.
assertSame(panelFirstChild.getNextSibling(), widget.getElement());
}
{
// Remove the widget and verify the caption remains at the 0th index
panel.remove(widget);
assertEquals("newer caption", panel.getCaptionText());
assertNull(panel.getContentWidget());
Element panelFirstChild = panel.getElement().getFirstChildElement();
// The legend element ought to be the 0th element in the DOM at this
// point.
assertTrue("legend".equalsIgnoreCase(panelFirstChild.getTagName()));
// (Perhaps redundantly) check that the one child is the legend element.
assertNull(panelFirstChild.getNextSibling());
}
}
public void testSafeHtmlConstructor() {
CaptionPanel panel = new CaptionPanel(SafeHtmlUtils.fromSafeConstant(html));
assertEquals(html, panel.getCaptionHTML().toLowerCase());
}
public void testSetCaptionSafeHtml() {
CaptionPanel panel = new CaptionPanel("hiworld");
panel.setCaptionHTML(SafeHtmlUtils.fromSafeConstant(html));
assertEquals(html, panel.getCaptionHTML().toLowerCase());
}
}