Add ability to render project of run configuration in tests

This commit is contained in:
Dmitry Savvinov
2020-02-17 18:07:20 +03:00
parent 51edf2b351
commit 1ea3db90e1
@@ -9,11 +9,17 @@ import com.intellij.codeInsight.daemon.LineMarkerInfo
import com.intellij.execution.PsiLocation import com.intellij.execution.PsiLocation
import com.intellij.execution.actions.ConfigurationContext import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.actions.ConfigurationFromContext import com.intellij.execution.actions.ConfigurationFromContext
import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.gradle.GradleDaemonAnalyzerTestCase import org.jetbrains.kotlin.gradle.GradleDaemonAnalyzerTestCase
import org.jetbrains.kotlin.gradle.checkFiles import org.jetbrains.kotlin.gradle.checkFiles
import org.jetbrains.kotlin.idea.run.KotlinGradleRunConfiguration import org.jetbrains.kotlin.idea.run.KotlinGradleRunConfiguration
import org.jetbrains.kotlin.test.TagsTestDataUtil import org.jetbrains.kotlin.test.TagsTestDataUtil
import org.junit.Test import org.junit.Test
import java.io.File
class GradleTestRunConfigurationAndHighlightingTest : GradleImportingTestCase() { class GradleTestRunConfigurationAndHighlightingTest : GradleImportingTestCase() {
@Test @Test
@@ -36,6 +42,11 @@ class GradleTestRunConfigurationAndHighlightingTest : GradleImportingTestCase()
doTest() doTest()
} }
@Test
fun testMultiprojectBuild() {
doTest()
}
private fun doTest() { private fun doTest() {
val files = importProjectFromTestData() val files = importProjectFromTestData()
val project = myTestFixture.project val project = myTestFixture.project
@@ -59,27 +70,67 @@ class GradleTestRunConfigurationAndHighlightingTest : GradleImportingTestCase()
val configFromContext = kotlinConfigsFromContext.single() // can we have more than one? val configFromContext = kotlinConfigsFromContext.single() // can we have more than one?
return "settings=\"${configFromContext.renderDescription().replace("\"", "\\\"")}\"" val tagsToRender = RunConfigurationsTags.getTagsToRender(lineMarkerInfo.element!!.containingFile)
return configFromContext.renderDescription(tagsToRender)
} }
} }
) )
} }
private fun ConfigurationFromContext.renderDescription(): String { private enum class RunConfigurationsTags {
PROJECT, SETTINGS;
companion object {
const val TAG_DIRECTIVE: String = "// !RENDER_TAGS: "
val DEFAULT_TAGS = listOf(SETTINGS)
fun getTagsToRender(file: PsiFile): List<RunConfigurationsTags> {
val tagDirectives = file.text.lines().filter { it.startsWith(RunConfigurationsTags.TAG_DIRECTIVE) }
return if (tagDirectives.isEmpty()) DEFAULT_TAGS else tagDirectives.single().parseTags()
}
// Expected format:
// !RENDER_TAGS: ENUM_VALUE_1, ENUM_VALUE_2, ...
private fun String.parseTags(): List<RunConfigurationsTags> =
removePrefix(TAG_DIRECTIVE).split(", ").map { valueOf(it) }
}
}
private fun ConfigurationFromContext.renderDescription(tagsToRender: List<RunConfigurationsTags>): String {
val configuration = configuration as KotlinGradleRunConfiguration val configuration = configuration as KotlinGradleRunConfiguration
val location = PsiLocation(sourceElement) val location = PsiLocation(sourceElement)
val context = ConfigurationContext.createEmptyContextForLocation(location) val context = ConfigurationContext.createEmptyContextForLocation(location)
var result: String? = null var settings: ExternalSystemTaskExecutionSettings? = null
// We can not use settings straight away, because exact settings are determined only after 'onFirstRun' // We can not use settings straight away, because exact settings are determined only after 'onFirstRun'
// (see MultiplatformTestTasksChooser) // (see MultiplatformTestTasksChooser)
onFirstRun(context) { onFirstRun(context) {
result = configuration.settings.toString() settings = configuration.settings
} }
return result!! val result = mutableListOf<Pair<String, String>>()
for (tag in tagsToRender) {
val renderedTagValue = when (tag) {
RunConfigurationsTags.PROJECT -> {
val currentProjectFile = File(settings!!.externalProjectPath)
val projectRoot = File(ExternalSystemApiUtil.getExternalRootProjectPath(context.module)!!)
val pathToCurrentProjectRelativeToRoot = currentProjectFile.relativeTo(projectRoot)
pathToCurrentProjectRelativeToRoot.toString()
}
RunConfigurationsTags.SETTINGS -> settings.toString()
}
result += tag.name.toLowerCase() to renderedTagValue
}
return result.joinToString { (tagName, tagValue) -> tagName + "=\"" + tagValue.replace("\"", "\\\"") + "\"" }
} }
private fun LineMarkerInfo<*>.extractConfigurationsFromContext(): List<ConfigurationFromContext> { private fun LineMarkerInfo<*>.extractConfigurationsFromContext(): List<ConfigurationFromContext> {
@@ -92,4 +143,8 @@ class GradleTestRunConfigurationAndHighlightingTest : GradleImportingTestCase()
} }
override fun testDataDirName(): String = "testRunConfigurations" override fun testDataDirName(): String = "testRunConfigurations"
companion object {
}
} }