From 16d3bf77164abec1c61528c696085d9834d85c2a Mon Sep 17 00:00:00 2001 From: Alexander Podkhalyuzin Date: Mon, 22 Oct 2018 15:04:23 +0300 Subject: [PATCH] Fixed KotlinConfidenceTests --- .../test/confidence/KotlinConfidenceTest.java | 54 ++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java index efa4941ec15..365df1573c8 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/confidence/KotlinConfidenceTest.java @@ -23,22 +23,25 @@ import com.intellij.codeInsight.completion.LightCompletionTestCase; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiFile; import com.intellij.util.ArrayUtil; import org.apache.commons.lang.SystemUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.completion.test.CompletionTestUtilKt; -import org.jetbrains.kotlin.idea.test.RunnableWithException; import org.jetbrains.kotlin.idea.test.TestUtilsKt; import org.jetbrains.kotlin.test.InTextDirectivesUtils; import java.io.File; +import java.lang.reflect.Method; import java.util.List; public class KotlinConfidenceTest extends LightCompletionTestCase { private static final String TYPE_DIRECTIVE_PREFIX = "// TYPE:"; + private final ThreadLocal skipComplete = ThreadLocal.withInitial(() -> false); public void testCompleteOnDotOutOfRanges() { doTest(); @@ -92,19 +95,46 @@ public class KotlinConfidenceTest extends LightCompletionTestCase { CodeInsightSettings.getInstance().SELECT_AUTOPOPUP_SUGGESTIONS_BY_CHARS = true; try { - configureByFile(getBeforeFileName()); - String text = getEditor().getDocument().getText(); - String typeText = getTypeText(text); - List expectedElements = InTextDirectivesUtils.findLinesWithPrefixesRemoved(text, "// ELEMENT:"); - boolean noLookup = InTextDirectivesUtils.isDirectiveDefined(text, "// NO_LOOKUP"); + skipComplete.set(true); + try { + configureByFile(getBeforeFileName()); + } finally { + skipComplete.set(false); + } + String text = getEditor().getDocument().getText(); + boolean noLookup = InTextDirectivesUtils.isDirectiveDefined(text, "// NO_LOOKUP"); + if (!noLookup) complete(); //This will cause NPE in case of absence of autopopup completion + + List expectedElements = InTextDirectivesUtils.findLinesWithPrefixesRemoved(text, "// ELEMENT:"); assertFalse("Can't both expect lookup elements and no lookup", !expectedElements.isEmpty() && noLookup); if (noLookup) { - assertNull("Expected no lookup", getLookup()); + try { + Method m = null; //Looking for shouldSkipAutoPopup method (note, we can't use name because of scrambling in Ultimate) + for (Method method : CodeCompletionHandlerBase.class.getDeclaredMethods()) { + Class[] parameterTypes = method.getParameterTypes(); + if (method.getReturnType().equals(Boolean.TYPE) && + parameterTypes.length == 2 && + parameterTypes[0].equals(Editor.class) && + parameterTypes[1].equals(PsiFile.class)) { + assertNull("Only one method with such signature should exist", m); + m = method; + } + } + assertNotNull(m); + m.setAccessible(true); + Object o = m.invoke(null, getEditor(), getFile()); + assert o instanceof Boolean; + assertTrue("Should skip autopopup completion", ((Boolean) o).booleanValue()); + } catch (Throwable e) { + throw new AssertionError(e); + } return; } - else if (!expectedElements.isEmpty()) { + + String typeText = getTypeText(text); + if (!expectedElements.isEmpty()) { assertContainsItems(ArrayUtil.toStringArray(expectedElements)); return; } @@ -117,8 +147,7 @@ public class KotlinConfidenceTest extends LightCompletionTestCase { } } - protected static String getTypeText(String text) { - + private static String getTypeText(String text) { String[] directives = InTextDirectivesUtils.findArrayWithPrefixes(text, TYPE_DIRECTIVE_PREFIX); if (directives.length == 0) return null; assertEquals("One directive with \"" + TYPE_DIRECTIVE_PREFIX +"\" expected", 1, directives.length); @@ -126,11 +155,11 @@ public class KotlinConfidenceTest extends LightCompletionTestCase { return StringUtil.unquoteString(directives[0]); } - protected String getBeforeFileName() { + private String getBeforeFileName() { return getTestName(false) + ".kt"; } - protected String getAfterFileName() { + private String getAfterFileName() { return getTestName(false) + ".kt.after"; } @@ -147,6 +176,7 @@ public class KotlinConfidenceTest extends LightCompletionTestCase { @Override protected void complete() { + if (skipComplete.get()) return; new CodeCompletionHandlerBase(CompletionType.BASIC, false, true, true).invokeCompletion( getProject(), getEditor(), 0, false, false);