blob: 2b4d4af70554d91b6e3580ee481840b4ca9058b5 [file] [log] [blame]
package com.intellij.codeInsight.completion
import com.intellij.JavaTestUtil
import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInspection.javaDoc.JavaDocLocalInspection
import com.intellij.lang.StdLanguages
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference
import com.intellij.psi.PsiReferenceBase
import com.intellij.psi.PsiReferenceProvider
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import com.intellij.psi.impl.source.resolve.reference.PsiReferenceRegistrarImpl
import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry
import com.intellij.psi.javadoc.PsiDocTag
import com.intellij.util.ObjectUtils
import com.intellij.util.ProcessingContext
import com.intellij.util.SystemProperties
import org.jetbrains.annotations.NotNull
/**
* @author mike
*/
public class JavadocCompletionTest extends LightFixtureCompletionTestCase {
@Override
protected void tearDown() throws Exception {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = true
super.tearDown()
}
@Override
protected String getBasePath() {
return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/javadoc/";
}
@Override
protected void setUp() throws Exception {
super.setUp();
myFixture.enableInspections(new JavaDocLocalInspection());
}
public void testNamesInPackage() throws Exception {
myFixture.configureFromExistingVirtualFile(myFixture.copyFileToProject("package-info.java", "p/package-info.java"));
complete();
assertStringItems("author", 'author ' + SystemProperties.getUserName(), "deprecated", "see", "since", "version")
}
public void testNamesInClass() throws Exception {
configureByFile("ClassTagName.java");
assertStringItems("author", 'author ' + SystemProperties.getUserName(), "deprecated", "param", "see", "serial", "since", "version");
}
public void testNamesInField() throws Exception {
configureByFile("FieldTagName.java");
assertStringItems("deprecated", "see", "serial", "serialField", "since");
}
public void testNamesInMethod0() throws Exception {
configureByFile("MethodTagName0.java");
assertStringItems("deprecated", "exception", "param", "return", "see", "serialData", "since", "throws");
}
public void testNamesInMethod1() throws Exception {
configureByFile("MethodTagName1.java");
assertStringItems("see", "serialData", "since", "throws");
}
public void testParamValueCompletion() throws Exception {
configureByFile("ParamValue0.java");
assertStringItems("a", "b", "c");
}
public void testParamValueWithPrefixCompletion() throws Exception {
configureByFile("ParamValue1.java");
assertStringItems("a1", "a2", "a3");
}
public void testDescribedParameters() throws Exception {
configureByFile("ParamValue2.java");
assertStringItems("a2", "a3");
}
public void testSee0() throws Exception {
configureByFile("See0.java");
myFixture.assertPreferredCompletionItems(0, "foo", "clone", "equals", "hashCode");
}
public void testSee1() throws Exception {
configureByFile("See1.java");
assertStringItems("notify", "notifyAll");
}
public void testSee2() throws Exception {
configureByFile("See2.java");
assertStringItems("notify", "notifyAll");
}
public void testSee3() throws Exception {
configureByFile("See3.java");
assertTrue(getLookupElementStrings().containsAll(Arrays.asList("foo", "myField")));
}
@NotNull
private List<String> getLookupElementStrings() {
return ObjectUtils.assertNotNull(myFixture.getLookupElementStrings());
}
public void testSee4() throws Exception {
configureByFile("See4.java");
assertTrue(getLookupElementStrings().containsAll(Arrays.asList("A", "B", "C")));
}
public void testSee5() throws Exception {
configureByFile("See5.java");
assertTrue(getLookupElementStrings().containsAll(Arrays.asList("foo", "myName")));
}
public void testIDEADEV10620() throws Exception {
configureByFile("IDEADEV10620.java");
checkResultByFile("IDEADEV10620-after.java");
}
public void testException0() throws Exception {
configureByFile("Exception0.java");
assertStringItems("deprecated", "exception", "param", "see", "serialData", "since", "throws");
}
public void testException1() throws Exception {
configureByFile("Exception1.java");
assertTrue(myItems.length > 18);
}
public void testException2() throws Exception {
myFixture.configureByFile("Exception2.java");
myFixture.complete(CompletionType.SMART);
assertStringItems("IllegalStateException", "IOException");
}
public void testInlineLookup() throws Exception {
configureByFile("InlineTagName.java");
assertStringItems("code", "docRoot", "inheritDoc", "link", "linkplain", "literal", "value");
}
public void testFinishWithSharp() throws Throwable {
boolean old = CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_CODE_COMPLETION;
CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_CODE_COMPLETION = false;
try {
checkFinishWithSharp();
}
finally {
CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_CODE_COMPLETION = old;
}
}
private void checkFinishWithSharp() throws Exception {
myFixture.configureByFile("FinishWithSharp.java");
myFixture.completeBasic();
type('#');
checkResultByFile("FinishWithSharp_after.java");
final List<LookupElement> items = getLookup().getItems();
assertEquals("bar", items.get(0).getLookupString());
assertEquals("foo", items.get(1).getLookupString());
}
public void testShortenClassName() throws Throwable {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = false;
doTest();
}
public void testMethodBeforeSharp() throws Throwable {
doTest();
}
public void testFieldReferenceInInnerClassJavadoc() throws Throwable {
doTest();
}
public void testShortenClassReference() throws Throwable {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = false
doTest()
}
public void testQualifiedClassReference() throws Throwable {
configureByFile(getTestName(false) + ".java");
myFixture.complete(CompletionType.BASIC, 2);
checkResultByFile(getTestName(false) + "_after.java");
}
public void testQualifiedImportedClassReference() throws Throwable { doTest() }
public void testThrowsNonImported() throws Throwable {
configureByFile(getTestName(false) + ".java");
myFixture.complete(CompletionType.BASIC, 2);
checkResultByFile(getTestName(false) + "_after.java");
}
private void doTest() throws Exception {
configureByFile(getTestName(false) + ".java");
checkResultByFile(getTestName(false) + "_after.java");
}
public void testInlinePackageReferenceCompletion() throws Exception {
configureByFile("InlineReference.java");
assertTrue(getLookupElementStrings().containsAll(Arrays.asList("io", "lang", "util")));
}
public void testQualifyClassReferenceInPackageStatement() throws Exception {
configureByFile(getTestName(false) + ".java");
myFixture.type('\n');
checkResultByFile(getTestName(false) + "_after.java");
}
public void "test suggest param names"() {
myFixture.configureByText "a.java", '''
class Foo {
/**
* @par<caret>
*/
void foo(int intParam, Object param2) {
}
}
'''
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems 0, 'param', 'param intParam', 'param param2'
myFixture.type('\n intParam\n@para')
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems 0, 'param', 'param param2'
}
public void "test fqns in package info"() {
myFixture.configureByText "package-info.java", '''
/**
* {@link java.util.Map#putA<caret>}
*/
'''
myFixture.complete(CompletionType.BASIC)
myFixture.checkResult '''
/**
* {@link java.util.Map#putAll(java.util.Map)}
*/
'''
}
public void "test suggest same param descriptions"() {
myFixture.configureByText "a.java", '''
class Foo {
/**
* @param intParam so<caret> xxx
* @throws Foo
*/
void foo2(int intParam, Object param2) { }
/**
* @param intParam some integer param
*/
void foo(int intParam, Object param2) { }
}
'''
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems 0, 'some', 'some integer param'
myFixture.lookup.currentItem = myFixture.lookupElements[1]
myFixture.type('\t')
myFixture.checkResult '''
class Foo {
/**
* @param intParam some integer param<caret>
* @throws Foo
*/
void foo2(int intParam, Object param2) { }
/**
* @param intParam some integer param
*/
void foo(int intParam, Object param2) { }
}
'''
}
public void "test see super class"() {
myFixture.addClass("package foo; public interface Foo {}")
myFixture.addClass("package bar; public class Bar {} ")
myFixture.configureByText "a.java", '''
import foo.*;
import bar.*;
/**
* @se<caret>
*/
class Impl extends Bar implements Foo {}
'''
myFixture.completeBasic()
myFixture.assertPreferredCompletionItems 0, 'see', 'see bar.Bar', 'see foo.Foo'
}
public void testShortenMethodParameterTypes() {
CodeStyleSettingsManager.getSettings(getProject()).USE_FQ_CLASS_NAMES_IN_JAVADOC = false
myFixture.addClass("package foo; public class Foo {}")
myFixture.addClass("package bar; public class Bar {}")
myFixture.configureByText "a.java", '''
import foo.*;
import bar.*;
/**
* {@link #go<caret>
*/
class Goo { void goo(Foo foo, Bar bar) {} }
'''
myFixture.completeBasic()
assert myFixture.editor.document.text.contains('@link #goo(Foo, Bar)')
}
public void testNoMethodsAfterClassDot() {
def text = '''
/**
* @see java.util.List.<caret>
*/
class Goo { void goo(Foo foo, Bar bar) {} }
'''
myFixture.configureByText "a.java", text
assert !myFixture.completeBasic()
myFixture.checkResult(text)
}
public void testCustomReferenceProvider() throws Exception {
PsiReferenceRegistrarImpl registrar =
(PsiReferenceRegistrarImpl) ReferenceProvidersRegistry.getInstance().getRegistrar(StdLanguages.JAVA);
PsiReferenceProvider provider = new PsiReferenceProvider() {
@Override
@NotNull
public PsiReference[] getReferencesByElement(@NotNull final PsiElement element, @NotNull final ProcessingContext context) {
def ref = new PsiReferenceBase<PsiElement>(element) {
@Override
public PsiElement resolve() {
return element;
}
@Override
@NotNull
public Object[] getVariants() {
return ["1", "2", "3"]
}
}
return [ref]
}
};
try {
registrar.registerReferenceProvider(PsiDocTag.class, provider);
configureByFile("ReferenceProvider.java");
assertStringItems("1", "2", "3");
}
finally {
registrar.unregisterReferenceProvider(PsiDocTag.class, provider);
}
}
}