Refactor, extract util in test code

This commit is contained in:
Pavel V. Talanov
2017-06-07 13:33:06 +03:00
parent 7949d3209b
commit 4356795324
8 changed files with 98 additions and 80 deletions
@@ -19,22 +19,16 @@ 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.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.idea.project.PluginJetFilesProvider
import org.jetbrains.kotlin.idea.stubs.AbstractMultiHighlightingTest import org.jetbrains.kotlin.idea.stubs.AbstractMultiHighlightingTest
import org.junit.Assert
abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTest() { abstract class AbstractMultiModuleHighlightingTest : AbstractMultiHighlightingTest() {
protected fun checkHighlightingInAllFiles(nameFilter: (fileName: String) -> Boolean = { true }) { protected fun checkHighlightingInAllFiles(
var atLeastOneFile = false shouldCheckFile: () -> Boolean = { !file.text.contains("// !CHECK_HIGHLIGHTING") }
PluginJetFilesProvider.allFilesInProject(myProject!!).forEach { file -> ) {
if (nameFilter(file.name) && !file.text.contains("// !CHECK_HIGHLIGHTING")) { checkFiles(shouldCheckFile) {
atLeastOneFile = true checkHighlighting(myEditor, true, false)
configureByExistingFile(file.virtualFile!!)
checkHighlighting(myEditor, true, false)
}
} }
Assert.assertTrue(atLeastOneFile)
} }
protected fun doMultiPlatformTest( protected fun doMultiPlatformTest(
@@ -16,20 +16,18 @@
package org.jetbrains.kotlin.idea.caches.resolve package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.openapi.command.WriteCommandAction
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.StdModuleTypes import com.intellij.openapi.module.StdModuleTypes
import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable
import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.testFramework.ModuleTestCase import com.intellij.testFramework.ModuleTestCase
import com.intellij.testFramework.UsefulTestCase import com.intellij.testFramework.UsefulTestCase
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.test.util.addDependency
import org.jetbrains.kotlin.test.util.jarRoot
import org.jetbrains.kotlin.test.util.projectLibrary
import org.junit.Assert import org.junit.Assert
import java.io.File
class IdeaModuleInfoTest : ModuleTestCase() { class IdeaModuleInfoTest : ModuleTestCase() {
@@ -304,12 +302,6 @@ class IdeaModuleInfoTest : ModuleTestCase() {
private val Library.classes: LibraryInfo private val Library.classes: LibraryInfo
get() = LibraryInfo(project!!, this) get() = LibraryInfo(project!!, this)
private fun Module.addDependency(
lib: Library,
dependencyScope: DependencyScope = DependencyScope.COMPILE,
exported: Boolean = false
) = ModuleRootModificationUtil.addDependency(this, lib, dependencyScope, exported)
private fun module(name: String): Module { private fun module(name: String): Module {
return createModuleFromTestData(createTempDirectory()!!.absolutePath, name, StdModuleTypes.JAVA, false)!! return createModuleFromTestData(createTempDirectory()!!.absolutePath, name, StdModuleTypes.JAVA, false)!!
} }
@@ -330,22 +322,9 @@ class IdeaModuleInfoTest : ModuleTestCase() {
UsefulTestCase.assertSameElements(this.getDependentModules(), expected.toList()) UsefulTestCase.assertSameElements(this.getDependentModules(), expected.toList())
} }
private fun projectLibrary(name: String = "lib", vararg roots: File): Library { private fun stdlibCommon(): Library = projectLibrary("kotlin-stdlib-common", ForTestCompileRuntime.stdlibCommonForTests().jarRoot)
val libraryTable = ProjectLibraryTable.getInstance(myProject)!!
return WriteCommandAction.runWriteCommandAction<Library>(myProject) {
libraryTable.createLibrary(name).apply {
for (root in roots) {
val model = modifiableModel
model.addRoot(VfsUtil.getUrlForLibraryRoot(root), OrderRootType.CLASSES)
model.commit()
}
}
}!!
}
private fun stdlibCommon(): Library = projectLibrary("kotlin-stdlib-common", ForTestCompileRuntime.stdlibCommonForTests()) private fun stdlibJvm(): Library = projectLibrary("kotlin-stdlib", ForTestCompileRuntime.runtimeJarForTests().jarRoot)
private fun stdlibJvm(): Library = projectLibrary("kotlin-stdlib", ForTestCompileRuntime.runtimeJarForTests()) private fun stdlibJs(): Library = projectLibrary("kotlin-stdlib-js", ForTestCompileRuntime.runtimeJarForTests().jarRoot)
private fun stdlibJs(): Library = projectLibrary("kotlin-stdlib-js", ForTestCompileRuntime.runtimeJarForTests())
} }
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.facet.FacetManager import com.intellij.facet.FacetManager
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.analyzer.ResolverForModuleComputationTracker import org.jetbrains.kotlin.analyzer.ResolverForModuleComputationTracker
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
@@ -32,16 +31,10 @@ import org.jetbrains.kotlin.idea.facet.KotlinFacetConfiguration
import org.jetbrains.kotlin.idea.facet.KotlinFacetType import org.jetbrains.kotlin.idea.facet.KotlinFacetType
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.test.KotlinTestUtils
open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() { open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/multiModuleHighlighting/" override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/multiModuleHighlighting/"
override fun setUp() {
super.setUp()
VfsRootAccess.allowRootAccess(KotlinTestUtils.getHomeDirectory())
}
fun testVisibility() { fun testVisibility() {
val module1 = module("m1") val module1 = module("m1")
val module2 = module("m2") val module2 = module("m2")
@@ -96,7 +89,7 @@ open class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
assertTrue(module2 !in resolversComputed) assertTrue(module2 !in resolversComputed)
assertTrue(module3 !in resolversComputed) assertTrue(module3 !in resolversComputed)
checkHighlightingInAllFiles { "m3" in it } checkHighlightingInAllFiles { "m3" in file.name }
assertTrue(module1 in resolversComputed) assertTrue(module1 in resolversComputed)
assertTrue(module2 !in resolversComputed) assertTrue(module2 !in resolversComputed)
@@ -18,13 +18,10 @@ package org.jetbrains.kotlin.idea.decompiler.navigation
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.StdModuleTypes import com.intellij.openapi.module.StdModuleTypes
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable
import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
@@ -37,6 +34,9 @@ import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir import org.jetbrains.kotlin.idea.util.projectStructure.getModuleDir
import org.jetbrains.kotlin.test.MockLibraryUtil import org.jetbrains.kotlin.test.MockLibraryUtil
import org.jetbrains.kotlin.test.testFramework.runWriteAction import org.jetbrains.kotlin.test.testFramework.runWriteAction
import org.jetbrains.kotlin.test.util.addDependency
import org.jetbrains.kotlin.test.util.jarRoot
import org.jetbrains.kotlin.test.util.projectLibrary
import org.junit.Assert import org.junit.Assert
import java.io.File import java.io.File
@@ -56,17 +56,8 @@ class NavigationWithMultipleCustomLibrariesTest : AbstractNavigationWithMultiple
val librarySrc = testDataPath + "libSrc" val librarySrc = testDataPath + "libSrc"
val libraryJar = MockLibraryUtil.compileLibraryToJar(librarySrc, libraryName, withSources, false, false) val libraryJar = MockLibraryUtil.compileLibraryToJar(librarySrc, libraryName, withSources, false, false)
val jarRoot = libraryJar.jarRoot() val jarRoot = libraryJar.jarRoot
return runWriteAction { return projectLibrary(libraryName, jarRoot, jarRoot.findChild("src").takeIf { withSources })
val library = ProjectLibraryTable.getInstance(project).createLibrary(libraryName)
val modifiableModel = library.modifiableModel
modifiableModel.addRoot(jarRoot, OrderRootType.CLASSES)
if (withSources) {
modifiableModel.addRoot(jarRoot.findChild("src")!!, OrderRootType.SOURCES)
}
modifiableModel.commit()
library
}
} }
} }
@@ -84,14 +75,14 @@ class NavigationWithMultipleRuntimesTest : AbstractNavigationWithMultipleLibrari
override fun createProjectLib(libraryName: String, withSources: Boolean): Library { override fun createProjectLib(libraryName: String, withSources: Boolean): Library {
val libraryJar = ForTestCompileRuntime.runtimeJarForTests().copyTo(File(createTempDirectory(), "$libraryName.jar")) val libraryJar = ForTestCompileRuntime.runtimeJarForTests().copyTo(File(createTempDirectory(), "$libraryName.jar"))
val jarUrl = libraryJar.jarRoot() val jarUrl = libraryJar.jarRoot
return runWriteAction { return runWriteAction {
val library = ProjectLibraryTable.getInstance(project).createLibrary(libraryName) val library = ProjectLibraryTable.getInstance(project).createLibrary(libraryName)
val modifiableModel = library.modifiableModel val modifiableModel = library.modifiableModel
modifiableModel.addRoot(jarUrl, OrderRootType.CLASSES) modifiableModel.addRoot(jarUrl, OrderRootType.CLASSES)
if (withSources) { if (withSources) {
val sourcesJar = ForTestCompileRuntime.runtimeSourcesJarForTests().copyTo(File(createTempDirectory(), "$libraryName-sources.jar")) val sourcesJar = ForTestCompileRuntime.runtimeSourcesJarForTests().copyTo(File(createTempDirectory(), "$libraryName-sources.jar"))
modifiableModel.addRoot(sourcesJar.jarRoot(), OrderRootType.SOURCES) modifiableModel.addRoot(sourcesJar.jarRoot, OrderRootType.SOURCES)
} }
modifiableModel.commit() modifiableModel.commit()
library library
@@ -108,8 +99,8 @@ abstract class AbstractNavigationWithMultipleLibrariesTest : ModuleTestCase() {
val moduleA = module("moduleA", srcPath) val moduleA = module("moduleA", srcPath)
val moduleB = module("moduleB", srcPath) val moduleB = module("moduleB", srcPath)
addDependencyOnProjectLibrary(moduleA, "libA", withSources) moduleA.addDependency(createProjectLib("libA", withSources))
addDependencyOnProjectLibrary(moduleB, "libB", withSources) moduleB.addDependency(createProjectLib("libB", withSources))
// navigation code works by providing first matching declaration from indices // navigation code works by providing first matching declaration from indices
// that's we need to check references in both modules to guard against possibility of code breaking // that's we need to check references in both modules to guard against possibility of code breaking
@@ -120,22 +111,18 @@ abstract class AbstractNavigationWithMultipleLibrariesTest : ModuleTestCase() {
private fun module(name: String, srcPath: String) = createModuleFromTestData(srcPath, name, StdModuleTypes.JAVA, true)!! private fun module(name: String, srcPath: String) = createModuleFromTestData(srcPath, name, StdModuleTypes.JAVA, true)!!
private fun checkReferencesInModule(moduleB: Module, libraryName: String, expectedFileName: String) { private fun checkReferencesInModule(module: Module, libraryName: String, expectedFileName: String) {
NavigationChecker.checkAnnotatedCode(findSourceFile(moduleB), File(testDataPath + expectedFileName)) { NavigationChecker.checkAnnotatedCode(findSourceFile(module), File(testDataPath + expectedFileName)) {
checkLibraryName(it, libraryName) checkLibraryName(it, libraryName)
} }
} }
private fun findSourceFile(moduleA: Module): PsiFile { private fun findSourceFile(module: Module): PsiFile {
val ioFile = File(moduleA.getModuleDir()).listFiles().first() val ioFile = File(module.getModuleDir()).listFiles().first()
val vFile = LocalFileSystem.getInstance().findFileByIoFile(ioFile)!! val vFile = LocalFileSystem.getInstance().findFileByIoFile(ioFile)!!
return PsiManager.getInstance(project).findFile(vFile)!! return PsiManager.getInstance(project).findFile(vFile)!!
} }
private fun addDependencyOnProjectLibrary(mainModule: Module, libraryName: String, withSources: Boolean) {
val library = createProjectLib(libraryName, withSources)
ModuleRootModificationUtil.addDependency(mainModule, library, DependencyScope.COMPILE, false)
}
abstract fun createProjectLib(libraryName: String, withSources: Boolean): Library abstract fun createProjectLib(libraryName: String, withSources: Boolean): Library
} }
@@ -151,5 +138,3 @@ private fun checkLibraryName(referenceTarget: PsiElement, expectedName: String)
} }
Assert.assertEquals("Referenced code from unrelated library: ${referenceTarget.text}", expectedName, libraryName) Assert.assertEquals("Referenced code from unrelated library: ${referenceTarget.text}", expectedName, libraryName)
} }
private fun File.jarRoot() = StandardFileSystems.getJarRootForLocalFile(LocalFileSystem.getInstance().findFileByIoFile(this)!!)!!
@@ -37,11 +37,6 @@ class KDocSampleTest : AbstractMultiModuleTest() {
override fun getTestDataPath() = "${PluginTestCaseBase.getTestDataPathBase()}/kdoc/multiModuleSamples/" override fun getTestDataPath() = "${PluginTestCaseBase.getTestDataPathBase()}/kdoc/multiModuleSamples/"
override fun setUp() {
VfsRootAccess.allowRootAccess(KotlinTestUtils.getHomeDirectory())
super.setUp()
}
fun testSimple() { fun testSimple() {
val code = module("code") val code = module("code")
@@ -58,5 +58,4 @@ abstract class AbstractMultiHighlightingTest : AbstractMultiModuleTest() {
} }
return infos return infos
} }
} }
@@ -29,21 +29,30 @@ import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEdito
import com.intellij.openapi.util.io.FileUtil 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.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
import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
import org.jetbrains.kotlin.idea.facet.initializeIfNeeded import org.jetbrains.kotlin.idea.facet.initializeIfNeeded
import org.jetbrains.kotlin.idea.project.PluginJetFilesProvider
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.test.KotlinTestUtils
import org.junit.Assert
import java.io.File import java.io.File
abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() { abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
abstract override fun getTestDataPath(): String abstract override fun getTestDataPath(): String
override fun setUp() {
super.setUp()
VfsRootAccess.allowRootAccess(KotlinTestUtils.getHomeDirectory())
}
protected fun module(name: String, hasTestRoot: Boolean = false, useFullJdk: Boolean = false): Module { protected fun module(name: String, hasTestRoot: Boolean = false, useFullJdk: Boolean = false): Module {
val srcDir = testDataPath + "${getTestName(true)}/$name" val srcDir = testDataPath + "${getTestName(true)}/$name"
val moduleWithSrcRootSet = createModuleFromTestData(srcDir, name, StdModuleTypes.JAVA, true)!! val moduleWithSrcRootSet = createModuleFromTestData(srcDir, name, StdModuleTypes.JAVA, true)!!
@@ -107,4 +116,16 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
additionalArguments += " -Xmulti-platform" additionalArguments += " -Xmulti-platform"
} }
} }
protected fun checkFiles(shouldCheckFile: () -> Boolean = { true }, check: () -> Unit) {
var atLeastOneFile = false
PluginJetFilesProvider.allFilesInProject(myProject!!).forEach { file ->
configureByExistingFile(file.virtualFile!!)
if (shouldCheckFile()) {
atLeastOneFile = true
check()
}
}
Assert.assertTrue(atLeastOneFile)
}
} }
@@ -0,0 +1,52 @@
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.test.util
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.DependencyScope
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.testFramework.PlatformTestCase
import org.jetbrains.kotlin.test.testFramework.runWriteAction
import java.io.File
fun PlatformTestCase.projectLibrary(
libraryName: String = "TestLibrary", classesRoot: VirtualFile? = null, sourcesRoot: VirtualFile? = null
): Library {
return runWriteAction {
ProjectLibraryTable.getInstance(project).createLibrary(libraryName).also {
with (it.modifiableModel) {
classesRoot?.let { addRoot(it, OrderRootType.CLASSES) }
sourcesRoot?.let { addRoot(it, OrderRootType.SOURCES) }
commit()
}
}
}
}
val File.jarRoot get() = StandardFileSystems.getJarRootForLocalFile(LocalFileSystem.getInstance().findFileByIoFile(this)!!)!!
fun Module.addDependency(
library: Library,
dependencyScope: DependencyScope = DependencyScope.COMPILE,
exported: Boolean = false
) = ModuleRootModificationUtil.addDependency(this, library, dependencyScope, exported)