blob: 9b23c61e82a346a2b25cf41e8e570829f2f55031 [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.dom.builder.shared;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.dom.client.TableElement;
import com.google.gwt.dom.client.TableRowElement;
import com.google.gwt.junit.client.GWTTestCase;
/**
* Test for implementations of {@link ElementBuilderImpl}.
*/
public abstract class GwtElementBuilderImplTestBase extends GWTTestCase {
private ElementBuilderFactory factory;
@Override
public String getModuleName() {
return "com.google.gwt.dom.builder.DomBuilder";
}
/**
* Attributes on an element.
*
* <pre>
* <div id="myId" title="myTitle">hello world</div>
* </pre>
*/
public void testAttributes() {
Element div =
factory.createDivBuilder().id("myId").title("myTitle").text("hello world").finish();
assertTrue("div".equalsIgnoreCase(div.getTagName()));
assertEquals("hello world", div.getInnerText());
assertEquals("myId", div.getId());
assertEquals("myTitle", div.getTitle());
}
public void testBuildTable() {
// Build a table.
TableBuilder tableBuilder = factory.createTableBuilder().id("mytable");
TableSectionBuilder tbody = tableBuilder.startTBody();
for (int r = 0; r < 5; r++) {
TableRowBuilder tr = tbody.startTR().id("row" + r);
for (int c = 0; c < 3; c++) {
tr.startTD().text(r + ":" + c).endTD();
}
tr.endTR();
}
tbody.endTBody();
tableBuilder.endTable();
// Check the rendered element.
TableElement table = tableBuilder.finish().cast();
assertEquals(5, table.getRows().getLength());
for (int r = 0; r < 5; r++) {
TableRowElement tr = table.getRows().getItem(r);
assertEquals(3, tr.getCells().getLength());
for (int c = 0; c < 3; c++) {
TableCellElement td = tr.getCells().getItem(c);
assertEquals(r + ":" + c, td.getInnerText());
}
}
}
public void testFinishTwice() {
DivBuilder builder = factory.createDivBuilder();
assertNotNull(builder.finish());
try {
builder.finish();
fail("Expected IllegalStateException: cannot call finish() twice");
} catch (IllegalStateException e) {
// Expected.
}
}
public void testGetDepth() {
DivBuilder parent = factory.createDivBuilder();
assertEquals(1, parent.getDepth());
DivBuilder child = parent.startDiv();
assertEquals(2, child.getDepth());
DivBuilder grandchild0 = child.startDiv();
assertEquals(3, grandchild0.getDepth());
grandchild0.endDiv();
assertEquals(2, child.getDepth());
DivBuilder grandchild1 = child.startDiv();
assertEquals(3, grandchild1.getDepth());
grandchild1.endDiv();
assertEquals(2, child.getDepth());
child.endDiv();
assertEquals(1, parent.getDepth());
parent.endDiv();
assertEquals(0, parent.getDepth());
}
/**
* Children nested at multiple levels.
*
* <pre>
* <div id="root">
* <div id="child">
* <div id="grandchild">grandchild</div>
* </div>
* </div>
* </pre>
*/
public void testNestedChildElements() {
DivBuilder builder = factory.createDivBuilder().id("root");
builder.startDiv().id("child").startDiv().id("grandchild").text("grandchild");
Element div = builder.finish();
assertTrue("div".equalsIgnoreCase(div.getTagName()));
assertEquals("root", div.getId());
assertEquals(1, div.getChildCount());
Element child = div.getFirstChildElement();
assertTrue("div".equalsIgnoreCase(child.getTagName()));
assertEquals("child", child.getId());
assertEquals(1, child.getChildCount());
Element grandchild = child.getFirstChildElement();
assertTrue("div".equalsIgnoreCase(grandchild.getTagName()));
assertEquals("grandchild", grandchild.getId());
assertNull(grandchild.getFirstChildElement());
}
/**
* Multiple children beneath root.
*
* <pre>
* <div>
* <div>div0</div>
* <div>div1</div>
* <div>div2</div>
* </div>
* </pre>
*/
public void testNestedSiblingElements() {
DivBuilder builder = factory.createDivBuilder();
for (int i = 0; i < 3; i++) {
builder.startDiv().text("div" + i).endDiv();
}
Element div = builder.finish();
assertTrue("div".equalsIgnoreCase(div.getTagName()));
assertEquals(3, div.getChildCount());
Element child = div.getFirstChildElement();
assertEquals("div0", child.getInnerText());
child = child.getNextSiblingElement();
assertEquals("div1", child.getInnerText());
child = child.getNextSiblingElement();
assertEquals("div2", child.getInnerText());
}
/**
* Single element with text.
*
* <pre>
* <div>hello world</div>.
* </pre>
*/
public void testSingleElement() {
Element div = factory.createDivBuilder().text("hello world").finish();
assertTrue("div".equalsIgnoreCase(div.getTagName()));
assertEquals("hello world", div.getInnerText());
}
/**
* Element with style properties.
*
* <pre>
* <div style="color:red;position:absolute;">hello world</div>.
* </pre>
*/
public void testStyleProperties() {
DivBuilder divBuilder = factory.createDivBuilder();
divBuilder.style().trustedColor("red").position(Position.ABSOLUTE).endStyle();
Element div = divBuilder.text("hello world").finish();
assertTrue("div".equalsIgnoreCase(div.getTagName()));
assertEquals("hello world", div.getInnerText());
assertEquals("red", div.getStyle().getColor());
assertEquals("absolute", div.getStyle().getPosition());
}
public void testTrustedStart() {
{
DivBuilder div = factory.createDivBuilder();
div.trustedStart("lowercase");
div.trustedStart("UPPERCASE");
div.trustedStart("camelCase");
div.trustedStart("containsNumber0");
div.trustedStart("a");
}
// Empty tagName.
try {
DivBuilder div = factory.createDivBuilder();
div.trustedStart("");
fail("Expected IllegalArgumentException: Empty string is not a valid tag name");
} catch (IllegalArgumentException e) {
// Expected.
}
try {
DivBuilder div = factory.createDivBuilder();
div.trustedStart("<containsbracket");
fail("Expected IllegalArgumentException: TagName cannot contain brackets (<)");
} catch (IllegalArgumentException e) {
// Expected.
}
}
/**
* Get the element builder factory used to create the implementation.
*/
protected abstract ElementBuilderFactory getElementBuilderFactory();
@Override
protected void gwtSetUp() throws Exception {
factory = getElementBuilderFactory();
}
@Override
protected void gwtTearDown() throws Exception {
factory = null;
}
}