// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md). // Licensed under the Apache License, Version 2.0 (see LICENSE). package com.twitter.intellij.pants.completion; import com.intellij.codeInsight.completion.CompletionType; import com.intellij.openapi.util.text.CharFilter; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.UsefulTestCase; import com.twitter.intellij.pants.testFramework.PantsCodeInsightFixtureTestCase; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Scanner; abstract public class PantsCompletionTestBase extends PantsCodeInsightFixtureTestCase { enum CheckType {EQUALS, INCLUDES, EXCLUDES} public PantsCompletionTestBase(String... path) { super(path); } protected void configure() throws Throwable { configure(null); } protected void configure(@Nullable String targetPath) throws Throwable { setUpPantsExecutable(); final String buildPath = targetPath == null ? "BUILD" : targetPath + "/BUILD"; final VirtualFile buildFile = myFixture.copyFileToProject(getTestName(true) + ".py", buildPath); myFixture.configureFromExistingVirtualFile(buildFile); } protected void doCompletionTest(char ch) { myFixture.complete(CompletionType.BASIC); assertNotNull("There was no lookup!", myFixture.getLookup()); myFixture.finishLookup(ch); myFixture.checkResultByFile(getTestName(true) + "_expected.py"); } protected void doTestVariants() throws Throwable { doTestVariantsInner(getTestName(true) + ".txt"); } protected void doTestVariantsInner(String fileName) throws Throwable { final VirtualFile virtualFile = myFixture.copyFileToProject(fileName); final Scanner in = new Scanner(virtualFile.getInputStream()); final CompletionType type = CompletionType.valueOf(in.next()); final int count = in.nextInt(); final CheckType checkType = CheckType.valueOf(in.next()); final List<String> variants = new ArrayList<>(); while (in.hasNext()) { final String variant = StringUtil.strip(in.next(), CharFilter.NOT_WHITESPACE_FILTER); if (variant.length() > 0) { variants.add(variant); } } myFixture.complete(type, count); checkCompletion(checkType, variants); } protected void checkCompletion(CheckType checkType, String... variants) { checkCompletion(checkType, new ArrayList<String>(Arrays.asList(variants))); } protected void checkCompletion(CheckType checkType, List<String> variants) { List<String> stringList = myFixture.getLookupElementStrings(); if (stringList == null) { stringList = Collections.emptyList(); } if (checkType == CheckType.EQUALS) { UsefulTestCase.assertSameElements(stringList, variants); } else if (checkType == CheckType.INCLUDES) { variants.removeAll(stringList); assertTrue("Missing variants: " + variants, variants.isEmpty()); } else if (checkType == CheckType.EXCLUDES) { variants.retainAll(stringList); assertTrue("Unexpected variants: " + variants, variants.isEmpty()); } } }