@Test public void failsToCompileNonEmptyTestSpecInterface() throws IOException { final JavaFileObject javaFileObject = JavaFileObjects.forResource( Resources.getResource(getClass(), RES_PREFIX + "IncorrectNonEmptyTestSpec.java")); final JavaFileObject layoutSpecObject = JavaFileObjects.forResource( Resources.getResource(getClass(), RES_PREFIX + "BasicLayoutSpec.java")); Truth.assertAbout(JavaSourcesSubjectFactory.javaSources()) .that(ImmutableList.of(javaFileObject, layoutSpecObject)) .processedWith(new ComponentsTestingProcessor(), new ComponentsProcessor()) .failsToCompile() .withErrorCount(1) .withErrorContaining( "TestSpec interfaces must not contain any members. Please remove these function declarations: ()void test, ()java.util.List<java.lang.Integer> list") .in(javaFileObject) .onLine(24); } }
@Test public void testDuplicateColumnNamesCaseInsensitive() throws Exception { JavaFileObject modelFile = JavaFileObjects.forResource("CaseInsensitiveDuplication.java"); assert_().about(javaSource()) .that(modelFile) .processedWith(new OrmaProcessor()) .failsToCompile() .withErrorCount(2) .withErrorContaining("Duplicate column names \"foo\" found"); }
@Test public void testNonEmptyConstructorWithLazyAndGenerics_shouldFail() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestNonEmptyConstructor", Joiner.on('\n').join(// "package test;", // "import java.util.List;", // "import javax.inject.Inject;", // "import toothpick.Lazy;", // "public class TestNonEmptyConstructor {", // " @Inject public TestNonEmptyConstructor(Lazy<List<String>> str) {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryProcessors()) .failsToCompile() .withErrorContaining("Lazy/Provider str is not a valid in <init>. Lazy/Provider cannot be used on generic types."); }
@Test public void testMethodInjection_shouldFail_whenInjectedMethodIsPrivate() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestMethodInjection", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestMethodInjection {", // " @Inject", // " private void m(Foo foo) {}", // "}", // "class Foo {}" // )); assert_().about(javaSource()) .that(source) .processedWith(memberInjectorProcessors()) .failsToCompile() .withErrorContaining("@Inject annotated methods must not be private : test.TestMethodInjection#m"); }
@Test public void testRelaxedFactoryCreationForInjectedMethod_shouldFail_WhenContainingClassIsInvalid() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestRelaxedFactoryCreationForInjectMethod", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestRelaxedFactoryCreationForInjectMethod {", // " private static class InnerClass {", // " @Inject void m(Foo foo) {}", // " }", // "}", // " class Foo {}")); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryAndMemberInjectorProcessors()) .failsToCompile() .withErrorContaining("@Injected fields in class InnerClass. The class must be non private."); }
@Test public void testFieldInjection_shouldFail_WhenFieldIsPrimitive() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestFieldInjection", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestFieldInjection {", // " @Inject int foo;", // " public TestFieldInjection() {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(memberInjectorProcessors()) .failsToCompile() .withErrorContaining("Field test.TestFieldInjection#foo is of type int which is not supported by Toothpick."); } }
@Test public void testFieldInjection_shouldFail_WhenFieldIsInvalidLazy() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestFieldInjection", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import toothpick.Lazy;", // "public class TestFieldInjection {", // " @Inject Lazy foo;", // " public TestFieldInjection() {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(memberInjectorProcessors()) .failsToCompile() .withErrorContaining("Field test.TestFieldInjection#foo is not a valid toothpick.Lazy."); }
@Test public void testRelaxedFactoryCreationForInjectedField_shouldFail_WhenContainingClassIsPrivate() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestRelaxedFactoryCreationForInjectField", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestRelaxedFactoryCreationForInjectField {", // " private static class InnerClass {", // " @Inject Foo foo;", // " }", // "}", // " class Foo {}")); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryAndMemberInjectorProcessors()) .failsToCompile() .withErrorContaining("@Injected fields in class InnerClass. The class must be non private."); }
@Test public void testMethodInjection_shouldFail_whenInjectedMethodParameterIsInvalidProvider() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestMethodInjection", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import javax.inject.Provider;", // "public class TestMethodInjection {", // " @Inject", // " public void m(Provider foo) {}", // "}", // "class Foo {}" // )); assert_().about(javaSource()) .that(source) .processedWith(memberInjectorProcessors()) .failsToCompile() .withErrorContaining("Parameter foo in method/constructor test.TestMethodInjection#m is not a valid javax.inject.Provider."); }
@Test public void testSimpleMethodInjectionWithLazyOfGenericType_shouldFail_WithLazyOfGenericType() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestMethodInjection", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import toothpick.Lazy;", // "public class TestMethodInjection {", // " @Inject", // " public void m(Lazy<Foo<String>> foo) {}", // "}", // "class Foo<T> {}" // )); assert_().about(javaSource()) .that(source) .processedWith(memberInjectorProcessors()) .failsToCompile() .withErrorContaining("Lazy/Provider foo is not a valid in m. Lazy/Provider cannot be used on generic types."); }
@Test public void parameterizedTypeOfNonParcelableTypeFails() { JavaFileObject source = JavaFileObjects.forSourceString("test.Test", "" + "package test;\n" + "import android.os.Parcelable;\n" + "import com.google.auto.value.AutoValue;\n" + "@AutoValue public abstract class Test<T extends Runnable> implements Parcelable {\n" + "public abstract T tea();\n" + "}" ); assertAbout(javaSources()) .that(Arrays.asList(parcel, parcelable, source)) .processedWith(new AutoValueProcessor()) .failsToCompile() .withErrorContaining("AutoValue property tea is not a supported Parcelable type.") .in(source).onLine(5); }
@Test public void testOptimisticFactoryCreationForHasScopeInstances_shouldFail_whenThereIsNoScopeAnnotation() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestOptimisticFactoryCreationForHasScopeInstances", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import toothpick.ProvidesSingletonInScope;", // "@ProvidesSingletonInScope", // "public class TestOptimisticFactoryCreationForHasScopeInstances {", // "}")); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryAndMemberInjectorProcessors()) .failsToCompile() .withErrorContaining( "The type test.TestOptimisticFactoryCreationForHasScopeInstances" + " uses @ProvidesSingletonInScope but doesn't have a scope annotation."); }
@Test public void testRelaxedFactoryCreationForInjectedMethod_shouldFail_WhenMethodParameterIsInvalidLazy() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestRelaxedFactoryCreationForInjectMethod", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import toothpick.Lazy;", // "public class TestRelaxedFactoryCreationForInjectMethod {", // " @Inject void m(Lazy foo) {}", // "}", // " class Foo {}")); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryAndMemberInjectorProcessors()) .failsToCompile() .withErrorContaining("Parameter foo in method/constructor test.TestRelaxedFactoryCreationForInjectMethod#m is not a valid toothpick.Lazy."); }
@Test public void testInjectedConstructor_withPrimitiveParam() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestPrimitiveConstructor", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestPrimitiveConstructor {", // " @Inject TestPrimitiveConstructor(int n) {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryProcessors()) .failsToCompile() .withErrorContaining("Parameter n in method/constructor test.TestPrimitiveConstructor#<init> is of type int which is not supported by Toothpick."); } }
@Test public void testRelaxedFactoryCreationForInjectedField_shouldFail_WhenFieldIsInvalidProvider() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestRelaxedFactoryCreationForInjectField", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import javax.inject.Provider;", // "public class TestRelaxedFactoryCreationForInjectField {", // " @Inject Provider foo;", // "}", // " class Foo {}")); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryAndMemberInjectorProcessors()) .failsToCompile() .withErrorContaining("Field test.TestRelaxedFactoryCreationForInjectField#foo is not a valid javax.inject.Provider."); }
@Test public void testNonEmptyConstructor_shouldFail_whenContainsInvalidProviderParameter() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestNonEmptyConstructor", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import javax.inject.Provider;", // "public class TestNonEmptyConstructor {", // " @Inject public TestNonEmptyConstructor(Provider provider, Integer n) {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryProcessors()) .failsToCompile() .withErrorContaining("Parameter provider in method/constructor test.TestNonEmptyConstructor#<init> is not a valid javax.inject.Provider."); }
@Test public void test2InjectedConstructors() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestPrivateConstructor", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestPrivateConstructor {", // " @Inject private TestPrivateConstructor() {}", // " @Inject private TestPrivateConstructor(String s) {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryProcessors()) .failsToCompile() .withErrorContaining("Class test.TestPrivateConstructor cannot have more than one @Inject annotated constructor."); }
@Test public void testRelaxedFactoryCreationForInjectedField_shouldFail_WhenFieldIsInvalidLazy() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestRelaxedFactoryCreationForInjectField", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "import toothpick.Lazy;", // "public class TestRelaxedFactoryCreationForInjectField {", // " @Inject Lazy foo;", // "}", // " class Foo {}")); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryAndMemberInjectorProcessors()) .failsToCompile() .withErrorContaining("Field test.TestRelaxedFactoryCreationForInjectField#foo is not a valid toothpick.Lazy."); }
@Test public void testInjectedConstructorInPrivateClass_shouldNotAllowInjectionInPrivateClasses() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestConstructorInPrivateClass", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "class Wrapper {", // " private class TestConstructorInPrivateClass {", // " @Inject public TestConstructorInPrivateClass() {}", // " }", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryProcessors()) .failsToCompile() .withErrorContaining("Class test.Wrapper.TestConstructorInPrivateClass is private. @Inject constructors are not allowed in private classes."); }
@Test public void testPrivateConstructor() { JavaFileObject source = JavaFileObjects.forSourceString("test.TestPrivateConstructor", Joiner.on('\n').join(// "package test;", // "import javax.inject.Inject;", // "public class TestPrivateConstructor {", // " @Inject private TestPrivateConstructor() {}", // "}" // )); assert_().about(javaSource()) .that(source) .processedWith(ProcessorTestUtilities.factoryProcessors()) .failsToCompile() .withErrorContaining("@Inject constructors must not be private in class test.TestPrivateConstructor"); }