/* * Copyright 2012-2013 Sergey Ignatov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.haskforce.codeInsight; // Imported from Erlang repository on 24 July 2014. import com.haskforce.HaskellFileType; import com.haskforce.HaskellLightPlatformCodeInsightFixtureTestCase; import com.haskforce.codeInsight.HaskellCompletionCacheLoader.LookupElementWrapper; import com.haskforce.codeInsight.HaskellCompletionCacheLoader.LookupElementWrapper$; import com.intellij.codeInsight.completion.CompletionType; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.fileTypes.FileType; import com.intellij.psi.PsiFile; import com.intellij.testFramework.UsefulTestCase; import com.intellij.util.Function; import com.intellij.util.containers.HashSet; import java.util.*; /** * Common functionality for completion tests */ abstract public class HaskellCompletionTestBase extends HaskellLightPlatformCodeInsightFixtureTestCase { final protected List<Function<HaskellCompletionCacheLoader.Cache, Void>> cacheLoaders; protected HaskellCompletionTestBase(String srcName) { super(srcName, srcName); cacheLoaders = new ArrayList<Function<HaskellCompletionCacheLoader.Cache, Void>>(0); } protected HaskellCompletionTestBase() { this("codeInsight"); } /* protected void localFileSystemSetUp() throws Exception { IdeaTestFixtureFactory factory = IdeaTestFixtureFactory.getFixtureFactory(); TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder = factory.createLightFixtureBuilder(getProjectDescriptor()); final IdeaProjectTestFixture fixture = fixtureBuilder.getFixture(); myFixture = IdeaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(fixture, new TempDirTestFixtureImpl()); InjectedLanguageManagerImpl.checkInjectorsAreDisposed(getProject()); myFixture.setUp(); myFixture.setTestDataPath(getTestDataPath()); myModule = myFixture.getModule(); } protected void doCheckResult(@NotNull String before, @NotNull String after) { doCheckResult(before, after, null); } protected void doCheckResult(@NotNull String before, @NotNull String after, @Nullable Character c) { myFixture.configureByText("a.erl", before); myFixture.completeBasic(); if (c != null) myFixture.type(c); myFixture.checkResult(after); } protected void doSmartTest(String text, CheckType type, String... variants) throws Throwable { doTestVariants(text, CompletionType.SMART, 1, type, variants); } protected void doTestEquals(String txt, String... variants) throws Throwable { doTestVariants(txt, CompletionType.BASIC, 1, CheckType.EQUALS, variants); } */ protected void doTestEqual(String txt, String... variants) throws Throwable { doTestVariants(txt, CompletionType.BASIC, 1, CheckType.EQUALS, variants); } protected void doTestInclude(String txt, String... variants) throws Throwable { doTestVariants(txt, CompletionType.BASIC, 1, CheckType.INCLUDES, variants); } protected void doTestExclude(String txt, String... variants) throws Throwable { doTestVariants(txt, CompletionType.BASIC, 1, CheckType.EXCLUDES, variants); } protected FileType getFileType() { return HaskellFileType.INSTANCE; } protected void doTestVariants(String txt, CompletionType type, int count, CheckType checkType, String... variants) throws Throwable { myFixture.configureByText(getFileType(), txt); PsiFile file = myFixture.getFile(); HaskellCompletionCacheLoader.Cache cacheHolder = HaskellCompletionCacheLoader.get(file.getProject()).cache(); for (Function<HaskellCompletionCacheLoader.Cache, Void> f : cacheLoaders) { f.fun(cacheHolder); } doTestVariantsInner(type, count, checkType, variants); } protected void loadLanguageExtensions(final String... ss) { cacheLoaders.add(new Function<HaskellCompletionCacheLoader.Cache, Void>() { @Override public Void fun(HaskellCompletionCacheLoader.Cache cache) { for (String s : ss) { cache.languageExtensions().add(LookupElementWrapper$.MODULE$.fromString(s)); } return null; } }); } protected void loadGhcFlags(final String... ss) { cacheLoaders.add(new Function<HaskellCompletionCacheLoader.Cache, Void>() { @Override public Void fun(HaskellCompletionCacheLoader.Cache cache) { Collections.addAll(cache.ghcFlags(), ss); return null; } }); } protected void loadVisibleModules(final String... ss) { cacheLoaders.add(new Function<HaskellCompletionCacheLoader.Cache, Void>() { @Override public Void fun(HaskellCompletionCacheLoader.Cache cache) { Collections.addAll(cache.visibleModules(), ss); return null; } }); } protected void loadModuleSymbols(final Map<String, List<LookupElement>> m) { cacheLoaders.add(new Function<HaskellCompletionCacheLoader.Cache, Void>() { @Override public Void fun(HaskellCompletionCacheLoader.Cache cache) { Map<String, Set<LookupElementWrapper>> syms = cache.moduleSymbols(); for (Map.Entry<String, List<LookupElement>> kvp : m.entrySet()) { Set<LookupElementWrapper> v = syms.get(kvp.getKey()); if (v == null) { v = new HashSet<LookupElementWrapper>(kvp.getValue().size()); syms.put(kvp.getKey(), v); } for (LookupElement e : kvp.getValue()) { v.add(new LookupElementWrapper(e)); } } return null; } }); } protected void clearCache() { cacheLoaders.clear(); } protected void doTestVariantsInner(CompletionType type, int count, CheckType checkType, String... variants) throws Throwable { myFixture.complete(type, count); List<String> stringList = myFixture.getLookupElementStrings(); assertNotNull("\nPossibly the single variant has been completed.\n" + "File after:\n" + myFixture.getFile().getText(), stringList); Collection<String> varList = new ArrayList<String>(Arrays.asList(variants)); if (checkType == CheckType.EQUALS) { UsefulTestCase.assertSameElements(stringList, variants); } else if (checkType == CheckType.INCLUDES) { varList.removeAll(stringList); assertTrue("Missing variants: " + varList, varList.isEmpty()); } else if (checkType == CheckType.EXCLUDES) { varList.retainAll(stringList); assertTrue("Unexpected variants: " + varList, varList.isEmpty()); } } public enum CheckType { EQUALS, INCLUDES, EXCLUDES } }