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.AbstractScriptConfigurationCompletionTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
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.AbstractSlicerLeafGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||||
@@ -766,6 +767,10 @@ fun main(args: Array<String>) {
|
|||||||
model("script/definition/completion", extension = null, recursive = false)
|
model("script/definition/completion", extension = null, recursive = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||||
|
model("script/definition/order", extension = null, recursive = false)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractNameSuggestionProviderTest> {
|
testClass<AbstractNameSuggestionProviderTest> {
|
||||||
model("refactoring/nameSuggestionProvider")
|
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.AbstractScriptConfigurationCompletionTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
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.AbstractSlicerLeafGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||||
@@ -755,6 +756,10 @@ fun main(args: Array<String>) {
|
|||||||
model("script/definition/completion", extension = null, recursive = false)
|
model("script/definition/completion", extension = null, recursive = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||||
|
model("script/definition/order", extension = null, recursive = false)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractNameSuggestionProviderTest> {
|
testClass<AbstractNameSuggestionProviderTest> {
|
||||||
model("refactoring/nameSuggestionProvider")
|
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.AbstractScriptConfigurationCompletionTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
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.AbstractSlicerLeafGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||||
@@ -755,6 +756,10 @@ fun main(args: Array<String>) {
|
|||||||
model("script/definition/completion", extension = null, recursive = false)
|
model("script/definition/completion", extension = null, recursive = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||||
|
model("script/definition/order", extension = null, recursive = false)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractNameSuggestionProviderTest> {
|
testClass<AbstractNameSuggestionProviderTest> {
|
||||||
model("refactoring/nameSuggestionProvider")
|
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.AbstractScriptConfigurationCompletionTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
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.AbstractSlicerLeafGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerNullnessGroupingTest
|
||||||
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
import org.jetbrains.kotlin.idea.slicer.AbstractSlicerTreeTest
|
||||||
@@ -747,6 +748,10 @@ fun main(args: Array<String>) {
|
|||||||
model("script/definition/completion", extension = null, recursive = false)
|
model("script/definition/completion", extension = null, recursive = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractScriptDefinitionsOrderTest> {
|
||||||
|
model("script/definition/order", extension = null, recursive = false)
|
||||||
|
}
|
||||||
|
|
||||||
testClass<AbstractNameSuggestionProviderTest> {
|
testClass<AbstractNameSuggestionProviderTest> {
|
||||||
model("refactoring/nameSuggestionProvider")
|
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.ScriptDefinitionsManager
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager.Companion.updateScriptDependenciesSynchronously
|
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.isScriptDependenciesUpdaterDisabled
|
||||||
|
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
|
||||||
import org.jetbrains.kotlin.idea.navigation.GotoCheck
|
import org.jetbrains.kotlin.idea.navigation.GotoCheck
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
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 useDefaultTemplate = "// DEPENDENCIES:"
|
||||||
|
private const val templatesSettings = "// TEMPLATES: "
|
||||||
// some bugs can only be reproduced when some module and script have intersecting library dependencies
|
// some bugs can only be reproduced when some module and script have intersecting library dependencies
|
||||||
private const val configureConflictingModule = "// CONFLICTING_MODULE"
|
private const val configureConflictingModule = "// CONFLICTING_MODULE"
|
||||||
|
|
||||||
@@ -205,15 +244,23 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() {
|
|||||||
val defaultEnvironment = defaultEnvironment(scriptFile.parent + File.separator)
|
val defaultEnvironment = defaultEnvironment(scriptFile.parent + File.separator)
|
||||||
val env = mutableMapOf<String, Any?>()
|
val env = mutableMapOf<String, Any?>()
|
||||||
scriptFile.forEachLine { line ->
|
scriptFile.forEachLine { line ->
|
||||||
line.trim().takeIf { useDefaultTemplate in it }?.substringAfter(useDefaultTemplate)?.split(";")?.forEach { entry ->
|
|
||||||
val (key, values) = entry.splitOrEmpty(":").map { it.trim() }
|
fun iterateKeysInLine(prefix: String) {
|
||||||
assert(key in validKeys) { "Unexpected key: $key" }
|
if (line.contains(prefix)) {
|
||||||
env[key] = values.split(",").map {
|
line.trim().substringAfter(prefix).split(";").forEach { entry ->
|
||||||
val str = it.trim()
|
val (key, values) = entry.splitOrEmpty(":").map { it.trim() }
|
||||||
defaultEnvironment[str] ?: str
|
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 {
|
switches.forEach {
|
||||||
if (it in line) {
|
if (it in line) {
|
||||||
env[it] = true
|
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)
|
env.putAll(defaultEnvironment)
|
||||||
return env
|
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 val id = "Test"
|
||||||
|
|
||||||
override fun getDefinitions() = loadDefinitionsFromTemplates(
|
override fun getDefinitions() = loadDefinitionsFromTemplates(
|
||||||
templateClassNames = listOf("custom.scriptDefinition.Template"),
|
templateClassNames = environment["template-classes-names"] as List<String>,
|
||||||
templateClasspath = listOfNotNull(environment["template-classes"] as? File),
|
templateClasspath = listOfNotNull(environment["template-classes"] as? File),
|
||||||
environment = environment
|
environment = environment
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user