package org.intellij.grammar;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.testFramework.UsefulTestCase;
import com.intellij.testFramework.fixtures.CodeInsightTestFixture;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
import com.intellij.util.containers.ContainerUtil;
import java.util.Collection;
import java.util.List;
import static org.intellij.grammar.BnfCompletionTest.CheckType.*;
/**
* @author gregsh
*/
public class BnfCompletionTest extends JavaCodeInsightFixtureTestCase {
public void testKeywords1() { variants("", INCLUDES, "private", "meta"); }
public void testKeywords2() { variants("{a=b}<caret>", INCLUDES, "private", "meta"); }
public void testKeywords21() { variants("{a=b}<caret>", EXCLUDES, "pin"); }
public void testKeywords3() { variants("{a=b} private rule::= <caret>", INCLUDES, "private", "meta"); }
public void testKeywords4() { variants("{a=b} <caret>rule::=", INCLUDES, "private", "meta"); }
public void testKeywords5() { variants("{a=b} pri<caret>rule::=", INCLUDES, "private"); }
public void testKeywords6() { variants("rule::= pri<caret>other ::=", INCLUDES, "private"); }
public void testKeywords7() { variants("pr<caret>rule::=", INCLUDES, "private"); }
public void testKeywords8() { variants("rule::=\npr<caret>rule::=", INCLUDES, "private"); }
public void testKeywordsNotInComments() { variants("root ::= //rule ::= p<caret>", EXCLUDES, "public", "private"); }
public void testAttr1() { variants("{<caret>}", INCLUDES, "pin"); }
public void testAttr2() { variants("{<caret>}", INCLUDES, "pin"); }
public void testAttr3() { variants("{pin=1 rec<caret>overUntil=abc}", INCLUDES, "recoverWhile"); }
public void testAttr4() { variants("a::= {name=\"A\" p<caret>=\"\"}", INCLUDES, "pin", "elementType"); }
public void testAttr5() { variants("expr ::= {name=\"A\" e<caret>xtends=\"\"}", EXCLUDES, "expr"); }
public void testAttr6() { variants("expr ::= {<caret>e= }", EXCLUDES, "expr"); }
public void testToken1() { variants("a ::= TOK TOKEN b ::= T<caret>", INCLUDES, "TOKEN"); }
public void testToken2() { variants("{tokens=[TOK TOKEN]} a ::= T<caret>", INCLUDES, "TOKEN"); }
public void testRule1() { variants("rule::= <caret>", INCLUDES, "rule"); }
public void testRule2() { textAfter("<with space>::= ws<caret>", CompletionType.BASIC, "<with space>::= <with space>");
}
public void testExternalMethod1() { variants(initUtil() + "external rule::= <caret>",
INCLUDES, "eofX", "eofY"); }
public void testExternalMethod2() { variants(initUtil() + "external rule::= abc <caret>",
EXCLUDES, "eofX", "eofY"); }
public void testExternalMethod3() { variants(initUtil() + "root ::= external rule ::= <caret>",
EXCLUDES, "root"); }
public void testExternalMethod4() { variants(initUtil() + "root ::= external rule ::= abc <caret>",
INCLUDES, "root"); }
public void testExternalMethod5() { variants(initUtil() + "root ::= meta metaR ::= rule ::= <<<caret> >>",
INCLUDES, "eofX", "eofY", "metaR"); }
public void testExternalMethod6() { variants(initUtil() + "root ::= rule ::= <<<caret> >>",
EXCLUDES, "root"); }
private String initUtil() {
myFixture.addClass("public class X { public static boolean eofX(com.intellij.lang.PsiBuilder b, int l) { } }");
myFixture.addClass("public class Y extends X { public static boolean eofY(com.intellij.lang.PsiBuilder b, int l) { } }");
return "{ parserUtilClass='Y' } ";
}
protected void variants(String txt, CheckType checkType, String... variants) {
myFixture.configureByText("a.bnf", txt);
doVariantsTestInner(myFixture, CompletionType.BASIC, checkType, variants);
}
protected void textAfter(String txt, CompletionType type, String textAfter) {
myFixture.configureByText("a.bnf", txt);
myFixture.complete(type, 1);
assertEquals(textAfter, myFixture.getEditor().getDocument().getText());
}
public enum CheckType {EQUALS, INCLUDES, EXCLUDES}
public static void doVariantsTestInner(CodeInsightTestFixture fixture, CompletionType type, CheckType checkType, String... variants) {
fixture.complete(type, 1);
List<String> stringList = fixture.getLookupElementStrings();
assertNotNull(stringList);
Collection<String> varList = ContainerUtil.newArrayList(variants);
if (checkType == EQUALS) {
UsefulTestCase.assertSameElements(stringList, variants);
}
else if (checkType == INCLUDES) {
varList.removeAll(stringList);
assertTrue("Missing: " + varList + " in " + stringList, varList.isEmpty());
}
else if (checkType == EXCLUDES) {
varList.retainAll(stringList);
assertTrue("Unexpected: " + varList + " in " + stringList, varList.isEmpty());
}
}
}