/* * Copyright 2010 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.rebind; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.dev.javac.testing.impl.MockResourceOracle; import junit.framework.TestCase; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXParseException; import java.beans.Beans; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; /** * Tests for {@link DesignTimeUtils}. */ public class DesignTimeUtilsTest extends TestCase { private static final W3cDomHelper docHelper = new W3cDomHelper( TreeLogger.NULL, new MockResourceOracle()); private final DesignTimeUtils stub = DesignTimeUtilsStub.EMPTY; private final DesignTimeUtilsImpl impl = new DesignTimeUtilsImpl(); /** * Test for {@link DesignTimeUtilsImpl#isDesignTime(String)}. */ public void test_isDesignTime_evaluate() { // not design time { Beans.setDesignTime(false); assertEquals(false, DesignTimeUtilsImpl.isDesignTime("no.Matter")); } // not this Binder try { Beans.setDesignTime(true); System.setProperty("gwt.UiBinder.isDesignTime my.Binder", "true"); assertEquals(false, DesignTimeUtilsImpl.isDesignTime("other.Binder")); } finally { Beans.setDesignTime(false); System.clearProperty("gwt.UiBinder.isDesignTime my.design.Binder"); } // OK try { Beans.setDesignTime(true); System.setProperty("gwt.UiBinder.isDesignTime my.Binder", "true"); assertEquals(true, DesignTimeUtilsImpl.isDesignTime("my.Binder")); } finally { Beans.setDesignTime(false); System.clearProperty("gwt.UiBinder.isDesignTime my.design.Binder"); } } /** * Test for {@link DesignTimeUtils#addDeclarations(IndentedWriter)}. */ public void test_addDeclarations_default() { String result = call_addDeclarations(stub); assertEquals("", result); } /** * Test for {@link DesignTimeUtils#addDeclarations(IndentedWriter)}. */ public void test_addDeclarations_designTime() { String result = call_addDeclarations(impl); assertContains(result, "public static interface DTObjectHandler"); assertContains(result, "void handle(String path, Object object)"); assertContains(result, "public DTObjectHandler dtObjectHandler;"); assertContains(result, "public final java.util.Map dtAttributes = new java.util.HashMap();"); assertContains(result, "private void dtPutAttribute(String key, Object...values) {"); } private static String call_addDeclarations(DesignTimeUtils designTime) { StringWriter sw = new StringWriter(); IndentedWriter indentedWriter = new IndentedWriter(new PrintWriter(sw)); designTime.addDeclarations(indentedWriter); return sw.toString(); } private static void assertContains(String content, String subString) { assertTrue(subString, content.contains(subString)); } /** * Test for {@link DesignTimeUtils#getImplName(String)}. */ public void test_getImplName_default() { String basicName = "MyBinderImpl"; String result = stub.getImplName(basicName); assertEquals(basicName, result); } /** * Test for {@link DesignTimeUtils#getImplName(String)}. */ public void test_getImplName_designTime() { String basicName = "MyBinderImpl"; String result = impl.getImplName(basicName); // has "_designTime" substring String prefix = basicName + "_designTime"; assertTrue(result.startsWith(prefix)); // suffix is current time plus/minus 1 hour, so generates unique names long suffix = Long.parseLong(result.substring(prefix.length())); long delta = System.currentTimeMillis() - suffix; assertTrue(Math.abs(delta) < 1000 * 3600); } /** * Test for {@link DesignTimeUtils#getPath(Element)} and related methods. */ public void test_path_default() throws SAXParseException { Document doc = docHelper.documentFor("<root><first/><second/></root>", null); stub.rememberPathForElements(doc); Element first = getChildElement(doc.getDocumentElement(), "first"); Element second = getChildElement(doc.getDocumentElement(), "second"); assertEquals(null, stub.getPath(first)); assertEquals(null, stub.getPath(second)); } /** * Test for {@link DesignTimeUtils#getPath(Element)} and related methods. */ public void test_path_designTime() throws SAXParseException { Document doc = docHelper.documentFor( "<root><first/><second><subSecond/></second></root>", null); impl.rememberPathForElements(doc); Element first = getChildElement(doc.getDocumentElement(), "first"); Element second = getChildElement(doc.getDocumentElement(), "second"); Element subSecond = getChildElement(second, "subSecond"); assertEquals("0/0", impl.getPath(first)); assertEquals("0/1", impl.getPath(second)); assertEquals("0/1/0", impl.getPath(subSecond)); } /** * Test for {@link DesignTimeUtils#getProvidedField(String, String)}. */ public void test_getProvidedField_default() { String source = stub.getProvidedField("java.lang.String", "fieldName"); assertEquals(null, source); } /** * Test for {@link DesignTimeUtils#getProvidedField(String, String)}. */ public void test_getProvidedField_designTime() { String source = impl.getProvidedField("java.lang.String", "fieldName"); assertEquals("(java.lang.String) dtObjectHandler.provideField(" + "java.lang.String.class, \"fieldName\")", source); } /** * Test for {@link DesignTimeUtils#getProvidedFactory(String, String, String)} * . */ public void test_getProvidedFactory_default() { String source = stub.getProvidedFactory("java.lang.String", "methodName", "false, 1"); assertEquals(null, source); } /** * Test for {@link DesignTimeUtils#getProvidedFactory(String, String, String)} * . */ public void test_getProvidedFactory_designTime() { String source = impl.getProvidedFactory("java.lang.String", "methodName", "false, 1"); assertEquals("(java.lang.String) dtObjectHandler.provideFactory(" + "java.lang.String.class, \"methodName\", new Object[] {false, 1})", source); } /** * Test for {@link DesignTimeUtils#getTemplateContent(String)}. */ public void test_getTemplateContent_default() { String path = "the/path"; assertEquals(null, stub.getTemplateContent(path)); } /** * Test for {@link DesignTimeUtils#getTemplateContent(String)}. */ public void test_getTemplateContent_designTime() { String path = "the/path"; String key = "gwt.UiBinder.designTime " + path; try { String content = "myContent"; System.setProperty(key, content); assertEquals(content, impl.getTemplateContent(path)); } finally { System.clearProperty(key); } } /** * Test for * {@link DesignTimeUtils#handleUIObject(IUiBinderWriterStatements, XMLElement, String)} * . */ public void test_handleUIObject_default() { WriterStatements writer = new WriterStatements(); stub.handleUIObject(writer, null, "myField"); assertEquals(0, writer.statements.size()); } /** * Test for * {@link DesignTimeUtils#handleUIObject(IUiBinderWriterStatements, XMLElement, String)} * . */ public void test_handleUIObject_designTime() throws SAXParseException { // prepare XMLElement XMLElement element; { Document doc = docHelper.documentFor("<root><first/></root>", null); impl.rememberPathForElements(doc); Element first = getChildElement(doc.getDocumentElement(), "first"); element = createXMLElement(first, impl); } // prepare statements List<String> statements; { WriterStatements writer = new WriterStatements(); impl.handleUIObject(writer, element, "myField"); statements = writer.statements; } // validate assertEquals(1, statements.size()); assertEquals( "if (dtObjectHandler != null) dtObjectHandler.handle(\"0/0\", myField);", statements.get(0)); } /** * Test for {@link DesignTimeUtils#isDesignTime()}. */ public void test_isDesignTime_default() { assertEquals(false, stub.isDesignTime()); } /** * Test for {@link DesignTimeUtils#isDesignTime()}. */ public void test_getOwnerCheck_designTime() { assertEquals(true, impl.isDesignTime()); } /** * Test for {@link DesignTimeUtils#putAttribute(XMLElement, String, String)} * and {@link DesignTimeUtils#writeAttributes(Statements)}. */ public void test_putAttribute_default() throws SAXParseException { List<String> statements = call_putAttribute(stub); // validate assertEquals(0, statements.size()); } /** * Test for {@link DesignTimeUtils#putAttribute(XMLElement, String, String)} * and {@link DesignTimeUtils#writeAttributes(Statements)}. */ public void test_putAttribute_designTime() throws SAXParseException { List<String> statements = call_putAttribute(impl); // validate assertEquals(1, statements.size()); assertEquals("dtPutAttribute(\"0/0 attr\", val);", statements.get(0)); } private static List<String> call_putAttribute(DesignTimeUtils designTime) throws SAXParseException { // prepare XMLElement XMLElement element; { Document doc = docHelper.documentFor("<root><first/></root>", null); designTime.rememberPathForElements(doc); Element first = getChildElement(doc.getDocumentElement(), "first"); element = createXMLElement(first, designTime); } // prepare statements List<String> statements; { WriterStatements writer = new WriterStatements(); designTime.putAttribute(element, "attr", "val"); designTime.writeAttributes(writer); statements = writer.statements; } // done return statements; } /** * Test for {@link DesignTimeUtils#putAttribute(XMLElement, String, String[])} * . */ public void test_putAttributeStrings_default() throws SAXParseException { List<String> statements = call_putAttributeStrings(new String[]{"a", "b"}, stub); // validate assertEquals(0, statements.size()); } /** * Test for {@link DesignTimeUtils#putAttribute(XMLElement, String, String[])} * . */ public void test_putAttributeStrings_designTime_empty() throws SAXParseException { List<String> statements = call_putAttributeStrings(new String[]{}, impl); // validate assertEquals(0, statements.size()); } /** * Test for {@link DesignTimeUtils#putAttribute(XMLElement, String, String[])} * . */ public void test_putAttributeStrings_designTime() throws SAXParseException { List<String> statements = call_putAttributeStrings(new String[]{"a", "b"}, impl); // validate assertEquals(1, statements.size()); assertEquals("dtPutAttribute(\"0/0 attr\", new String[] {a, b});", statements.get(0)); } private static List<String> call_putAttributeStrings(String[] strings, DesignTimeUtils designTime) throws SAXParseException { // prepare XMLElement XMLElement element; { Document doc = docHelper.documentFor("<root><first/></root>", null); designTime.rememberPathForElements(doc); Element first = getChildElement(doc.getDocumentElement(), "first"); element = createXMLElement(first, designTime); } // prepare statements List<String> statements; { WriterStatements writer = new WriterStatements(); designTime.putAttribute(element, "attr", strings); designTime.writeAttributes(writer); statements = writer.statements; } return statements; } /** * Returns the only child {@link Element} with given tag name. */ private static Element getChildElement(Element parent, String name) { NodeList elements = parent.getElementsByTagName(name); assertEquals(1, elements.getLength()); return (Element) elements.item(0); } /** * Returns the {@link XMLElement} wrapper for given {@link Element}. */ private static XMLElement createXMLElement(Element elem, DesignTimeUtils designTime) { return new XMLElement(elem, null, null, null, designTime, null); } /** * Implementation of {@link IUiBinderWriterStatements} for simple statements. */ static class WriterStatements extends Statements.Empty { List<String> statements = new ArrayList<String>(); @Override public void addStatement(String format, Object... args) { statements.add(String.format(format, args)); } }; }