From 29f7318f4f57c094bde01f20e80b5f27b50d6568 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 27 Nov 2013 17:12:12 +0400 Subject: [PATCH] Refactored completion tests to support more flexible input file format --- .../basic/common/ExtensionForProperty.kt | 4 +- .../basic/common/ExtensionFunReceiverForce.kt | 4 +- .../basic/common/ExtensionInsideFunction.kt | 2 +- .../common/FunctionCompletionFormatting.kt | 2 +- .../basic/common/InParametersTypes.kt | 7 +- .../basic/common/InParametersTypesForce.kt | 7 +- .../OnlyScopedClassesWithoutExplicit.kt | 4 +- .../basic/common/StandardJetArrayFirst.kt | 8 +- .../basic/common/StandardJetDoubleFirst.kt | 6 +- .../basic/java/AutoForceCompletion.kt | 2 +- .../java/ExtensionFromStandardLibrary.kt | 2 +- .../NoClassNameDuplicationForRuntimeClass.kt | 2 +- .../java/NoImportedJavaClassDuplication.kt | 2 +- .../completion/basic/java/PropertyMetadata.kt | 4 +- idea/testData/completion/smart/Constructor.kt | 2 +- .../smart/ConstructorForGenericType.kt | 2 +- .../smart/ConstructorForNullable.kt | 2 +- idea/testData/completion/smart/EmptyPrefix.kt | 2 +- .../completion/ExpectedCompletionUtils.java | 127 +++++++++++------- 19 files changed, 110 insertions(+), 81 deletions(-) diff --git a/idea/testData/completion/basic/common/ExtensionForProperty.kt b/idea/testData/completion/basic/common/ExtensionForProperty.kt index 5f04657be34..bd663cb813c 100644 --- a/idea/testData/completion/basic/common/ExtensionForProperty.kt +++ b/idea/testData/completion/basic/common/ExtensionForProperty.kt @@ -3,9 +3,9 @@ class Test { } // INVOCATION_COUNT: 1 -// EXIST: String~(jet) +// EXIST: { lookupString:"String", tailText:" (jet)" } // EXIST: IllegalStateException // EXIST: StringBuilder // EXIST_JAVA_ONLY: StringBuffer // ABSENT: HTMLStyleElement -// ABSENT: Statement@Statement~(java.sql) +// ABSENT: Statement diff --git a/idea/testData/completion/basic/common/ExtensionFunReceiverForce.kt b/idea/testData/completion/basic/common/ExtensionFunReceiverForce.kt index 0847eeba5e9..a6ddad8f5b5 100644 --- a/idea/testData/completion/basic/common/ExtensionFunReceiverForce.kt +++ b/idea/testData/completion/basic/common/ExtensionFunReceiverForce.kt @@ -3,9 +3,9 @@ class Test { } // INVOCATION_COUNT: 2 -// EXIST: String~(jet) +// EXIST: { lookupString:"String", tailText:" (jet)" } // EXIST: IllegalStateException // EXIST: StringBuilder // EXIST_JAVA_ONLY: StringBuffer // EXIST_JS_ONLY: HTMLStyleElement -// EXIST_JAVA_ONLY: Statement@Statement~(java.sql) +// EXIST_JAVA_ONLY: { lookupString:"Statement", tailText:" (java.sql)" } diff --git a/idea/testData/completion/basic/common/ExtensionInsideFunction.kt b/idea/testData/completion/basic/common/ExtensionInsideFunction.kt index 9fee7a1d3c2..83e7555ce79 100644 --- a/idea/testData/completion/basic/common/ExtensionInsideFunction.kt +++ b/idea/testData/completion/basic/common/ExtensionInsideFunction.kt @@ -13,7 +13,7 @@ class StrMore { } // INVOCATION_COUNT: 1 -// EXIST: String~(jet) +// EXIST: { lookupString:"String", tailText:" (jet)" } // EXIST: StrSome // EXIST: StrMore // EXIST: StrInFun diff --git a/idea/testData/completion/basic/common/FunctionCompletionFormatting.kt b/idea/testData/completion/basic/common/FunctionCompletionFormatting.kt index e78f3533967..8905a87b47b 100644 --- a/idea/testData/completion/basic/common/FunctionCompletionFormatting.kt +++ b/idea/testData/completion/basic/common/FunctionCompletionFormatting.kt @@ -4,4 +4,4 @@ fun some() { tes } -// EXIST: test@test(a: jet.Int) \ No newline at end of file +// EXIST: { lookupString:"test", itemText:"test(a: jet.Int)" } \ No newline at end of file diff --git a/idea/testData/completion/basic/common/InParametersTypes.kt b/idea/testData/completion/basic/common/InParametersTypes.kt index 8303fe7da07..b6c77c206bc 100644 --- a/idea/testData/completion/basic/common/InParametersTypes.kt +++ b/idea/testData/completion/basic/common/InParametersTypes.kt @@ -5,10 +5,11 @@ class SomeClass { } // INVOCATION_COUNT: 1 -// EXIST: SomeClass, SomeInternal -// EXIST: String~(jet) +// EXIST: SomeClass +// EXIST: SomeInternal +// EXIST: { lookupString:"String", tailText:" (jet)" } // EXIST: IllegalStateException // EXIST: StringBuilder // EXIST_JAVA_ONLY: StringBuffer // ABSENT: HTMLStyleElement -// ABSENT: Statement@Statement~(java.sql) \ No newline at end of file +// ABSENT: Statement \ No newline at end of file diff --git a/idea/testData/completion/basic/common/InParametersTypesForce.kt b/idea/testData/completion/basic/common/InParametersTypesForce.kt index 121b67fdeeb..db89a58f1ec 100644 --- a/idea/testData/completion/basic/common/InParametersTypesForce.kt +++ b/idea/testData/completion/basic/common/InParametersTypesForce.kt @@ -5,10 +5,11 @@ class SomeClass { } // INVOCATION_COUNT: 2 -// EXIST: SomeClass, SomeInternal -// EXIST: String~(jet) +// EXIST: SomeClass +// EXIST: SomeInternal +// EXIST: { lookupString:"String", tailText:" (jet)" } // EXIST: IllegalStateException // EXIST: StringBuilder // EXIST_JAVA_ONLY: StringBuffer // EXIST_JS_ONLY: HTMLStyleElement -// EXIST_JAVA_ONLY: Statement@Statement~(java.sql) \ No newline at end of file +// EXIST_JAVA_ONLY: { lookupString:"Statement", tailText:" (java.sql)" } \ No newline at end of file diff --git a/idea/testData/completion/basic/common/OnlyScopedClassesWithoutExplicit.kt b/idea/testData/completion/basic/common/OnlyScopedClassesWithoutExplicit.kt index 0dd3c454b9e..3d7fff8f7a7 100644 --- a/idea/testData/completion/basic/common/OnlyScopedClassesWithoutExplicit.kt +++ b/idea/testData/completion/basic/common/OnlyScopedClassesWithoutExplicit.kt @@ -5,5 +5,5 @@ fun firstFun() { } // INVOCATION_COUNT: 0 -// EXIST: Int~(jet) -// ABSENT: Int~(jet.runtime.SharedVar) \ No newline at end of file +// EXIST: { lookupString:"Int", tailText:" (jet)" } +// ABSENT: { lookupString:"Int", tailText:" (jet.runtime.SharedVar)" } \ No newline at end of file diff --git a/idea/testData/completion/basic/common/StandardJetArrayFirst.kt b/idea/testData/completion/basic/common/StandardJetArrayFirst.kt index 2d98b01914e..a3107af3fd0 100644 --- a/idea/testData/completion/basic/common/StandardJetArrayFirst.kt +++ b/idea/testData/completion/basic/common/StandardJetArrayFirst.kt @@ -4,10 +4,10 @@ fun main(args: Array) { // INVOCATION_COUNT: 2 // WITH_ORDER: 1 -// EXIST: Array~(jet) -// EXIST_JAVA_ONLY: Array~(java.sql) -// EXIST_JAVA_ONLY: ArrayList~ (java.util) -// EXIST_JS_ONLY: ArrayList~(java.util) +// EXIST: { lookupString:"Array", tailText:" (jet)" } +// EXIST_JAVA_ONLY: { lookupString:"Array", tailText:" (java.sql)" } +// EXIST_JAVA_ONLY: { lookupString:"ArrayList", tailText:" (java.util)" } +// EXIST_JS_ONLY: { lookupString:"ArrayList", tailText:" (java.util)" } diff --git a/idea/testData/completion/basic/common/StandardJetDoubleFirst.kt b/idea/testData/completion/basic/common/StandardJetDoubleFirst.kt index ec9b925d6ec..3378b983722 100644 --- a/idea/testData/completion/basic/common/StandardJetDoubleFirst.kt +++ b/idea/testData/completion/basic/common/StandardJetDoubleFirst.kt @@ -3,6 +3,6 @@ fun some(a: Double) { // INVOCATION_COUNT: 2 // WITH_ORDER: 1 -// EXIST: Double~(jet) -// EXIST_JAVA_ONLY: Double~(java.lang) -// EXIST: DoubleArray~(jet) +// EXIST: { lookupString:"Double", tailText:" (jet)" } +// EXIST_JAVA_ONLY: { lookupString:"Double", tailText:" (java.lang)" } +// EXIST: { lookupString:"DoubleArray", tailText:" (jet)" } diff --git a/idea/testData/completion/basic/java/AutoForceCompletion.kt b/idea/testData/completion/basic/java/AutoForceCompletion.kt index 79439b1f978..9eb11a09fd7 100644 --- a/idea/testData/completion/basic/java/AutoForceCompletion.kt +++ b/idea/testData/completion/basic/java/AutoForceCompletion.kt @@ -1,4 +1,4 @@ fun some(a : Statement) // INVOCATION_COUNT: 1 -// EXIST: Statement@Statement~(java.sql) \ No newline at end of file +// EXIST: { lookupString:"Statement", tailText:" (java.sql)" } \ No newline at end of file diff --git a/idea/testData/completion/basic/java/ExtensionFromStandardLibrary.kt b/idea/testData/completion/basic/java/ExtensionFromStandardLibrary.kt index c9020d8199c..6682bbd180c 100644 --- a/idea/testData/completion/basic/java/ExtensionFromStandardLibrary.kt +++ b/idea/testData/completion/basic/java/ExtensionFromStandardLibrary.kt @@ -8,5 +8,5 @@ fun firstFun() { } // INVOCATION_COUNT: 1 -// EXIST: toLinkedList@toLinkedList()~for jet.Iterable in kotlin +// EXIST: { lookupString:"toLinkedList", itemText:"toLinkedList()", tailText:" for jet.Iterable in kotlin" } // NUMBER: 1 diff --git a/idea/testData/completion/basic/java/NoClassNameDuplicationForRuntimeClass.kt b/idea/testData/completion/basic/java/NoClassNameDuplicationForRuntimeClass.kt index f93550aec1e..821bfd4e840 100644 --- a/idea/testData/completion/basic/java/NoClassNameDuplicationForRuntimeClass.kt +++ b/idea/testData/completion/basic/java/NoClassNameDuplicationForRuntimeClass.kt @@ -1,5 +1,5 @@ val x = LineIterator // INVOCATION_COUNT: 1 -// EXIST: LineIterator~(kotlin.io) +// EXIST: { lookupString:"LineIterator", tailText:" (kotlin.io)" } // NUMBER: 1 diff --git a/idea/testData/completion/basic/java/NoImportedJavaClassDuplication.kt b/idea/testData/completion/basic/java/NoImportedJavaClassDuplication.kt index 4557055bdb7..6f87bb1a5cd 100644 --- a/idea/testData/completion/basic/java/NoImportedJavaClassDuplication.kt +++ b/idea/testData/completion/basic/java/NoImportedJavaClassDuplication.kt @@ -3,5 +3,5 @@ import java.io.InputStreamReader val x = InputStreamReader // INVOCATION_COUNT: 1 -// EXIST: InputStreamReader~(java.io) +// EXIST: { lookupString:"InputStreamReader", tailText:" (java.io)" } // NUMBER: 1 \ No newline at end of file diff --git a/idea/testData/completion/basic/java/PropertyMetadata.kt b/idea/testData/completion/basic/java/PropertyMetadata.kt index 6de2bf054b4..89a6a979b97 100644 --- a/idea/testData/completion/basic/java/PropertyMetadata.kt +++ b/idea/testData/completion/basic/java/PropertyMetadata.kt @@ -6,6 +6,6 @@ fun firstFun() { } // INVOCATION_COUNT: 1 -// EXIST: PropertyMetadata@PropertyMetadata~(jet) -// EXIST: PropertyMetadataImpl@PropertyMetadataImpl~(jet) +// EXIST: { lookupString:"PropertyMetadata", itemText:"PropertyMetadata", tailText:" (jet)" } +// EXIST: { lookupString:"PropertyMetadataImpl", itemText:"PropertyMetadataImpl", tailText:" (jet)" } // NUMBER: 2 diff --git a/idea/testData/completion/smart/Constructor.kt b/idea/testData/completion/smart/Constructor.kt index 3229062eb09..9f18f29c067 100644 --- a/idea/testData/completion/smart/Constructor.kt +++ b/idea/testData/completion/smart/Constructor.kt @@ -2,4 +2,4 @@ class Foo var a : Foo = -// EXIST: Foo@Foo() +// EXIST: { lookupString:"Foo", itemText:"Foo()" } diff --git a/idea/testData/completion/smart/ConstructorForGenericType.kt b/idea/testData/completion/smart/ConstructorForGenericType.kt index b82a6ce7228..5d001b2faf8 100644 --- a/idea/testData/completion/smart/ConstructorForGenericType.kt +++ b/idea/testData/completion/smart/ConstructorForGenericType.kt @@ -4,4 +4,4 @@ fun foo(p : Any){ var a : Foo = } -// EXIST: Foo@Foo() +// EXIST: { lookupString:"Foo", itemText:"Foo()" } diff --git a/idea/testData/completion/smart/ConstructorForNullable.kt b/idea/testData/completion/smart/ConstructorForNullable.kt index 5d1d1a84877..3922d4c8210 100644 --- a/idea/testData/completion/smart/ConstructorForNullable.kt +++ b/idea/testData/completion/smart/ConstructorForNullable.kt @@ -4,4 +4,4 @@ fun foo(p : Any){ var a : Foo? = } -// EXIST: Foo@Foo() +// EXIST: { lookupString:"Foo", itemText:"Foo()" } diff --git a/idea/testData/completion/smart/EmptyPrefix.kt b/idea/testData/completion/smart/EmptyPrefix.kt index 4fa6fff4f85..6c87b561d70 100644 --- a/idea/testData/completion/smart/EmptyPrefix.kt +++ b/idea/testData/completion/smart/EmptyPrefix.kt @@ -24,4 +24,4 @@ fun f3() : String{} // EXIST: f1 // EXIST: f2 // ABSENT: f3 -// EXIST: Foo@Foo() +// EXIST: { lookupString:"Foo", itemText:"Foo()" } diff --git a/idea/tests/org/jetbrains/jet/completion/ExpectedCompletionUtils.java b/idea/tests/org/jetbrains/jet/completion/ExpectedCompletionUtils.java index 3a57a262d71..76dab188d7b 100644 --- a/idea/tests/org/jetbrains/jet/completion/ExpectedCompletionUtils.java +++ b/idea/tests/org/jetbrains/jet/completion/ExpectedCompletionUtils.java @@ -19,6 +19,10 @@ package org.jetbrains.jet.completion; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.openapi.util.text.StringUtil; @@ -29,11 +33,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.InTextDirectivesUtils; import org.jetbrains.jet.plugin.project.TargetPlatform; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.*; /** * Extract a number of statements about completion from the given text. Those statements @@ -44,52 +44,57 @@ public class ExpectedCompletionUtils { } public static class CompletionProposal { - public static final Pattern PATTERN = Pattern.compile("([^~@]*)(@([^~]*))?(~(.*))?"); - public static final int LOOKUP_STRING_GROUP_INDEX = 1; - public static final int PRESENTABLE_STRING_GROUP_INDEX = 3; - public static final int TAIL_TEXT_STRING_GROUP_INDEX = 5; + public static final String LOOKUP_STRING = "lookupString"; + public static final String PRESENTATION_ITEM_TEXT = "itemText"; + public static final String PRESENTATION_TYPE_TEXT = "typeText"; + public static final String PRESENTATION_TAIL_TEXT = "tailText"; + public static final Set validKeys = new HashSet( + Arrays.asList(LOOKUP_STRING, PRESENTATION_ITEM_TEXT, PRESENTATION_TYPE_TEXT, PRESENTATION_TAIL_TEXT) + ); - public static final String TAIL_FLAG = "~"; - public static final String PRESENTABLE_FLAG = "@"; + private final Map map; - private final String lookupString; - private final String presenterText; - private final String tailString; - - public CompletionProposal(@NotNull String lookupString, @Nullable String presenterText, @Nullable String tailString) { - this.lookupString = lookupString; - this.presenterText = presenterText != null ? presenterText.trim() : null; - this.tailString = tailString != null ? tailString.trim() : null; + public CompletionProposal(@NotNull String lookupString) { + map = new HashMap(); + map.put(LOOKUP_STRING, lookupString); } - public boolean isSuitable(CompletionProposal proposal) { - if (proposal.tailString != null) { - if (!proposal.tailString.equals(tailString)) { + public CompletionProposal(@NotNull Map map) { + this.map = map; + for (String key : map.keySet()) { + if (!validKeys.contains(key)){ + throw new RuntimeException("Invalid key '" + key + "'"); + } + } + } + + public CompletionProposal(@NotNull JsonObject json) { + map = new HashMap(); + for (Map.Entry entry : json.entrySet()) { + String key = entry.getKey(); + if (!validKeys.contains(key)) { + throw new RuntimeException("Invalid json property '" + key + "'"); + } + map.put(key, entry.getValue().getAsString()); + } + } + + public boolean matches(CompletionProposal expectedProposal) { + for (Map.Entry entry : expectedProposal.map.entrySet()) { + if (!entry.getValue().equals(map.get(entry.getKey()))) { return false; } } - - if (proposal.presenterText != null) { - if (!proposal.presenterText.equals(presenterText)) { - return false; - } - } - - return lookupString.equals(proposal.lookupString); + return true; } @Override public String toString() { - StringBuilder result = new StringBuilder(lookupString); - if (presenterText != null) { - result.append(PRESENTABLE_FLAG).append(presenterText); + JsonObject jsonObject = new JsonObject(); + for (Map.Entry entry : map.entrySet()) { + jsonObject.addProperty(entry.getKey(), entry.getValue()); } - - if (tailString != null) { - result.append(TAIL_FLAG).append(tailString); - } - - return result.toString(); + return jsonObject.toString(); } } @@ -168,12 +173,17 @@ public class ExpectedCompletionUtils { public static CompletionProposal[] processProposalAssertions(String fileText, String... prefixes) { Collection proposals = new ArrayList(); - for (String proposalStr : InTextDirectivesUtils.findListWithPrefixes(fileText, prefixes)) { - Matcher matcher = CompletionProposal.PATTERN.matcher(proposalStr); - matcher.find(); - proposals.add(new CompletionProposal(matcher.group(CompletionProposal.LOOKUP_STRING_GROUP_INDEX), - matcher.group(CompletionProposal.PRESENTABLE_STRING_GROUP_INDEX), - matcher.group(CompletionProposal.TAIL_TEXT_STRING_GROUP_INDEX))); + for (String proposalStr : InTextDirectivesUtils.findLinesWithPrefixesRemoved(fileText, prefixes)) { + if (proposalStr.startsWith("{")){ + JsonParser parser = new JsonParser(); + JsonElement json = parser.parse(proposalStr); + proposals.add(new CompletionProposal((JsonObject) json)); + } + else{ + for(String item : proposalStr.split(",")){ + proposals.add(new CompletionProposal(item.trim())); + } + } } return ArrayUtil.toObjectArray(proposals, CompletionProposal.class); @@ -225,7 +235,7 @@ public class ExpectedCompletionUtils { for (int index = 0; index < itemsInformation.size(); index++) { CompletionProposal proposal = itemsInformation.get(index); - if (proposal.isSuitable(expectedProposal)) { + if (proposal.matches(expectedProposal)) { isFound = true; Assert.assertTrue("Invalid order of existent elements in " + allItemsString, @@ -236,7 +246,14 @@ public class ExpectedCompletionUtils { } } - Assert.assertTrue("Expected '" + expectedProposal + "' not found in " + allItemsString, isFound); + if (!isFound) { + if (allItemsString.isEmpty()) { + Assert.fail("Completion is empty but " + expectedProposal + " is expected"); + } + else { + Assert.fail("Expected " + expectedProposal + " not found in:\n" + allItemsString); + } + } } } @@ -259,7 +276,7 @@ public class ExpectedCompletionUtils { for (CompletionProposal unexpectedProposal : unexpected) { for (CompletionProposal proposal : itemsInformation) { Assert.assertFalse("Unexpected '" + unexpectedProposal + "' presented in " + allItemsString, - proposal.isSuitable(unexpectedProposal)); + proposal.matches(unexpectedProposal)); } } } @@ -271,8 +288,18 @@ public class ExpectedCompletionUtils { if (items != null) { for (LookupElement item : items) { item.renderElement(presentation); - result.add(new ExpectedCompletionUtils.CompletionProposal(item.getLookupString(), presentation.getItemText(), - presentation.getTailText())); + Map map = new HashMap(); + map.put(CompletionProposal.LOOKUP_STRING, item.getLookupString()); + if (presentation.getItemText() != null){ + map.put(CompletionProposal.PRESENTATION_ITEM_TEXT, presentation.getItemText()); + } + if (presentation.getTypeText() != null){ + map.put(CompletionProposal.PRESENTATION_TYPE_TEXT, presentation.getTypeText()); + } + if (presentation.getTailText() != null){ + map.put(CompletionProposal.PRESENTATION_TAIL_TEXT, presentation.getTailText()); + } + result.add(new ExpectedCompletionUtils.CompletionProposal(map)); } }