Convert MultiFileIntentionTest to light fixture test case

This commit is contained in:
Dmitry Jemerov
2017-03-27 19:44:34 +02:00
parent de58786fcc
commit f13c1b8d87
@@ -19,86 +19,86 @@ package org.jetbrains.kotlin.idea.intentions
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.google.gson.JsonParser import com.google.gson.JsonParser
import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.EditorFactory
import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.fileEditor.impl.LoadTextUtil
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.VirtualFile
import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiManager
import com.intellij.refactoring.util.CommonRefactoringUtil import com.intellij.refactoring.util.CommonRefactoringUtil
import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.PlatformTestUtil
import com.intellij.testFramework.UsefulTestCase
import junit.framework.TestCase import junit.framework.TestCase
import org.jetbrains.kotlin.idea.jsonUtils.getNullableString import org.jetbrains.kotlin.idea.jsonUtils.getNullableString
import org.jetbrains.kotlin.idea.jsonUtils.getString import org.jetbrains.kotlin.idea.jsonUtils.getString
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.extractMarkerOffset
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.Assert import org.junit.Assert
import java.io.File import java.io.File
abstract class AbstractMultiFileIntentionTest : KotlinMultiFileTestCase() { abstract class AbstractMultiFileIntentionTest : KotlinLightCodeInsightFixtureTestCase() {
override fun getProjectDescriptor(): LightProjectDescriptor {
if (KotlinTestUtils.isAllFilesPresentTest(getTestName(false))) return super.getProjectDescriptor()
val testFile = File(testDataPath, fileName())
val config = JsonParser().parse(FileUtil.loadFile(testFile, true)) as JsonObject
val withRuntime = config["withRuntime"]?.asBoolean ?: false
return if (withRuntime)
KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
else
KotlinLightProjectDescriptor.INSTANCE
}
protected fun doTest(path: String) { protected fun doTest(path: String) {
val config = JsonParser().parse(FileUtil.loadFile(File(path), true)) as JsonObject val testFile = File(path)
val config = JsonParser().parse(FileUtil.loadFile(testFile, true)) as JsonObject
val mainFilePath = config.getString("mainFile") val mainFilePath = config.getString("mainFile")
val intentionAction = Class.forName(config.getString("intentionClass")).newInstance() as IntentionAction val intentionAction = Class.forName(config.getString("intentionClass")).newInstance() as IntentionAction
val isApplicableExpected = config["isApplicable"]?.asBoolean ?: true val isApplicableExpected = config["isApplicable"]?.asBoolean ?: true
val withRuntime = config["withRuntime"]?.asBoolean ?: false doTest(path) { rootDir ->
if (withRuntime) { val mainFile = myFixture.configureFromTempProjectFile(mainFilePath)
ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk()) val conflictFile = rootDir.findFileByRelativePath("$mainFilePath.conflicts")
}
doTest({ rootDir, _ -> try {
val mainFile = rootDir.findFileByRelativePath(mainFilePath)!! Assert.assertTrue("isAvailable() for ${intentionAction::class.java} should return $isApplicableExpected",
val conflictFile = rootDir.findFileByRelativePath("$mainFilePath.conflicts") isApplicableExpected == intentionAction.isAvailable(project, editor, mainFile))
val document = FileDocumentManager.getInstance().getDocument(mainFile)!! config.getNullableString("intentionText")?.let {
val editor = EditorFactory.getInstance()!!.createEditor(document, project!!)!! TestCase.assertEquals("Intention text mismatch", it, intentionAction.text)
editor.caretModel.moveToOffset(document.extractMarkerOffset(project)) }
val mainPsiFile = PsiManager.getInstance(project!!).findFile(mainFile)!!
try { if (isApplicableExpected) {
Assert.assertTrue("isAvailable() for ${intentionAction::class.java} should return $isApplicableExpected", project.executeWriteCommand(intentionAction.text) {
isApplicableExpected == intentionAction.isAvailable(project, editor, mainPsiFile)) intentionAction.invoke(project, editor, mainFile)
config.getNullableString("intentionText")?.let { }
TestCase.assertEquals("Intention text mismatch", it, intentionAction.text) }
}
if (isApplicableExpected) { assert(conflictFile == null) { "Conflict file $conflictFile should not exist" }
project.executeWriteCommand(intentionAction.text) { }
intentionAction.invoke(project, editor, mainPsiFile) catch (e: CommonRefactoringUtil.RefactoringErrorHintException) {
} val expectedConflicts = LoadTextUtil.loadText(conflictFile!!).toString().trim()
} assertEquals(expectedConflicts, e.message)
}
assert(conflictFile == null) { "Conflict file $conflictFile should not exist" } }
}
catch (e: CommonRefactoringUtil.RefactoringErrorHintException) {
KotlinTestUtils.assertEqualsToFile(File(conflictFile!!.path), e.message!!)
}
finally {
PsiDocumentManager.getInstance(project!!).commitAllDocuments()
FileDocumentManager.getInstance().saveAllDocuments()
EditorFactory.getInstance()!!.releaseEditor(editor)
if (withRuntime) {
ConfigLibraryUtil.unConfigureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk())
}
}
},
getTestDirName(true))
} }
protected fun getTestDirName(lowercaseFirstLetter : Boolean) : String { protected fun doTest(path: String, action: (VirtualFile) -> Unit) {
val testName = getTestName(lowercaseFirstLetter) val beforeDir = path.removePrefix(testDataPath).substringBeforeLast('/') + "/before"
return testName.substring(0, testName.lastIndexOf('_')).replace('_', '/') val beforeVFile = myFixture.copyDirectoryToProject(beforeDir, "")
} PsiDocumentManager.getInstance(myFixture.project).commitAllDocuments()
override fun getTestRoot() : String { val afterDir = beforeDir.substringBeforeLast("/") + "/after"
return "/multiFileIntentions/" val afterDirIOFile = File(testDataPath, afterDir)
} val afterVFile = LocalFileSystem.getInstance().findFileByIoFile(afterDirIOFile)!!
UsefulTestCase.refreshRecursively(afterVFile)
override fun getTestDataPath() : String { action(beforeVFile)
return PluginTestCaseBase.getTestDataPathBase()
PsiDocumentManager.getInstance(project).commitAllDocuments()
FileDocumentManager.getInstance().saveAllDocuments()
PlatformTestUtil.assertDirectoriesEqual(beforeVFile, afterVFile)
} }
} }