Support annotation-based declaration of target plugin and gradle version

in gradle importing tests
This commit is contained in:
Andrey Uskov
2019-11-07 15:07:39 +03:00
parent 14aa0eae71
commit 48f6207d26
4 changed files with 127 additions and 13 deletions
@@ -11,36 +11,54 @@ package org.jetbrains.kotlin.idea.codeInsight.gradle
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.junit.Rule
import org.junit.runners.Parameterized
import java.util.*
abstract class MultiplePluginVersionGradleImportingTestCase : GradleImportingTestCase() {
@Rule
@JvmField
var pluginVersionMatchingRule = PluginTargetVersionsRule()
val project: Project
get() = myProject
override fun isApplicableTest(): Boolean {
return pluginVersionMatchingRule.matches(
gradleVersion, gradleKotlinPluginVersion,
gradleKotlinPluginVersionType == LATEST_SUPPORTED_VERSION
)
}
@JvmField
@Parameterized.Parameter(1)
var gradleKotlinPluginVersion: String = MINIMAL_SUPPORTED_VERSION
var gradleKotlinPluginVersionType: String = MINIMAL_SUPPORTED_VERSION
val gradleKotlinPluginVersion: String
get() = KOTLIN_GRADLE_PLUGIN_VERSION_DESCRIPTION_TO_VERSION[gradleKotlinPluginVersionType] ?: gradleKotlinPluginVersion
companion object {
const val MINIMAL_SUPPORTED_VERSION = "minimal"// minimal supported version
private val KOTLIN_GRADLE_PLUGIN_VERSIONS = listOf(MINIMAL_SUPPORTED_VERSION, "1.3.50")
const val LATEST_STABLE_VERSUON = "latest stable"
const val LATEST_SUPPORTED_VERSION = "master"// gradle plugin from current build
private val KOTLIN_GRADLE_PLUGIN_VERSIONS = listOf(MINIMAL_SUPPORTED_VERSION, LATEST_STABLE_VERSUON, LATEST_SUPPORTED_VERSION)
private val KOTLIN_GRADLE_PLUGIN_VERSION_DESCRIPTION_TO_VERSION = mapOf(
MINIMAL_SUPPORTED_VERSION to MINIMAL_SUPPORTED_GRADLE_PLUGIN_VERSION,
LATEST_STABLE_VERSUON to LATEST_STABLE_GRADLE_PLUGIN_VERSION,
LATEST_SUPPORTED_VERSION to "master"
)
@JvmStatic
@Parameterized.Parameters(name = "{index}: Gradle-{0}, KotlinGradlePlugin-{1}")
fun data(): Collection<Array<Any>> {
return AbstractModelBuilderTest.SUPPORTED_GRADLE_VERSIONS.flatMap { gradleVersion ->
if ((gradleVersion[0] as String).startsWith("3.")) {
listOf(arrayOf<Any>(gradleVersion[0], MINIMAL_SUPPORTED_VERSION))
} else {
KOTLIN_GRADLE_PLUGIN_VERSIONS.map { kotlinVersion ->
arrayOf<Any>(
gradleVersion[0],
kotlinVersion
)
}
KOTLIN_GRADLE_PLUGIN_VERSIONS.map { kotlinVersion ->
arrayOf<Any>(
gradleVersion[0],
kotlinVersion
)
}
}.toList()
}
}
@@ -0,0 +1,74 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.codeInsight.gradle;
import org.gradle.util.GradleVersion;
import org.hamcrest.CustomMatcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.gradle.tooling.annotation.PluginTargetVersions;
import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions;
import org.jetbrains.plugins.gradle.tooling.util.VersionMatcher;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import java.lang.annotation.Annotation;
// modified copy of org.jetbrains.plugins.gradle.tooling.VersionMatcherRule
public class PluginTargetVersionsRule extends TestWatcher {
private class TargetVersionsImpl implements TargetVersions {
private final String value;
TargetVersionsImpl(String value) {
this.value = value;
}
@Override
public String value() {
return value;
}
@Override
public boolean checkBaseVersions() {
return true;
}
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
}
@Nullable
private CustomMatcher gradleVersionMatcher;
@Nullable
private CustomMatcher pluginVersionMatcher;
@NotNull
public boolean matches(String gradleVersion, String pluginVersion, boolean isLatestPluginVersion) {
boolean matchGradleVersion = gradleVersionMatcher == null || gradleVersionMatcher.matches(gradleVersion);
if (isLatestPluginVersion) {
return matchGradleVersion;
}
boolean pluginVersionMatches = pluginVersionMatcher == null || pluginVersionMatcher.matches(pluginVersion);
return matchGradleVersion && pluginVersionMatches;
}
@Override
protected void starting(Description d) {
final PluginTargetVersions pluginTargetVersions = d.getAnnotation(PluginTargetVersions.class);
if (d.getAnnotation(TargetVersions.class) != null && pluginTargetVersions != null) {
throw new IllegalArgumentException(String.format("Annotations %s and %s could not be used together. ",
TargetVersions.class.getName(), PluginTargetVersions.class.getName()));
}
if (pluginTargetVersions == null) return;
gradleVersionMatcher = VersionMatcherRule.produceMatcher("Gradle", new TargetVersionsImpl(pluginTargetVersions.gradleVersion()));
pluginVersionMatcher = VersionMatcherRule.produceMatcher("Plugin", new TargetVersionsImpl(pluginTargetVersions.pluginVersion()));
}
}
@@ -42,7 +42,11 @@ public class VersionMatcherRule extends TestWatcher {
final TargetVersions targetVersions = d.getAnnotation(TargetVersions.class);
if (targetVersions == null) return;
myMatcher = new CustomMatcher<String>("Gradle version '" + targetVersions.value() + "'") {
myMatcher = produceMatcher("Gradle", targetVersions);
}
public static CustomMatcher<String> produceMatcher(String caption, TargetVersions targetVersions) {
return new CustomMatcher<String>(caption + " version '" + targetVersions.value() + "'") {
@Override
public boolean matches(Object item) {
return item instanceof String && new VersionMatcher(GradleVersion.version(item.toString())).isVersionMatch(targetVersions);
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.plugins.gradle.tooling.annotation;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface PluginTargetVersions {
String gradleVersion();
String pluginVersion();
}