| /* |
| * 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; |
| } |
| } |