/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.codegen; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.StringWriter; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Target; import java.util.Arrays; import org.junit.Before; import org.junit.Test; import com.google.common.base.Charsets; import com.google.common.base.Function; import com.google.common.io.Resources; import com.mysema.codegen.model.ClassType; import com.mysema.codegen.model.Parameter; import com.mysema.codegen.model.SimpleType; import com.mysema.codegen.model.Type; import com.mysema.codegen.model.TypeCategory; import com.mysema.codegen.model.Types; public class JavaWriterTest { private static final Function<Parameter, Parameter> transformer = new Function<Parameter, Parameter>() { @Override public Parameter apply(Parameter input) { return input; } }; private StringWriter w; private CodeWriter writer; private Type testType, testType2, testSuperType, testInterface1, testInterface2; private static void match(String resource, String text) throws IOException { // TODO : try to compile ? String expected = Resources.toString(JavaWriterTest.class.getResource(resource), Charsets.UTF_8) .replace("\r\n", "\n").trim(); String actual = text.trim(); assertEquals(expected, actual); } @Before public void setUp() { w = new StringWriter(); writer = new JavaWriter(w); testType = new ClassType(JavaWriterTest.class); testType2 = new SimpleType("com.mysema.codegen.Test", "com.mysema.codegen", "Test"); testSuperType = new SimpleType("com.mysema.codegen.Superclass", "com.mysema.codegen", "Superclass"); testInterface1 = new SimpleType("com.mysema.codegen.TestInterface1", "com.mysema.codegen", "TestInterface1"); testInterface2 = new SimpleType("com.mysema.codegen.TestInterface2", "com.mysema.codegen", "TestInterface2"); } @Test public void Arrays() throws IOException { writer.beginClass(new SimpleType("Main")); writer.field(Types.STRING.asArrayType(), "stringArray"); writer.beginPublicMethod(Types.VOID, "main", new Parameter("args", Types.STRING.asArrayType())); writer.line("//"); writer.end(); writer.beginPublicMethod(Types.VOID, "main2", new Parameter("args", new ClassType( TypeCategory.ARRAY, String[].class))); writer.line("//"); writer.end(); writer.end(); System.out.println(w); assertTrue(w.toString().contains("String[] stringArray;")); assertTrue(w.toString().contains("public void main(String[] args) {")); assertTrue(w.toString().contains("public void main2(String[] args) {")); } @Test public void Primitive_Arrays() { ClassType byteArray = new ClassType(byte[].class); assertEquals("byte[]", writer.getRawName(byteArray)); } @Test public void Basic() throws IOException { writer.packageDecl("com.mysema.codegen"); writer.imports(IOException.class, StringWriter.class, Test.class); writer.beginClass(testType); writer.annotation(Test.class); writer.beginPublicMethod(Types.VOID, "test"); writer.line("// TODO"); writer.end(); writer.end(); match("/testBasic", w.toString()); } @Test public void Extends() throws IOException { writer.beginClass(testType2, testSuperType); writer.end(); match("/testExtends", w.toString()); } @Test public void Implements() throws IOException { writer.beginClass(testType2, null, testInterface1, testInterface2); writer.end(); match("/testImplements", w.toString()); } @Test public void Interface() throws IOException { writer.packageDecl("com.mysema.codegen"); writer.imports(IOException.class, StringWriter.class, Test.class); writer.beginInterface(testType); writer.end(); match("/testInterface", w.toString()); } @Test public void Interface2() throws IOException { writer.beginInterface(testType2, testInterface1); writer.end(); match("/testInterface2", w.toString()); } @Test public void Interface3() throws IOException { writer.beginInterface(testType, testType2, testInterface1, testInterface2); writer.end(); assertTrue(w.toString().contains( "public interface JavaWriterTest extends Test, TestInterface1, TestInterface2 {")); } @Test public void Javadoc() throws IOException { writer.packageDecl("com.mysema.codegen"); writer.imports(IOException.class, StringWriter.class, Test.class); writer.javadoc("JavaWriterTest is a test class"); writer.beginClass(testType); writer.end(); match("/testJavadoc", w.toString()); } @Test public void Annotations() throws IOException { writer.packageDecl("com.mysema.codegen"); writer.imports(IOException.class, StringWriter.class); writer.annotation(Entity.class); writer.beginClass(testType); writer.annotation(Test.class); writer.beginPublicMethod(Types.VOID, "test"); writer.end(); writer.end(); match("/testAnnotations", w.toString()); } @Test public void Annotations2() throws IOException { writer.packageDecl("com.mysema.codegen"); writer.imports(IOException.class.getPackage(), StringWriter.class.getPackage()); writer.annotation(Entity.class); writer.beginClass(testType); writer.annotation(new Test() { @Override public Class<? extends Throwable> expected() { // TODO Auto-generated method stub return null; } @Override public long timeout() { return 0; } @Override public Class<? extends Annotation> annotationType() { return Test.class; } }); writer.beginPublicMethod(Types.VOID, "test"); writer.end(); writer.end(); match("/testAnnotations2", w.toString()); } @Test public void Annotation_With_ArrayMethod() throws IOException { Target annotation = new Target() { @Override public ElementType[] value() { return new ElementType[] { ElementType.FIELD, ElementType.METHOD }; } @Override public Class<? extends Annotation> annotationType() { return Target.class; } }; writer.imports(Target.class.getPackage()); writer.annotation(annotation); assertTrue(w.toString().contains("@Target({FIELD, METHOD})")); } @Test public void ClassConstants() { assertEquals("SomeClass.class", writer.getClassConstant("SomeClass")); } @Test public void Fields() throws IOException { writer.beginClass(testType); // private writer.privateField(Types.STRING, "privateField"); writer.privateStaticFinal(Types.STRING, "privateStaticFinal", "\"val\""); // protected writer.protectedField(Types.STRING, "protectedField"); // field writer.field(Types.STRING, "field"); // public writer.publicField(Types.STRING, "publicField"); writer.publicStaticFinal(Types.STRING, "publicStaticFinal", "\"val\""); writer.publicFinal(Types.STRING, "publicFinalField"); writer.publicFinal(Types.STRING, "publicFinalField2", "\"val\""); writer.end(); match("/testFields", w.toString()); } @Test public void Methods() throws IOException { writer.beginClass(testType); // private // protected // method // public writer.beginPublicMethod(Types.STRING, "publicMethod", Arrays.asList(new Parameter("a", Types.STRING)), transformer); writer.line("return null;"); writer.end(); writer.beginStaticMethod(Types.STRING, "staticMethod", Arrays.asList(new Parameter("a", Types.STRING)), transformer); writer.line("return null;"); writer.end(); writer.end(); match("/testMethods", w.toString()); } @Test public void Constructors() throws IOException { writer.beginClass(testType); writer.beginConstructor( Arrays.asList(new Parameter("a", Types.STRING), new Parameter("b", Types.STRING)), transformer); writer.end(); writer.beginConstructor(new Parameter("a", Types.STRING)); writer.end(); writer.end(); match("/testConstructors", w.toString()); } @Test public void Inner_Classes() throws IOException { writer.beginClass(testType); writer.beginClass(testType2); writer.end(); writer.beginConstructor(new Parameter("a", Types.STRING)); writer.end(); writer.end(); match("/testInnerClasses", w.toString()); } @Test public void Imports() throws IOException { writer.staticimports(Arrays.class); match("/testImports", w.toString()); } @Test public void Imports2() throws IOException { writer.importPackages("java.lang.reflect", "java.util"); match("/testImports2", w.toString()); } @Test public void Imports3() throws IOException { writer.importClasses("java.util.Locale"); assertTrue(w.toString().contains("import java.util.Locale;")); } @Test public void SuppressWarnings() throws IOException { writer.suppressWarnings("unused"); writer.privateField(Types.STRING, "test"); match("/testSuppressWarnings", w.toString()); } @Test public void SuppressWarnings2() throws IOException { writer.suppressWarnings("all", "unused"); writer.privateField(Types.STRING, "test"); match("/testSuppressWarnings2", w.toString()); } }