fenix/mozilla-lint-rules/src/test/java/org/mozilla/fenix/lintrules/ContextCompatDetectorTest.kt

163 lines
5.4 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.lintrules
import com.android.tools.lint.checks.infrastructure.LintDetectorTest
import com.android.tools.lint.detector.api.Detector
import com.android.tools.lint.detector.api.Issue
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@RunWith(JUnit4::class)
class ContextCompatDetectorTest : LintDetectorTest() {
override fun getDetector(): Detector = ContextCompatDetector()
override fun getIssues(): MutableList<Issue> = ContextCompatDetector.ISSUES.toMutableList()
@Test
fun `report error when the ContextCompat getDrawable method is called`() {
val code = """
|package example
|
|import androidx.core.content.ContextCompat
|import android.content.Context
|
|class Fake {
|
| fun trigger(context: Context, id: Int) {
| ContextCompat.getDrawable(context, id)
| }
|
|}""".trimMargin()
val expectedReport = """
|src/example/Fake.kt:9: Error: This call can lead to crashes, replace with AppCompatResources.getDrawable [UnsafeCompatGetDrawable]
| ContextCompat.getDrawable(context, id)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|1 errors, 0 warnings""".trimMargin()
val expectedFixOutput = """
|Fix for src/example/Fake.kt line 9: Replace with AppCompatResources.getDrawable:
|@@ -9 +9
|- ContextCompat.getDrawable(context, id)
|+ AppCompatResources.getDrawable(context, id)""".trimMargin()
lint()
.files(Context, ContextCompat, kotlin(code))
.allowMissingSdk(true)
.run()
.expect(expectedReport)
.expectFixDiffs(expectedFixOutput)
}
@Test
fun `report error when the ContextCompat getColorStateList method is called`() {
val code = """
|package example
|
|import androidx.core.content.ContextCompat
|import android.content.Context
|
|class Fake {
|
| fun trigger(context: Context, id: Int) {
| ContextCompat.getColorStateList(context, id)
| }
|
|}""".trimMargin()
val expectedReport = """
|src/example/Fake.kt:9: Error: This call can lead to crashes, replace with AppCompatResources.getColorStateList [UnsafeCompatGetColorStateList]
| ContextCompat.getColorStateList(context, id)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|1 errors, 0 warnings""".trimMargin()
val expectedFixOutput = """
|Fix for src/example/Fake.kt line 9: Replace with AppCompatResources.getColorStateList:
|@@ -9 +9
|- ContextCompat.getColorStateList(context, id)
|+ AppCompatResources.getColorStateList(context, id)""".trimMargin()
lint()
.files(Context, ContextCompat, kotlin(code))
.allowMissingSdk(true)
.run()
.expect(expectedReport)
.expectFixDiffs(expectedFixOutput)
}
@Test
fun `does not report any errors if the getDrawable method being called is not from the ContextCompat class`() {
val code = """
|package example
|
|import android.content.Context
|
|class Fake {
|
| fun trigger(context: Context, id: Int) {
| getDrawable(context, id)
| }
|
| fun getDrawable(context: Context, id: Int) {}
|
|}""".trimMargin()
lint()
.files(Context, kotlin(code))
.allowMissingSdk(true)
.run()
.expectClean()
}
@Test
fun `does not report any errors if the getColorStateList method being called is not from the ContextCompat class`() {
val code = """
|package example
|
|import android.content.Context
|
|class Fake {
|
| fun trigger(context: Context, id: Int) {
| getColorStateList(context, id)
| }
|
| fun getColorStateList(context: Context, id: Int) {}
|
|}""".trimMargin()
lint()
.files(Context, kotlin(code))
.allowMissingSdk(true)
.run()
.expectClean()
}
// As Lint doesn't have access to the real corresponding classes, we have to provide stubs
companion object Stubs {
private val Context = java(
"""
|package android.content;
|
|public class Context {}
|""".trimMargin()
)
private val ContextCompat = java(
"""
|package androidx.core.content;
|
|public class ContextCompat {
| public static void getDrawable(Context context, int resId) {}
| public static void getColorStateList(Context context, int resId) {}
|}
|""".trimMargin()
)
}
}