diff --git a/ultimate/src/org/jetbrains/kotlin/idea/nodejs/KotlinMochaRunConfigurationProducer.kt b/ultimate/src/org/jetbrains/kotlin/idea/nodejs/KotlinMochaRunConfigurationProducer.kt index 47b996f8617..919c99926c6 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/nodejs/KotlinMochaRunConfigurationProducer.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/nodejs/KotlinMochaRunConfigurationProducer.kt @@ -3,7 +3,7 @@ package org.jetbrains.kotlin.idea.nodejs import com.intellij.execution.RunManager import com.intellij.execution.actions.ConfigurationContext 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.project.Project 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.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiDirectory 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.util.SmartList import com.intellij.util.containers.SmartHashSet import com.jetbrains.nodejs.mocha.MochaUtil 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.getJsOutputFilePath 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.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtNamedDeclaration @@ -33,7 +34,10 @@ import java.io.File class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() { private data class TestElementInfo(val runSettings: MochaRunSettings, val enclosingTestElement: PsiElement) - private data class TestElementPath(val suiteNames: List, val testName: String?) + private sealed class TestElementPath { + data class BySuite(val suiteNames: List, val testName: String?) : TestElementPath() + object BySingleFile : TestElementPath() + } // Copied from MochaRunConfigurationProducer.collectMochaTestRoots() private fun collectMochaTestRoots(project: Project): List { @@ -75,7 +79,11 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() { 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() ?: return null val klass = when (declaration) { is KtClassOrObject -> declaration @@ -88,7 +96,7 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() { .toList() .asReversed() val testName = (declaration as? KtNamedFunction)?.name - return TestElementPath(suiteNames, testName) + return TestElementPath.BySuite(suiteNames, testName) } private fun createTestElementRunInfo(element: PsiElement, originalSettings: MochaRunSettings): TestElementInfo? { @@ -101,19 +109,28 @@ class KotlinMochaRunConfigurationProducer : MochaRunConfigurationProducer() { originalSettings.builder().setWorkingDir(workingDir).build() } else originalSettings - val (suiteNames, testName) = createSuiteOrTestData(element) ?: return null + val testElementPath = createSuiteOrTestData(element, module) ?: return null val builder = settings.builder() builder.setTestFilePath(testFilePath) if (settings.ui.isEmpty()) { builder.setUi(MochaUtil.UI_BDD) } - if (testName == null) { - builder.setTestKind(MochaTestKind.SUITE) - builder.setSuiteNames(suiteNames) - } - else { - builder.setTestKind(MochaTestKind.TEST) - builder.setTestNames(suiteNames + testName) + when (testElementPath) { + is TestElementPath.BySuite -> { + val (suiteNames, testName) = testElementPath + if (testName == null) { + builder.setTestKind(MochaTestKind.SUITE) + builder.setSuiteNames(suiteNames) + } + else { + builder.setTestKind(MochaTestKind.TEST) + builder.setTestNames(suiteNames + testName) + } + } + + is TestElementPath.BySingleFile -> { + builder.setTestKind(MochaTestKind.TEST_FILE) + } } val nodeJsClasspath = getJsClasspath(module).joinToString(File.pathSeparator) {