Add test for script definitions settings
This commit is contained in:
@@ -133,6 +133,7 @@ import org.jetbrains.kotlin.idea.scratch.AbstractScratchRunActionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationCompletionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptDefinitionsOrderTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerLeafGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||
@@ -766,6 +767,10 @@ fun main(args: Array<String>) {
|
||||
model("script/definition/completion", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||
model("script/definition/order", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractNameSuggestionProviderTest> {
|
||||
model("refactoring/nameSuggestionProvider")
|
||||
}
|
||||
|
||||
@@ -132,6 +132,7 @@ import org.jetbrains.kotlin.idea.scratch.AbstractScratchRunActionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationCompletionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptDefinitionsOrderTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerLeafGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||
@@ -755,6 +756,10 @@ fun main(args: Array<String>) {
|
||||
model("script/definition/completion", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||
model("script/definition/order", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractNameSuggestionProviderTest> {
|
||||
model("refactoring/nameSuggestionProvider")
|
||||
}
|
||||
|
||||
@@ -132,6 +132,7 @@ import org.jetbrains.kotlin.idea.scratch.AbstractScratchRunActionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationCompletionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptDefinitionsOrderTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerLeafGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||
@@ -755,6 +756,10 @@ fun main(args: Array<String>) {
|
||||
model("script/definition/completion", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||
model("script/definition/order", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractNameSuggestionProviderTest> {
|
||||
model("refactoring/nameSuggestionProvider")
|
||||
}
|
||||
|
||||
@@ -124,6 +124,7 @@ import org.jetbrains.kotlin.idea.scratch.AbstractScratchRunActionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationCompletionTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
||||
import org.jetbrains.kotlin.idea.script.AbstractScriptDefinitionsOrderTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerLeafGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||
@@ -747,6 +748,10 @@ fun main(args: Array<String>) {
|
||||
model("script/definition/completion", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||
model("script/definition/order", extension = null, recursive = false)
|
||||
}
|
||||
|
||||
testClass<AbstractNameSuggestionProviderTest> {
|
||||
model("refactoring/nameSuggestionProvider")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
val c = 3
|
||||
|
||||
// TEMPLATES: template-classes-names:custom.scriptDefinition.Template1,custom.scriptDefinition.Template2
|
||||
// SCRIPT DEFINITIONS: Template1:2; Template2:1
|
||||
@@ -0,0 +1,35 @@
|
||||
package custom.scriptDefinition
|
||||
|
||||
import java.io.File
|
||||
import kotlin.script.dependencies.*
|
||||
import kotlin.script.experimental.dependencies.*
|
||||
import kotlin.script.templates.ScriptTemplateDefinition
|
||||
|
||||
class SuccessDependenciesResolver : DependenciesResolver {
|
||||
override fun resolve(
|
||||
scriptContents: ScriptContents,
|
||||
environment: Environment
|
||||
): DependenciesResolver.ResolveResult {
|
||||
return ScriptDependencies.Empty.asSuccess()
|
||||
}
|
||||
}
|
||||
|
||||
class ErrorDependenciesResolver : DependenciesResolver {
|
||||
override fun resolve(
|
||||
scriptContents: ScriptContents,
|
||||
environment: Environment
|
||||
): DependenciesResolver.ResolveResult {
|
||||
return DependenciesResolver.ResolveResult.Failure(ScriptReport("Error"))
|
||||
}
|
||||
}
|
||||
|
||||
@ScriptTemplateDefinition(ErrorDependenciesResolver::class, scriptFilePattern = "script.kts")
|
||||
open class Template1: Base()
|
||||
|
||||
@ScriptTemplateDefinition(SuccessDependenciesResolver::class, scriptFilePattern = "script.kts")
|
||||
open class Template2: Base()
|
||||
|
||||
open class Base {
|
||||
val i = 3
|
||||
val str = ""
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
val c = 3
|
||||
|
||||
// TEMPLATES: template-classes-names:custom.scriptDefinition.Template1,custom.scriptDefinition.Template2
|
||||
// SCRIPT DEFINITIONS: Template1:off
|
||||
@@ -0,0 +1,35 @@
|
||||
package custom.scriptDefinition
|
||||
|
||||
import java.io.File
|
||||
import kotlin.script.dependencies.*
|
||||
import kotlin.script.experimental.dependencies.*
|
||||
import kotlin.script.templates.ScriptTemplateDefinition
|
||||
|
||||
class SuccessDependenciesResolver : DependenciesResolver {
|
||||
override fun resolve(
|
||||
scriptContents: ScriptContents,
|
||||
environment: Environment
|
||||
): DependenciesResolver.ResolveResult {
|
||||
return ScriptDependencies.Empty.asSuccess()
|
||||
}
|
||||
}
|
||||
|
||||
class ErrorDependenciesResolver : DependenciesResolver {
|
||||
override fun resolve(
|
||||
scriptContents: ScriptContents,
|
||||
environment: Environment
|
||||
): DependenciesResolver.ResolveResult {
|
||||
return DependenciesResolver.ResolveResult.Failure(ScriptReport("Error"))
|
||||
}
|
||||
}
|
||||
|
||||
@ScriptTemplateDefinition(ErrorDependenciesResolver::class, scriptFilePattern = "script.kts")
|
||||
open class Template1: Base()
|
||||
|
||||
@ScriptTemplateDefinition(SuccessDependenciesResolver::class, scriptFilePattern = "script.kts")
|
||||
open class Template2: Base()
|
||||
|
||||
open class Base {
|
||||
val i = 3
|
||||
val str = ""
|
||||
}
|
||||
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager.Companion.updateScriptDependenciesSynchronously
|
||||
import org.jetbrains.kotlin.idea.core.script.isScriptDependenciesUpdaterDisabled
|
||||
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
||||
import org.jetbrains.kotlin.idea.navigation.GotoCheck
|
||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||
@@ -106,8 +107,46 @@ abstract class AbstractScriptConfigurationNavigationTest : AbstractScriptConfigu
|
||||
}
|
||||
}
|
||||
|
||||
private val validKeys = setOf("sources", "classpath", "imports")
|
||||
|
||||
abstract class AbstractScriptDefinitionsOrderTest : AbstractScriptConfigurationTest() {
|
||||
fun doTest(path: String) {
|
||||
configureScriptFile(path)
|
||||
|
||||
assertException(object : AbstractExceptionCase<ComparisonFailure>() {
|
||||
override fun getExpectedExceptionClass(): Class<ComparisonFailure> = ComparisonFailure::class.java
|
||||
|
||||
override fun tryClosure() {
|
||||
checkHighlighting(editor, false, false)
|
||||
}
|
||||
})
|
||||
|
||||
val definitions = InTextDirectivesUtils
|
||||
.findStringWithPrefixes(myFile.text, "// SCRIPT DEFINITIONS: ")
|
||||
?.split(";")
|
||||
?.map { it.substringBefore(":").trim() to it.substringAfter(":").trim() }
|
||||
?: error("SCRIPT DEFINITIONS directive should be defined")
|
||||
|
||||
val allDefinitions = ScriptDefinitionsManager.getInstance(project).getAllDefinitions()
|
||||
for ((definitionName, action) in definitions) {
|
||||
val scriptDefinition = allDefinitions
|
||||
.find { it.name == definitionName }
|
||||
?: error("Unknown script definition name in SCRIPT DEFINITIONS directive: name=$definitionName, all={${allDefinitions.joinToString { it.name }}}")
|
||||
when (action) {
|
||||
"off" -> KotlinScriptingSettings.getInstance(project).setEnabled(scriptDefinition, false)
|
||||
else -> KotlinScriptingSettings.getInstance(project).setOrder(scriptDefinition, action.toInt())
|
||||
}
|
||||
}
|
||||
|
||||
ScriptDefinitionsManager.getInstance(project).reorderScriptDefinitions()
|
||||
updateScriptDependenciesSynchronously(myFile.virtualFile, project)
|
||||
|
||||
checkHighlighting(editor, false, false)
|
||||
}
|
||||
}
|
||||
|
||||
private val validKeys = setOf("sources", "classpath", "imports", "template-classes-names")
|
||||
private const val useDefaultTemplate = "// DEPENDENCIES:"
|
||||
private const val templatesSettings = "// TEMPLATES: "
|
||||
// some bugs can only be reproduced when some module and script have intersecting library dependencies
|
||||
private const val configureConflictingModule = "// CONFLICTING_MODULE"
|
||||
|
||||
@@ -205,15 +244,23 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() {
|
||||
val defaultEnvironment = defaultEnvironment(scriptFile.parent + File.separator)
|
||||
val env = mutableMapOf<String, Any?>()
|
||||
scriptFile.forEachLine { line ->
|
||||
line.trim().takeIf { useDefaultTemplate in it }?.substringAfter(useDefaultTemplate)?.split(";")?.forEach { entry ->
|
||||
val (key, values) = entry.splitOrEmpty(":").map { it.trim() }
|
||||
assert(key in validKeys) { "Unexpected key: $key" }
|
||||
env[key] = values.split(",").map {
|
||||
val str = it.trim()
|
||||
defaultEnvironment[str] ?: str
|
||||
|
||||
fun iterateKeysInLine(prefix: String) {
|
||||
if (line.contains(prefix)) {
|
||||
line.trim().substringAfter(prefix).split(";").forEach { entry ->
|
||||
val (key, values) = entry.splitOrEmpty(":").map { it.trim() }
|
||||
assert(key in validKeys) { "Unexpected key: $key" }
|
||||
env[key] = values.split(",").map {
|
||||
val str = it.trim()
|
||||
defaultEnvironment[str] ?: str
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
iterateKeysInLine(useDefaultTemplate)
|
||||
iterateKeysInLine(templatesSettings)
|
||||
|
||||
switches.forEach {
|
||||
if (it in line) {
|
||||
env[it] = true
|
||||
@@ -221,6 +268,10 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() {
|
||||
}
|
||||
}
|
||||
|
||||
if (env[useDefaultTemplate] != true && env["template-classes-names"] == null) {
|
||||
env["template-classes-names"] = listOf("custom.scriptDefinition.Template")
|
||||
}
|
||||
|
||||
env.putAll(defaultEnvironment)
|
||||
return env
|
||||
}
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. 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.script;
|
||||
|
||||
import com.intellij.testFramework.TestDataPath;
|
||||
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
||||
import org.jetbrains.kotlin.test.TargetBackend;
|
||||
import org.jetbrains.kotlin.test.TestMetadata;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||
@SuppressWarnings("all")
|
||||
@TestMetadata("idea/testData/script/definition/order")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public class ScriptDefinitionsOrderTestGenerated extends AbstractScriptDefinitionsOrderTest {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInOrder() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/script/definition/order"), Pattern.compile("^([^\\.]+)$"), TargetBackend.ANY, false);
|
||||
}
|
||||
|
||||
@TestMetadata("reorder")
|
||||
public void testReorder() throws Exception {
|
||||
runTest("idea/testData/script/definition/order/reorder/");
|
||||
}
|
||||
|
||||
@TestMetadata("switchOff")
|
||||
public void testSwitchOff() throws Exception {
|
||||
runTest("idea/testData/script/definition/order/switchOff/");
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ class CustomScriptTemplateProvider(
|
||||
override val id = "Test"
|
||||
|
||||
override fun getDefinitions() = loadDefinitionsFromTemplates(
|
||||
templateClassNames = listOf("custom.scriptDefinition.Template"),
|
||||
templateClassNames = environment["template-classes-names"] as List<String>,
|
||||
templateClasspath = listOfNotNull(environment["template-classes"] as? File),
|
||||
environment = environment
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user