Tests, Scripting: extend custom def test infra with gradle-like def

to be able to test gradle-like DSL
This commit is contained in:
Ilya Chernikov
2024-03-13 16:49:23 +01:00
committed by Space Team
parent 988edab7a0
commit 60e38d592c
6 changed files with 61 additions and 3 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
import org.jetbrains.kotlin.test.directives.model.StringDirective
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider
@@ -30,9 +31,15 @@ class ScriptWithCustomDefEnvironmentConfigurator(testServices: TestServices) : E
configuration.addJvmClasspathRoots(testScriptDefinitionClasspath) configuration.addJvmClasspathRoots(testScriptDefinitionClasspath)
val dirSplitRegex = Regex(" *, *") val dirSplitRegex = Regex(" *, *")
ScriptingTestDirectives.directivesToPassViaEnvironment.forEach { (directive, envName) -> ScriptingTestDirectives.directivesToPassViaEnvironment.forEach { (directive, envName) ->
module.directives[directive].flatMap { it.split(dirSplitRegex).filter { it.isNotEmpty() } }.let { if (directive is StringDirective) {
if (it.isNotEmpty()) { module.directives[directive].flatMap { it.split(dirSplitRegex).filter { it.isNotEmpty() } }.let {
configuration.put(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, envName, it) if (it.isNotEmpty()) {
configuration.put(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, envName, it)
}
}
} else {
if (directive in module.directives) {
configuration.put(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, envName, "true")
} }
} }
} }
@@ -10,10 +10,12 @@ import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
object ScriptingTestDirectives : SimpleDirectivesContainer() { object ScriptingTestDirectives : SimpleDirectivesContainer() {
val SCRIPT_DEFAULT_IMPORTS by stringDirective("Default imports", multiLine = true) val SCRIPT_DEFAULT_IMPORTS by stringDirective("Default imports", multiLine = true)
val SCRIPT_PROVIDED_PROPERTIES by stringDirective("Provided properties", multiLine = true) val SCRIPT_PROVIDED_PROPERTIES by stringDirective("Provided properties", multiLine = true)
val GRADLE_LIKE_SCRIPT by directive("Provided properties")
val directivesToPassViaEnvironment = val directivesToPassViaEnvironment =
listOf( listOf(
SCRIPT_DEFAULT_IMPORTS to "defaultImports", SCRIPT_DEFAULT_IMPORTS to "defaultImports",
SCRIPT_PROVIDED_PROPERTIES to "providedProperties", SCRIPT_PROVIDED_PROPERTIES to "providedProperties",
GRADLE_LIKE_SCRIPT to "gradleLikeScript",
) )
} }
@@ -7,8 +7,12 @@ package org.jetbrains.kotlin.scripting.test.definition
import kotlin.script.experimental.annotations.KotlinScript import kotlin.script.experimental.annotations.KotlinScript
import org.jetbrains.kotlin.scripting.definitions.getEnvironment import org.jetbrains.kotlin.scripting.definitions.getEnvironment
import org.jetbrains.kotlin.scripting.test.definition.gradleLike.CompiledKotlinBuildScript
import org.jetbrains.kotlin.scripting.test.definition.gradleLike.Project
import kotlin.script.experimental.api.* import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.ScriptingHostConfiguration import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
import kotlin.script.experimental.jvm.jvm
@Suppress("unused", "UNUSED_PARAMETER") @Suppress("unused", "UNUSED_PARAMETER")
@KotlinScript(fileExtension = "test.kts", compilationConfiguration = ConfigurableTestScriptConfiguration::class) @KotlinScript(fileExtension = "test.kts", compilationConfiguration = ConfigurableTestScriptConfiguration::class)
@@ -23,6 +27,15 @@ class ConfigurableTestScriptConfiguration : ScriptCompilationConfiguration(
if (env == null) makeFailureResult("Unable to retrieve environment for the custom test script") if (env == null) makeFailureResult("Unable to retrieve environment for the custom test script")
else else
ScriptCompilationConfiguration(ctx.compilationConfiguration) { ScriptCompilationConfiguration(ctx.compilationConfiguration) {
env["gradleLikeScript"]?.let {
@Suppress("UNCHECKED_CAST")
defaultImports("org.jetbrains.kotlin.scripting.test.definition.gradleLike.*")
jvm {
dependenciesFromCurrentContext(wholeClasspath = true)
}
baseClass(CompiledKotlinBuildScript::class)
implicitReceivers(Project::class)
}
env["defaultImports"]?.let { env["defaultImports"]?.let {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
defaultImports.append(it as List<String>) defaultImports.append(it as List<String>)
@@ -0,0 +1,9 @@
/*
* Copyright 2010-2024 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.scripting.test.definition.gradleLike;
public interface PluginAware {
}
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2024 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.scripting.test.definition.gradleLike
open class DefaultKotlinScript {
fun memberApi1(body: (Int) -> Int = { it }): Int = body(42)
}
open class CompiledKotlinBuildScript : DefaultKotlinScript(), PluginAware
class Project : PluginAware
@@ -0,0 +1,11 @@
/*
* Copyright 2010-2024 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.scripting.test.definition.gradleLike
@JvmOverloads
fun Project.projectApi(body: (Int) -> Int = { it }): Int = body(42)
fun staticApi(): Int = 42