blob: f269ea99797c8a4268929ad87fd9ab9fa18a16a5 [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.uibinder.rebind;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.dev.CompilerContext;
import com.google.gwt.dev.javac.CompilationState;
import com.google.gwt.dev.javac.CompilationStateBuilder;
import com.google.gwt.dev.javac.testing.impl.MockJavaResource;
import com.google.gwt.dev.javac.testing.impl.MockResourceOracle;
import com.google.gwt.dev.resource.Resource;
import com.google.gwt.dev.resource.ResourceOracle;
import com.google.gwt.dev.util.collect.HashSet;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
import com.google.gwt.resources.rg.GssResourceGenerator.AutoConversionMode;
import com.google.gwt.resources.rg.GssResourceGenerator.GssOptions;
import com.google.gwt.uibinder.attributeparsers.AttributeParsers;
import com.google.gwt.uibinder.test.UiJavaResources;
import junit.framework.TestCase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXParseException;
import java.io.PrintWriter;
import java.util.Set;
/**
* Tests UiBinderParser behavior for <ui:with> tag.
*/
public class UiBinderParserUiWithTest extends TestCase {
public static final MockJavaResource BAR = new MockJavaResource("bar.Bar") {
@Override
public CharSequence getContent() {
StringBuffer code = new StringBuffer();
code.append("package bar;");
code.append("public class Bar {");
code.append(" public Bar(int a) { }");
code.append("}");
return code;
}
};
public static final MockJavaResource BINDER = new MockJavaResource("binder.OwnerClass") {
@Override
public CharSequence getContent() {
StringBuffer code = new StringBuffer();
code.append("package binder;\n");
code.append("import com.google.gwt.uibinder.client.UiBinder;\n");
code.append("import com.google.gwt.uibinder.client.UiField;\n");
code.append("import com.google.gwt.uibinder.client.UiFactory;\n");
code.append("import bar.Bar;\n");
code.append("import foo.Foo;\n");
code.append("public class OwnerClass {");
code.append(" public interface Binder");
code.append(" extends UiBinder<java.lang.String, OwnerClass> {");
code.append(" }");
code.append(" @UiField foo.Foo fieldName;");
code.append(" @UiFactory bar.Bar aFactory() { return new Bar(1); }");
code.append("}");
return code;
}
};
public static final MockJavaResource FOO = new MockJavaResource("foo.Foo") {
@Override
public CharSequence getContent() {
StringBuffer code = new StringBuffer();
code.append("package foo;");
code.append("public class Foo {");
code.append("}");
return code;
}
};
public static final MockJavaResource FOOISH = new MockJavaResource("foo.Fooish") {
@Override
public CharSequence getContent() {
StringBuffer code = new StringBuffer();
code.append("package foo;");
code.append("public class Fooish extends Foo {");
code.append("}");
return code;
}
};
public static final MockJavaResource RENDERER = new MockJavaResource("renderer.OwnerClass") {
@Override
public CharSequence getContent() {
StringBuffer code = new StringBuffer();
code.append("package renderer;\n");
code.append("import com.google.gwt.safehtml.shared.SafeHtmlBuilder;\n");
code.append("import com.google.gwt.uibinder.client.UiRenderer;\n");
code.append("import foo.Foo;\n");
code.append("public class OwnerClass {");
code.append(" public interface Renderer");
code.append(" extends UiRenderer {");
code.append(" public void render(SafeHtmlBuilder sb, foo.Fooish fieldName);");
code.append(" }");
code.append("}");
return code;
}
};
private static final W3cDomHelper docHelper = new W3cDomHelper(TreeLogger.NULL,
new MockResourceOracle());
private static TreeLogger createCompileLogger() {
PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter(System.err, true));
logger.setMaxDetail(TreeLogger.ERROR);
return logger;
}
UiBinderParser parser;
private Document doc;
private XMLElementProvider elemProvider;
private XMLElement elm;
private FieldManager fieldManager;
private Element item;
private MockMortalLogger logger;
private Set<Resource> resources = new HashSet<Resource>();
private TypeOracle types;
private UiBinderWriter writer;
@Override
public void setUp() throws Exception {
super.setUp();
resources.addAll(UiJavaResources.getUiResources());
resources.add(FOO);
resources.add(FOOISH);
resources.add(BAR);
resources.add(RENDERER);
resources.add(BINDER);
CompilationState state =
CompilationStateBuilder.buildFrom(createCompileLogger(), new CompilerContext(), resources);
types = state.getTypeOracle();
logger = new MockMortalLogger();
fieldManager = new FieldManager(types, logger, true);
}
public void testWithErrorMisTyped() throws SAXParseException {
try {
init("<doc><with field=\"fieldName\" type=\"bar.Bar\" bloop=\"\"/></doc>",
"renderer.OwnerClass.Renderer");
fail("Expecting UnabletoCompleteException");
} catch (UnableToCompleteException e) {
assertNotNull(logger.died);
}
}
public void testWithErrorNoField() throws SAXParseException {
try {
init("<doc><with type=\"bar.Bar\"/></doc>", "renderer.OwnerClass.Renderer");
fail("Expecting UnabletoCompleteException");
} catch (UnableToCompleteException e) {
assertNotNull(logger.died);
}
}
public void testWithErrorUiBinderBadUiFieldType() throws SAXParseException {
try {
init("<doc><with field=\"someName\" type=\"foo.Unknown\"/></doc>",
"binder.OwnerClass.Binder");
fail("Expecting UnabletoCompleteException");
} catch (UnableToCompleteException e) {
assertNotNull(logger.died);
}
}
public void testWithErrorUiBinderMisTypedUiField() throws SAXParseException {
try {
init("<doc><with field=\"fieldName\" type=\"bar.Bar\"/></doc>", "binder.OwnerClass.Binder");
fail("Expecting UnabletoCompleteException");
} catch (UnableToCompleteException e) {
assertNotNull(logger.died);
}
}
public void testWithErrorUiRendererMisTypedImport() throws SAXParseException {
try {
init("<doc><with field=\"fieldName\" type=\"bar.Bar\"/></doc>",
"renderer.OwnerClass.Renderer");
fail("Expecting UnabletoCompleteException");
} catch (UnableToCompleteException e) {
assertNotNull(logger.died);
}
}
public void testWithErrorUiRendererUnTypedNonExistingFieldName() throws SAXParseException {
try {
init("<doc><with field=\"nonExisting\"/></doc>", "renderer.OwnerClass.Renderer");
fail("Expecting UnabletoCompleteException");
} catch (UnableToCompleteException e) {
assertNotNull(logger.died);
}
}
public void testWithGwtCreated() throws UnableToCompleteException, SAXParseException {
init("<doc><with field=\"notAField\" type=\"foo.Foo\"/></doc>", "renderer.OwnerClass.Renderer");
assertNotNull(fieldManager.lookup("notAField"));
assertEquals("foo.Foo", fieldManager.lookup("notAField").getAssignableType()
.getQualifiedSourceName());
}
public void testWithUiBinderTypedUiField() throws UnableToCompleteException, SAXParseException {
init("<doc><with field=\"fieldName\" type=\"foo.Foo\"/></doc>", "binder.OwnerClass.Binder");
assertNotNull(fieldManager.lookup("fieldName"));
assertEquals("foo.Foo", fieldManager.lookup("fieldName").getAssignableType()
.getQualifiedSourceName());
}
public void testWithUiBinderUiFactory() throws UnableToCompleteException, SAXParseException {
init("<doc><with field=\"factoryProvided\" type=\"bar.Bar\"/></doc>",
"binder.OwnerClass.Binder");
assertNotNull(fieldManager.lookup("factoryProvided"));
assertEquals("bar.Bar", fieldManager.lookup("factoryProvided").getAssignableType()
.getQualifiedSourceName());
}
public void testWithUiBinderUntypedUiField() throws UnableToCompleteException, SAXParseException {
init("<doc><with field=\"fieldName\"/></doc>", "binder.OwnerClass.Binder");
assertNotNull(fieldManager.lookup("fieldName"));
assertEquals("foo.Foo", fieldManager.lookup("fieldName").getAssignableType()
.getQualifiedSourceName());
}
public void testWithUiRendererTypedImport() throws UnableToCompleteException, SAXParseException {
init("<doc><with field=\"fieldName\" type=\"foo.Foo\"/></doc>", "renderer.OwnerClass.Renderer");
assertNotNull(fieldManager.lookup("fieldName"));
assertEquals("foo.Fooish", fieldManager.lookup("fieldName").getAssignableType()
.getQualifiedSourceName());
}
public void testWithUiRendererUntypedImport()
throws UnableToCompleteException, SAXParseException {
init("<doc><with field=\"fieldName\"/></doc>", "renderer.OwnerClass.Renderer");
assertNotNull(fieldManager.lookup("fieldName"));
assertEquals("foo.Fooish", fieldManager.lookup("fieldName").getAssignableType()
.getQualifiedSourceName());
}
private void init(String domString, String baseClass) throws SAXParseException,
UnableToCompleteException {
DesignTimeUtils designTime = DesignTimeUtilsStub.EMPTY;
elemProvider =
new XMLElementProviderImpl(new AttributeParsers(types, null, logger), types,
logger, designTime);
doc = docHelper.documentFor(domString, null);
item = (Element) doc.getDocumentElement().getElementsByTagName("with").item(0);
elm = elemProvider.get(item);
JClassType aClass = types.findType(baseClass);
ResourceOracle resourceOracle = new MockResourceOracle();
GssOptions gssOptions = new GssOptions(true, AutoConversionMode.OFF, true);
writer = new UiBinderWriter(aClass, "foo", "", types, logger, fieldManager, null,
DesignTimeUtilsStub.EMPTY, new UiBinderContext(), true, true, "", resourceOracle,
gssOptions);
parser = new UiBinderParser(writer, null, fieldManager, types, null, "", new UiBinderContext(),
resourceOracle, gssOptions);
designTime.rememberPathForElements(doc);
UiBinderParser.Resource.WITH.create(parser, elm);
}
}