Revision: 7082 Author: rj...@google.com Date: Fri Nov 20 14:07:49 2009 Log: Merges tr...@7032 into releases/2.0 Makes UiFactory work with parameterized return types svn merge --ignore-ancestry -c 7032 https://google-web-toolkit.googlecode.com/svn/trunk .
http://code.google.com/p/google-web-toolkit/source/detail?r=7082 Added: /releases/2.0/user/test/com/google/gwt/uibinder/test/client/Abstract.java /releases/2.0/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java /releases/2.0/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.ui.xml /releases/2.0/user/test/com/google/gwt/uibinder/test/client/TestParameterizedWidgets.java Modified: /releases/2.0/branch-info.txt /releases/2.0/user/src/com/google/gwt/uibinder/rebind/model/OwnerClass.java /releases/2.0/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java /releases/2.0/user/test/com/google/gwt/uibinder/rebind/model/OwnerClassTest.java /releases/2.0/user/test/com/google/gwt/uibinder/test/UiJavaResources.java ======================================= --- /dev/null +++ /releases/2.0/user/test/com/google/gwt/uibinder/test/client/Abstract.java Fri Nov 20 14:07:49 2009 @@ -0,0 +1,29 @@ +/* + * 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.test.client; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.user.client.ui.Widget; + +/** + * Used by {...@link ParameterizedWidgets}. + * @see TestParameterizedWidgets + */ +abstract class Abstract<T> extends Widget { + Abstract() { + setElement(Document.get().createDivElement()); + } +} ======================================= --- /dev/null +++ /releases/2.0/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java Fri Nov 20 14:07:49 2009 @@ -0,0 +1,45 @@ +/* + * 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.test.client; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiFactory; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Widget; + +/** + * Used by {...@link TestParameterizedWidgets} + */ +class ParameterizedWidgets { + interface Binder extends UiBinder<Widget, ParameterizedWidgets> { + } + + static final Binder binder = GWT.create(Binder.class); + + @UiField + Abstract<?> a; + + ParameterizedWidgets() { + binder.createAndBindUi(this); + } + + @UiFactory + Abstract<?> createA() { + return new Abstract<String>() { + }; + } +} ======================================= --- /dev/null +++ /releases/2.0/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.ui.xml Fri Nov 20 14:07:49 2009 @@ -0,0 +1,4 @@ +<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" + xmlns:t="urn:import:com.google.gwt.uibinder.test.client"> + <t:Abstract ui:field='a'></t:Abstract> +</ui:UiBinder> ======================================= --- /dev/null +++ /releases/2.0/user/test/com/google/gwt/uibinder/test/client/TestParameterizedWidgets.java Fri Nov 20 14:07:49 2009 @@ -0,0 +1,33 @@ +/* + * 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.test.client; + +import com.google.gwt.junit.client.GWTTestCase; + +/** + * Test that {...@literal @}UiFactory and parameterized return types get along. + */ +public class TestParameterizedWidgets extends GWTTestCase { + @Override + public String getModuleName() { + return "com.google.gwt.uibinder.test.UiBinderTestApp"; + } + + public void testHappy() { + ParameterizedWidgets ui = new ParameterizedWidgets(); + assertNotNull(ui.a); + } +} ======================================= --- /releases/2.0/branch-info.txt Fri Nov 20 13:22:49 2009 +++ /releases/2.0/branch-info.txt Fri Nov 20 14:07:49 2009 @@ -930,3 +930,6 @@ Fix ant doc target. svn merge --ignore-ancestry -c7080 https://google-web-toolkit.googlecode.com/svn/trunk . +tr...@7032 was merged into this branch + Makes UiFactory work with parameterized return types + svn merge --ignore-ancestry -c 7032 https://google-web-toolkit.googlecode.com/svn/trunk . ======================================= --- /releases/2.0/user/src/com/google/gwt/uibinder/rebind/model/OwnerClass.java Fri Nov 6 17:41:50 2009 +++ /releases/2.0/user/src/com/google/gwt/uibinder/rebind/model/OwnerClass.java Fri Nov 20 14:07:49 2009 @@ -18,7 +18,9 @@ import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JField; +import com.google.gwt.core.ext.typeinfo.JGenericType; import com.google.gwt.core.ext.typeinfo.JMethod; +import com.google.gwt.core.ext.typeinfo.JParameterizedType; import com.google.gwt.uibinder.client.UiFactory; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; @@ -85,6 +87,11 @@ * @return the factory method, or null if none exists */ public JMethod getUiFactoryMethod(JClassType forType) { + JGenericType genericType = forType.isGenericType(); + if (genericType != null) { + forType = genericType.getRawType(); + } + return uiFactories.get(forType); } @@ -148,6 +155,11 @@ logger.die("Factory return type is not a class in method " + method.getName()); } + + JParameterizedType paramType = factoryType.isParameterized(); + if (paramType != null) { + factoryType = paramType.getRawType(); + } if (uiFactories.containsKey(factoryType)) { logger.die("Duplicate factory in class " ======================================= --- /releases/2.0/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java Mon Nov 2 13:18:15 2009 +++ /releases/2.0/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java Fri Nov 20 14:07:49 2009 @@ -16,6 +16,7 @@ package com.google.gwt.uibinder; import com.google.gwt.junit.tools.GWTTestSuite; +import com.google.gwt.uibinder.test.client.TestParameterizedWidgets; import com.google.gwt.uibinder.test.client.UiBinderTest; import junit.framework.Test; @@ -29,6 +30,7 @@ "Test suite for UiBinder GWTTestCases"); suite.addTestSuite(UiBinderTest.class); + suite.addTestSuite(TestParameterizedWidgets.class); return suite; } ======================================= --- /releases/2.0/user/test/com/google/gwt/uibinder/rebind/model/OwnerClassTest.java Wed Nov 4 14:13:39 2009 +++ /releases/2.0/user/test/com/google/gwt/uibinder/rebind/model/OwnerClassTest.java Fri Nov 20 14:07:49 2009 @@ -1,12 +1,12 @@ /* * 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 @@ -15,22 +15,26 @@ */ package com.google.gwt.uibinder.rebind.model; +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.JMethod; import com.google.gwt.core.ext.typeinfo.JParameter; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.MouseOverEvent; -import com.google.gwt.uibinder.client.UiFactory; -import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.core.ext.typeinfo.JType; +import com.google.gwt.core.ext.typeinfo.TypeOracle; +import com.google.gwt.dev.javac.CompilationState; +import com.google.gwt.dev.javac.CompilationStateBuilder; +import com.google.gwt.dev.javac.impl.MockJavaResource; +import com.google.gwt.dev.resource.Resource; +import com.google.gwt.dev.util.log.PrintWriterTreeLogger; import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.uibinder.rebind.JClassTypeAdapter; import com.google.gwt.uibinder.rebind.MortalLogger; -import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.Label; +import com.google.gwt.uibinder.test.UiJavaResources; import junit.framework.TestCase; +import java.io.PrintWriter; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; @@ -41,24 +45,237 @@ */ public class OwnerClassTest extends TestCase { - private JClassTypeAdapter gwtTypeAdapter; + private static TreeLogger createCompileLogger() { + PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter( + System.err, true)); + logger.setMaxDetail(TreeLogger.ERROR); + return logger; + } + + private TypeOracle types; + private JClassType labelType; + private JClassType buttonType; + private JClassType clickEventType; + private JClassType mouseOverEventType; @Override protected void setUp() throws Exception { super.setUp(); - - gwtTypeAdapter = new JClassTypeAdapter(); + CompilationState state = CompilationStateBuilder.buildFrom( + createCompileLogger(), getJavaResources()); + types = state.getTypeOracle(); + labelType = types.findType("com.google.gwt.user.client.ui.Label"); + buttonType = types.findType("com.google.gwt.user.client.ui.Button"); + clickEventType = types.findType("com.google.gwt.event.dom.client.ClickEvent"); + mouseOverEventType = types.findType("com.google.gwt.event.dom.client.MouseOverEvent"); } - /** - * Empty uibinder class for sanity checking. - */ - private static class EmptyOwnerClass { } + private Set<Resource> getJavaResources() { + MockJavaResource[] javaFiles = { + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.EmptyOwnerClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("public class EmptyOwnerClass {\n"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.BadUiFactoryClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("public class BadUiFactoryClass {\n"); + code.append(" @UiFactory int thisShouldntWork() { return 0; }\n"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.UiFieldsClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.user.client.ui.Button;\n"); + code.append("import com.google.gwt.user.client.ui.Label;\n"); + code.append("import com.google.gwt.uibinder.client.UiField;\n"); + code.append("public class UiFieldsClass {\n"); + code.append(" @UiField Label label1;"); + code.append(" @UiField(provided=true) Button button1;"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.UiHandlersClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.event.dom.client.ClickEvent;\n"); + code.append("import com.google.gwt.event.dom.client.MouseOverEvent;\n"); + code.append("import com.google.gwt.uibinder.client.UiHandler;\n"); + code.append("public class UiHandlersClass {\n"); + code.append(" @UiHandler(\"myField\") void onMyFieldClicked(ClickEvent ev) {}"); + code.append(" @UiHandler( {\"myField\", \"myOtherField\"}) void onMouseOver(MouseOverEvent ev){}"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.BadUiFieldsClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiField;\n"); + code.append("public class BadUiFieldsClass {\n"); + code.append(" @UiField int thisShouldntWork;"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.UiFactoryClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("import com.google.gwt.user.client.ui.Label;\n"); + code.append("public class UiFactoryClass {"); + code.append(" @UiFactory"); + code.append(" Label createLabel() { return null; }"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource("com.google.gwt.uibinder.rebind.model.Abstract") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("public class Abstract<T> {"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.WildcardWidgetFactory") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("public class WildcardWidgetFactory {"); + code.append(" @UiFactory"); + code.append(" Abstract<?> createOne() { return null; }"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.ParamterizedWidgetFactory") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("public class ParamterizedWidgetFactory {"); + code.append(" @UiFactory"); + code.append(" Abstract<String> createOne() { return null; }"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.TooManyGenerics") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("public class TooManyGenerics {"); + code.append(" @UiFactory"); + code.append(" Abstract<?> createSomething() { return null; }"); + code.append(" @UiFactory"); + code.append(" Abstract<String> createStringThing() { return null; }"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.DuplicateUiFactoryClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("import com.google.gwt.user.client.ui.Label;\n"); + code.append("public class DuplicateUiFactoryClass {"); + code.append(" @UiFactory"); + code.append(" Label labelFactory1() { return null; }"); + code.append(" @UiFactory"); + code.append(" Label labelFactory2() { return null; }"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.ParentUiBinderClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.event.dom.client.MouseOverEvent;\n"); + code.append("import com.google.gwt.uibinder.client.UiField;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("import com.google.gwt.uibinder.client.UiHandler;\n"); + code.append("import com.google.gwt.user.client.ui.Label;\n"); + code.append("public class ParentUiBinderClass {"); + code.append(" @UiField Label label1;"); + code.append(" @UiFactory Label createLabel() { return null; }"); + code.append(" @UiHandler(\"label1\")"); + code.append(" void onLabelMouseOver(MouseOverEvent e) { }"); + code.append("}\n"); + return code; + } + }, + new MockJavaResource( + "com.google.gwt.uibinder.rebind.model.ChildUiBinderClass") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.rebind.model;\n"); + code.append("import com.google.gwt.event.dom.client.ClickEvent;\n"); + code.append("import com.google.gwt.uibinder.client.UiField;\n"); + code.append("import com.google.gwt.uibinder.client.UiFactory;\n"); + code.append("import com.google.gwt.uibinder.client.UiHandler;\n"); + code.append("import com.google.gwt.user.client.ui.Button;\n"); + code.append("public class ChildUiBinderClass extends ParentUiBinderClass {"); + code.append(" @UiField(provided = true) Button button1;"); + code.append(" @UiFactory Button createButton() { return null; }"); + code.append(" @UiHandler(\"button1\")"); + code.append(" void onButtonClicked(ClickEvent e) { }"); + code.append("}\n"); + return code; + } + },}; + + Set<Resource> rtn = new HashSet<Resource>(UiJavaResources.getUiResources()); + rtn.addAll(Arrays.asList(javaFiles)); + return rtn; + } @SuppressWarnings("deprecation") - public void testOwnerClass_empty() throws Exception { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(EmptyOwnerClass.class); - JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class); + public void testOwnerClass_empty() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.EmptyOwnerClass"); OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); assertNull(ownerClass.getUiFactoryMethod(labelType)); @@ -66,24 +283,10 @@ assertNull(ownerClass.getUiFieldForType(labelType)); assertTrue(ownerClass.getUiFields().isEmpty()); assertTrue(ownerClass.getUiHandlers().isEmpty()); - - gwtTypeAdapter.verifyAll(); } - /** - * Uibinder class for testing of {...@link UiFactory}. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class UiFactoryClass { - @UiFactory - Label createLabel() { - throw new UnsupportedOperationException("Should never be called"); - } - } - - public void testOwnerClass_uiFactory() throws Exception { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(UiFactoryClass.class); - JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class); + public void testOwnerClass_uiFactory() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.UiFactoryClass"); OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); JMethod uiFactoryMethod = ownerClass.getUiFactoryMethod(labelType); @@ -93,78 +296,64 @@ JParameter[] parameters = uiFactoryMethod.getParameters(); assertNotNull(parameters); assertEquals(0, parameters.length); - - gwtTypeAdapter.verifyAll(); + } + + public void testParameterizedWidgets() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.ParamterizedWidgetFactory"); + JClassType abstractType = types.findType("com.google.gwt.uibinder.rebind.model.Abstract"); + OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); + + JMethod expected = ownerType.findMethod("createOne", new JType[] {}); + JMethod uiFactoryMethod = ownerClass.getUiFactoryMethod(abstractType); + + assertEquals(expected, uiFactoryMethod); } - /** - * Uibinder class for testing bad usage of {...@link UiFactory}. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class BadUiFactoryClass { - @UiFactory - int thisShouldntWork() { - throw new UnsupportedOperationException("Should never be called"); + public void testWildcardWidgets() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.WildcardWidgetFactory"); + JClassType abstractType = types.findType("com.google.gwt.uibinder.rebind.model.Abstract"); + OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); + + JMethod expected = ownerType.findMethod("createOne", new JType[] {}); + JMethod uiFactoryMethod = ownerClass.getUiFactoryMethod(abstractType); + + assertEquals(expected, uiFactoryMethod); + } + + public void testHowSuckyWeReallyAreWithGenerics() { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.TooManyGenerics"); + + try { + new OwnerClass(ownerType, MortalLogger.NULL); + fail(); + } catch (UnableToCompleteException e) { + /* pass */ } } public void testOwnerClass_uiFactoryBadType() { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(BadUiFactoryClass.class); + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.BadUiFactoryClass"); try { new OwnerClass(ownerType, MortalLogger.NULL); fail("Expected exception not thrown."); } catch (UnableToCompleteException utce) { // Expected } - - gwtTypeAdapter.verifyAll(); - } - - /** - * Uibinder class for testing bad usage of {...@link UiFactory}. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class DuplicateUiFactoryClass { - @UiFactory - Label labelFactory1() { - throw new UnsupportedOperationException("Should never be called"); - } - - @UiFactory - Label labelFactory2() { - throw new UnsupportedOperationException("Should never be called"); - } } public void testOwnerClass_uiFactoryDuplicateType() { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(DuplicateUiFactoryClass.class); + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.DuplicateUiFactoryClass"); try { new OwnerClass(ownerType, MortalLogger.NULL); fail("Expected exception not thrown."); } catch (UnableToCompleteException utce) { // Expected } - - gwtTypeAdapter.verifyAll(); - } - - /** - * Uibinder class for testing of {...@link UiField}. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class UiFieldsClass { - @UiField - Label label1; - - @UiField(provided = true) - Button button1; } @SuppressWarnings("deprecation") - public void testOwnerClass_uiFields() throws Exception { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(UiFieldsClass.class); - JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class); - JClassType buttonType = gwtTypeAdapter.adaptJavaClass(Button.class); + public void testOwnerClass_uiFields() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.UiFieldsClass"); OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); OwnerField labelField = ownerClass.getUiField("label1"); @@ -191,56 +380,26 @@ expectedFieldSet.add(labelField); expectedFieldSet.add(buttonField); assertEquals(expectedFieldSet, uiFieldSet); - - gwtTypeAdapter.verifyAll(); - } - - /** - * Uibinder class for testing bad usage of {...@link UiField}. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class BadUiFieldsClass { - @UiField - int thisShouldntWork; } public void testOwnerClass_uiFieldsBadType() { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(BadUiFieldsClass.class); + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.BadUiFieldsClass"); try { new OwnerClass(ownerType, MortalLogger.NULL); fail("Expected exception not thrown."); } catch (UnableToCompleteException utce) { // Expected } - - gwtTypeAdapter.verifyAll(); } - /** - * Uibinder class for testing of {...@link UiHandler}. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class UiHandlersClass { - @UiHandler("myField") - void onMyFieldClicked(ClickEvent ev) { - throw new UnsupportedOperationException("Should never be called"); - } - - @UiHandler({"myField", "myOtherField"}) - void onMouseOver(MouseOverEvent ev) { - throw new UnsupportedOperationException("Should never be called"); - } - } - - public void testOwnerClass_uiHandlers() throws Exception { - JClassType ownerType = gwtTypeAdapter.adaptJavaClass(UiHandlersClass.class); + public void testOwnerClass_uiHandlers() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.UiHandlersClass"); OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); // Assert the two expected handlers are there List<JMethod> uiHandlers = ownerClass.getUiHandlers(); assertEquals(2, uiHandlers.size()); - JMethod clickMethod = null, - mouseOverMethod = null; + JMethod clickMethod = null, mouseOverMethod = null; // Don't care about ordering for (JMethod method : uiHandlers) { @@ -255,7 +414,6 @@ assertNotNull(mouseOverMethod); // Check the click handler - JClassType clickEventType = gwtTypeAdapter.adaptJavaClass(ClickEvent.class); JParameter[] clickParams = clickMethod.getParameters(); assertEquals(1, clickParams.length); assertEquals(clickEventType, clickParams[0].getType()); @@ -266,7 +424,6 @@ assertEquals("myField", clickFields[0]); // Check the mouse over handler - JClassType mouseOverEventType = gwtTypeAdapter.adaptJavaClass(MouseOverEvent.class); JParameter[] mouseOverParams = mouseOverMethod.getParameters(); assertEquals(1, mouseOverParams.length); assertEquals(mouseOverEventType, mouseOverParams[0].getType()); @@ -276,54 +433,11 @@ assertEquals(2, mouseOverFields.length); assertEquals("myField", mouseOverFields[0]); assertEquals("myOtherField", mouseOverFields[1]); - - gwtTypeAdapter.verifyAll(); - } - - /** - * Parent class for testing inheritance of owner classes. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class ParentUiBinderClass { - @UiField - Label label1; - - @UiFactory - Label createLabel() { - throw new UnsupportedOperationException("Should never be called"); - } - - @UiHandler("label1") - void onLabelMouseOver(MouseOverEvent ev) { - throw new UnsupportedOperationException("Should never be called"); - } - } - - /** - * Child class for testing inheritance of owner classes. - */ - @SuppressWarnings("unused") // We know these methods are unused - private static class ChildUiBinderClass extends ParentUiBinderClass { - @UiField(provided = true) - Button button1; - - @UiFactory - Button createButton() { - throw new UnsupportedOperationException("Should never be called"); - } - - @UiHandler("button1") - void onButtonClicked(ClickEvent ev) { - throw new UnsupportedOperationException("Should never be called"); - } } @SuppressWarnings("deprecation") - public void testOwnerClass_withParent() throws Exception { - JClassType ownerType = - gwtTypeAdapter.adaptJavaClass(ChildUiBinderClass.class); - JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class); - JClassType buttonType = gwtTypeAdapter.adaptJavaClass(Button.class); + public void testOwnerClass_withParent() throws UnableToCompleteException { + JClassType ownerType = types.findType("com.google.gwt.uibinder.rebind.model.ChildUiBinderClass"); OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL); // Test fields @@ -372,8 +486,7 @@ // Test handlers List<JMethod> uiHandlers = ownerClass.getUiHandlers(); assertEquals(2, uiHandlers.size()); - JMethod clickMethod = null, - mouseOverMethod = null; + JMethod clickMethod = null, mouseOverMethod = null; for (JMethod method : uiHandlers) { if (method.getName().equals("onButtonClicked")) { @@ -386,7 +499,6 @@ assertNotNull(clickMethod); assertNotNull(mouseOverMethod); - JClassType clickEventType = gwtTypeAdapter.adaptJavaClass(ClickEvent.class); JParameter[] clickParams = clickMethod.getParameters(); assertEquals(1, clickParams.length); assertEquals(clickEventType, clickParams[0].getType()); @@ -396,7 +508,6 @@ assertEquals(1, clickFields.length); assertEquals("button1", clickFields[0]); - JClassType mouseOverEventType = gwtTypeAdapter.adaptJavaClass(MouseOverEvent.class); JParameter[] mouseOverParams = mouseOverMethod.getParameters(); assertEquals(1, mouseOverParams.length); assertEquals(mouseOverEventType, mouseOverParams[0].getType()); @@ -405,7 +516,5 @@ String[] mouseOverFields = mouseOverAnnotation.value(); assertEquals(1, mouseOverFields.length); assertEquals("label1", mouseOverFields[0]); - - gwtTypeAdapter.verifyAll(); } } ======================================= --- /releases/2.0/user/test/com/google/gwt/uibinder/test/UiJavaResources.java Thu Nov 19 13:02:01 2009 +++ /releases/2.0/user/test/com/google/gwt/uibinder/test/UiJavaResources.java Fri Nov 20 14:07:49 2009 @@ -29,6 +29,49 @@ */ public class UiJavaResources { + public static final MockJavaResource BUTTON = new MockJavaResource( + "com.google.gwt.user.client.ui.Button") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.user.client.ui;\n"); + code.append("import com.google.gwt.event.dom.client.ClickEvent;\n"); + code.append("import com.google.gwt.event.dom.client.ClickHandler;\n"); + code.append("import com.google.gwt.event.dom.client.MouseOverEvent;\n"); + code.append("import com.google.gwt.event.dom.client.MouseOverHandler;\n"); + code.append("public class Button extends Widget"); + code.append(" implements ClickHandler, MouseOverHandler {\n"); + code.append(" public void onMouseOver(MouseOverEvent event){}\n"); + code.append(" public void onClick(ClickEvent event){}\n"); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource CLICK_EVENT = new MockJavaResource( + "com.google.gwt.event.dom.client.ClickEvent") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.dom.client;\n"); + code.append("import com.google.gwt.event.shared.GwtEvent;\n"); + code.append("public class ClickEvent extends GwtEvent<ClickHandler> {\n"); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource CLICK_HANDLER = new MockJavaResource( + "com.google.gwt.event.dom.client.ClickHandler") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.dom.client;\n"); + code.append("import com.google.gwt.event.shared.EventHandler;\n"); + code.append("public interface ClickHandler extends EventHandler {\n"); + code.append(" void onClick(ClickEvent event);\n"); + code.append("}\n"); + return code; + } + }; public static final MockJavaResource DIALOG_BOX = new MockJavaResource( "com.google.gwt.user.client.ui.DialogBox") { @Override @@ -50,6 +93,53 @@ code.append("}\n"); return code; } + }; + public static final MockJavaResource EVENT_HANDLER = new MockJavaResource( + "com.google.gwt.event.shared.EventHandler") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.shared;\n"); + code.append("public interface EventHandler {\n"); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource GWT_EVENT = new MockJavaResource( + "com.google.gwt.event.shared.GwtEvent") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.shared;\n"); + code.append("public abstract class GwtEvent<H extends EventHandler> {\n"); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource HANDLER_REGISTRATION = new MockJavaResource( + "com.google.gwt.event.shared.HandlerRegistration") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.shared;\n"); + code.append("public interface HandlerRegistration {\n"); + code.append(" void removeHandler();"); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource HAS_CLICK_HANDLERS = new MockJavaResource( + "com.google.gwt.event.dom.client.HasClickHandlers") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.dom.client;\n"); + code.append("import com.google.gwt.event.shared.HandlerRegistration;\n"); + code.append("public interface HasClickHandlers {\n"); + code.append(" HandlerRegistration addClickHandler(ClickHandler handler);"); + code.append("}\n"); + return code; + } }; public static final MockJavaResource HAS_HORIZONTAL_ALIGNMENT = new MockJavaResource( "com.google.gwt.user.client.ui.HasHorizontalAlignment") { @@ -83,7 +173,14 @@ protected CharSequence getContent() { StringBuffer code = new StringBuffer(); code.append("package com.google.gwt.user.client.ui;\n"); - code.append("public class Label extends Widget {\n"); + code.append("import com.google.gwt.event.dom.client.ClickEvent;\n"); + code.append("import com.google.gwt.event.dom.client.ClickHandler;\n"); + code.append("import com.google.gwt.event.dom.client.MouseOverEvent;\n"); + code.append("import com.google.gwt.event.dom.client.MouseOverHandler;\n"); + code.append("public class Label extends Widget"); + code.append(" implements ClickHandler, MouseOverHandler {\n"); + code.append(" public void onMouseOver(MouseOverEvent event){}\n"); + code.append(" public void onClick(ClickEvent event){}\n"); code.append("}\n"); return code; } @@ -98,6 +195,31 @@ code.append("}\n"); return code; } + }; + public static final MockJavaResource MOUSE_OVER_EVENT = new MockJavaResource( + "com.google.gwt.event.dom.client.MouseOverEvent") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.dom.client;\n"); + code.append("import com.google.gwt.event.shared.GwtEvent;\n"); + code.append("public class MouseOverEvent extends GwtEvent<MouseOverHandler> {\n"); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource MOUSE_OVER_HANDLER = new MockJavaResource( + "com.google.gwt.event.dom.client.MouseOverHandler") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.event.dom.client;\n"); + code.append("import com.google.gwt.event.shared.EventHandler;\n"); + code.append("public interface MouseOverHandler extends EventHandler {\n"); + code.append(" void onMouseOver(MouseOverEvent event);\n"); + code.append("}\n"); + return code; + } }; public static final MockJavaResource SPLIT_LAYOUT_PANEL = new MockJavaResource( "com.google.gwt.user.client.ui.SplitLayoutPanel") { @@ -154,6 +276,19 @@ code.append("}\n"); return code; } + }; + public static final MockJavaResource UI_FACTORY = new MockJavaResource( + "com.google.gwt.uibinder.client.UiFactory") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.uibinder.client;\n"); + code.append("import java.lang.annotation.Target;\n"); + // code.append("@Target(ElementType.METHOD)"); + code.append("public @interface UiFactory {\n"); + code.append("}\n"); + return code; + } }; public static final MockJavaResource UI_OBJECT = new MockJavaResource( "com.google.gwt.user.client.ui.UIObject") { @@ -185,18 +320,28 @@ public static Set<Resource> getUiResources() { Set<Resource> rtn = new HashSet<Resource>( Arrays.asList(JavaResourceBase.getStandardResources())); + rtn.add(BUTTON); + rtn.add(CLICK_EVENT); + rtn.add(CLICK_HANDLER); rtn.add(DIALOG_BOX); rtn.add(DOCK_LAYOUT_PANEL); + rtn.add(EVENT_HANDLER); + rtn.add(GWT_EVENT); + rtn.add(HANDLER_REGISTRATION); + rtn.add(HAS_CLICK_HANDLERS); rtn.add(HAS_HORIZONTAL_ALIGNMENT); rtn.add(HAS_VERTICAL_ALIGNMENT); rtn.add(LABEL); rtn.add(LAYOUT_PANEL); + rtn.add(MOUSE_OVER_EVENT); + rtn.add(MOUSE_OVER_HANDLER); rtn.add(SPLIT_LAYOUT_PANEL); rtn.add(STACK_LAYOUT_PANEL); rtn.add(STYLE); rtn.add(TAB_LAYOUT_PANEL); rtn.add(UI_OBJECT); rtn.add(UI_BINDER); + rtn.add(UI_FACTORY); rtn.add(WIDGET); return rtn; } -- http://groups.google.com/group/Google-Web-Toolkit-Contributors