package com.josketres.builderator; import com.google.common.collect.Lists; import com.google.testing.compile.JavaFileObjects; import com.google.testing.compile.JavaSourceSubjectFactory; import com.google.testing.compile.JavaSourcesSubjectFactory; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; import org.junit.Test; import test.classes.NormalJavaBean; import javax.lang.model.element.Modifier; import java.util.concurrent.Callable; import static com.google.common.truth.Truth.assert_; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class BuilderatorTest { @Test public void test_builder_compiles_without_error() throws Exception { assert_().about(JavaSourceSubjectFactory.javaSource()) .that(JavaFileObjects.forSourceString("test.classes.NormalJavaBeanBuilder", Builderator.builderFor(NormalJavaBean.class))) .compilesWithoutError(); } @Test public void test_builder_tester_compiles_without_error() throws Exception { assert_().about(JavaSourcesSubjectFactory.javaSources()) .that(Lists.newArrayList( JavaFileObjects.forSourceString("test.classes.NormalJavaBeanBuilder", Builderator.builderFor(NormalJavaBean.class)), JavaFileObjects.forSourceString("test.classes.BuilderTester", createBuilderTesterSource()))) .compilesWithoutError(); } @Test public void test_compiles_and_can_be_used() throws Exception { TestCompiler testCompiler = new TestCompiler(); testCompiler.compile( JavaFileObjects.forSourceString("test.classes.NormalJavaBeanBuilder", Builderator.builderFor(NormalJavaBean.class)), JavaFileObjects.forSourceString("test.classes.BuilderTester", createBuilderTesterSource())); testCompiler.loadClass("test.classes.NormalJavaBeanBuilder"); Callable<NormalJavaBean> tester = (Callable<NormalJavaBean>) testCompiler.loadClass("test.classes.BuilderTester").newInstance(); NormalJavaBean constructed = tester.call(); assertThat(constructed.getName(), is("builderTest")); assertThat(constructed.getAge(), is(18)); } private String createBuilderTesterSource() throws Exception { TypeSpec.Builder builder = TypeSpec.classBuilder("BuilderTester") .addModifiers(Modifier.PUBLIC) .addMethod(MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).build()) .addSuperinterface(Callable.class) .addMethod(MethodSpec.methodBuilder("call") .addModifiers(Modifier.PUBLIC) .returns(NormalJavaBean.class) .addStatement("NormalJavaBeanBuilder builder = NormalJavaBeanBuilder.aNormalJavaBean()") .addStatement("return builder.name($S).age(18).date(new java.util.Date()).address(new Address()).build()", "builderTest") .build()); return JavaFile.builder("test.classes", builder.build()).build().toString(); } }