From c4f9c3fb89a544df92087d8a35212e75f30999b2 Mon Sep 17 00:00:00 2001 From: geralt-encore Date: Fri, 6 Oct 2017 11:20:00 +0300 Subject: [PATCH 1/9] Question marks in a query don't match number of arguments lint check --- build.gradle | 9 + checks/build.gradle | 18 ++ .../squareup/sqlbrite3/BriteIssueRegistry.kt | 23 ++ .../sqlbrite3/SqlBriteArgCountDetector.kt | 74 +++++++ .../sqlbrite3/SqlBriteArgCountDetectorTest.kt | 203 ++++++++++++++++++ settings.gradle | 1 + sqlbrite/build.gradle | 2 + 7 files changed, 330 insertions(+) create mode 100644 checks/build.gradle create mode 100644 checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt create mode 100644 checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt create mode 100644 checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt diff --git a/build.gradle b/build.gradle index 9ca9e64e..49014a3c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ buildscript { 'minSdk': 14, 'compileSdk': 27, 'kotlin': '1.1.60', + 'lint': '26.0.1' ] repositories { @@ -21,6 +22,7 @@ allprojects { repositories { mavenCentral() google() + jcenter() } group = GROUP @@ -50,6 +52,13 @@ ext { rxBinding = 'com.jakewharton.rxbinding2:rxbinding:2.0.0' junit = 'junit:junit:4.12' truth = 'com.google.truth:truth:0.36' + + // Lint dependencies. + lintApi = "com.android.tools.lint:lint-api:${versions.lint}" + lintChecks = "com.android.tools.lint:lint-checks:${versions.lint}" + lint = "com.android.tools.lint:lint:${versions.lint}" + lintTests = "com.android.tools.lint:lint-tests:${versions.lint}" + lintTestUtils = "com.android.tools:testutils:${versions.lint}" } configurations { diff --git a/checks/build.gradle b/checks/build.gradle new file mode 100644 index 00000000..7dc10d4d --- /dev/null +++ b/checks/build.gradle @@ -0,0 +1,18 @@ +apply plugin: 'kotlin' + +dependencies { + compileOnly rootProject.ext.kotlinStdLib + compileOnly rootProject.ext.lintApi + compileOnly rootProject.ext.lintChecks + + testCompile rootProject.ext.junit + testCompile rootProject.ext.lint + testCompile rootProject.ext.lintTests + testCompile rootProject.ext.lintTestUtils +} + +jar { + manifest { + attributes("Lint-Registry-v2": "com.squareup.sqlbrite3.BriteIssueRegistry") + } +} diff --git a/checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt b/checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt new file mode 100644 index 00000000..e0afee0d --- /dev/null +++ b/checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.squareup.sqlbrite3 + +import com.android.tools.lint.client.api.IssueRegistry + +class BriteIssueRegistry : IssueRegistry() { + + override fun getIssues() = listOf(SqlBriteArgCountDetector.ISSUE) +} diff --git a/checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt b/checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt new file mode 100644 index 00000000..465b3a73 --- /dev/null +++ b/checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.squareup.sqlbrite3 + +import com.android.tools.lint.detector.api.Category +import com.android.tools.lint.detector.api.ConstantEvaluator.evaluateString +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Implementation +import com.android.tools.lint.detector.api.Issue +import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Severity +import com.intellij.psi.PsiMethod +import org.jetbrains.uast.UCallExpression + +private const val BRITE_DATABASE = "com.squareup.sqlbrite3.BriteDatabase" +private const val QUERY_METHOD_NAME = "query" +private const val CREATE_QUERY_METHOD_NAME = "createQuery" + +class SqlBriteArgCountDetector : Detector(), Detector.UastScanner { + + companion object { + + val ISSUE: Issue = Issue.create( + "SqlBriteArgCount", + "Number of provided arguments doesn't match number " + + "of arguments specified in query", + "When providing arguments to query you need to provide the same amount of" + + "arguments that is specified in query.", + Category.MESSAGES, + 9, + Severity.ERROR, + Implementation(SqlBriteArgCountDetector::class.java, Scope.JAVA_FILE_SCOPE)) + } + + override fun getApplicableMethodNames() = listOf(CREATE_QUERY_METHOD_NAME, QUERY_METHOD_NAME) + + override fun visitMethod(context: JavaContext, call: UCallExpression, method: PsiMethod) { + val evaluator = context.evaluator + + if (evaluator.isMemberInClass(method, BRITE_DATABASE)) { + // skip non varargs overloads + if (!method.isVarArgs) return + + // position of sql parameter depends on method + val sql = evaluateString(context, + call.valueArguments[if (call.isQueryMethod()) 0 else 1], true) ?: return + + // count only vararg arguments + val argumentsCount = call.valueArgumentCount - if (call.isQueryMethod()) 1 else 2 + val questionMarksCount = sql.count { it == '?' } + if (argumentsCount != questionMarksCount) { + context.report(ISSUE, call, context.getLocation(call), "Wrong argument count, " + + "query $sql requires $questionMarksCount arguments, but was provided" + + " $argumentsCount arguments") + } + } + } + + private fun UCallExpression.isQueryMethod() = methodName == QUERY_METHOD_NAME +} \ No newline at end of file diff --git a/checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt b/checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt new file mode 100644 index 00000000..cdb4c206 --- /dev/null +++ b/checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.squareup.sqlbrite3 + +import com.android.tools.lint.checks.infrastructure.LintDetectorTest +import com.android.tools.lint.checks.infrastructure.TestFiles + +class SqlBriteArgCountDetectorTest : LintDetectorTest() { + + companion object { + private val BRITE_DATABASE_STUB = TestFiles.java( + """ + package com.squareup.sqlbrite3; + + public final class BriteDatabase { + + public void query(String sql, Object... args) { + } + + public void createQuery(String table, String sql, Object... args) { + } + + // simulate createQuery with SupportSQLiteQuery query parameter + public void createQuery(String table, int something) { + } + } + """.trimIndent() + ) + } + + override fun getDetector() = SqlBriteArgCountDetector() + + override fun getIssues() = listOf(SqlBriteArgCountDetector.ISSUE) + + fun testCleanCaseWithWithQueryAsLiteral() { + lint().files( + BRITE_DATABASE_STUB, + java( + """ + package test.pkg; + + import com.squareup.sqlbrite3.BriteDatabase; + + public class Test { + + private static final String QUERY = "SELECT name FROM table WHERE id = ?"; + + public void test() { + BriteDatabase db = new BriteDatabase(); + db.query(QUERY, "id"); + } + + } + """.trimIndent())) + .run() + .expectClean() + } + + fun testCleanCaseWithQueryAsBinaryExpression() { + lint().files( + BRITE_DATABASE_STUB, + java( + """ + package test.pkg; + + import com.squareup.sqlbrite3.BriteDatabase; + + public class Test { + + private static final String QUERY = "SELECT name FROM table WHERE "; + + public void test() { + BriteDatabase db = new BriteDatabase(); + db.query(QUERY + "id = ?", "id"); + } + + } + """.trimIndent())) + .run() + .expectClean() + } + + fun testCleanCaseWithQueryThatCantBeEvaluated() { + lint().files( + BRITE_DATABASE_STUB, + java( + """ + package test.pkg; + + import com.squareup.sqlbrite3.BriteDatabase; + + public class Test { + + private static final String QUERY = "SELECT name FROM table WHERE id = ?"; + + public void test() { + BriteDatabase db = new BriteDatabase(); + db.query(query(), "id"); + } + + private String query() { + return QUERY + " age = ?"; + } + + } + """.trimIndent())) + .run() + .expectClean() + } + + fun testCleanCaseWithNonVarargMethodCall() { + lint().files( + BRITE_DATABASE_STUB, + java( + """ + package test.pkg; + + import com.squareup.sqlbrite3.BriteDatabase; + + public class Test { + + public void test() { + BriteDatabase db = new BriteDatabase(); + db.createQuery("table", 42); + } + + } + """.trimIndent())) + .run() + .expectClean() + } + + fun testQueryMethodWithWrongNumberOfArguments() { + lint().files( + BRITE_DATABASE_STUB, + java( + """ + package test.pkg; + + import com.squareup.sqlbrite3.BriteDatabase; + + public class Test { + + private static final String QUERY = "SELECT name FROM table WHERE id = ?"; + + public void test() { + BriteDatabase db = new BriteDatabase(); + db.query(QUERY); + } + + } + """.trimIndent())) + .run() + .expect("src/test/pkg/Test.java:11: " + + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + + " requires 1 arguments, but was provided 0 arguments [SqlBriteArgCount]\n" + + " db.query(QUERY);\n" + + " ~~~~~~~~~~~~~~~\n" + + "1 errors, 0 warnings") + } + + fun testCreateQueryMethodWithWrongNumberOfArguments() { + lint().files( + BRITE_DATABASE_STUB, + java( + """ + package test.pkg; + + import com.squareup.sqlbrite3.BriteDatabase; + + public class Test { + + private static final String QUERY = "SELECT name FROM table WHERE id = ?"; + + public void test() { + BriteDatabase db = new BriteDatabase(); + db.createQuery("table", QUERY); + } + + } + """.trimIndent())) + .run() + .expect("src/test/pkg/Test.java:11: " + + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + + " requires 1 arguments, but was provided 0 arguments [SqlBriteArgCount]\n" + + " db.createQuery(\"table\", QUERY);\n" + + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + + "1 errors, 0 warnings") + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 445958a1..3cc80c61 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,6 @@ include ':sqlbrite' include ':sqlbrite-kotlin' include ':sample' +include ':checks' rootProject.name = 'sqlbrite-root' diff --git a/sqlbrite/build.gradle b/sqlbrite/build.gradle index 87b23f41..28c19d0c 100644 --- a/sqlbrite/build.gradle +++ b/sqlbrite/build.gradle @@ -8,6 +8,8 @@ dependencies { androidTestImplementation rootProject.ext.supportTestRunner androidTestImplementation rootProject.ext.truth androidTestImplementation rootProject.ext.supportSqliteFramework + + lintChecks project(':checks') } android { From d1a399994dbaa9004a26a233ee5a8a43758322bf Mon Sep 17 00:00:00 2001 From: geralt-encore Date: Wed, 29 Nov 2017 10:16:16 +0200 Subject: [PATCH 2/9] Fix PR comments --- settings.gradle | 2 +- {checks => sqlbrite-lint}/build.gradle | 0 .../squareup/sqlbrite3/BriteIssueRegistry.kt | 2 +- .../sqlbrite3/SqlBriteArgCountDetector.kt | 18 +++++++++++------- .../sqlbrite3/SqlBriteArgCountDetectorTest.kt | 6 +++--- sqlbrite/build.gradle | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) rename {checks => sqlbrite-lint}/build.gradle (100%) rename {checks => sqlbrite-lint}/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt (95%) rename {checks => sqlbrite-lint}/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt (81%) rename {checks => sqlbrite-lint}/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt (96%) diff --git a/settings.gradle b/settings.gradle index 3cc80c61..a3221f32 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,6 @@ include ':sqlbrite' include ':sqlbrite-kotlin' include ':sample' -include ':checks' +include ':sqlbrite-lint' rootProject.name = 'sqlbrite-root' diff --git a/checks/build.gradle b/sqlbrite-lint/build.gradle similarity index 100% rename from checks/build.gradle rename to sqlbrite-lint/build.gradle diff --git a/checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt similarity index 95% rename from checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt rename to sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt index e0afee0d..ae915519 100644 --- a/checks/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt +++ b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/BriteIssueRegistry.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Square, Inc. + * Copyright (C) 2017 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt similarity index 81% rename from checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt rename to sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt index 465b3a73..b59477fb 100644 --- a/checks/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt +++ b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Square, Inc. + * Copyright (C) 2017 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Implementation import com.android.tools.lint.detector.api.Issue import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.LintUtils import com.android.tools.lint.detector.api.Scope import com.android.tools.lint.detector.api.Severity import com.intellij.psi.PsiMethod @@ -38,7 +39,7 @@ class SqlBriteArgCountDetector : Detector(), Detector.UastScanner { "SqlBriteArgCount", "Number of provided arguments doesn't match number " + "of arguments specified in query", - "When providing arguments to query you need to provide the same amount of" + + "When providing arguments to query you need to provide the same amount of " + "arguments that is specified in query.", Category.MESSAGES, 9, @@ -52,23 +53,26 @@ class SqlBriteArgCountDetector : Detector(), Detector.UastScanner { val evaluator = context.evaluator if (evaluator.isMemberInClass(method, BRITE_DATABASE)) { - // skip non varargs overloads + // Skip non varargs overloads. if (!method.isVarArgs) return - // position of sql parameter depends on method + // Position of sql parameter depends on method. val sql = evaluateString(context, call.valueArguments[if (call.isQueryMethod()) 0 else 1], true) ?: return - // count only vararg arguments + // Count only vararg arguments. val argumentsCount = call.valueArgumentCount - if (call.isQueryMethod()) 1 else 2 val questionMarksCount = sql.count { it == '?' } if (argumentsCount != questionMarksCount) { + val requiredArguments = "$questionMarksCount ${"argument".pluralize(questionMarksCount)}" + val actualArguments = "$argumentsCount ${"argument".pluralize(argumentsCount)}" context.report(ISSUE, call, context.getLocation(call), "Wrong argument count, " + - "query $sql requires $questionMarksCount arguments, but was provided" + - " $argumentsCount arguments") + "query $sql requires $requiredArguments, but was provided $actualArguments") } } } private fun UCallExpression.isQueryMethod() = methodName == QUERY_METHOD_NAME + + private fun String.pluralize(count: Int) = if (count == 1) this else this + "s" } \ No newline at end of file diff --git a/checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt similarity index 96% rename from checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt rename to sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt index cdb4c206..ff7d2c32 100644 --- a/checks/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt +++ b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Square, Inc. + * Copyright (C) 2017 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -166,7 +166,7 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { .run() .expect("src/test/pkg/Test.java:11: " + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + - " requires 1 arguments, but was provided 0 arguments [SqlBriteArgCount]\n" + + " requires 1 argument, but was provided 0 arguments [SqlBriteArgCount]\n" + " db.query(QUERY);\n" + " ~~~~~~~~~~~~~~~\n" + "1 errors, 0 warnings") @@ -195,7 +195,7 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { .run() .expect("src/test/pkg/Test.java:11: " + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + - " requires 1 arguments, but was provided 0 arguments [SqlBriteArgCount]\n" + + " requires 1 argument, but was provided 0 arguments [SqlBriteArgCount]\n" + " db.createQuery(\"table\", QUERY);\n" + " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + "1 errors, 0 warnings") diff --git a/sqlbrite/build.gradle b/sqlbrite/build.gradle index 28c19d0c..229e65da 100644 --- a/sqlbrite/build.gradle +++ b/sqlbrite/build.gradle @@ -9,7 +9,7 @@ dependencies { androidTestImplementation rootProject.ext.truth androidTestImplementation rootProject.ext.supportSqliteFramework - lintChecks project(':checks') + lintChecks project(':sqlbrite-lint') } android { From a9439c90236f5448de48c0f62d05a483a3dcf447 Mon Sep 17 00:00:00 2001 From: geralt-encore Date: Wed, 29 Nov 2017 15:20:28 +0200 Subject: [PATCH 3/9] Fix more PR comments --- .../sqlbrite3/SqlBriteArgCountDetector.kt | 7 +-- .../sqlbrite3/SqlBriteArgCountDetectorTest.kt | 43 +++++++++++++------ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt index b59477fb..e68d1f57 100644 --- a/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt +++ b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt @@ -21,11 +21,12 @@ import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Implementation import com.android.tools.lint.detector.api.Issue import com.android.tools.lint.detector.api.JavaContext -import com.android.tools.lint.detector.api.LintUtils -import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Scope.JAVA_FILE +import com.android.tools.lint.detector.api.Scope.TEST_SOURCES import com.android.tools.lint.detector.api.Severity import com.intellij.psi.PsiMethod import org.jetbrains.uast.UCallExpression +import java.util.* private const val BRITE_DATABASE = "com.squareup.sqlbrite3.BriteDatabase" private const val QUERY_METHOD_NAME = "query" @@ -44,7 +45,7 @@ class SqlBriteArgCountDetector : Detector(), Detector.UastScanner { Category.MESSAGES, 9, Severity.ERROR, - Implementation(SqlBriteArgCountDetector::class.java, Scope.JAVA_FILE_SCOPE)) + Implementation(SqlBriteArgCountDetector::class.java, EnumSet.of(JAVA_FILE, TEST_SOURCES))) } override fun getApplicableMethodNames() = listOf(CREATE_QUERY_METHOD_NAME, QUERY_METHOD_NAME) diff --git a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt index ff7d2c32..bef5ac4b 100644 --- a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt +++ b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt @@ -15,13 +15,14 @@ */ package com.squareup.sqlbrite3 -import com.android.tools.lint.checks.infrastructure.LintDetectorTest -import com.android.tools.lint.checks.infrastructure.TestFiles +import com.android.tools.lint.checks.infrastructure.TestFiles.java +import com.android.tools.lint.checks.infrastructure.TestLintTask.lint +import org.junit.Test -class SqlBriteArgCountDetectorTest : LintDetectorTest() { +class SqlBriteArgCountDetectorTest { companion object { - private val BRITE_DATABASE_STUB = TestFiles.java( + private val BRITE_DATABASE_STUB = java( """ package com.squareup.sqlbrite3; @@ -41,11 +42,8 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { ) } - override fun getDetector() = SqlBriteArgCountDetector() - - override fun getIssues() = listOf(SqlBriteArgCountDetector.ISSUE) - - fun testCleanCaseWithWithQueryAsLiteral() { + @Test + fun cleanCaseWithWithQueryAsLiteral() { lint().files( BRITE_DATABASE_STUB, java( @@ -65,11 +63,14 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { } """.trimIndent())) + .detector(SqlBriteArgCountDetector()) + .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() } - fun testCleanCaseWithQueryAsBinaryExpression() { + @Test + fun cleanCaseWithQueryAsBinaryExpression() { lint().files( BRITE_DATABASE_STUB, java( @@ -89,11 +90,14 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { } """.trimIndent())) + .detector(SqlBriteArgCountDetector()) + .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() } - fun testCleanCaseWithQueryThatCantBeEvaluated() { + @Test + fun cleanCaseWithQueryThatCantBeEvaluated() { lint().files( BRITE_DATABASE_STUB, java( @@ -117,11 +121,14 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { } """.trimIndent())) + .detector(SqlBriteArgCountDetector()) + .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() } - fun testCleanCaseWithNonVarargMethodCall() { + @Test + fun cleanCaseWithNonVarargMethodCall() { lint().files( BRITE_DATABASE_STUB, java( @@ -139,11 +146,14 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { } """.trimIndent())) + .detector(SqlBriteArgCountDetector()) + .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() } - fun testQueryMethodWithWrongNumberOfArguments() { + @Test + fun queryMethodWithWrongNumberOfArguments() { lint().files( BRITE_DATABASE_STUB, java( @@ -163,6 +173,8 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { } """.trimIndent())) + .detector(SqlBriteArgCountDetector()) + .issues(SqlBriteArgCountDetector.ISSUE) .run() .expect("src/test/pkg/Test.java:11: " + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + @@ -172,7 +184,8 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { "1 errors, 0 warnings") } - fun testCreateQueryMethodWithWrongNumberOfArguments() { + @Test + fun createQueryMethodWithWrongNumberOfArguments() { lint().files( BRITE_DATABASE_STUB, java( @@ -192,6 +205,8 @@ class SqlBriteArgCountDetectorTest : LintDetectorTest() { } """.trimIndent())) + .detector(SqlBriteArgCountDetector()) + .issues(SqlBriteArgCountDetector.ISSUE) .run() .expect("src/test/pkg/Test.java:11: " + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + From 3b88397a8538c25a391b0340955cfa6f645a7192 Mon Sep 17 00:00:00 2001 From: geralt-encore Date: Wed, 29 Nov 2017 16:11:39 +0200 Subject: [PATCH 4/9] Remove unnecessary detector call in tests --- .../com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt index bef5ac4b..dcf980eb 100644 --- a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt +++ b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt @@ -63,7 +63,6 @@ class SqlBriteArgCountDetectorTest { } """.trimIndent())) - .detector(SqlBriteArgCountDetector()) .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() @@ -90,7 +89,6 @@ class SqlBriteArgCountDetectorTest { } """.trimIndent())) - .detector(SqlBriteArgCountDetector()) .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() @@ -121,7 +119,6 @@ class SqlBriteArgCountDetectorTest { } """.trimIndent())) - .detector(SqlBriteArgCountDetector()) .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() @@ -146,7 +143,6 @@ class SqlBriteArgCountDetectorTest { } """.trimIndent())) - .detector(SqlBriteArgCountDetector()) .issues(SqlBriteArgCountDetector.ISSUE) .run() .expectClean() @@ -173,7 +169,6 @@ class SqlBriteArgCountDetectorTest { } """.trimIndent())) - .detector(SqlBriteArgCountDetector()) .issues(SqlBriteArgCountDetector.ISSUE) .run() .expect("src/test/pkg/Test.java:11: " + @@ -205,7 +200,6 @@ class SqlBriteArgCountDetectorTest { } """.trimIndent())) - .detector(SqlBriteArgCountDetector()) .issues(SqlBriteArgCountDetector.ISSUE) .run() .expect("src/test/pkg/Test.java:11: " + From 244a9b71c65d85ca2672f2d128a2bee14b72b23e Mon Sep 17 00:00:00 2001 From: Ilya Zorin Date: Sun, 10 Dec 2017 12:59:42 +0200 Subject: [PATCH 5/9] Fix comments --- build.gradle | 1 - sqlbrite-lint/build.gradle | 7 +++---- .../com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt | 5 ----- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 49014a3c..2b7fe904 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,6 @@ ext { lintChecks = "com.android.tools.lint:lint-checks:${versions.lint}" lint = "com.android.tools.lint:lint:${versions.lint}" lintTests = "com.android.tools.lint:lint-tests:${versions.lint}" - lintTestUtils = "com.android.tools:testutils:${versions.lint}" } configurations { diff --git a/sqlbrite-lint/build.gradle b/sqlbrite-lint/build.gradle index 7dc10d4d..50195657 100644 --- a/sqlbrite-lint/build.gradle +++ b/sqlbrite-lint/build.gradle @@ -5,10 +5,9 @@ dependencies { compileOnly rootProject.ext.lintApi compileOnly rootProject.ext.lintChecks - testCompile rootProject.ext.junit - testCompile rootProject.ext.lint - testCompile rootProject.ext.lintTests - testCompile rootProject.ext.lintTestUtils + testImplementation rootProject.ext.junit + testImplementation rootProject.ext.lint + testImplementation rootProject.ext.lintTests } jar { diff --git a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt index dcf980eb..52d80554 100644 --- a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt +++ b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt @@ -53,7 +53,6 @@ class SqlBriteArgCountDetectorTest { import com.squareup.sqlbrite3.BriteDatabase; public class Test { - private static final String QUERY = "SELECT name FROM table WHERE id = ?"; public void test() { @@ -79,7 +78,6 @@ class SqlBriteArgCountDetectorTest { import com.squareup.sqlbrite3.BriteDatabase; public class Test { - private static final String QUERY = "SELECT name FROM table WHERE "; public void test() { @@ -105,7 +103,6 @@ class SqlBriteArgCountDetectorTest { import com.squareup.sqlbrite3.BriteDatabase; public class Test { - private static final String QUERY = "SELECT name FROM table WHERE id = ?"; public void test() { @@ -159,7 +156,6 @@ class SqlBriteArgCountDetectorTest { import com.squareup.sqlbrite3.BriteDatabase; public class Test { - private static final String QUERY = "SELECT name FROM table WHERE id = ?"; public void test() { @@ -190,7 +186,6 @@ class SqlBriteArgCountDetectorTest { import com.squareup.sqlbrite3.BriteDatabase; public class Test { - private static final String QUERY = "SELECT name FROM table WHERE id = ?"; public void test() { From 2b506b3729fa17d7d4148dc71edf363a18c4be77 Mon Sep 17 00:00:00 2001 From: Ilya Zorin Date: Sun, 10 Dec 2017 14:40:01 +0200 Subject: [PATCH 6/9] Fix tests --- .../com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt index 52d80554..c946983e 100644 --- a/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt +++ b/sqlbrite-lint/src/test/java/com/squareup/sqlbrite3/SqlBriteArgCountDetectorTest.kt @@ -167,7 +167,7 @@ class SqlBriteArgCountDetectorTest { """.trimIndent())) .issues(SqlBriteArgCountDetector.ISSUE) .run() - .expect("src/test/pkg/Test.java:11: " + + .expect("src/test/pkg/Test.java:10: " + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + " requires 1 argument, but was provided 0 arguments [SqlBriteArgCount]\n" + " db.query(QUERY);\n" + @@ -197,7 +197,7 @@ class SqlBriteArgCountDetectorTest { """.trimIndent())) .issues(SqlBriteArgCountDetector.ISSUE) .run() - .expect("src/test/pkg/Test.java:11: " + + .expect("src/test/pkg/Test.java:10: " + "Error: Wrong argument count, query SELECT name FROM table WHERE id = ?" + " requires 1 argument, but was provided 0 arguments [SqlBriteArgCount]\n" + " db.createQuery(\"table\", QUERY);\n" + From 37be373722f85eb12f7b99665108a0555bd42994 Mon Sep 17 00:00:00 2001 From: geralt-encore Date: Tue, 12 Dec 2017 11:11:04 +0200 Subject: [PATCH 7/9] Fix star import --- .../java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt index e68d1f57..a3535632 100644 --- a/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt +++ b/sqlbrite-lint/src/main/java/com/squareup/sqlbrite3/SqlBriteArgCountDetector.kt @@ -26,7 +26,7 @@ import com.android.tools.lint.detector.api.Scope.TEST_SOURCES import com.android.tools.lint.detector.api.Severity import com.intellij.psi.PsiMethod import org.jetbrains.uast.UCallExpression -import java.util.* +import java.util.EnumSet private const val BRITE_DATABASE = "com.squareup.sqlbrite3.BriteDatabase" private const val QUERY_METHOD_NAME = "query" From 26c4ae5289a35a18e8a69edb958f9081a7c772e5 Mon Sep 17 00:00:00 2001 From: Ilya Zorin Date: Sat, 16 Dec 2017 17:08:58 +0200 Subject: [PATCH 8/9] Fix comment --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index a3221f32..c8e57996 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,6 @@ include ':sqlbrite' include ':sqlbrite-kotlin' -include ':sample' include ':sqlbrite-lint' +include ':sample' rootProject.name = 'sqlbrite-root' From 8a7ac86f3eef6d25b558869392a669735a4c29c7 Mon Sep 17 00:00:00 2001 From: Ilya Zorin Date: Mon, 18 Dec 2017 10:25:42 +0200 Subject: [PATCH 9/9] Remove lint checks dependency --- build.gradle | 1 - sqlbrite-lint/build.gradle | 1 - 2 files changed, 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2b7fe904..35f71b0d 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,6 @@ ext { // Lint dependencies. lintApi = "com.android.tools.lint:lint-api:${versions.lint}" - lintChecks = "com.android.tools.lint:lint-checks:${versions.lint}" lint = "com.android.tools.lint:lint:${versions.lint}" lintTests = "com.android.tools.lint:lint-tests:${versions.lint}" } diff --git a/sqlbrite-lint/build.gradle b/sqlbrite-lint/build.gradle index 50195657..6760c202 100644 --- a/sqlbrite-lint/build.gradle +++ b/sqlbrite-lint/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'kotlin' dependencies { compileOnly rootProject.ext.kotlinStdLib compileOnly rootProject.ext.lintApi - compileOnly rootProject.ext.lintChecks testImplementation rootProject.ext.junit testImplementation rootProject.ext.lint