Mpp tests: allow to test java code in highlighting and quickfix tests

This commit is contained in:
Pavel V. Talanov
2018-04-27 15:53:34 +02:00
committed by Pavel V. Talanov
parent 0157d7bd5d
commit 9e493d8b73
10 changed files with 72 additions and 39 deletions
@@ -22,7 +22,7 @@ import java.io.File
abstract class AbstractMultiPlatformCompletionTest : AbstractMultiModuleTest() { abstract class AbstractMultiPlatformCompletionTest : AbstractMultiModuleTest() {
protected fun doTest(testPath: String) { protected fun doTest(testPath: String) {
setupMppProjectFromDirStructure(File(testPath)) setupMppProjectFromDirStructure(File(testPath))
val file = project.findFileWithCaret() val file = project.findFileWithCaret() as KtFile
val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!! val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!!
val offset = doc.extractMarkerOffset(project) val offset = doc.extractMarkerOffset(project)
val editor = EditorFactory.getInstance().createEditor(doc, myProject)!! val editor = EditorFactory.getInstance().createEditor(doc, myProject)!!
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.test
import com.intellij.codeInsight.CodeInsightTestCase import com.intellij.codeInsight.CodeInsightTestCase
import com.intellij.codeInsight.daemon.impl.EditorTracker import com.intellij.codeInsight.daemon.impl.EditorTracker
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.ide.startup.impl.StartupManagerImpl import com.intellij.ide.startup.impl.StartupManagerImpl
import com.intellij.openapi.actionSystem.ActionPlaces import com.intellij.openapi.actionSystem.ActionPlaces
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
@@ -22,6 +23,7 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.ProjectScope import com.intellij.psi.search.ProjectScope
@@ -226,5 +228,14 @@ fun Project.allKotlinFiles(): List<KtFile> {
.filterIsInstance<KtFile>() .filterIsInstance<KtFile>()
} }
fun Project.allJavaFiles(): List<PsiJavaFile> {
val virtualFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, ProjectScope.getProjectScope(this))
return virtualFiles
.map { PsiManager.getInstance(this).findFile(it) }
.filterIsInstance<PsiJavaFile>()
}
fun Project.findFileWithCaret() = fun Project.findFileWithCaret() =
allKotlinFiles().single { "<caret>" in VfsUtilCore.loadText(it.virtualFile) } (allKotlinFiles() + allJavaFiles()).single {
"<caret>" in VfsUtilCore.loadText(it.virtualFile) && !it.virtualFile.name.endsWith(".after")
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.test
import com.intellij.codeInsight.CodeInsightTestCase import com.intellij.codeInsight.CodeInsightTestCase
import com.intellij.codeInsight.daemon.impl.EditorTracker import com.intellij.codeInsight.daemon.impl.EditorTracker
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.ide.startup.impl.StartupManagerImpl import com.intellij.ide.startup.impl.StartupManagerImpl
import com.intellij.openapi.actionSystem.ActionPlaces import com.intellij.openapi.actionSystem.ActionPlaces
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
@@ -22,6 +23,7 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.search.ProjectScope import com.intellij.psi.search.ProjectScope
@@ -227,5 +229,14 @@ fun Project.allKotlinFiles(): List<KtFile> {
.filterIsInstance<KtFile>() .filterIsInstance<KtFile>()
} }
fun Project.allJavaFiles(): List<PsiJavaFile> {
val virtualFiles = FileTypeIndex.getFiles(JavaFileType.INSTANCE, ProjectScope.getProjectScope(this))
return virtualFiles
.map { PsiManager.getInstance(this).findFile(it) }
.filterIsInstance<PsiJavaFile>()
}
fun Project.findFileWithCaret() = fun Project.findFileWithCaret() =
allKotlinFiles().single { "<caret>" in VfsUtilCore.loadText(it.virtualFile) } (allKotlinFiles() + allJavaFiles()).single {
"<caret>" in VfsUtilCore.loadText(it.virtualFile) && !it.virtualFile.name.endsWith(".after")
}
@@ -16,17 +16,20 @@
package org.jetbrains.kotlin.idea.caches.resolve package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure
import org.jetbrains.kotlin.idea.stubs.AbstractMultiHighlightingTest import org.jetbrains.kotlin.idea.stubs.AbstractMultiHighlightingTest
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.test.allJavaFiles
import org.jetbrains.kotlin.idea.test.allKotlinFiles
import java.io.File import java.io.File
abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTest() { abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTest() {
protected open fun checkHighlightingInAllFiles( protected open fun checkHighlightingInProject(
shouldCheckFile: () -> Boolean = { !file.text.contains("// !CHECK_HIGHLIGHTING") } findFiles: () -> List<PsiFile> = { project.allKotlinFiles().excludeByDirective() }
) { ) {
checkFiles(shouldCheckFile) { checkFiles(findFiles) {
checkHighlighting(myEditor, true, false) checkHighlighting(myEditor, true, false)
} }
} }
@@ -36,8 +39,12 @@ abstract class AbstractMultiPlatformHighlightingTest : AbstractMultiModuleHighli
protected open fun doTest(path: String) { protected open fun doTest(path: String) {
setupMppProjectFromDirStructure(File(path)) setupMppProjectFromDirStructure(File(path))
checkHighlightingInAllFiles() checkHighlightingInProject {
(project.allKotlinFiles() + project.allJavaFiles()).excludeByDirective()
}
} }
override fun getTestDataPath() = "${PluginTestCaseBase.getTestDataPathBase()}/multiModuleHighlighting/multiplatform/" override fun getTestDataPath() = "${PluginTestCaseBase.getTestDataPathBase()}/multiModuleHighlighting/multiplatform/"
} }
private fun List<PsiFile>.excludeByDirective() = filter { !it.text.contains("// !CHECK_HIGHLIGHTING") }
@@ -32,6 +32,6 @@ abstract class AbstractMultiModuleLineMarkerTest : AbstractMultiModuleHighlighti
protected fun doTest(path: String) { protected fun doTest(path: String) {
setupMppProjectFromDirStructure(File(path)) setupMppProjectFromDirStructure(File(path))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
} }
@@ -28,6 +28,6 @@ class Java8MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
module1.addDependency(module2) module1.addDependency(module2)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
} }
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.idea.caches.resolve package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.MockLibraryUtil import org.jetbrains.kotlin.test.MockLibraryUtil
@@ -30,7 +29,7 @@ class Java9MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testSimpleModuleExportsPackage() { fun testSimpleModuleExportsPackage() {
module("main").addDependency(module("dependency")) module("main").addDependency(module("dependency"))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testSimpleLibraryExportsPackage() { fun testSimpleLibraryExportsPackage() {
@@ -42,22 +41,22 @@ class Java9MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
) )
module("main").addLibrary(library, "library") module("main").addLibrary(library, "library")
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testNamedDependsOnUnnamed() { fun testNamedDependsOnUnnamed() {
module("main").addDependency(module("dependency")) module("main").addDependency(module("dependency"))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testUnnamedDependsOnNamed() { fun testUnnamedDependsOnNamed() {
module("main").addDependency(module("dependency")) module("main").addDependency(module("dependency"))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testDeclarationKinds() { fun testDeclarationKinds() {
module("main").addDependency(module("dependency")) module("main").addDependency(module("dependency"))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testExportsTo() { fun testExportsTo() {
@@ -65,17 +64,17 @@ class Java9MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
module("first").addDependency(d) module("first").addDependency(d)
module("second").addDependency(d) module("second").addDependency(d)
module("unnamed").addDependency(d) module("unnamed").addDependency(d)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testExportedPackageIsInaccessibleWithoutRequires() { fun testExportedPackageIsInaccessibleWithoutRequires() {
module("main").addDependency(module("dependency")) module("main").addDependency(module("dependency"))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testTypealiasToUnexported() { fun testTypealiasToUnexported() {
module("main").addDependency(module("dependency")) module("main").addDependency(module("dependency"))
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testCyclicDependency() { fun testCyclicDependency() {
@@ -83,6 +82,6 @@ class Java9MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
val b = module("moduleB") val b = module("moduleB")
val c = module("moduleC") val c = module("moduleC")
module("main").addDependency(a).addDependency(b).addDependency(c) module("main").addDependency(a).addDependency(b).addDependency(c)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
} }
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.framework.JSLibraryKind
import org.jetbrains.kotlin.idea.project.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.project.KotlinCodeBlockModificationListener
import org.jetbrains.kotlin.idea.project.KotlinModuleModificationTracker import org.jetbrains.kotlin.idea.project.KotlinModuleModificationTracker
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.test.allKotlinFiles
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.util.projectStructure.sdk import org.jetbrains.kotlin.idea.util.projectStructure.sdk
@@ -57,7 +58,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
module2.addDependency(module1) module2.addDependency(module1)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testDependency() { fun testDependency() {
@@ -76,7 +77,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
module4.addDependency(module2) module4.addDependency(module2)
module4.addDependency(module3) module4.addDependency(module3)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testLazyResolvers() { fun testLazyResolvers() {
@@ -94,7 +95,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
assertTrue(module2 !in tracker.moduleResolversComputed) assertTrue(module2 !in tracker.moduleResolversComputed)
assertTrue(module3 !in tracker.moduleResolversComputed) assertTrue(module3 !in tracker.moduleResolversComputed)
checkHighlightingInAllFiles { "m3" in file.name } checkHighlightingInProject { project.allKotlinFiles().filter { "m3" in it.name } }
assertTrue(module1 in tracker.moduleResolversComputed) assertTrue(module1 in tracker.moduleResolversComputed)
assertTrue(module2 !in tracker.moduleResolversComputed) assertTrue(module2 !in tracker.moduleResolversComputed)
@@ -129,7 +130,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
assertEquals(0, tracker.sdkResolversComputed.size) assertEquals(0, tracker.sdkResolversComputed.size)
checkHighlightingInAllFiles { "m2" in file.name } checkHighlightingInProject { project.allKotlinFiles().filter { "m2" in it.name } }
assertEquals(2, tracker.moduleResolversComputed.size) assertEquals(2, tracker.moduleResolversComputed.size)
@@ -156,14 +157,14 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
assertEquals(currentModCount, module2ModTracker.modificationCount) assertEquals(currentModCount, module2ModTracker.modificationCount)
assertEquals(currentModCount, module3ModTracker.modificationCount) assertEquals(currentModCount, module3ModTracker.modificationCount)
checkHighlightingInAllFiles { "m2" in file.name } checkHighlightingInProject { project.allKotlinFiles().filter { "m2" in it.name } }
assertEquals(0, tracker.sdkResolversComputed.size) assertEquals(0, tracker.sdkResolversComputed.size)
assertEquals(1, tracker.moduleResolversComputed.size) assertEquals(1, tracker.moduleResolversComputed.size)
tracker.moduleResolversComputed.clear() tracker.moduleResolversComputed.clear()
(PsiModificationTracker.SERVICE.getInstance(myProject) as PsiModificationTrackerImpl).incOutOfCodeBlockModificationCounter() (PsiModificationTracker.SERVICE.getInstance(myProject) as PsiModificationTrackerImpl).incOutOfCodeBlockModificationCounter()
checkHighlightingInAllFiles { "m2" in file.name } checkHighlightingInProject { project.allKotlinFiles().filter { "m2" in it.name } }
assertEquals(0, tracker.sdkResolversComputed.size) assertEquals(0, tracker.sdkResolversComputed.size)
assertEquals(2, tracker.moduleResolversComputed.size) assertEquals(2, tracker.moduleResolversComputed.size)
} }
@@ -178,7 +179,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
module3.addDependency(module2, dependencyScope = DependencyScope.TEST) module3.addDependency(module2, dependencyScope = DependencyScope.TEST)
module2.addDependency(module1, dependencyScope = DependencyScope.COMPILE) module2.addDependency(module1, dependencyScope = DependencyScope.COMPILE)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testLanguageVersionsViaFacets() { fun testLanguageVersionsViaFacets() {
@@ -192,7 +193,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
m1.addDependency(m2) m1.addDependency(m2)
m2.addDependency(m1) m2.addDependency(m1)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testSamWithReceiverExtension() { fun testSamWithReceiverExtension() {
@@ -210,7 +211,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
module1.addDependency(module2) module1.addDependency(module2)
module2.addDependency(module1) module2.addDependency(module1)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testJvmExperimentalLibrary() { fun testJvmExperimentalLibrary() {
@@ -221,8 +222,9 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
"-Xexperimental=lib.ExperimentalAPI" "-Xexperimental=lib.ExperimentalAPI"
) )
) )
module("usage").addLibrary(lib) module("usage").addLibrary(lib)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
fun testJsExperimentalLibrary() { fun testJsExperimentalLibrary() {
@@ -233,8 +235,9 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
"-Xexperimental=lib.ExperimentalAPI" "-Xexperimental=lib.ExperimentalAPI"
) )
) )
module("usage").addLibrary(lib, kind = JSLibraryKind) module("usage").addLibrary(lib, kind = JSLibraryKind)
checkHighlightingInAllFiles() checkHighlightingInProject()
} }
private fun Module.setupKotlinFacet(configure: KotlinFacetConfiguration.() -> Unit) = apply { private fun Module.setupKotlinFacet(configure: KotlinFacetConfiguration.() -> Unit) = apply {
@@ -20,6 +20,7 @@ import com.intellij.ide.util.gotoByName.GotoSymbolModel2
import com.intellij.openapi.module.StdModuleTypes import com.intellij.openapi.module.StdModuleTypes
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.test.allKotlinFiles
import org.jetbrains.kotlin.test.MockLibraryUtil import org.jetbrains.kotlin.test.MockLibraryUtil
import org.jetbrains.kotlin.test.util.addDependency import org.jetbrains.kotlin.test.util.addDependency
import org.jetbrains.kotlin.test.util.jarRoot import org.jetbrains.kotlin.test.util.jarRoot
@@ -63,7 +64,7 @@ class GotoWithMultipleLibrariesTest : AbstractMultiModuleTest() {
module("m${++i}", srcPath).addDependency(projectLibrary("libB", jarRoot, jarRoot.findChild("src")!!)) module("m${++i}", srcPath).addDependency(projectLibrary("libB", jarRoot, jarRoot.findChild("src")!!))
} }
checkFiles { checkFiles({ project.allKotlinFiles() }) {
GotoCheck.checkGotoDirectives(GotoSymbolModel2(project), editor, nonProjectSymbols = true, checkNavigation = true) GotoCheck.checkGotoDirectives(GotoSymbolModel2(project), editor, nonProjectSymbols = true, checkNavigation = true)
} }
} }
@@ -21,6 +21,7 @@ import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
import com.intellij.psi.PsiFile
import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.PsiTestUtil
import org.jetbrains.kotlin.config.CompilerSettings import org.jetbrains.kotlin.config.CompilerSettings
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
@@ -31,7 +32,6 @@ import org.jetbrains.kotlin.idea.facet.initializeIfNeeded
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
import org.jetbrains.kotlin.idea.test.KotlinJdkAndLibraryProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinJdkAndLibraryProjectDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.test.allKotlinFiles
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.TestJdkKind
import org.junit.Assert import org.junit.Assert
@@ -111,14 +111,15 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
facetSettings.coroutineSupport = LanguageFeature.State.ENABLED facetSettings.coroutineSupport = LanguageFeature.State.ENABLED
} }
protected fun checkFiles(shouldCheckFile: () -> Boolean = { true }, check: () -> Unit) { protected fun checkFiles(
findFiles: () -> List<PsiFile>,
check: () -> Unit
) {
var atLeastOneFile = false var atLeastOneFile = false
myProject.allKotlinFiles().forEach { file -> findFiles().forEach { file ->
configureByExistingFile(file.virtualFile!!) configureByExistingFile(file.virtualFile!!)
if (shouldCheckFile()) { atLeastOneFile = true
atLeastOneFile = true check()
check()
}
} }
Assert.assertTrue(atLeastOneFile) Assert.assertTrue(atLeastOneFile)
} }