Kotlin Ultimate: Support Mocha run configurations for module directory
#KT-16814 In Progress
This commit is contained in:
+31
-14
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user