[kotlin] Add basic gradle hl tests

#KTIJ-30118
#KTIJ-28597

GitOrigin-RevId: d4e62f0dc2bd81e0237dc4aa728c8213d771a9f6
This commit is contained in:
Vladimir Dolzhenko
2024-06-11 17:41:59 +02:00
committed by intellij-monorepo-bot
parent 3b7873d0a6
commit e33e4b641a
8 changed files with 266 additions and 13 deletions

View File

@@ -0,0 +1,17 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeInsight.gradle
import org.jetbrains.kotlin.gradle.AbstractKotlinGradleHighlightingTest
import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode
import org.jetbrains.kotlin.idea.test.UseK2PluginMode
import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleProjectTestApplication
@UseK2PluginMode
@GradleProjectTestApplication
@AssertKotlinPluginMode
class K2GradleHighlightingTest: AbstractKotlinGradleHighlightingTest() {
override fun setUp() {
testRootDisposable.enableK2Scripting()
super.setUp()
}
}

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeInsight.gradle
import com.intellij.openapi.Disposable
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.registry.Registry
import org.jetbrains.kotlin.gradle.AbstractKotlinGradleNavigationTest
@@ -10,17 +11,20 @@ import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradlePro
private const val SCRIPTING_ENABLED_FLAG = "kotlin.k2.scripting.enabled"
internal fun Disposable.enableK2Scripting() {
val oldUseScripting = Registry.`is`(SCRIPTING_ENABLED_FLAG, false)
Registry.get(SCRIPTING_ENABLED_FLAG).setValue(true)
Disposer.register(this) {
Registry.get(SCRIPTING_ENABLED_FLAG).setValue(oldUseScripting)
}
}
@UseK2PluginMode
@GradleProjectTestApplication
@AssertKotlinPluginMode
class K2GradleNavigationTest : AbstractKotlinGradleNavigationTest() {
override fun setUp() {
val oldUseScripting = Registry.`is`(SCRIPTING_ENABLED_FLAG, false)
Registry.get(SCRIPTING_ENABLED_FLAG).setValue(true)
Disposer.register(testRootDisposable) {
Registry.get(SCRIPTING_ENABLED_FLAG).setValue(oldUseScripting)
}
testRootDisposable.enableK2Scripting()
super.setUp()
}
}

View File

@@ -0,0 +1,79 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle
import com.intellij.testFramework.TestDataPath
import com.intellij.testFramework.runInEdtAndWait
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.AbstractKotlinGradleNavigationTest.Companion.GRADLE_KOTLIN_FIXTURE
import org.jetbrains.kotlin.idea.base.plugin.useK2Plugin
import org.jetbrains.kotlin.idea.base.test.IgnoreTests
import org.jetbrains.kotlin.idea.base.test.TestRoot
import org.jetbrains.kotlin.idea.codeMetaInfo.renderConfigurations.HighlightingConfiguration.SeverityRenderingOption
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.highlighter.CHECK_SYMBOL_NAMES
import org.jetbrains.kotlin.idea.highlighter.checkHighlighting
import org.jetbrains.kotlin.idea.test.KotlinTestUtils.parseDirectives
import org.jetbrains.kotlin.test.TestMetadata
import org.jetbrains.plugins.gradle.testFramework.annotations.BaseGradleVersionSource
import org.junit.jupiter.params.ParameterizedTest
import java.io.File
@TestRoot("idea/tests/testData/")
@TestDataPath("\$CONTENT_ROOT")
@TestMetadata("gradle/highlighting")
abstract class AbstractKotlinGradleHighlightingTest : AbstractGradleCodeInsightTest() {
@ParameterizedTest
@BaseGradleVersionSource
@TestMetadata("simple.test")
fun testSimple(gradleVersion: GradleVersion) {
verifyHighlighting(gradleVersion)
}
@ParameterizedTest
@BaseGradleVersionSource
@TestMetadata("withSdkAndScriptClasses.test")
fun testWithSdkAndScriptClasses(gradleVersion: GradleVersion) {
verifyHighlighting(gradleVersion)
}
private val outputFileExtensions: List<String> = listOfNotNull(".highlighting.k2".takeIf { useK2Plugin == true }, ".highlighting")
private fun verifyHighlighting(gradleVersion: GradleVersion) {
test(gradleVersion, GRADLE_KOTLIN_FIXTURE) {
val mainFile = mainTestDataPsiFile
runInEdtAndWait {
ScriptConfigurationManager.updateScriptDependenciesSynchronously(mainFile)
}
val ktsFileUnderTest = mainFile.virtualFile.toNioPath().toFile()
val path = ktsFileUnderTest.path
val ktsFileHighlighting = outputFileExtensions.mapNotNull<String, File> { ext ->
val resolveSibling = ktsFileUnderTest.resolveSibling("$path$ext")
resolveSibling.takeIf(File::exists)
}.firstOrNull() ?: error("highlighting file does not exist for ${ktsFileUnderTest.path}")
val directives = parseDirectives(mainTestDataFile.content).also {
it.put(CHECK_SYMBOL_NAMES, true.toString())
}
runInEdtAndWait {
IgnoreTests.runTestIfNotDisabledByFileDirective(
mainFile.virtualFile.toNioPath(),
if (useK2Plugin == true) IgnoreTests.DIRECTIVES.IGNORE_K2 else IgnoreTests.DIRECTIVES.IGNORE_K1
) {
checkHighlighting(
mainFile,
ktsFileHighlighting,
directives,
project,
highlightWarnings = true,
severityOption = SeverityRenderingOption.ALWAYS
)
}
}
}
}
}

