/*
* Copyright 2000-2017 JetBrains s.r.o.
*
* 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.intellij.codeInsight
import com.intellij.codeInsight.documentation.DocumentationManager
import com.intellij.codeInsight.javadoc.DocumentationDelegateProvider
import com.intellij.codeInsight.navigation.CtrlMouseHandler
import com.intellij.lang.java.JavaDocumentationProvider
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiExpressionList
import com.intellij.psi.PsiMethod
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.testFramework.PlatformTestUtil
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
/**
* @author peter
*/
class JavaDocumentationTest extends LightCodeInsightFixtureTestCase {
private static final String STYLE_BLOCK =
" "
void testConstructorDoc() {
configure """\
class Foo { Foo() {} Foo(int param) {} }
class Foo2 {{
new Foo
}}""".stripIndent()
def originalElement = myFixture.file.findElementAt(myFixture.editor.caretModel.offset)
def element = DocumentationManager.getInstance(project).findTargetElement(myFixture.editor, myFixture.file)
def doc = new JavaDocumentationProvider().generateDoc(element, originalElement)
def expected =
"" +
"Candidates for new Foo() are:
" +
" Foo()
" +
" Foo(int param)
" +
""
assert doc == expected
}
void testConstructorDoc2() {
configure """\
class Foo { Foo() {} Foo(int param) {} }
class Foo2 {{
new Foo()
}}""".stripIndent()
def elementAt = myFixture.file.findElementAt(myFixture.editor.caretModel.offset)
def exprList = PsiTreeUtil.getParentOfType(elementAt, PsiExpressionList.class)
def doc = new JavaDocumentationProvider().generateDoc(exprList, elementAt)
def expected =
"" +
"Candidates for new Foo() are:
" +
" Foo()
" +
" Foo(int param)
" +
""
assert doc == expected
}
void testMethodDocWhenInArgList() {
configure """\
class Foo { void doFoo() {} }
class Foo2 {{
new Foo().doFoo()
}}""".stripIndent()
def exprList = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiExpressionList.class)
def doc = new JavaDocumentationProvider().generateDoc(exprList, null)
def expected =
"" + STYLE_BLOCK + "" +
"Foo" +
"void doFoo()
" +
""
assert doc == expected
}
void testGenericMethod() {
configure """\
class Bar { java.util.List foo(T param); }
class Foo {{
new Bar().foo();
}}""".stripIndent()
def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset)
def doc = CtrlMouseHandler.getInfo(ref.resolve(), ref.element)
assert doc == "Bar\n List<String> foo(String param)"
}
void testGenericField() {
configure """\
class Bar { T field; }
class Foo {{
new Bar().field
}}""".stripIndent()
def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset)
def doc = CtrlMouseHandler.getInfo(ref.resolve(), ref.element)
assert doc == "Bar\n Integer field"
}
void testMethodInAnonymousClass() {
configure """\
class Foo {{
new Runnable() {
@Override
public void run() {
m();
}
private void m() {}
}.run();
}}""".stripIndent()
def doc = CtrlMouseHandler.getInfo(editor, CtrlMouseHandler.BrowseMode.Declaration)
assert doc == "private void m()"
}
void testAsterisksFiltering() {
configure """\
class C {
/**
* For example, {@link String#String(byte[],
* int, int,
* String)}.
*/
public void m() { }
}""".stripIndent()
def method = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiMethod.class)
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"" + STYLE_BLOCK + "" +
"C" +
"public void m()
\n " +
"For example, " +
"String.String(byte[], int, int, String)" +
"."
assert doc == expected
}
void testInlineTagSpacing() {
configure """\
class C {
/** Visit the "{@code /login}" URL. */
public void m() { }
}""".stripIndent()
def method = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiMethod.class)
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"" + STYLE_BLOCK + "" +
"C" +
"public void m()
" +
" Visit the \"/login\" URL." +
""
assert doc == expected
}
void testMethodToMethodDelegate() {
DocumentationDelegateProvider provider = {
if (it instanceof PsiMethod && it.name == 'foo') {
JavaPsiFacade.getInstance(project).findClass('Foo', it.resolveScope)?.findMethodBySignature(it, false)
}
}
PlatformTestUtil.registerExtension DocumentationDelegateProvider.EP_NAME, provider, myFixture.testRootDisposable
configure '''\
class Foo {
/**
* Some doc
*/
void foo() {}
}
class Bar {
void foo() {}
}
'''
def method = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiMethod.class)
def doc = new JavaDocumentationProvider().generateDoc(method, null)
String expected = "$STYLE_BLOCK" +
"Bar" +
"void foo()
" +
"- " +
"Description copied from class:
Foo
" +
"\n Some doc\n " +
"
" +
""
assert doc == expected
}
void "test at method name with overloads"() {
def input = """\
class Foo {
void foo(String s) {
s.regionMatches()
}
}""".stripIndent()
def actual = JavaExternalDocumentationTest.getDocumentationText(myFixture.project, input)
def expected =
"Candidates for method call s.regionMatches() are:
" +
"
" +
" boolean regionMatches(int, String, int, int)
" +
" boolean regionMatches(boolean, int, String, int, int)
" +
""
assert actual == expected
}
private void configure(String text) {
myFixture.configureByText 'a.java', text
}
}