From c2315f065a3d7de8e801613b2656f5c97d23b682 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Tue, 31 Jul 2018 15:08:14 +0300 Subject: [PATCH] Add test for script definitions settings --- .../kotlin/generators/tests/GenerateTests.kt | 5 ++ .../generators/tests/GenerateTests.kt.as31 | 5 ++ .../generators/tests/GenerateTests.kt.as32 | 5 ++ .../generators/tests/GenerateTests.kt.as33 | 5 ++ .../definition/order/reorder/script.kts | 4 ++ .../order/reorder/template/template.kt | 35 ++++++++++ .../definition/order/switchOff/script.kts | 4 ++ .../order/switchOff/template/template.kt | 35 ++++++++++ .../script/AbstractScriptConfigurationTest.kt | 65 +++++++++++++++++-- .../ScriptDefinitionsOrderTestGenerated.java | 41 ++++++++++++ .../TestScriptDefinitionContributors.kt | 2 +- 11 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 idea/testData/script/definition/order/reorder/script.kts create mode 100644 idea/testData/script/definition/order/reorder/template/template.kt create mode 100644 idea/testData/script/definition/order/switchOff/script.kts create mode 100644 idea/testData/script/definition/order/switchOff/template/template.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/script/ScriptDefinitionsOrderTestGenerated.java diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 7b3b4c9bdb0..31c8858eccd 100755 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -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) { model("script/definition/completion", extension = null, recursive = false) } + testClass { + model("script/definition/order", extension = null, recursive = false) + } + testClass { model("refactoring/nameSuggestionProvider") } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 index 3bf5e4c6166..1e0b291684f 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as31 @@ -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) { model("script/definition/completion", extension = null, recursive = false) } + testClass { + model("script/definition/order", extension = null, recursive = false) + } + testClass { model("refactoring/nameSuggestionProvider") } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 index 3bf5e4c6166..1e0b291684f 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as32 @@ -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) { model("script/definition/completion", extension = null, recursive = false) } + testClass { + model("script/definition/order", extension = null, recursive = false) + } + testClass { model("refactoring/nameSuggestionProvider") } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 index c1c881df81a..aee3556e831 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.as33 @@ -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) { model("script/definition/completion", extension = null, recursive = false) } + testClass { + model("script/definition/order", extension = null, recursive = false) + } + testClass { model("refactoring/nameSuggestionProvider") } diff --git a/idea/testData/script/definition/order/reorder/script.kts b/idea/testData/script/definition/order/reorder/script.kts new file mode 100644 index 00000000000..6765f44b900 --- /dev/null +++ b/idea/testData/script/definition/order/reorder/script.kts @@ -0,0 +1,4 @@ +val c = 3 + +// TEMPLATES: template-classes-names:custom.scriptDefinition.Template1,custom.scriptDefinition.Template2 +// SCRIPT DEFINITIONS: Template1:2; Template2:1 \ No newline at end of file diff --git a/idea/testData/script/definition/order/reorder/template/template.kt b/idea/testData/script/definition/order/reorder/template/template.kt new file mode 100644 index 00000000000..8627d6fec60 --- /dev/null +++ b/idea/testData/script/definition/order/reorder/template/template.kt @@ -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 = "" +} \ No newline at end of file diff --git a/idea/testData/script/definition/order/switchOff/script.kts b/idea/testData/script/definition/order/switchOff/script.kts new file mode 100644 index 00000000000..03a52f0cc14 --- /dev/null +++ b/idea/testData/script/definition/order/switchOff/script.kts @@ -0,0 +1,4 @@ +val c = 3 + +// TEMPLATES: template-classes-names:custom.scriptDefinition.Template1,custom.scriptDefinition.Template2 +// SCRIPT DEFINITIONS: Template1:off \ No newline at end of file diff --git a/idea/testData/script/definition/order/switchOff/template/template.kt b/idea/testData/script/definition/order/switchOff/template/template.kt new file mode 100644 index 00000000000..8627d6fec60 --- /dev/null +++ b/idea/testData/script/definition/order/switchOff/template/template.kt @@ -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 = "" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt index 4c9cf9af6c5..106fc0fe2c2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt @@ -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() { + override fun getExpectedExceptionClass(): Class = 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() 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 } diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/ScriptDefinitionsOrderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptDefinitionsOrderTestGenerated.java new file mode 100644 index 00000000000..c7326d6591d --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptDefinitionsOrderTestGenerated.java @@ -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/"); + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/TestScriptDefinitionContributors.kt b/idea/tests/org/jetbrains/kotlin/idea/script/TestScriptDefinitionContributors.kt index 907e5140248..d0b0f30ca98 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/script/TestScriptDefinitionContributors.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/script/TestScriptDefinitionContributors.kt @@ -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, templateClasspath = listOfNotNull(environment["template-classes"] as? File), environment = environment )