From 549bebbd19d380e245651a6f4e79b6f334974cbb Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 28 Mar 2018 17:34:29 +0200 Subject: [PATCH] Add test infrastructure for completion in mpp Allow to specify specific expected module in test data for completion items --- .../AbstractMultiPlatformCompletionTest.kt | 52 +++++++++++++++++++ .../test/ExpectedCompletionUtils.kt | 16 +++++- .../KotlinLightCodeInsightFixtureTestCase.kt | 4 ++ ...AbstractKotlinNavigationMultiModuleTest.kt | 8 +-- 4 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/AbstractMultiPlatformCompletionTest.kt diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/AbstractMultiPlatformCompletionTest.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/AbstractMultiPlatformCompletionTest.kt new file mode 100644 index 00000000000..686117b3c59 --- /dev/null +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/AbstractMultiPlatformCompletionTest.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.completion.test + +import com.intellij.codeInsight.completion.CodeCompletionHandlerBase +import com.intellij.codeInsight.lookup.LookupManager +import com.intellij.codeInsight.lookup.impl.LookupImpl +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.EditorFactory +import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil +import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure +import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest +import org.jetbrains.kotlin.idea.test.extractMarkerOffset +import org.jetbrains.kotlin.idea.test.findFileWithCaret +import org.jetbrains.kotlin.psi.KtFile +import java.io.File + +abstract class AbstractMultiPlatformCompletionTest : AbstractMultiModuleTest() { + protected fun doTest(testPath: String) { + setupMppProjectFromDirStructure(File(testPath)) + val file = project.findFileWithCaret() + val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!! + val offset = doc.extractMarkerOffset(project) + val editor = EditorFactory.getInstance().createEditor(doc, myProject)!! + editor.caretModel.moveToOffset(offset) + try { + testCompletion(file, editor) + } finally { + EditorFactory.getInstance().releaseEditor(editor) + } + } + + private fun testCompletion(file: KtFile, editor: Editor) { + testCompletion(file.text, null, { completionType, invocationCount -> + CodeCompletionHandlerBase(completionType).invokeCompletion( + myProject, InjectedLanguageUtil + .getEditorForInjectedLanguageNoCommit(editor, file), invocationCount + ) + + val lookup = LookupManager.getActiveLookup(editor) as LookupImpl + lookup.items?.toTypedArray() + }) + } + + override fun getTestDataPath(): String { + return COMPLETION_TEST_DATA_BASE_PATH + "/smartMultiFile/" + getTestName(false) + "/" + } +} \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ExpectedCompletionUtils.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ExpectedCompletionUtils.kt index 9947bddbbf0..7aa9413d99b 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ExpectedCompletionUtils.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/ExpectedCompletionUtils.kt @@ -27,7 +27,9 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation import com.intellij.codeInsight.lookup.impl.LookupCellRenderer import com.intellij.ui.JBColor import com.intellij.util.ArrayUtil +import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject import org.jetbrains.kotlin.idea.test.AstAccessControl +import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform @@ -88,7 +90,11 @@ object ExpectedCompletionUtils { val PRESENTATION_TYPE_TEXT: String = "typeText" val PRESENTATION_TAIL_TEXT: String = "tailText" val PRESENTATION_TEXT_ATTRIBUTES: String = "attributes" - val validKeys: Set = setOf(LOOKUP_STRING, ALL_LOOKUP_STRINGS, PRESENTATION_ITEM_TEXT, PRESENTATION_TYPE_TEXT, PRESENTATION_TAIL_TEXT, PRESENTATION_TEXT_ATTRIBUTES) + val MODULE_NAME: String = "module" + val validKeys: Set = setOf( + LOOKUP_STRING, ALL_LOOKUP_STRINGS, PRESENTATION_ITEM_TEXT, PRESENTATION_TYPE_TEXT, + PRESENTATION_TAIL_TEXT, PRESENTATION_TEXT_ATTRIBUTES, MODULE_NAME + ) } } @@ -315,12 +321,20 @@ object ExpectedCompletionUtils { if (presentation.tailText != null) { map.put(CompletionProposal.PRESENTATION_TAIL_TEXT, presentation.tailText) } + item.moduleName?.let { + map.put(CompletionProposal.MODULE_NAME, it) + } result.add(ExpectedCompletionUtils.CompletionProposal(map)) } return result } + private val LookupElement.moduleName: String? + get() { + return (`object` as? DeclarationLookupObject)?.psiElement?.module?.name + } + private fun textAttributes(presentation: LookupElementPresentation): String { return buildString { if (presentation.isItemTextBold) { diff --git a/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt index 12c6c06c461..06d2cc948d7 100644 --- a/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupManager import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil +import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess import com.intellij.psi.PsiManager import com.intellij.psi.search.FileTypeIndex @@ -201,3 +202,6 @@ fun Project.allKotlinFiles(): List { .map { PsiManager.getInstance(this).findFile(it) } .filterIsInstance() } + +fun Project.findFileWithCaret() = + allKotlinFiles().single { "" in VfsUtilCore.loadText(it.virtualFile) } diff --git a/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt index 01ff7408b8f..aa0e2fda04c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/navigation/AbstractKotlinNavigationMultiModuleTest.kt @@ -9,15 +9,14 @@ import com.intellij.codeInsight.navigation.GotoTargetHandler import com.intellij.codeInsight.navigation.NavigationUtil import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.EditorFactory -import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiFile import org.jetbrains.kotlin.idea.codeInsight.GotoSuperActionHandler import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.test.PluginTestCaseBase -import org.jetbrains.kotlin.idea.test.allKotlinFiles import org.jetbrains.kotlin.idea.test.extractMarkerOffset +import org.jetbrains.kotlin.idea.test.findFileWithCaret import java.io.File abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest() { @@ -25,7 +24,7 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest protected fun doTest(testDataDir: String) { setupMppProjectFromDirStructure(File(testDataDir)) - val file = findFileWithCaret() + val file = project.findFileWithCaret() val doc = PsiDocumentManager.getInstance(myProject).getDocument(file)!! val offset = doc.extractMarkerOffset(project, "") val editor = EditorFactory.getInstance().createEditor(doc, myProject) @@ -37,9 +36,6 @@ abstract class AbstractKotlinNavigationMultiModuleTest : AbstractMultiModuleTest EditorFactory.getInstance().releaseEditor(editor) } } - - private fun findFileWithCaret() = - project.allKotlinFiles().single { "" in VfsUtilCore.loadText(it.virtualFile) } }