Add test for script definitions settings

This commit is contained in:
Natalia Selezneva
2018-07-31 15:08:14 +03:00
parent 71e72ec6c2
commit c2315f065a
11 changed files with 198 additions and 8 deletions
@@ -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
}
@@ -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
)