diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractMultiFileIntentionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractMultiFileIntentionTest.kt index f583679fe2a..c1dad7d5ef8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractMultiFileIntentionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/AbstractMultiFileIntentionTest.kt @@ -19,86 +19,86 @@ package org.jetbrains.kotlin.idea.intentions import com.google.gson.JsonObject import com.google.gson.JsonParser import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.openapi.editor.EditorFactory import com.intellij.openapi.fileEditor.FileDocumentManager +import com.intellij.openapi.fileEditor.impl.LoadTextUtil 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.PsiManager 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 org.jetbrains.kotlin.idea.jsonUtils.getNullableString import org.jetbrains.kotlin.idea.jsonUtils.getString -import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil -import org.jetbrains.kotlin.idea.test.KotlinMultiFileTestCase -import org.jetbrains.kotlin.idea.test.PluginTestCaseBase -import org.jetbrains.kotlin.idea.test.extractMarkerOffset +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor +import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.test.KotlinTestUtils import org.junit.Assert 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) { - 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 intentionAction = Class.forName(config.getString("intentionClass")).newInstance() as IntentionAction val isApplicableExpected = config["isApplicable"]?.asBoolean ?: true - val withRuntime = config["withRuntime"]?.asBoolean ?: false - if (withRuntime) { - ConfigLibraryUtil.configureKotlinRuntimeAndSdk(myModule, PluginTestCaseBase.mockJdk()) - } + doTest(path) { rootDir -> + val mainFile = myFixture.configureFromTempProjectFile(mainFilePath) + val conflictFile = rootDir.findFileByRelativePath("$mainFilePath.conflicts") - doTest({ rootDir, _ -> - val mainFile = rootDir.findFileByRelativePath(mainFilePath)!! - val conflictFile = rootDir.findFileByRelativePath("$mainFilePath.conflicts") - val document = FileDocumentManager.getInstance().getDocument(mainFile)!! - val editor = EditorFactory.getInstance()!!.createEditor(document, project!!)!! - editor.caretModel.moveToOffset(document.extractMarkerOffset(project)) - val mainPsiFile = PsiManager.getInstance(project!!).findFile(mainFile)!! + try { + Assert.assertTrue("isAvailable() for ${intentionAction::class.java} should return $isApplicableExpected", + isApplicableExpected == intentionAction.isAvailable(project, editor, mainFile)) + config.getNullableString("intentionText")?.let { + TestCase.assertEquals("Intention text mismatch", it, intentionAction.text) + } - try { - Assert.assertTrue("isAvailable() for ${intentionAction::class.java} should return $isApplicableExpected", - isApplicableExpected == intentionAction.isAvailable(project, editor, mainPsiFile)) - config.getNullableString("intentionText")?.let { - TestCase.assertEquals("Intention text mismatch", it, intentionAction.text) - } + if (isApplicableExpected) { + project.executeWriteCommand(intentionAction.text) { + intentionAction.invoke(project, editor, mainFile) + } + } - if (isApplicableExpected) { - project.executeWriteCommand(intentionAction.text) { - intentionAction.invoke(project, editor, mainPsiFile) - } - } - - 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)) + assert(conflictFile == null) { "Conflict file $conflictFile should not exist" } + } + catch (e: CommonRefactoringUtil.RefactoringErrorHintException) { + val expectedConflicts = LoadTextUtil.loadText(conflictFile!!).toString().trim() + assertEquals(expectedConflicts, e.message) + } + } } - protected fun getTestDirName(lowercaseFirstLetter : Boolean) : String { - val testName = getTestName(lowercaseFirstLetter) - return testName.substring(0, testName.lastIndexOf('_')).replace('_', '/') - } + protected fun doTest(path: String, action: (VirtualFile) -> Unit) { + val beforeDir = path.removePrefix(testDataPath).substringBeforeLast('/') + "/before" + val beforeVFile = myFixture.copyDirectoryToProject(beforeDir, "") + PsiDocumentManager.getInstance(myFixture.project).commitAllDocuments() - override fun getTestRoot() : String { - return "/multiFileIntentions/" - } + val afterDir = beforeDir.substringBeforeLast("/") + "/after" + val afterDirIOFile = File(testDataPath, afterDir) + val afterVFile = LocalFileSystem.getInstance().findFileByIoFile(afterDirIOFile)!! + UsefulTestCase.refreshRecursively(afterVFile) - override fun getTestDataPath() : String { - return PluginTestCaseBase.getTestDataPathBase() + action(beforeVFile) + + PsiDocumentManager.getInstance(project).commitAllDocuments() + FileDocumentManager.getInstance().saveAllDocuments() + PlatformTestUtil.assertDirectoriesEqual(beforeVFile, afterVFile) } } \ No newline at end of file