| /* |
| * Copyright 2013 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.web.bindery.requestfactory.gwt.rebind; |
| |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.dev.javac.StandardGeneratorContext; |
| import com.google.gwt.dev.javac.testing.GeneratorContextBuilder; |
| import com.google.gwt.dev.javac.testing.JavaSource; |
| import com.google.gwt.dev.util.log.PrintWriterTreeLogger; |
| |
| import junit.framework.TestCase; |
| |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| |
| /** |
| * Tests for {@link RequestFactoryGenerator}. |
| */ |
| public class RequestFactoryGeneratorTest extends TestCase { |
| |
| // Common imports for generated clients. |
| private static final String COMMON_IMPORTS = "import com.google.api.gwt.shared.AuthScope;\n" |
| + "import com.google.web.bindery.autobean.shared.AutoBean.PropertyName;\n" |
| + "import com.google.web.bindery.requestfactory.shared.JsonRpcService;\n" |
| + "import com.google.web.bindery.requestfactory.shared.Request;\n" |
| + "import com.google.web.bindery.requestfactory.shared.RequestContext;\n" |
| + "import com.google.web.bindery.requestfactory.shared.RequestFactory;\n"; |
| |
| // Classes needed by by RequestFactoryModel |
| private static final JavaSource SET = createMockJavaSource( |
| "java.util.Set", |
| "package java.util;", |
| "public interface Set<V> {}"); |
| |
| private static final JavaSource AUTH_SCOPE = createMockJavaSource( |
| "com.google.api.gwt.shared.AuthScope", |
| "package com.google.api.gwt.shared;", |
| "public @interface AuthScope {}"); |
| |
| private static final JavaSource SPLITTABLE = createMockJavaSource( |
| "com.google.web.bindery.autobean.shared.Splittable", |
| "package com.google.web.bindery.autobean.shared;", |
| "public interface Splittable {}"); |
| |
| private static final JavaSource PROPERTY_NAME = createMockJavaSource( |
| "com.google.web.bindery.autobean.shared.AutoBean.PropertyName", |
| "package com.google.web.bindery.autobean.shared.AutoBean;", |
| "public @interface PropertyName {}"); |
| |
| private static final JavaSource ENTITY_PROXY = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.EntityProxy", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public interface EntityProxy {}"); |
| |
| private static final JavaSource INSTANCE_REQUEST = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.InstanceRequest", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public interface InstanceRequest {}"); |
| |
| private static final JavaSource JSON_RPC_SERVICE = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.JsonRpcService", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public @interface JsonRpcService {}"); |
| |
| private static final JavaSource REQUEST = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.Request", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public interface Request<T> {}"); |
| |
| private static final JavaSource REQUEST_CONTEXT = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.RequestContext", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public interface RequestContext {}"); |
| |
| private static final JavaSource REQUEST_FACTORY = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.RequestFactory", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public interface RequestFactory {}"); |
| |
| private static final JavaSource VALUE_PROXY = createMockJavaSource( |
| "com.google.web.bindery.requestfactory.shared.ValueProxy", |
| "package com.google.web.bindery.requestfactory.shared;", |
| "public interface ValueProxy {}"); |
| |
| private TreeLogger logger; |
| private StringWriter writer; |
| private GeneratorContextBuilder contextBuilder; |
| private RequestFactoryGenerator generator; |
| |
| @Override |
| public void setUp() throws Exception { |
| super.setUp(); |
| writer = new StringWriter(); |
| logger = createTreeLogger(new PrintWriter(writer)); |
| generator = new RequestFactoryGenerator(); |
| contextBuilder = GeneratorContextBuilder.newCoreBasedBuilder(); |
| contextBuilder.add(SET); |
| contextBuilder.add(AUTH_SCOPE); |
| contextBuilder.add(SPLITTABLE); |
| contextBuilder.add(PROPERTY_NAME); |
| contextBuilder.add(ENTITY_PROXY); |
| contextBuilder.add(INSTANCE_REQUEST); |
| contextBuilder.add(JSON_RPC_SERVICE); |
| contextBuilder.add(REQUEST); |
| contextBuilder.add(REQUEST_CONTEXT); |
| contextBuilder.add(REQUEST_FACTORY); |
| contextBuilder.add(VALUE_PROXY); |
| } |
| |
| private static TreeLogger createTreeLogger(PrintWriter writer) { |
| PrintWriterTreeLogger logger = new PrintWriterTreeLogger(writer); |
| logger.setMaxDetail(TreeLogger.ERROR); |
| return logger; |
| } |
| |
| public void testContextIsNotAService() throws Exception { |
| JavaSource simpleEnumTest = createMockJavaSource("test.Simple", |
| "package test;", |
| COMMON_IMPORTS, |
| "public interface Simple extends RequestFactory {", |
| " SimpleContext simple();", |
| " public interface SimpleContext extends RequestContext {", |
| " GetByIdRequest getById(Long id);", |
| " public interface GetByIdRequest extends Request<String> {", |
| " GetByIdRequest setId(Long id);", |
| " }", |
| " }", |
| "}"); |
| |
| contextBuilder.add(simpleEnumTest); |
| StandardGeneratorContext ctx = |
| (StandardGeneratorContext) contextBuilder.buildGeneratorContext(); |
| assertNotNull(ctx.getTypeOracle().findType("test.Simple")); |
| try { |
| assertEquals("test.SimpleImpl", |
| generator.generate(logger, contextBuilder.buildGeneratorContext(), "test.Simple")); |
| fail("RequestContext is not annotated as a service"); |
| } catch (UnableToCompleteException expected) { |
| assertTrue(writer.toString().contains("RequestContext subtype test.Simple.SimpleContext " |
| + "is missing a @Service or @JsonRpcService annotation")); |
| } |
| } |
| |
| public void testExtraEnumsPulledFromParameterizedParameters() throws Exception { |
| JavaSource simpleEnumTest = createMockJavaSource("test.Simple", |
| "package test;", |
| COMMON_IMPORTS, |
| "public interface Simple extends RequestFactory {", |
| " SimpleContext simple();", |
| " @JsonRpcService", |
| " public interface SimpleContext extends RequestContext {", |
| " GetByIdRequest getById(Long id);", |
| " public interface GetByIdRequest extends Request<String> {", |
| " public enum GetByIdEnum {}", |
| " GetByIdRequest setId(Long id);", |
| " GetByIdRequest setEnums(java.util.List<GetByIdEnum> enums);", |
| " }", |
| " }", |
| "}"); |
| |
| contextBuilder.add(simpleEnumTest); |
| StandardGeneratorContext ctx = |
| (StandardGeneratorContext) contextBuilder.buildGeneratorContext(); |
| assertNotNull(ctx.getTypeOracle().findType("test.Simple")); |
| try { |
| assertEquals("test.SimpleImpl", generator.generate(logger, ctx, "test.Simple")); |
| } catch (UnableToCompleteException e) { |
| throw new RuntimeException("Could not complete with errors:\n" + writer.toString()); |
| } |
| assertNotNull(ctx.getGeneratedUnitMap().get("test.SimpleImpl")); |
| String source = ctx.getGeneratedUnitMap().get("test.SimpleImpl").getSource(); |
| assertTrue(source.contains("@com.google.web.bindery.autobean.shared.impl.EnumMap.ExtraEnums(" |
| + "{test.Simple.SimpleContext.GetByIdRequest.GetByIdEnum.class})")); |
| } |
| |
| private static JavaSource createMockJavaSource(String typeName, final String... lines) { |
| return new JavaSource(typeName) { |
| @Override |
| public String getSource() { |
| StringBuilder code = new StringBuilder(); |
| for (String line : lines) { |
| code.append(line + "\n"); |
| } |
| return code.toString(); |
| } |
| }; |
| } |
| } |
| |
| |