To use this rule in a test, just add the following field:
{@code
+ * @Rule public CompilationRule compilationRule = new CompilationRule();}
+ *
+ * @author Gregory Kick
+ */
+ public static final class CompilationRule implements TestRule {
+ private Elements elements;
+ private Types types;
+
+ @Override
+ public Statement apply(final Statement base, Description description) {
+ return new Statement() {
+ @Override public void evaluate() throws Throwable {
+ final AtomicReference thrown = new AtomicReference();
+ boolean successful = compile(ImmutableList.of(new AbstractProcessor() {
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latest();
+ }
+
+ @Override
+ public Set getSupportedAnnotationTypes() {
+ return ImmutableSet.of("*");
+ }
+
+ @Override
+ public synchronized void init(ProcessingEnvironment processingEnv) {
+ super.init(processingEnv);
+ elements = processingEnv.getElementUtils();
+ types = processingEnv.getTypeUtils();
+ }
+
+ @Override
+ public boolean process(Set extends TypeElement> annotations,
+ RoundEnvironment roundEnv) {
+ // just run the test on the last round after compilation is over
+ if (roundEnv.processingOver()) {
+ try {
+ base.evaluate();
+ } catch (Throwable e) {
+ thrown.set(e);
+ }
+ }
+ return false;
+ }
+ }));
+ checkState(successful);
+ Throwable t = thrown.get();
+ if (t != null) {
+ throw t;
+ }
+ }
+ };
+ }
+
+ /**
+ * Returns the {@link Elements} instance associated with the current execution of the rule.
+ *
+ * @throws IllegalStateException if this method is invoked outside the execution of the rule.
+ */
+ public Elements getElements() {
+ checkState(elements != null, "Not running within the rule");
+ return elements;
+ }
+
+ /**
+ * Returns the {@link Types} instance associated with the current execution of the rule.
+ *
+ * @throws IllegalStateException if this method is invoked outside the execution of the rule.
+ */
+ public Types getTypes() {
+ checkState(elements != null, "Not running within the rule");
+ return types;
+ }
+
+ static private boolean compile(Iterable extends Processor> processors) {
+ JavaCompiler compiler = new EclipseCompiler();
+ DiagnosticCollector diagnosticCollector =
+ new DiagnosticCollector();
+ JavaFileManager fileManager = compiler.getStandardFileManager(diagnosticCollector, Locale.getDefault(), UTF_8);
+ JavaCompiler.CompilationTask task = compiler.getTask(
+ null,
+ fileManager,
+ diagnosticCollector,
+ ImmutableSet.of(),
+ ImmutableSet.of(TypesEclipseTest.class.getCanonicalName()),
+ ImmutableSet.of());
+ task.setProcessors(processors);
+ return task.call();
+ }
+ }
+
+ @Rule public final CompilationRule compilation = new CompilationRule();
+
+ @Override
+ protected Elements getElements() {
+ return compilation.getElements();
+ }
+
+ @Override
+ protected Types getTypes() {
+ return compilation.getTypes();
+ }
+}
diff --git a/src/test/java/com/squareup/javapoet/TypesTest.java b/src/test/java/com/squareup/javapoet/TypesTest.java
index 6c11c9693..2455ae585 100644
--- a/src/test/java/com/squareup/javapoet/TypesTest.java
+++ b/src/test/java/com/squareup/javapoet/TypesTest.java
@@ -15,203 +15,26 @@
*/
package com.squareup.javapoet;
-import com.google.testing.compile.CompilationRule;
-import java.io.Serializable;
-import java.nio.charset.Charset;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.lang.model.element.TypeElement;
-import javax.lang.model.element.TypeParameterElement;
-import javax.lang.model.type.DeclaredType;
-import javax.lang.model.type.TypeKind;
-import javax.lang.model.type.TypeMirror;
-import javax.lang.model.type.WildcardType;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
+
import org.junit.Rule;
-import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import com.google.testing.compile.CompilationRule;
@RunWith(JUnit4.class)
-public final class TypesTest {
+public final class TypesTest extends AbstractTypesTest {
@Rule public final CompilationRule compilation = new CompilationRule();
- private TypeElement getElement(Class> clazz) {
- return compilation.getElements().getTypeElement(clazz.getCanonicalName());
- }
-
- private TypeMirror getMirror(Class> clazz) {
- return getElement(clazz).asType();
- }
-
- @Test public void getBasicTypeMirror() {
- assertThat(TypeName.get(getMirror(Object.class)))
- .isEqualTo(ClassName.get(Object.class));
- assertThat(TypeName.get(getMirror(Charset.class)))
- .isEqualTo(ClassName.get(Charset.class));
- assertThat(TypeName.get(getMirror(TypesTest.class)))
- .isEqualTo(ClassName.get(TypesTest.class));
- }
-
- @Test public void getParameterizedTypeMirror() {
- DeclaredType setType =
- compilation.getTypes().getDeclaredType(getElement(Set.class), getMirror(Object.class));
- assertThat(TypeName.get(setType))
- .isEqualTo(ParameterizedTypeName.get(ClassName.get(Set.class), ClassName.OBJECT));
- }
-
- static class Parameterized<
- Simple,
- ExtendsClass extends Number,
- ExtendsInterface extends Runnable,
- ExtendsTypeVariable extends Simple,
- Intersection extends Number & Runnable,
- IntersectionOfInterfaces extends Runnable & Serializable> {}
-
- @Test public void getTypeVariableTypeMirror() {
- List extends TypeParameterElement> typeVariables =
- getElement(Parameterized.class).getTypeParameters();
-
- // Members of converted types use ClassName and not Class>.
- ClassName number = ClassName.get(Number.class);
- ClassName runnable = ClassName.get(Runnable.class);
- ClassName serializable = ClassName.get(Serializable.class);
-
- assertThat(TypeName.get(typeVariables.get(0).asType()))
- .isEqualTo(TypeVariableName.get("Simple"));
- assertThat(TypeName.get(typeVariables.get(1).asType()))
- .isEqualTo(TypeVariableName.get("ExtendsClass", number));
- assertThat(TypeName.get(typeVariables.get(2).asType()))
- .isEqualTo(TypeVariableName.get("ExtendsInterface", runnable));
- assertThat(TypeName.get(typeVariables.get(3).asType()))
- .isEqualTo(TypeVariableName.get("ExtendsTypeVariable", TypeVariableName.get("Simple")));
- assertThat(TypeName.get(typeVariables.get(4).asType()))
- .isEqualTo(TypeVariableName.get("Intersection", number, runnable));
- assertThat(TypeName.get(typeVariables.get(5).asType()))
- .isEqualTo(TypeVariableName.get("IntersectionOfInterfaces", runnable, serializable));
- assertThat(((TypeVariableName) TypeName.get(typeVariables.get(4).asType())).bounds)
- .containsExactly(number, runnable);
- }
-
- @Test public void getPrimitiveTypeMirror() {
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.BOOLEAN)))
- .isEqualTo(TypeName.BOOLEAN);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.BYTE)))
- .isEqualTo(TypeName.BYTE);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.SHORT)))
- .isEqualTo(TypeName.SHORT);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.INT)))
- .isEqualTo(TypeName.INT);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.LONG)))
- .isEqualTo(TypeName.LONG);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.CHAR)))
- .isEqualTo(TypeName.CHAR);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.FLOAT)))
- .isEqualTo(TypeName.FLOAT);
- assertThat(TypeName.get(compilation.getTypes().getPrimitiveType(TypeKind.DOUBLE)))
- .isEqualTo(TypeName.DOUBLE);
- }
-
- @Test public void getArrayTypeMirror() {
- assertThat(TypeName.get(compilation.getTypes().getArrayType(getMirror(Object.class))))
- .isEqualTo(ArrayTypeName.of(ClassName.OBJECT));
- }
-
- @Test public void getVoidTypeMirror() {
- assertThat(TypeName.get(compilation.getTypes().getNoType(TypeKind.VOID)))
- .isEqualTo(TypeName.VOID);
- }
-
- @Test public void getNullTypeMirror() {
- try {
- TypeName.get(compilation.getTypes().getNullType());
- fail();
- } catch (IllegalArgumentException expected) {
- }
- }
-
- @Test public void parameterizedType() throws Exception {
- ParameterizedTypeName type = ParameterizedTypeName.get(Map.class, String.class, Long.class);
- assertThat(type.toString()).isEqualTo("java.util.Map");
- }
-
- @Test public void arrayType() throws Exception {
- ArrayTypeName type = ArrayTypeName.of(String.class);
- assertThat(type.toString()).isEqualTo("java.lang.String[]");
- }
-
- @Test public void wildcardExtendsType() throws Exception {
- WildcardTypeName type = WildcardTypeName.subtypeOf(CharSequence.class);
- assertThat(type.toString()).isEqualTo("? extends java.lang.CharSequence");
- }
-
- @Test public void wildcardExtendsObject() throws Exception {
- WildcardTypeName type = WildcardTypeName.subtypeOf(Object.class);
- assertThat(type.toString()).isEqualTo("?");
- }
-
- @Test public void wildcardSuperType() throws Exception {
- WildcardTypeName type = WildcardTypeName.supertypeOf(String.class);
- assertThat(type.toString()).isEqualTo("? super java.lang.String");
- }
-
- @Test public void wildcardMirrorNoBounds() throws Exception {
- WildcardType wildcard = compilation.getTypes().getWildcardType(null, null);
- TypeName type = TypeName.get(wildcard);
- assertThat(type.toString()).isEqualTo("?");
- }
-
- @Test public void wildcardMirrorExtendsType() throws Exception {
- Types types = compilation.getTypes();
- Elements elements = compilation.getElements();
- TypeMirror charSequence = elements.getTypeElement(CharSequence.class.getName()).asType();
- WildcardType wildcard = types.getWildcardType(charSequence, null);
- TypeName type = TypeName.get(wildcard);
- assertThat(type.toString()).isEqualTo("? extends java.lang.CharSequence");
- }
-
- @Test public void wildcardMirrorSuperType() throws Exception {
- Types types = compilation.getTypes();
- Elements elements = compilation.getElements();
- TypeMirror string = elements.getTypeElement(String.class.getName()).asType();
- WildcardType wildcard = types.getWildcardType(null, string);
- TypeName type = TypeName.get(wildcard);
- assertThat(type.toString()).isEqualTo("? super java.lang.String");
- }
-
- @Test public void typeVariable() throws Exception {
- TypeVariableName type = TypeVariableName.get("T", CharSequence.class);
- assertThat(type.toString()).isEqualTo("T"); // (Bounds are only emitted in declaration.)
- }
-
- @Test public void box() throws Exception {
- assertThat(TypeName.INT.box()).isEqualTo(ClassName.get(Integer.class));
- assertThat(TypeName.VOID.box()).isEqualTo(ClassName.get(Void.class));
- assertThat(ClassName.get(Integer.class).box()).isEqualTo(ClassName.get(Integer.class));
- assertThat(ClassName.get(Void.class).box()).isEqualTo(ClassName.get(Void.class));
- assertThat(TypeName.OBJECT.box()).isEqualTo(TypeName.OBJECT);
- assertThat(ClassName.get(String.class).box()).isEqualTo(ClassName.get(String.class));
+ @Override
+ protected Elements getElements() {
+ return compilation.getElements();
}
- @Test public void unbox() throws Exception {
- assertThat(TypeName.INT).isEqualTo(TypeName.INT.unbox());
- assertThat(TypeName.VOID).isEqualTo(TypeName.VOID.unbox());
- assertThat(ClassName.get(Integer.class).unbox()).isEqualTo(TypeName.INT.unbox());
- assertThat(ClassName.get(Void.class).unbox()).isEqualTo(TypeName.VOID.unbox());
- try {
- TypeName.OBJECT.unbox();
- fail();
- } catch (UnsupportedOperationException expected) {
- }
- try {
- ClassName.get(String.class).unbox();
- fail();
- } catch (UnsupportedOperationException expected) {
- }
+ @Override
+ protected Types getTypes() {
+ return compilation.getTypes();
}
}