Initial tests for methods with invalid arguments
Bug: 32342385
Test: Unit tests in the CL.
Change-Id: Ibd65d995a1a1024b5344d423e1df90103c0e0311
diff --git a/lifecycle/processor/src/main/kotlin/com/android/support/lifecycle/LifecycleProcessor.kt b/lifecycle/processor/src/main/kotlin/com/android/support/lifecycle/LifecycleProcessor.kt
index a7d7b04..592524f 100644
--- a/lifecycle/processor/src/main/kotlin/com/android/support/lifecycle/LifecycleProcessor.kt
+++ b/lifecycle/processor/src/main/kotlin/com/android/support/lifecycle/LifecycleProcessor.kt
@@ -28,10 +28,18 @@
@SupportedAnnotationTypes("com.android.support.lifecycle.OnState")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
class LifecycleProcessor : AbstractProcessor() {
+ companion object ErrorMessages {
+ const val TOO_MANY_ARGS_ERROR_MSG = "callback method cannot have more than 2 parameters"
+ const val INVALID_SECOND_ARGUMENT = "2nd argument of a callback method" +
+ " must be an int and represent the previous state"
+ const val INVALID_FIRST_ARGUMENT = "1st argument of a callback method must be " +
+ "a LifecycleProvider which represents the source of the event"
+ }
+
private val LIFECYCLE_PROVIDER = ClassName.get(LifecycleProvider::class.java)
- val T = "\$T"
- val N = "\$N"
- val L = "\$L"
+ private val T = "\$T"
+ private val N = "\$N"
+ private val L = "\$L"
private fun printErrorMessage(msg: CharSequence, elem: Element) {
processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, msg, elem)
@@ -45,18 +53,16 @@
private fun validateMethod(method: ExecutableElement) {
if (method.parameters.size > 2) {
- printErrorMessage("callback method cannot have more than 2 parameters", method)
+ printErrorMessage(TOO_MANY_ARGS_ERROR_MSG, method)
}
if (method.parameters.size > 1) {
// 2nd parameter must be an int
- checkParameter(method.parameters[1], Integer.TYPE, "2nd argument of a callback method" +
- " must be an int and represent the previous state")
+ checkParameter(method.parameters[1], Integer.TYPE, INVALID_SECOND_ARGUMENT)
}
if (method.parameters.size > 0) {
checkParameter(method.parameters[0], LifecycleProvider::class.java,
- "1st argument of a callback method must be a LifecycleProvider " +
- "which represents the source of the event")
+ INVALID_FIRST_ARGUMENT)
}
}
diff --git a/lifecycle/processor/src/tests/kotlin/com/android/support/lifecycle/ProcessorTest.kt b/lifecycle/processor/src/tests/kotlin/com/android/support/lifecycle/ProcessorTest.kt
index e2aaa13..13a0920 100644
--- a/lifecycle/processor/src/tests/kotlin/com/android/support/lifecycle/ProcessorTest.kt
+++ b/lifecycle/processor/src/tests/kotlin/com/android/support/lifecycle/ProcessorTest.kt
@@ -21,20 +21,44 @@
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import com.google.common.truth.Truth.assertAbout
+import com.google.common.truth.Truth.assertThat
+import com.google.testing.compile.CompileTester
import com.google.testing.compile.JavaFileObjects
import com.google.testing.compile.JavaSourceSubjectFactory.javaSource
-import com.google.testing.compile.JavaSourcesSubjectFactory.javaSources
import java.io.File
import java.nio.charset.Charset
@RunWith(JUnit4::class)
class ProcessorTest {
+
+ fun processClass(className: String): CompileTester {
+ val code = File("src/tests/test-data/$className.java").readText(Charset.defaultCharset())
+ val processedWith = assertAbout(javaSource())
+ .that(JavaFileObjects.forSourceString("foo.$className", code))
+ .processedWith(LifecycleProcessor())
+ return checkNotNull(processedWith)
+ }
+
@Test
fun testTest() {
- val code = File("src/tests/test-data/Bar.java").readText(Charset.defaultCharset())
- assertAbout(javaSource())
- .that(JavaFileObjects.forSourceString("foo.Bar", code))
- .processedWith(LifecycleProcessor())
- .compilesWithoutError()
+ processClass("Bar").compilesWithoutError()
+ }
+
+ @Test
+ fun testTooManyArguments() {
+ processClass("TooManyArgs").failsToCompile()?.withErrorContaining(
+ LifecycleProcessor.TOO_MANY_ARGS_ERROR_MSG)
+ }
+
+ @Test
+ fun testInvalidFirstArg() {
+ processClass("InvalidFirstArg").failsToCompile()?.withErrorContaining(
+ LifecycleProcessor.INVALID_FIRST_ARGUMENT)
+ }
+
+ @Test
+ fun testInvalidSecondArg() {
+ processClass("InvalidSecondArg").failsToCompile()?.withErrorContaining(
+ LifecycleProcessor.INVALID_SECOND_ARGUMENT)
}
}
\ No newline at end of file
diff --git a/lifecycle/processor/src/tests/test-data/InvalidFirstArg.java b/lifecycle/processor/src/tests/test-data/InvalidFirstArg.java
new file mode 100644
index 0000000..0d531fc
--- /dev/null
+++ b/lifecycle/processor/src/tests/test-data/InvalidFirstArg.java
@@ -0,0 +1,10 @@
+package foo;
+import com.android.support.lifecycle.OnState;
+import static com.android.support.lifecycle.Lifecycle.STARTED;
+import static com.android.support.lifecycle.Lifecycle.STOPPED;
+import com.android.support.lifecycle.LifecycleProvider;
+
+public class InvalidFirstArg {
+ @OnState(STOPPED)
+ public void onStop(int prevState){}
+}
\ No newline at end of file
diff --git a/lifecycle/processor/src/tests/test-data/InvalidSecondArg.java b/lifecycle/processor/src/tests/test-data/InvalidSecondArg.java
new file mode 100644
index 0000000..e4c19c3
--- /dev/null
+++ b/lifecycle/processor/src/tests/test-data/InvalidSecondArg.java
@@ -0,0 +1,10 @@
+package foo;
+import com.android.support.lifecycle.OnState;
+import static com.android.support.lifecycle.Lifecycle.STARTED;
+import static com.android.support.lifecycle.Lifecycle.STOPPED;
+import com.android.support.lifecycle.LifecycleProvider;
+
+public class InvalidSecondArg {
+ @OnState(STOPPED)
+ public void onStop(LifecycleProvider provider, Object prevState){}
+}
\ No newline at end of file
diff --git a/lifecycle/processor/src/tests/test-data/TooManyArgs.java b/lifecycle/processor/src/tests/test-data/TooManyArgs.java
new file mode 100644
index 0000000..f332a25
--- /dev/null
+++ b/lifecycle/processor/src/tests/test-data/TooManyArgs.java
@@ -0,0 +1,10 @@
+package foo;
+import com.android.support.lifecycle.OnState;
+import static com.android.support.lifecycle.Lifecycle.STARTED;
+import static com.android.support.lifecycle.Lifecycle.STOPPED;
+import com.android.support.lifecycle.LifecycleProvider;
+
+public class TooManyArgs {
+ @OnState(STOPPED)
+ public void onStop(LifecycleProvider provider, int prevstate, int x){}
+}
\ No newline at end of file