| /* |
| * 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.resources.ext; |
| |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.typeinfo.JClassType; |
| import com.google.gwt.core.ext.typeinfo.JMethod; |
| import com.google.gwt.core.ext.typeinfo.JPrimitiveType; |
| import com.google.gwt.core.ext.typeinfo.JType; |
| import com.google.gwt.core.ext.typeinfo.NotFoundException; |
| 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.JavaResourceBase; |
| import com.google.gwt.dev.javac.testing.impl.MockJavaResource; |
| import com.google.gwt.dev.resource.Resource; |
| import com.google.gwt.dev.util.log.PrintWriterTreeLogger; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.PrintWriter; |
| import java.util.Arrays; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| /** |
| * Test cases for methods in ResourceGeneratorUtil. |
| */ |
| public class ResourceGeneratorUtilTest extends TestCase { |
| |
| JMethod intMethod; |
| TypeOracle oracle; |
| JClassType rootType; |
| JMethod stringMethod; |
| JMethod voidMethod; |
| |
| @Override |
| public void setUp() throws Exception { |
| PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new PrintWriter( |
| System.err)); |
| logger.setMaxDetail(TreeLogger.ERROR); |
| CompilationState cs = CompilationStateBuilder.buildFrom(logger, |
| new CompilerContext(), getResources()); |
| oracle = cs.getTypeOracle(); |
| rootType = oracle.findType("test.A"); |
| intMethod = rootType.findMethod("i", new JType[0]); |
| stringMethod = oracle.findType("test.D").findMethod("string", new JType[0]); |
| voidMethod = rootType.findMethod("v", new JType[0]); |
| } |
| |
| public void testMethodOnArray() { |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("array", |
| "Q"), oracle.getType("java.lang.String")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Cannot resolve member Q on type test.A[]", e.getMessage()); |
| // OK |
| } |
| } |
| |
| public void testMethodOnPrimitive() { |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("i", "Q"), |
| oracle.getType("java.lang.String")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Cannot resolve member Q on type int", e.getMessage()); |
| // OK |
| } |
| } |
| |
| public void testMethodOnVoid() { |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("v", "Q"), |
| oracle.getType("java.lang.String")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Cannot resolve member Q on type void", e.getMessage()); |
| // OK |
| } |
| } |
| |
| public void testMethodWithArgs() { |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("b", "d", |
| "string"), oracle.getType("java.lang.String")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Could not find no-arg method named d in type test.B", |
| e.getMessage()); |
| // OK |
| } |
| } |
| |
| public void testNoSuchMethod() { |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("b", "Q", |
| "d", "string"), oracle.getType("java.lang.String")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Could not find no-arg method named Q in type test.B", |
| e.getMessage()); |
| // OK |
| } |
| } |
| |
| public void testObjectReturnType() throws NotFoundException { |
| assertSame(stringMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("b", "c", "d", "string"), null)); |
| assertSame(stringMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("b", "c", "d", "string"), |
| oracle.getType("java.lang.String"))); |
| assertSame(stringMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("b", "c", "d", "string"), |
| oracle.getType("java.lang.Object"))); |
| } |
| |
| public void testPrimitiveReturnType() throws NotFoundException { |
| assertSame(intMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("i"), null)); |
| assertSame(intMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("i"), JPrimitiveType.INT)); |
| } |
| |
| public void testReturnTypeMismatch() { |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("b", "c", |
| "d", "string"), oracle.getType("java.lang.Throwable")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Expecting return type java.lang.Throwable" |
| + " found java.lang.String", e.getMessage()); |
| // OK |
| } |
| |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("b", "c", |
| "d", "string"), JPrimitiveType.INT); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Expecting return type int" + " found java.lang.String", |
| e.getMessage()); |
| // OK |
| } |
| |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("i"), |
| JPrimitiveType.DOUBLE); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Expecting return type double" + " found int", |
| e.getMessage()); |
| // OK |
| } |
| |
| try { |
| ResourceGeneratorUtil.getMethodByPath(rootType, Arrays.asList("i"), |
| oracle.getType("java.lang.Throwable")); |
| fail(); |
| } catch (NotFoundException e) { |
| assertEquals("Expecting return type java.lang.Throwable" + " found int", |
| e.getMessage()); |
| // OK |
| } |
| } |
| |
| public void testVoidReturnType() throws NotFoundException { |
| assertSame(voidMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("v"), null)); |
| assertSame(voidMethod, ResourceGeneratorUtil.getMethodByPath(rootType, |
| Arrays.asList("v"), JPrimitiveType.VOID)); |
| } |
| |
| private Set<Resource> getResources() { |
| Set<Resource> res = new HashSet<Resource>( |
| Arrays.asList(JavaResourceBase.getStandardResources())); |
| res.add(new MockJavaResource("test.A") { |
| @Override |
| public CharSequence getContent() { |
| StringBuilder code = new StringBuilder(); |
| code.append("package test;"); |
| code.append("interface A {"); |
| code.append(" A[] array();"); |
| code.append(" B b();"); |
| code.append(" D d(String withArg);"); |
| code.append(" int i();"); |
| code.append(" void v();"); |
| code.append("}"); |
| return code; |
| } |
| }); |
| res.add(new MockJavaResource("test.B") { |
| @Override |
| public CharSequence getContent() { |
| StringBuilder code = new StringBuilder(); |
| code.append("package test;"); |
| code.append("abstract class B {"); |
| code.append(" abstract C c();"); |
| code.append(" abstract Object c(String withOverload);"); |
| code.append("}"); |
| return code; |
| } |
| }); |
| res.add(new MockJavaResource("test.C") { |
| @Override |
| public CharSequence getContent() { |
| StringBuilder code = new StringBuilder(); |
| code.append("package test;"); |
| code.append("interface C {"); |
| code.append(" D d();"); |
| code.append("}"); |
| return code; |
| } |
| }); |
| res.add(new MockJavaResource("test.D") { |
| @Override |
| public CharSequence getContent() { |
| StringBuilder code = new StringBuilder(); |
| code.append("package test;"); |
| code.append("interface D {"); |
| code.append(" String string();"); |
| code.append("}"); |
| return code; |
| } |
| }); |
| return res; |
| } |
| } |