blob: 5d0bcd4eaa8cc366426265d671af7592f7ef593d [file] [log] [blame]
/*
* Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved.
* Use is subject to license terms.
*/
package com.intellij.codeInsight.completion
import com.intellij.JavaTestUtil
import com.intellij.codeInsight.generation.OverrideImplementExploreUtil
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.lookup.LookupManager
import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ex.PathManagerEx
import com.intellij.openapi.extensions.LoadingOrder
import com.intellij.openapi.module.StdModuleTypes
import com.intellij.openapi.roots.ContentEntry
import com.intellij.openapi.roots.ModifiableRootModel
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.SourceFolder
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiManager
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.PsiTestUtil
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase
import org.jetbrains.annotations.NotNull
/**
* @author peter
*/
public class HeavyNormalCompletionTest extends JavaCodeInsightFixtureTestCase {
@Override
protected String getTestDataPath() {
return JavaTestUtil.getJavaTestDataPath();
}
public void testPackagePrefix() throws Throwable {
myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
ApplicationManager.application.runWriteAction {
final ModifiableRootModel model = ModuleRootManager.getInstance(myFixture.getModule()).getModifiableModel();
model.getContentEntries()[0].getSourceFolders()[0].setPackagePrefix("foo.bar.goo");
model.commit();
}
myFixture.completeBasic();
myFixture.checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + "_after.java");
assertTrue(JavaPsiFacade.getInstance(getProject()).findPackage("foo").isValid());
assertTrue(JavaPsiFacade.getInstance(getProject()).findPackage("foo.bar").isValid());
assertTrue(JavaPsiFacade.getInstance(getProject()).findPackage("foo.bar.goo").isValid());
}
public void testPreferTestCases() throws Throwable {
myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
ApplicationManager.application.runWriteAction {
final ModifiableRootModel model = ModuleRootManager.getInstance(myFixture.getModule()).getModifiableModel();
ContentEntry contentEntry = model.getContentEntries()[0];
SourceFolder sourceFolder = contentEntry.getSourceFolders()[0];
VirtualFile file = sourceFolder.getFile();
contentEntry.removeSourceFolder(sourceFolder);
contentEntry.addSourceFolder(file, true);
model.commit();
}
myFixture.addClass("package foo; public class SomeTestCase {}");
myFixture.addClass("package bar; public class SomeTestec {}");
myFixture.addClass("package goo; public class SomeAnchor {}");
myFixture.completeBasic();
myFixture.assertPreferredCompletionItems(0, "SomeTestCase", "SomeAnchor", "SomeTestec");
}
public void testAllClassesWhenNothingIsFound() throws Throwable {
myFixture.addClass("package foo.bar; public class AxBxCxDxEx {}");
myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
myFixture.completeBasic();
myFixture.type('\n');
myFixture.checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + "_after.java");
}
public void testAllClassesOnSecondBasicCompletion() throws Throwable {
myFixture.addClass("package foo.bar; public class AxBxCxDxEx {}");
myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
myFixture.complete(CompletionType.BASIC, 2);
LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(myFixture.getEditor());
LookupElement[] myItems = lookup.getItems().toArray(LookupElement.EMPTY_ARRAY);
assertEquals(2, myItems.length);
assertEquals("AxBxCxDxEx", myItems[1].getLookupString());
assertEquals("AyByCyDyEy", myItems[0].getLookupString());
}
static class CacheVerifyingContributor extends CompletionContributor {
@Override
void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull CompletionResultSet result) {
PsiClass psiClass = PsiTreeUtil.getParentOfType(parameters.position, PsiClass)
for (ci in OverrideImplementExploreUtil.getMethodsToOverrideImplement(psiClass, true)) {
assert ci.element.valid
}
for (ci in OverrideImplementExploreUtil.getMethodsToOverrideImplement(psiClass, false)) {
assert ci.element.valid
}
}
}
public void testMapsInvalidation() throws Exception {
JavaAutoPopupTest.registerCompletionContributor(CacheVerifyingContributor, testRootDisposable, LoadingOrder.FIRST)
myFixture.configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
assertInstanceOf(myFixture.getFile().getVirtualFile().getFileSystem(), LocalFileSystem.class); // otherwise the completion copy won't be preserved which is critical here
myFixture.completeBasic();
assertOrderedEquals(myFixture.getLookupElementStrings(), "getAaa", "getBbb");
myFixture.getEditor().getCaretModel().moveToOffset(myFixture.getEditor().getCaretModel().getOffset() + 2);
assertNull(myFixture.completeBasic());
}
public void testQualifyInaccessibleClassName() throws Exception {
PsiTestUtil.addModule(getProject(), StdModuleTypes.JAVA, "second", myFixture.getTempDirFixture().findOrCreateDir("second"));
myFixture.addFileToProject("second/foo/bar/AxBxCxDxEx.java", "package foo.bar; class AxBxCxDxEx {}");
myFixture.configureByText("a.java", "class Main { ABCDE<caret> }");
myFixture.complete(CompletionType.BASIC, 3);
myFixture.checkResult("class Main { foo.bar.AxBxCxDxEx<caret> }");
}
public void testPreferOwnMethods() {
def lib = LocalFileSystem.getInstance().refreshAndFindFileByPath(PathManagerEx.getTestDataPath() + "/../../../lib")
def nanoJar = lib.children.find { it.name.startsWith("nanoxml") }
PsiTestUtil.addLibrary(myModule, 'nano1', lib.path, ["/$nanoJar.name!/"] as String[], [] as String[])
assert JavaPsiFacade.getInstance(project).findClass('net.n3.nanoxml.StdXMLParser', GlobalSearchScope.allScope(project))
myFixture.configureByText "a.java", """
public class Test {
void method(net.n3.nanoxml.StdXMLParser f) {
f.<caret>
}
}
"""
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems 0, 'getBuilder'
}
public void testNoJavaStructureModificationOnSecondInvocation() {
myFixture.configureByText 'a.java', 'class Foo { Xxxxx<caret> }'
def oldCount = PsiManager.getInstance(project).modificationTracker.javaStructureModificationCount
assert !myFixture.completeBasic()
assert !myFixture.completeBasic()
assert oldCount == PsiManager.getInstance(project).modificationTracker.javaStructureModificationCount
}
public void testNoJavaStructureModificationOnSecondInvocationAfterTyping() {
myFixture.configureByText 'a.java', 'class Foo { Xxxxx<caret> }'
def tracker = PsiManager.getInstance(project).modificationTracker
def oldCount = tracker.javaStructureModificationCount
assert !myFixture.completeBasic()
assert oldCount == tracker.javaStructureModificationCount
myFixture.type 'x'
PsiDocumentManager.getInstance(project).commitAllDocuments()
assert oldCount != tracker.javaStructureModificationCount
oldCount = tracker.javaStructureModificationCount
assert !myFixture.completeBasic()
assert !myFixture.completeBasic()
assert oldCount == tracker.javaStructureModificationCount
}
}