package com.airbnb.epoxy;
import com.google.testing.compile.JavaFileObjects;
import org.junit.Test;
import javax.tools.JavaFileObject;
import static com.google.common.truth.Truth.assert_;
import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
import static junit.framework.Assert.assertTrue;
/**
* These processor tests are in their own module since the processor module can't depend on the
* android EpoxyAdapter library that contains the EpoxyModel.
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
public class ModelProcessorTest {
@Test
public void testSimpleModel() {
JavaFileObject model = JavaFileObjects
.forResource("BasicModelWithAttribute.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("BasicModelWithAttribute_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithAllFieldTypes() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithAllFieldTypes.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithAllFieldTypes_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithConstructors() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithConstructors.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithConstructors_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithSuper() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithSuper.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithSuper_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithFieldAnnotation() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithFieldAnnotation.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithFieldAnnotation_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithSuperClass() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithSuperAttributes.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithSuperAttributes_.java");
JavaFileObject generatedSubClassModel =
JavaFileObjects.forResource("ModelWithSuperAttributes$SubModelWithSuperAttributes_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel, generatedSubClassModel);
}
@Test
public void testModelWithType() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithType.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithType_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithoutHash() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithoutHash.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithoutHash_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testDoNotHashModel() {
JavaFileObject model = JavaFileObjects
.forResource("ModelDoNotHash.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelDoNotHash_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithFinalAttribute() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithFinalField.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithFinalField_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithStaticAttributeFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithStaticField.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("static");
}
@Test
public void testModelWithPrivateClassFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateInnerClass.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private classes");
}
@Test
public void testModelWithFinalClassFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithFinalClass.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile();
}
@Test
public void testModelThatDoesNotExtendEpoxyModelFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithoutEpoxyExtension.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("must extend");
}
@Test
public void testModelAsInnerClassFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelAsInnerClass.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("Nested classes");
}
@Test
public void testModelWithIntDefAnnotation() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithIntDef.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithIntDef_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithAnnotatedClass() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithAnnotatedClass.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithAnnotatedClass_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithAbstractClass() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithAbstractClass.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError();
// We don't generate subclasses if the model is abstract unless it has a class annotation.
boolean modelNotGenerated;
try {
JavaFileObjects.forResource("ModelWithAbstractClass_.java");
modelNotGenerated = false;
} catch (IllegalArgumentException e) {
modelNotGenerated = true;
}
assertTrue(modelNotGenerated);
}
@Test
public void testModelWithAbstractClassAndAnnotation() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithAbstractClassAndAnnotation.java");
JavaFileObject generatedModel =
JavaFileObjects.forResource("ModelWithAbstractClassAndAnnotation_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithAnnotatedClassAndSuperClass() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithAnnotatedClassAndSuperAttributes.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("ModelWithAnnotatedClassAndSuperAttributes_.java");
JavaFileObject generatedSubClassModel =
JavaFileObjects.forResource("ModelWithAnnotatedClassAndSuperAttributes$SubModel"
+ "WithAnnotatedClassAndSuperAttributes_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel, generatedSubClassModel);
}
@Test
public void testModelWithoutSetter() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithoutSetter.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelWithoutSetter_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelReturningClassType() {
JavaFileObject model = JavaFileObjects
.forResource("ModelReturningClassType.java");
JavaFileObject generatedModel = JavaFileObjects.forResource("ModelReturningClassType_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelReturningClassTypeWithVarargs() {
JavaFileObject model = JavaFileObjects
.forResource("ModelReturningClassTypeWithVarargs.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("ModelReturningClassTypeWithVarargs_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithVarargsConstructors() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithVarargsConstructors.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("ModelWithVarargsConstructors_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testModelWithHolderGeneratesNewHolderMethod() {
JavaFileObject model = JavaFileObjects
.forResource("AbstractModelWithHolder.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("AbstractModelWithHolder_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testGenerateDefaultLayoutMethod() {
JavaFileObject model = JavaFileObjects
.forResource("GenerateDefaultLayoutMethod.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("GenerateDefaultLayoutMethod_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void testGenerateDefaultLayoutMethodFailsIfLayoutNotSpecified() {
JavaFileObject model = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodNoLayout.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("Model must specify a valid layout resource");
}
@Test
public void testGeneratedDefaultMethodWithLayoutSpecifiedInParent() {
JavaFileObject model = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodParentLayout.java");
JavaFileObject generatedNoLayoutModel = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodParentLayout$NoLayout_.java");
JavaFileObject generatedWithLayoutModel =
JavaFileObjects.forResource("GenerateDefaultLayoutMethodParentLayout$WithLayout_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedNoLayoutModel, generatedWithLayoutModel);
}
@Test
public void testGeneratedDefaultMethodWithLayoutSpecifiedInNextParent() {
JavaFileObject model = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodNextParentLayout.java");
JavaFileObject generatedNoLayoutModel = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodNextParentLayout$NoLayout_.java");
JavaFileObject generatedStillNoLayoutModel = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodNextParentLayout$StillNoLayout_.java");
JavaFileObject generatedWithLayoutModel =
JavaFileObjects.forResource("GenerateDefaultLayoutMethodNextParentLayout$WithLayout_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedNoLayoutModel, generatedStillNoLayoutModel,
generatedWithLayoutModel);
}
@Test
public void testGeneratedDefaultMethodWithLayoutFailsIfNotSpecifiedInParent() {
JavaFileObject model = JavaFileObjects
.forResource("GenerateDefaultLayoutMethodParentStillNoLayout.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("Model must specify a valid layout resource");
}
@Test
public void modelWithViewClickListener() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithViewClickListener.java");
JavaFileObject generatedNoLayoutModel = JavaFileObjects
.forResource("ModelWithViewClickListener_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedNoLayoutModel);
}
@Test
public void testModelWithPrivateAttributeWithoutGetterAndSetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithoutGetterAndSetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithoutSetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithoutSetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithoutGetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithoutGetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithIsPrefixGetter() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithIsPrefixGetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError();
}
@Test
public void testModelWithPrivateAttributeWithPrivateGetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithPrivateGetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithStaticGetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithStaticGetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithGetterWithParamsFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithGetterWithParams.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithGetterWithWrongReturnTypeFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithGetterWithWrongReturnType.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithPrivateSetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithPrivateSetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithStaticSetterFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithStaticSetter.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithGetterWithoutParamsFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithSettterWithoutParams.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithPrivateAttributeWithSetterWithWrongReturnTypeFails() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithSetterWithWrongParamType.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.failsToCompile()
.withErrorContaining("private fields without proper getter and setter");
}
@Test
public void testModelWithAllPrivateFieldTypes() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithAllPrivateFieldTypes.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("ModelWithAllPrivateFieldTypes_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void modelWithViewPrivateClickListener() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateViewClickListener.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("ModelWithPrivateViewClickListener_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
@Test
public void modelWithPrivateFieldWithSameAsFieldGetterAndSetterName() {
JavaFileObject model = JavaFileObjects
.forResource("ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName.java");
JavaFileObject generatedModel = JavaFileObjects
.forResource("ModelWithPrivateFieldWithSameAsFieldGetterAndSetterName_.java");
assert_().about(javaSource())
.that(model)
.processedWith(new EpoxyProcessor())
.compilesWithoutError()
.and()
.generatesSources(generatedModel);
}
}