Files
openide/java/java-tests/testSrc/com/intellij/codeInsight/completion/ClassNameCompletionTest.java
T
Maxim.Mossienko ecbf2e64c5 [Java] When we complete class name after new then if constructor(s) exist: show documentation for it, for several constructors suggest list of links to particular constructor documentation, same way as we do for (overloaded) calls.
Also try hard for documentation to work on incomplete new expressions like 'new Class<caret>', 'new Class(<caret>)'. As useful side effect method documentation links are shown for overloads (or method documentation for no overloads) when documentation action is invoked in argument list.
2014-12-24 22:05:27 +01:00

310 lines
10 KiB
Java

/*
* Copyright 2000-2013 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.completion;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiClass;
import com.intellij.testFramework.TestDataPath;
import java.io.IOException;
@TestDataPath("$CONTENT_ROOT/testData")
public class ClassNameCompletionTest extends LightFixtureCompletionTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7);
}
@Override
protected String getBasePath() {
return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/className/";
}
public void testImportAfterNew() throws Exception {
createClass("package pack; public class AAClass {}");
createClass("package pack; public class WithInnerAClass{\n" +
" public static class Inner{}\n" +
"}");
String path = "/importAfterNew";
configureByFile(path + "/before1.java");
checkResultByFile(path + "/after1.java");
configureByFile(path + "/before2.java");
selectItem(myItems[0]);
checkResultByFile(path + "/after2.java");
}
public void testDocAfterNew() throws Exception {
createClass("public class Time { Time() {} Time(long time) {} }");
String path = "/docAfterNew";
configureByFile(path + "/before1.java");
assertTrue(myItems != null && myItems.length >= 1);
String doc = new JavaDocumentationProvider().generateDoc(
(PsiClass)myItems[0].getObject(),
myFixture.getFile().findElementAt(myFixture.getEditor().getCaretModel().getOffset())
);
assertEquals(doc,
"<html>Candidates for new <b>Time</b>() are:<br>&nbsp;&nbsp;<a href=\"psi_element://Time\">Time()</a><br>&nbsp;&nbsp;<a href=\"psi_element://Time\">Time(long time)</a><br></html>");
}
public void testTypeParametersTemplate() throws Exception {
createClass("package pack; public interface Foo<T> {void foo(T t};");
String path = "/template";
TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
configureByFile(path + "/before1.java");
selectItem(myItems[0]);
TemplateState state = TemplateManagerImpl.getTemplateState(myFixture.getEditor());
type("String");
assert state != null;
state.gotoEnd(false);
checkResultByFile(path + "/after1.java");
configureByFile(path + "/before2.java");
selectItem(myItems[0]);
assert TemplateManagerImpl.getTemplateState(myFixture.getEditor()) == null;
checkResultByFile(path +"/after2.java");
}
private void createClass(String text) {
myFixture.addClass(text);
}
public void testAfterNewThrowable1() throws Exception {
addClassesForAfterNewThrowable();
String path = "/afterNewThrowable";
configureByFile(path + "/before1.java");
myFixture.type('\n');
checkResultByFile(path + "/after1.java");
}
private void addClassesForAfterNewThrowable() throws IOException {
createClass("public class OurException extends Throwable{}");
createClass("public class OurNotException {\n" +
" public static class InnerException extends Throwable{}\n" +
" public static class InnerNonException{}\n" +
"}");
}
public void testAfterNewThrowable2() throws Exception {
addClassesForAfterNewThrowable();
String path = "/afterNewThrowable";
configureByFile(path + "/before2.java");
myFixture.type('\n');
checkResultByFile(path + "/after2.java");
}
public void testExcessParensAfterNew() throws Exception { doTest(); }
public void testReuseParensAfterNew() throws Exception { doTest(); }
public void testBracesAfterNew() throws Exception { doTest(); }
public void testInPlainTextFile() throws Exception {
configureByFile(getTestName(false) + ".txt");
checkResultByFile(getTestName(false) + "_after.txt");
}
public void testInPropertiesFile() throws Exception {
myFixture.configureByText("a.properties", "abc = StrinBui<caret>");
complete();
myFixture.checkResult("abc = java.lang.StringBuilder<caret>");
}
public void testDoubleStringBuffer() throws Exception {
createClass("package java.lang; public class StringBuffer {}");
doTest();
assertNull(myItems);
}
public void testReplaceReferenceExpressionWithTypeElement() throws Exception {
createClass("package foo.bar; public class ABCDEF {}");
doTest();
}
public void testCamelHumpPrefix() throws Exception {
String path = "/java/";
configureByFile(path + getTestName(false) + ".java");
complete();
assertEquals(2, myItems.length);
}
private void doTest() throws Exception {
String path = "/java/";
configureByFile(path + getTestName(false) + ".java");
checkResultByFile(path + getTestName(false) + "_after.java");
}
public void testNameCompletionJava() throws Exception {
String path = "/nameCompletion/java";
configureByFile(path + "/test1-source.java");
performAction();
checkResultByFile(path + "/test1-result.java");
configureByFile(path + "/test2-source.java");
performAction();
checkResultByFile(path + "/test2-result.java");
}
public void testImplementsFiltering1() throws Exception {
final String path = "/nameCompletion/java";
configureByFile(path + "/test4-source.java");
performAction();
checkResultByFile(path + "/test4-result.java");
}
public void testImplementsFiltering2() throws Exception {
final String path = "/nameCompletion/java";
configureByFile(path + "/test3-source.java");
performAction();
checkResultByFile(path + "/test3-result.java");
configureByFile(path + "/implements2-source.java");
performAction();
checkResultByFile(path + "/implements2-result.java");
configureByFile(path + "/implements3-source.java");
performAction();
checkResultByFile(path + "/implements3-result.java");
}
public void testAnnotationFiltering() throws Exception {
createClass("@interface MyObjectType {}");
final String path = "/nameCompletion/java";
configureByFile(path + "/test8-source.java");
performAction();
checkResultByFile(path + "/test8-result.java");
cleanupVfs();
configureByFile(path + "/test9-source.java");
performAction();
checkResultByFile(path + "/test9-result.java");
cleanupVfs();
configureByFile(path + "/test9_2-source.java");
performAction();
checkResultByFile(path + "/test9_2-result.java");
cleanupVfs();
configureByFile(path + "/test9_3-source.java");
performAction();
checkResultByFile(path + "/test9_3-result.java");
cleanupVfs();
configureByFile(path + "/test11-source.java");
performAction();
checkResultByFile(path + "/test11-result.java");
cleanupVfs();
configureByFile(path + "/test10-source.java");
performAction();
checkResultByFile(path + "/test10-result.java");
cleanupVfs();
configureByFile(path + "/test12-source.java");
performAction();
checkResultByFile(path + "/test12-result.java");
cleanupVfs();
configureByFile(path + "/test13-source.java");
performAction();
checkResultByFile(path + "/test13-result.java");
}
private void cleanupVfs() {
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
public void run() {
FileDocumentManager.getInstance().saveAllDocuments();
for (VirtualFile file : myFixture.getTempDirFixture().getFile("").getChildren()) {
try {
file.delete(this);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
}
});
}
public void testInMethodCall() throws Exception {
final String path = "/nameCompletion/java";
configureByFile(path + "/methodCall-source.java");
performAction();
checkResultByFile(path + "/methodCall-result.java");
}
public void testInMethodCallQualifier() throws Exception {
final String path = "/nameCompletion/java";
configureByFile(path + "/methodCall1-source.java");
performAction();
checkResultByFile(path + "/methodCall1-result.java");
}
public void testInVariableDeclarationType() throws Exception {
final String path = "/nameCompletion/java";
configureByFile(path + "/varType-source.java");
performAction();
checkResultByFile(path + "/varType-result.java");
}
public void testExtraSpace() throws Exception { doJavaTest(); }
public void testAnnotation() throws Exception { doJavaTest(); }
public void testInStaticImport() throws Exception { doJavaTest(); }
public void testInCommentWithPackagePrefix() throws Exception { doJavaTest(); }
private void doJavaTest() throws Exception {
final String path = "/nameCompletion/java";
myFixture.configureByFile(path + "/" + getTestName(false) + "-source.java");
performAction();
checkResultByFile(path + "/" + getTestName(false) + "-result.java");
}
@Override
protected void complete() {
myItems = myFixture.complete(CompletionType.BASIC, 2);
}
private void performAction() {
complete();
if (LookupManager.getActiveLookup(myFixture.getEditor()) != null) {
myFixture.type('\n');
}
}
}