/* * 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.uibinder.client; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.dom.client.Style.Visibility; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Random; import com.google.gwt.user.client.ui.RootPanel; /** * Tests {@link UiBinderUtil}. */ public class UiBinderUtilTest extends GWTTestCase { @Override public String getModuleName() { return "com.google.gwt.uibinder.test.UiBinderSuite"; } public void testAttachToDomAndGetChildUnattached() { go(); } public void testAttachToDomAndGetChildUnderUnattached() { DivElement div = Document.get().createDivElement(); try { go(div); } finally { detach(div); } } public void testAttachToDomAndGetChildUnderHidden() { DivElement div = Document.get().createDivElement(); try { RootPanel.getBodyElement().appendChild(div); div.getStyle().setVisibility(Visibility.HIDDEN); go(div); } finally { detach(div); } } public void testAttachToDomAndGetChildUnderDisplayNone() { DivElement div = Document.get().createDivElement(); try { RootPanel.getBodyElement().appendChild(div); div.getStyle().setDisplay(Display.NONE); go(div); } finally { detach(div); } } public void testAttachToDomAndGetChildUnderAttachedThenUnattached() { DivElement div = Document.get().createDivElement(); detach(div); try { RootPanel.getBodyElement().appendChild(div); go(div); } finally { detach(div); } } /** * Make sure this test's clean up method actually works. */ public void testDetach() { DivElement div = Document.get().createDivElement(); RootPanel.getBodyElement().appendChild(div); detach(div); assertNull(div.getParentElement()); } private void assertStartsWith(String string, String prefix) { assertTrue('"' + string + "\" should start with \"" + prefix + "\"", string.startsWith(prefix)); } private void findAndAssertTextBeforeFirstChild(Element div, String id, String firstText) { UiBinderUtil.TempAttachment t = UiBinderUtil.attachToDom(div); Element child = Document.get().getElementById(id); t.detach(); assertStartsWith(child.getInnerHTML(), firstText + "<"); } private void detach(Element div) { if (div != null) { Element parent = div.getParentElement(); if (parent != null) { parent.removeChild(div); } } } private void go() { go(null); } private void go(Element underHere) { Element div = null; try { String ableId = DOM.createUniqueId(); String bakerId = DOM.createUniqueId(); String charlieId = DOM.createUniqueId(); String deltaId = DOM.createUniqueId(); String ableText = "able" + Random.nextInt(); String bakerText = "baker" + Random.nextInt(); String charlieText = "charlie" + Random.nextInt(); String deltaText = "delta" + Random.nextInt(); StringBuilder b = new StringBuilder(); b.append("<div>"); b.append("<span id='").append(ableId).append("'>").append(ableText); b.append("<span id='").append(bakerId).append("'>").append(bakerText); b.append("<span id='").append(charlieId).append("'>").append(charlieText); b.append("<span id='").append(deltaId).append("'>").append(deltaText); b.append("</span>").append("</span>").append("</span>").append("</span>"); b.append("</div>"); div = UiBinderUtil.fromHtml(b.toString()); if (underHere != null) { underHere.insertFirst(div); } findAndAssertTextBeforeFirstChild(div, ableId, ableText); findAndAssertTextBeforeFirstChild(div, bakerId, bakerText); findAndAssertTextBeforeFirstChild(div, charlieId, charlieText); UiBinderUtil.TempAttachment t = UiBinderUtil.attachToDom(div); Element e = Document.get().getElementById(deltaId); t.detach(); assertEquals(deltaText, e.getInnerText()); } finally { // tearDown isn't reliable enough, e.g. doesn't fire when exceptions // happen detach(div); } } }