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