/* * 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 } }