View File

@@ -115,8 +115,8 @@ class CodeMetaInfoTestCase(
if ("!CHECK_HIGHLIGHTING" in file.text)
return emptyList()
val highlightingInfos = CodeInsightTestFixtureImpl.instantiateAndRun(file, editor, intArrayOf(), false)
.filterNot { it.severity < configuration.severityLevel }
val infos = CodeInsightTestFixtureImpl.instantiateAndRun(file, editor, intArrayOf(), false)
val highlightingInfos = infos.filterNot { it.severity < configuration.severityLevel }
if (configuration.checkNoError) {
val errorHighlights = highlightingInfos.filter { it.severity >= HighlightSeverity.ERROR }

View File

@@ -12,16 +12,18 @@ import org.jetbrains.kotlin.codeMetaInfo.model.CodeMetaInfo
import org.jetbrains.kotlin.idea.codeMetaInfo.CodeMetaInfoTestCase
import org.jetbrains.kotlin.idea.codeMetaInfo.models.HighlightingCodeMetaInfo
import org.jetbrains.kotlin.idea.codeMetaInfo.renderConfigurations.HighlightingConfiguration
import org.jetbrains.kotlin.idea.codeMetaInfo.renderConfigurations.HighlightingConfiguration.SeverityRenderingOption
import org.jetbrains.kotlin.idea.test.Directives
import java.io.File
import java.util.*
const val CHECK_SYMBOL_NAMES = "CHECK_SYMBOL_NAMES"
const val HIGHLIGHT_SEVERITY = "HIGHLIGHT_SEVERITY"
private const val ALLOW_ERRORS = "ALLOW_ERRORS"
private const val HIGHLIGHT_WARNINGS = "HIGHLIGHT_WARNINGS"
private const val HIGHLIGHTER_ATTRIBUTES_KEY = "HIGHLIGHTER_ATTRIBUTES_KEY"
private const val CHECK_SYMBOL_NAMES = "CHECK_SYMBOL_NAMES"
private const val DUMB_MODE = "DUMB_MODE"
private const val HIGHLIGHT_SEVERITY = "HIGHLIGHT_SEVERITY"
fun checkHighlighting(
@@ -29,7 +31,8 @@ fun checkHighlighting(
expectedHighlightingFile: File,
globalDirectives: Directives,
project: Project,
highlightWarnings: Boolean? = false
highlightWarnings: Boolean? = false,
severityOption: SeverityRenderingOption = SeverityRenderingOption.ONLY_NON_INFO
) {
val highlightSeverity = globalDirectives.highlightSeverity()
// compatibility mode
@@ -37,7 +40,7 @@ fun checkHighlighting(
val highlightingRenderConfiguration = HighlightingConfiguration(
descriptionRenderingOption = HighlightingConfiguration.DescriptionRenderingOption.IF_NOT_NULL,
renderSeverityOption = HighlightingConfiguration.SeverityRenderingOption.ONLY_NON_INFO,
renderSeverityOption = severityOption,
renderHighlightingAttributesKey = HIGHLIGHTER_ATTRIBUTES_KEY in globalDirectives,
severityLevel = highlightSeverity
)

View File

@@ -0,0 +1,53 @@
// FILE: build.gradle.kts
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
dependencies {
implementation(project(":module1"))
}
// FILE: settings.gradle.kts
include("module1")
// FILE: build.gradle.kts.highlighting
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>plugins<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>`kotlin-dsl`<!>
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>repositories<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>mavenCentral<!>()
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>dependencies<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>implementation<!>(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>project<!>(":module1"))
}
// FILE: build.gradle.kts.highlighting.k2
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; descr='Style 4'")!>plugins<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>`kotlin-dsl`<!>
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>repositories<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>mavenCentral<!>()
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>dependencies<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>implementation<!>(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>project<!>(":module1"))
}
// FILE: settings.gradle.kts
include("module1")
// FILE: module1/build.gradle.kts
plugins {
java
}
repositories {
mavenCentral()
}

View File

@@ -0,0 +1,97 @@
// FILE: build.gradle.kts
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
dependencies {
implementation(project(":module1"))
}
enum class JvmTestFramework {
JUnit,
JUnit5,
TestNG;
fun lowercase() = name.lowercase()
}
val jvmTestFrameworks = JvmTestFramework.values().toList()
tasks.register("generateModuleInfo") {
doLast {
val modules = rootProject.subprojects
File("")
.writer() // jdk
.buffered() // kotlin stdlib ext function
jvmTestFrameworks.forEach { framework ->
println(framework)
}
}
}
// FILE: settings.gradle.kts
include("module1")
// FILE: build.gradle.kts.highlighting
// IGNORE_K1
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>plugins<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>`kotlin-dsl`<!>
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>repositories<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>mavenCentral<!>()
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>dependencies<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>implementation<!>(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>project<!>(":module1"))
}
// FILE: build.gradle.kts.highlighting.k2
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'"), HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'; descr='Style 4'")!>plugins<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>`kotlin-dsl`<!>
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>repositories<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>mavenCentral<!>()
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>dependencies<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>implementation<!>(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>project<!>(":module1"))
}
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>enum<!> class <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>JvmTestFramework<!> {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>JUnit<!>,
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>JUnit5<!>,
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>TestNG<!>;
fun <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>lowercase<!>() = <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>name<!>.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>lowercase<!>()
}
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>jvmTestFrameworks<!> = <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>JvmTestFramework<!>.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>values<!>().<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>toList<!>()
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>tasks<!>.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>register<!>("generateModuleInfo") {
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>doLast<!> {
val <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>modules<!> = <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>rootProject<!>.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>subprojects<!>
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>File<!>("")
.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>writer<!>() // jdk
.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>buffered<!>() // kotlin stdlib ext function
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>jvmTestFrameworks<!>.<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>forEach<!> { <!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>framework<!> ->
<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>println<!>(<!HIGHLIGHTING("severity='SYMBOL_TYPE_SEVERITY'")!>framework<!>)
}
}
}
// FILE: settings.gradle.kts
include("module1")
// FILE: module1/build.gradle.kts
plugins {
java
}
repositories {
mavenCentral()
}

View File

@@ -6,7 +6,7 @@ import org.jetbrains.kotlin.idea.base.test.InTextDirectivesUtils
class Directives {
private val directives = mutableMapOf<String, MutableList<String>?>()
private val directives: MutableMap<String, MutableList<String>?> = mutableMapOf<String, MutableList<String>?>()
operator fun contains(key: String): Boolean {
return key in directives