Kotlin Ultimate: Support Mocha run configurations for module directory

#KT-16814 In Progress
This commit is contained in:
Alexey Sedunov
2017-09-07 04:33:24 +03:00
parent 8b64a4c8ea
commit 8ebc766b5b
@@ -3,7 +3,7 @@ package org.jetbrains.kotlin.idea.nodejs
import com.intellij.execution.RunManager import com.intellij.execution.RunManager
import com.intellij.execution.actions.ConfigurationContext import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.configuration.EnvironmentVariablesData import com.intellij.execution.configuration.EnvironmentVariablesData
import com.intellij.lang.javascript.ecmascript6.TypeScriptUtil import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Ref import com.intellij.openapi.util.Ref
@@ -11,17 +11,18 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.impl.file.PsiJavaDirectoryImpl
import com.intellij.psi.util.PsiUtilCore import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.SmartList import com.intellij.util.SmartList
import com.intellij.util.containers.SmartHashSet import com.intellij.util.containers.SmartHashSet
import com.jetbrains.nodejs.mocha.MochaUtil import com.jetbrains.nodejs.mocha.MochaUtil
import com.jetbrains.nodejs.mocha.execution.* import com.jetbrains.nodejs.mocha.execution.*
import com.jetbrains.nodejs.util.NodeJsCoffeeUtil
import org.jetbrains.kotlin.idea.js.getJsClasspath import org.jetbrains.kotlin.idea.js.getJsClasspath
import org.jetbrains.kotlin.idea.js.getJsOutputFilePath import org.jetbrains.kotlin.idea.js.getJsOutputFilePath
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir
import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.js.resolve.JsPlatform
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
@@ -33,7 +34,10 @@ import java.io.File
class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() { class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() {
private data class TestElementInfo(val runSettings: MochaRunSettings, val enclosingTestElement: PsiElement) private data class TestElementInfo(val runSettings: MochaRunSettings, val enclosingTestElement: PsiElement)
private data class TestElementPath(val suiteNames: List<String>, val testName: String?) private sealed class TestElementPath {
data class BySuite(val suiteNames: List<String>, val testName: String?) : TestElementPath()
object BySingleFile : TestElementPath()
}
// Copied from MochaRunConfigurationProducer.collectMochaTestRoots() // Copied from MochaRunConfigurationProducer.collectMochaTestRoots()
private fun collectMochaTestRoots(project: Project): List<VirtualFile> { private fun collectMochaTestRoots(project: Project): List<VirtualFile> {
@@ -75,7 +79,11 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() {
return VfsUtilCore.isUnder(file, dirs) return VfsUtilCore.isUnder(file, dirs)
} }
private fun createSuiteOrTestData(element: PsiElement): TestElementPath? { private fun createSuiteOrTestData(element: PsiElement, module: Module): TestElementPath? {
if (element is PsiDirectory && module.getModuleDir() == (element as PsiJavaDirectoryImpl).virtualFile.path) {
return TestElementPath.BySingleFile
}
val declaration = element.getNonStrictParentOfType<KtNamedDeclaration>() ?: return null val declaration = element.getNonStrictParentOfType<KtNamedDeclaration>() ?: return null
val klass = when (declaration) { val klass = when (declaration) {
is KtClassOrObject -> declaration is KtClassOrObject -> declaration
@@ -88,7 +96,7 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() {
.toList() .toList()
.asReversed() .asReversed()
val testName = (declaration as? KtNamedFunction)?.name val testName = (declaration as? KtNamedFunction)?.name
return TestElementPath(suiteNames, testName) return TestElementPath.BySuite(suiteNames, testName)
} }
private fun createTestElementRunInfo(element: PsiElement, originalSettings: MochaRunSettings): TestElementInfo? { private fun createTestElementRunInfo(element: PsiElement, originalSettings: MochaRunSettings): TestElementInfo? {
@@ -101,19 +109,28 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() {
originalSettings.builder().setWorkingDir(workingDir).build() originalSettings.builder().setWorkingDir(workingDir).build()
} }
else originalSettings else originalSettings
val (suiteNames, testName) = createSuiteOrTestData(element) ?: return null val testElementPath = createSuiteOrTestData(element, module) ?: return null
val builder = settings.builder() val builder = settings.builder()
builder.setTestFilePath(testFilePath) builder.setTestFilePath(testFilePath)
if (settings.ui.isEmpty()) { if (settings.ui.isEmpty()) {
builder.setUi(MochaUtil.UI_BDD) builder.setUi(MochaUtil.UI_BDD)
} }
if (testName == null) { when (testElementPath) {
builder.setTestKind(MochaTestKind.SUITE) is TestElementPath.BySuite -> {
builder.setSuiteNames(suiteNames) val (suiteNames, testName) = testElementPath
} if (testName == null) {
else { builder.setTestKind(MochaTestKind.SUITE)
builder.setTestKind(MochaTestKind.TEST) builder.setSuiteNames(suiteNames)
builder.setTestNames(suiteNames + testName) }
else {
builder.setTestKind(MochaTestKind.TEST)
builder.setTestNames(suiteNames + testName)
}
}
is TestElementPath.BySingleFile -> {
builder.setTestKind(MochaTestKind.TEST_FILE)
}
} }
val nodeJsClasspath = getJsClasspath(module).joinToString(File.pathSeparator) { val nodeJsClasspath = getJsClasspath(module).joinToString(File.pathSeparator) {