193: Fix code fragment tests fixture configuration
This commit is contained in:
+154
@@ -0,0 +1,154 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.debugger.evaluate
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.completion.CompletionType
|
||||||
|
import com.intellij.codeInspection.InspectionProfileEntry
|
||||||
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
import org.jetbrains.kotlin.checkers.AbstractPsiCheckerTest
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeWithContent
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference
|
||||||
|
import org.jetbrains.kotlin.idea.completion.test.AbstractJvmBasicCompletionTest
|
||||||
|
import org.jetbrains.kotlin.idea.completion.test.ExpectedCompletionUtils
|
||||||
|
import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest
|
||||||
|
import org.jetbrains.kotlin.idea.debugger.getContextElement
|
||||||
|
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
||||||
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
import java.io.File
|
||||||
|
import kotlin.test.assertNull
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
abstract class AbstractCodeFragmentHighlightingTest : AbstractPsiCheckerTest() {
|
||||||
|
override fun doTest(filePath: String) {
|
||||||
|
myFixture.configureByCodeFragment(testDataFile())
|
||||||
|
checkHighlighting(filePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun doTestWithImport(filePath: String) {
|
||||||
|
myFixture.configureByCodeFragment(testDataFile())
|
||||||
|
|
||||||
|
project.executeWriteCommand("Imports insertion") {
|
||||||
|
val fileText = FileUtil.loadFile(File(filePath), true)
|
||||||
|
val file = myFixture.file as KtFile
|
||||||
|
InTextDirectivesUtils.findListWithPrefixes(fileText, "// IMPORT: ").forEach {
|
||||||
|
val descriptor = file.resolveImportReference(FqName(it)).singleOrNull()
|
||||||
|
?: error("Could not resolve descriptor to import: $it")
|
||||||
|
ImportInsertHelper.getInstance(project).importDescriptor(file, descriptor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkHighlighting(filePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkHighlighting(filePath: String) {
|
||||||
|
val inspectionName = InTextDirectivesUtils.findStringWithPrefixes(File(filePath).readText(), "// INSPECTION_CLASS: ")
|
||||||
|
if (inspectionName != null) {
|
||||||
|
val inspection = Class.forName(inspectionName).newInstance() as InspectionProfileEntry
|
||||||
|
myFixture.enableInspections(inspection)
|
||||||
|
try {
|
||||||
|
myFixture.checkHighlighting(true, false, false)
|
||||||
|
} finally {
|
||||||
|
myFixture.disableInspections(inspection)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
myFixture.checkHighlighting(true, false, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class AbstractCodeFragmentCompletionTest : AbstractJvmBasicCompletionTest() {
|
||||||
|
override fun setUpFixture(testPath: String) {
|
||||||
|
myFixture.configureByCodeFragment(testDataFile())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class AbstractCodeFragmentCompletionHandlerTest : AbstractCompletionHandlerTest(CompletionType.BASIC) {
|
||||||
|
override fun setUpFixture(testPath: String) {
|
||||||
|
myFixture.configureByCodeFragment(testDataFile())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun doTest(testPath: String) {
|
||||||
|
super.doTest(testPath)
|
||||||
|
|
||||||
|
val fragment = myFixture.file as KtCodeFragment
|
||||||
|
fragment.checkImports(testPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class AbstractCodeFragmentAutoImportTest : AbstractPsiCheckerTest() {
|
||||||
|
override fun doTest(filePath: String) {
|
||||||
|
myFixture.configureByCodeFragment(testDataFile())
|
||||||
|
myFixture.doHighlighting()
|
||||||
|
|
||||||
|
val importFix = myFixture.availableIntentions.singleOrNull { it.familyName == "Import" }
|
||||||
|
?: error("No import fix available")
|
||||||
|
importFix.invoke(project, editor, file)
|
||||||
|
|
||||||
|
myFixture.checkResultByFile(filePath + ".after")
|
||||||
|
|
||||||
|
val fragment = myFixture.file as KtCodeFragment
|
||||||
|
fragment.checkImports(testDataPath + File.separator + filePath)
|
||||||
|
|
||||||
|
val fixAfter = myFixture.availableIntentions.firstOrNull { it.familyName == "Import" }
|
||||||
|
assertNull(fixAfter, "No import fix should be available after")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getProjectDescriptor() = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
|
||||||
|
override fun getTestDataPath() = KotlinTestUtils.getHomeDirectory()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtCodeFragment.checkImports(testPath: String) {
|
||||||
|
val importList = importsAsImportList()
|
||||||
|
val importsText = StringUtil.convertLineSeparators(importList?.text ?: "")
|
||||||
|
val fragmentAfterFile = File(testPath + ".after.imports")
|
||||||
|
|
||||||
|
if (fragmentAfterFile.exists()) {
|
||||||
|
KotlinTestUtils.assertEqualsToFile(fragmentAfterFile, importsText)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assertTrue(importsText.isEmpty(), "Unexpected imports found: $importsText" )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun JavaCodeInsightTestFixture.configureByCodeFragment(testDataFile: File) {
|
||||||
|
configureByFile(testDataFile.name)
|
||||||
|
|
||||||
|
val elementAt = file?.findElementAt(caretOffset)
|
||||||
|
val file = createCodeFragment(testDataFile.path, elementAt!!)
|
||||||
|
|
||||||
|
val typeStr = InTextDirectivesUtils.findStringWithPrefixes(getFile().text, "// ${ExpectedCompletionUtils.RUNTIME_TYPE} ")
|
||||||
|
if (typeStr != null) {
|
||||||
|
file.putCopyableUserData(KtCodeFragment.RUNTIME_TYPE_EVALUATOR, {
|
||||||
|
val codeFragment = KtPsiFactory(project).createBlockCodeFragment("val xxx: $typeStr", PsiTreeUtil.getParentOfType(elementAt, KtElement::class.java))
|
||||||
|
val context = codeFragment.analyzeWithContent()
|
||||||
|
val typeReference: KtTypeReference = PsiTreeUtil.getChildOfType(codeFragment.getContentElement().firstChild, KtTypeReference::class.java)!!
|
||||||
|
context[BindingContext.TYPE, typeReference]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
configureFromExistingVirtualFile(file.virtualFile!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createCodeFragment(filePath: String, contextElement: PsiElement): KtCodeFragment {
|
||||||
|
val fileForFragment = File(filePath + ".fragment")
|
||||||
|
val codeFragmentText = FileUtil.loadFile(fileForFragment, true).trim()
|
||||||
|
val psiFactory = KtPsiFactory(contextElement.project)
|
||||||
|
if (fileForFragment.readLines().size == 1) {
|
||||||
|
return psiFactory.createExpressionCodeFragment(codeFragmentText, getContextElement(contextElement))
|
||||||
|
}
|
||||||
|
return psiFactory.createBlockCodeFragment(codeFragmentText, getContextElement(contextElement))
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.debugger.evaluate
|
||||||
|
|
||||||
|
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
||||||
|
import org.jetbrains.kotlin.idea.debugger.KotlinEditorTextProvider
|
||||||
|
import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
||||||
|
import org.jetbrains.kotlin.idea.test.invalidateLibraryCache
|
||||||
|
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||||
|
import org.junit.Assert
|
||||||
|
|
||||||
|
abstract class AbstractSelectExpressionForDebuggerTest : LightCodeInsightFixtureTestCase() {
|
||||||
|
|
||||||
|
override fun setUp() {
|
||||||
|
super.setUp()
|
||||||
|
invalidateLibraryCache(project)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun doTest(path: String) {
|
||||||
|
doTest(path, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun doTestWoMethodCalls(path: String) {
|
||||||
|
doTest(path, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun doTest(path: String, allowMethodCalls: Boolean) {
|
||||||
|
myFixture.configureByFile(path.substringAfterLast('/'))
|
||||||
|
|
||||||
|
val elementAt = myFixture.file?.findElementAt(myFixture.caretOffset)!!
|
||||||
|
val selectedExpression = KotlinEditorTextProvider.findExpressionInner(elementAt, allowMethodCalls)
|
||||||
|
|
||||||
|
val expected = InTextDirectivesUtils.findStringWithPrefixes(myFixture.file?.text!!, "// EXPECTED: ")
|
||||||
|
val actualResult = if (selectedExpression != null)
|
||||||
|
KotlinEditorTextProvider.getElementInfo(selectedExpression) { it.text }
|
||||||
|
else
|
||||||
|
"null"
|
||||||
|
|
||||||
|
Assert.assertEquals("Another expression should be selected", expected, actualResult)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getProjectDescriptor() = KotlinLightProjectDescriptor.INSTANCE
|
||||||
|
|
||||||
|
override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/debugger/selectExpression"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user