Convert MultiFileIntentionTest to light fixture test case
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user