don't insert pair ) when choosing a lookup item by ( before an identifier
[idea/community.git] / java / java-tests / testSrc / com / intellij / codeInsight / completion / NormalCompletionTest.groovy
1 /*
2  * Copyright 2000-2011 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeInsight.completion;
17
18
19 import com.intellij.JavaTestUtil
20 import com.intellij.codeInsight.CodeInsightSettings
21 import com.intellij.codeInsight.lookup.Lookup
22 import com.intellij.codeInsight.lookup.LookupElement
23 import com.intellij.codeInsight.lookup.LookupElementPresentation
24 import com.intellij.codeInsight.lookup.LookupManager
25 import com.intellij.openapi.actionSystem.IdeActions
26 import com.intellij.openapi.command.WriteCommandAction
27 import com.intellij.openapi.fileTypes.StdFileTypes
28 import com.intellij.psi.codeStyle.CodeStyleSettings
29 import com.intellij.psi.codeStyle.CodeStyleSettingsManager
30 import com.intellij.psi.*
31
32 public class NormalCompletionTest extends LightFixtureCompletionTestCase {
33   @Override
34   protected String getBasePath() {
35     return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/normal/";
36   }
37
38   public void testSimple() throws Exception {
39     configureByFile("Simple.java");
40     assertStringItems("_local1", "_local2", "_field", "_method", "_baseField", "_baseMethod");
41   }
42
43   public void testDontCompleteFieldsAndMethodsInReferenceCodeFragment() throws Throwable {
44     final String text = CommonClassNames.JAVA_LANG_OBJECT + ".<caret>";
45     PsiFile file = JavaCodeFragmentFactory.getInstance(project).createReferenceCodeFragment(text, null, true, true);
46     myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
47     complete();
48     myFixture.checkResult(text);
49     assertEmpty(myItems);
50   }
51
52   public void testNoPackagesInExpressionCodeFragment() throws Throwable {
53     final String text = "jav<caret>";
54     PsiFile file = JavaCodeFragmentFactory.getInstance(project).createExpressionCodeFragment(text, null, null, true);
55     myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
56     complete();
57     myFixture.checkResult(text);
58     assertEmpty(myItems);
59   }
60
61   public void testSubPackagesInExpressionCodeFragment() throws Throwable {
62     PsiFile file = JavaCodeFragmentFactory.getInstance(project).createExpressionCodeFragment("java.la<caret>", null, null, true);
63     myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
64     complete();
65     myFixture.checkResult("java.lang.<caret>");
66     assertNull(myItems);
67   }
68
69   public void testPrimitivesInTypeCodeFragmentWithParameterListContext() throws Throwable {
70     def clazz = myFixture.addClass("class Foo { void foo(int a) {} }")
71
72     PsiFile file = JavaCodeFragmentFactory.getInstance(project).createTypeCodeFragment("b<caret>", clazz.methods[0].parameterList, true);
73     myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
74     complete();
75     assertStringItems('boolean', 'byte')
76   }
77
78   public void testQualifierCastingInExpressionCodeFragment() throws Throwable {
79     final ctxText = "class Bar {{ Object o; o=null }}"
80     final ctxFile = createLightFile(StdFileTypes.JAVA, ctxText)
81     final context = ctxFile.findElementAt(ctxText.indexOf("o="))
82     assert context
83
84     PsiFile file = JavaCodeFragmentFactory.getInstance(project).createExpressionCodeFragment("o instanceof String && o.subst<caret>", context, null, true);
85     myFixture.configureFromExistingVirtualFile(file.getVirtualFile());
86     complete();
87     myFixture.checkResult("o instanceof String && ((String) o).substring(<caret>)");
88     assertNull(myItems);
89   }
90
91   public void testCastToPrimitive1() throws Exception {
92     configureByFile("CastToPrimitive1.java");
93
94     for (final LookupElement item : myItems) {
95       if (item.getLookupString().equals("int")) return;
96     }
97     assertTrue(false);
98   }
99
100   public void testCastToPrimitive2() throws Exception {
101     configureByFile("CastToPrimitive2.java");
102
103     for (final LookupElement item : myItems) {
104       if (item.getLookupString().equals("int")) return;
105     }
106     assertTrue(false);
107   }
108
109   public void testCastToPrimitive3() throws Exception {
110     configureByFile("CastToPrimitive3.java");
111
112     for (final LookupElement item : myItems) {
113       if (item.getLookupString().equals("int")) return;
114     }
115     assertTrue(false);
116   }
117
118   public void testWriteInInvokeLater() throws Exception {
119     configureByFile("WriteInInvokeLater.java");
120   }
121
122   public void testQualifiedNew1() throws Exception {
123     configure()
124     assertStringItems "IInner", "Inner"
125   }
126
127   public void testQualifiedNew2() throws Exception {
128     configure()
129     assertStringItems "AnInner", "Inner"
130   }
131
132   public void testKeywordsInName() throws Exception {
133     doTest 'a\n'
134   }
135
136   public void testSimpleVariable() throws Exception { doTest() }
137
138   public void testMethodItemPresentation() {
139     configure()
140     LookupElementPresentation presentation = renderElement(myItems[0])
141     assert "equals" == presentation.itemText
142     assert "(Object anObject)" == presentation.tailText
143     assert "boolean" == presentation.typeText
144
145     assert !presentation.tailGrayed
146     assert presentation.itemTextBold
147   }
148
149   private LookupElementPresentation renderElement(LookupElement element) {
150     def presentation = new LookupElementPresentation()
151     element.renderElement(presentation)
152     return presentation
153   }
154
155   public void testMethodItemPresentationGenerics() {
156     configure()
157     LookupElementPresentation presentation = renderElement(myItems[0])
158     assert "add" == presentation.itemText
159     assert "(String o)" == presentation.tailText
160     assert "boolean" == presentation.typeText
161
162     assert !presentation.tailGrayed
163     assert presentation.itemTextBold
164   }
165
166   public void testPreferLongerNamesOption() throws Exception {
167     configureByFile("PreferLongerNamesOption.java");
168
169     assertEquals(3, myItems.length);
170     assertEquals("abcdEfghIjk", myItems[0].getLookupString());
171     assertEquals("efghIjk", myItems[1].getLookupString());
172     assertEquals("ijk", myItems[2].getLookupString());
173
174     LookupManager.getInstance(getProject()).hideActiveLookup();
175
176     CodeStyleSettingsManager.getSettings(getProject()).PREFER_LONGER_NAMES = false;
177     try{
178       configureByFile("PreferLongerNamesOption.java");
179
180       assertEquals(3, myItems.length);
181       assertEquals("ijk", myItems[0].getLookupString());
182       assertEquals("efghIjk", myItems[1].getLookupString());
183       assertEquals("abcdEfghIjk", myItems[2].getLookupString());
184     }
185     finally{
186       CodeStyleSettingsManager.getSettings(getProject()).PREFER_LONGER_NAMES = true;
187     }
188   }
189
190   public void testSCR7208() throws Exception {
191     configureByFile("SCR7208.java");
192   }
193
194   public void testProtectedFromSuper() throws Exception {
195     configureByFile("ProtectedFromSuper.java");
196     Arrays.sort(myItems);
197     assertTrue("Exception not found", Arrays.binarySearch(myItems, "xxx") > 0);
198   }
199
200   public void testBeforeInitialization() throws Exception {
201     configureByFile("BeforeInitialization.java");
202     assertNotNull(myItems);
203     assertTrue(myItems.length > 0);
204   }
205
206   public void testProtectedFromSuper2() throws Exception {
207
208     configureByFile("ProtectedFromSuper.java");
209     Arrays.sort(myItems);
210     assertTrue("Exception not found", Arrays.binarySearch(myItems, "xxx") > 0);
211   }
212
213   public void testClassLiteralInArrayAnnoInitializer() throws Throwable { doTest(); }
214   public void testClassLiteralInArrayAnnoInitializer2() throws Throwable { doTest(); }
215
216   public void testReferenceParameters() throws Exception {
217     configureByFile("ReferenceParameters.java");
218     assertNotNull(myItems);
219     assertEquals(myItems.length, 2);
220     assertEquals(myItems[0].getLookupString(), "AAAA");
221     assertEquals(myItems[1].getLookupString(), "AAAB");
222   }
223
224   public void testConstructorName1() throws Exception{
225     final CodeInsightSettings settings = CodeInsightSettings.getInstance();
226     final boolean autocomplete_on_code_completion = settings.AUTOCOMPLETE_ON_CODE_COMPLETION;
227     settings.AUTOCOMPLETE_ON_CODE_COMPLETION = false;
228     configureByFile("ConstructorName1.java");
229     assertNotNull(myItems);
230     boolean failed = true;
231     for (final LookupElement item : myItems) {
232       if (item.getLookupString().equals("ABCDE")) {
233         failed = false;
234       }
235     }
236     assertFalse(failed);
237     settings.AUTOCOMPLETE_ON_CODE_COMPLETION = autocomplete_on_code_completion;
238   }
239
240   public void testConstructorName2() throws Exception{
241     final CodeInsightSettings settings = CodeInsightSettings.getInstance();
242     final boolean autocomplete_on_code_completion = settings.AUTOCOMPLETE_ON_CODE_COMPLETION;
243     settings.AUTOCOMPLETE_ON_CODE_COMPLETION = false;
244     configureByFile("ConstructorName2.java");
245     assertNotNull(myItems);
246     boolean failed = true;
247     for (final LookupElement item : myItems) {
248       if (item.getLookupString().equals("ABCDE")) {
249         failed = false;
250       }
251     }
252     assertFalse(failed);
253     settings.AUTOCOMPLETE_ON_CODE_COMPLETION = autocomplete_on_code_completion;
254   }
255
256   public void testObjectsInThrowsBlock() throws Exception {
257     configureByFile("InThrowsCompletion.java");
258     assert "C" in myFixture.lookupElementStrings
259     assert !("B" in myFixture.lookupElementStrings)
260   }
261
262   public void testAfterInstanceof() throws Exception {
263     configureByFile("AfterInstanceof.java");
264     assert "A" in myFixture.lookupElementStrings
265   }
266
267   public void testAfterCast1() throws Exception {
268     configureByFile("AfterCast1.java");
269
270     assertNotNull(myItems);
271     assertEquals(2, myItems.length);
272   }
273
274   public void testAfterCast2() throws Exception {
275     configureByFile("AfterCast2.java");
276     checkResultByFile("AfterCast2-result.java");
277   }
278
279   public void testMethodCallForTwoLevelSelection() throws Exception {
280     configureByFile("MethodLookup.java");
281     assertEquals(2, myItems.length);
282   }
283
284   public void testMethodCallBeforeAnotherStatementWithParen() throws Exception {
285     configureByFile("MethodLookup2.java");
286     checkResultByFile("MethodLookup2_After.java");
287   }
288
289   public void testMethodCallBeforeAnotherStatementWithParen2() throws Exception {
290     CodeStyleSettings settings = CodeStyleSettingsManager.getInstance(getProject()).getCurrentSettings();
291     boolean oldvalue = settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE;
292     settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE = true;
293     configureByFile("MethodLookup2.java");
294     checkResultByFile("MethodLookup2_After2.java");
295     settings.METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE = oldvalue;
296   }
297
298   public void testSwitchEnumLabel() throws Exception {
299     configureByFile("SwitchEnumLabel.java");
300     assertEquals(3, myItems.length);
301   }
302
303   public void testMethodInAnnotation() throws Exception {
304     configureByFile("Annotation.java");
305     checkResultByFile("Annotation_after.java");
306   }
307
308   public void testMethodInAnnotation2() throws Exception {
309     configureByFile("Annotation2.java");
310     checkResultByFile("Annotation2_after.java");
311   }
312
313   public void testMethodInAnnotation3() throws Exception {
314     configureByFile("Annotation3.java");
315     checkResultByFile("Annotation3_after.java");
316   }
317
318   public void testMethodInAnnotation5() throws Exception {
319     configureByFile("Annotation5.java");
320     checkResultByFile("Annotation5_after.java");
321   }
322
323   public void testMethodInAnnotation7() throws Exception {
324     configureByFile("Annotation7.java");
325     selectItem(myItems[0]);
326     checkResultByFile("Annotation7_after.java");
327   }
328
329   public void testEnumInAnnotation() throws Exception {
330     configureByFile("Annotation4.java");
331     checkResultByFile("Annotation4_after.java");
332   }
333
334   public void testSecondAttribute() throws Exception {
335     configureByFile("Annotation6.java");
336     checkResultByFile("Annotation6_after.java");
337   }
338
339   public void testIDEADEV6408() throws Exception {
340     configureByFile("IDEADEV6408.java");
341     assertStringItems "boolean", "byte"
342   }
343
344   public void testMethodWithLeftParTailType() throws Exception {
345     configureByFile("MethodWithLeftParTailType.java");
346     type('(');
347     checkResultByFile("MethodWithLeftParTailType_after.java");
348
349     configureByFile("MethodWithLeftParTailType2.java");
350     type('(');
351     checkResultByFile("MethodWithLeftParTailType2_after.java");
352   }
353
354   public void testMethodWithLeftParTailTypeNoPairBrace() throws Exception {
355     final boolean old = CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
356     CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = false;
357
358     try {
359       configureByFile(getTestName(false) + ".java");
360       type('(');
361       checkResult()
362     }
363     finally {
364       CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = old;
365     }
366   }
367
368   public void testMethodWithLeftParTailTypeNoPairBrace2() throws Exception {
369     final boolean old = CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
370     CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = false;
371
372     try {
373       //no tail type should work the normal way
374       configureByFile("MethodWithLeftParTailTypeNoPairBrace.java");
375       selectItem(myItems[0]);
376       checkResultByFile("MethodWithLeftParTailTypeNoPairBrace_after2.java");
377     }
378     finally {
379       CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = old;
380     }
381   }
382
383   public void testMethodNoPairBrace() throws Exception {
384     final boolean old = CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
385     CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = false;
386
387     try {
388       doTest '\n'
389     }
390     finally {
391       CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = old;
392     }
393   }
394
395   public void testExcessSpaceInTypeCast() throws Throwable {
396    configure()
397    selectItem(myItems[0]);
398    checkResult()
399   }
400
401   public void testFieldType() throws Throwable { doTest(); }
402
403   public void testPackageInAnnoParam() throws Throwable {
404     doTest();
405   }
406
407   public void testClassLiteralInAnnoParam() throws Throwable {
408     doTest();
409   }
410
411   public void testExcludeStringBuffer() throws Throwable {
412     CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = [StringBuffer.name] as String[]
413     try {
414       doAntiTest()
415     }
416     finally {
417       CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = new String[0]
418     }
419   }
420
421   public void testExcludeInstanceInnerClasses() throws Throwable {
422     CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = ['foo']
423     myFixture.addClass 'package foo; public class Outer { public class Inner {} }'
424     myFixture.addClass 'package bar; public class Inner {}'
425     try {
426       configure()
427       assert 'bar.Inner' == ((JavaPsiClassReferenceElement)myFixture.lookupElements[0]).qualifiedName
428       assert myFixture.lookupElementStrings == ['Inner']
429     }
430     finally {
431       CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = new String[0]
432     }
433   }
434
435   public void testExcludedInstanceInnerClassCreation() throws Throwable {
436     CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = ['foo']
437     myFixture.addClass 'package foo; public class Outer { public class Inner {} }'
438     myFixture.addClass 'package bar; public class Inner {}'
439     try {
440       configure()
441       assert 'foo.Outer.Inner' == ((JavaPsiClassReferenceElement)myFixture.lookupElements[0]).qualifiedName
442       assert myFixture.lookupElementStrings == ['Inner']
443     }
444     finally {
445       CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = new String[0]
446     }
447   }
448
449   public void testExcludedInstanceInnerClassQualifiedReference() throws Throwable {
450     CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = ['foo']
451     myFixture.addClass 'package foo; public class Outer { public class Inner {} }'
452     myFixture.addClass 'package bar; public class Inner {}'
453     try {
454       configure()
455       assert 'foo.Outer.Inner' == ((JavaPsiClassReferenceElement)myFixture.lookupElements[0]).qualifiedName
456       assert myFixture.lookupElementStrings == ['Inner']
457     }
458     finally {
459       CodeInsightSettings.getInstance().EXCLUDED_PACKAGES = new String[0]
460     }
461   }
462
463   public void testAtUnderClass() throws Throwable {
464     doTest();
465   }
466
467   public void testLocalClassName() throws Throwable { doTest(); }
468   public void testAssigningFieldForTheFirstTime() throws Throwable { doTest(); }
469
470   public void testClassTypeParameters() throws Throwable {
471     configure()
472     assert 'K' in myFixture.lookupElementStrings
473   }
474
475   public void testClassTypeParametersGenericBounds() throws Throwable {
476     configure()
477     assert 'K' in myFixture.lookupElementStrings
478   }
479
480   public void testLocalClassTwice() throws Throwable {
481     configure()
482     assertOrderedEquals myFixture.lookupElementStrings, 'Zoooz', 'Zooooo'
483   }
484
485   public void testLocalTopLevelConflict() throws Throwable {
486     configure()
487     assertOrderedEquals myFixture.lookupElementStrings, 'Zoooz', 'Zooooo'
488   }
489
490   public void testFinalBeforeMethodCall() throws Throwable {
491     configure()
492     assertStringItems 'final', 'finalize'
493   }
494   public void testPrivateInAnonymous() throws Throwable { doTest() }
495
496   public void testMethodParenthesesSpaces() throws Throwable {
497     final settings = CodeStyleSettingsManager.getSettings(getProject())
498     settings.SPACE_BEFORE_METHOD_CALL_PARENTHESES = true
499     settings.SPACE_WITHIN_METHOD_CALL_PARENTHESES = true
500     doTest();
501   }
502
503   public void testMethodParenthesesSpacesArgs() throws Throwable {
504     final settings = CodeStyleSettingsManager.getSettings(getProject())
505     settings.SPACE_BEFORE_METHOD_CALL_PARENTHESES = true
506     settings.SPACE_WITHIN_METHOD_CALL_PARENTHESES = true
507     doTest();
508   }
509
510   public void testAtUnderClassNoModifiers() throws Throwable {
511     doTest();
512   }
513
514   public void testBreakInIfCondition() throws Throwable { doTest(); }
515   public void testAccessStaticViaInstance() throws Throwable { doTest(); }
516
517   public void testAccessStaticViaInstanceSecond() throws Throwable {
518     configure()
519     myFixture.complete(CompletionType.BASIC, 2)
520     checkResult()
521   }
522
523   public void testContinueLabel() throws Throwable { doTest(); }
524
525   public void testAnonymousProcess() {
526     myFixture.addClass 'package java.lang; public class Process {}'
527     myFixture.addClass '''
528 import java.util.*;
529 public class Process {}
530 interface Pred <A> { boolean predicate(A elem); }
531 public class ListUtils {
532     public static <A> List<A> filter(List<A> list, Pred<A> pred) {}
533 }
534 '''
535     configure()
536     type '\n'
537     checkResult()
538   }
539
540   public void testNoThisInComment() throws Throwable { doAntiTest() }
541
542   public void testLastExpressionInFor() throws Throwable { doTest(); }
543
544   public void testUndoCommonPrefixOnHide() throws Throwable {//actually don't undo
545     configureByFile(getTestName(false) + ".java");
546     checkResult()
547     LookupManager.getInstance(getProject()).hideActiveLookup();
548     checkResult()
549   }
550
551   public void testOnlyKeywordsInsideSwitch() throws Throwable {
552     configureByFile(getTestName(false) + ".java");
553     assertStringItems("case", "default");
554   }
555
556   public void testBooleanLiterals() throws Throwable {
557     doTest();
558   }
559
560   public void testDoubleBooleanInParameter() throws Throwable {
561     configure()
562     assertStringItems("boolean", "byte")
563   }
564
565   public void testDoubleConstant() throws Throwable {
566     configure()
567     assertStringItems("FOO", "Float")
568   }
569
570   public void testNotOnlyKeywordsInsideSwitch() throws Throwable {
571     doTest();
572   }
573
574   public void testChainedCallOnNextLine() throws Throwable {
575     configureByFile(getTestName(false) + ".java");
576     selectItem(myItems[0]);
577     checkResult()
578   }
579
580   public void testFinishWithDot() throws Throwable {
581     configureByFile(getTestName(false) + ".java");
582     type('.');
583     checkResult()
584   }
585
586   public void testEnclosingThis() throws Throwable { doTest(); }
587
588   public void testSeamlessConstant() throws Throwable {
589     configureByFile(getTestName(false) + ".java");
590     selectItem(myItems[0]);
591     checkResult()
592   }
593
594   public void testDefaultAnnoParam() throws Throwable { doTest(); }
595
596   public void testSpaceAfterLookupString() throws Throwable {
597     configureByFile(getTestName(false) + ".java");
598     type(' ');
599     assertNull(getLookup());
600     checkResult()
601   }
602
603   public void testNoSpaceInParensWithoutParams() throws Throwable {
604     CodeStyleSettingsManager.getSettings(getProject()).SPACE_WITHIN_METHOD_CALL_PARENTHESES = true;
605     try {
606       doTest();
607     }
608     finally {
609       CodeStyleSettingsManager.getSettings(getProject()).SPACE_WITHIN_METHOD_CALL_PARENTHESES = false;
610     }
611   }
612   
613   public void testTwoSpacesInParensWithParams() throws Throwable {
614     CodeStyleSettingsManager.getSettings(getProject()).SPACE_WITHIN_METHOD_CALL_PARENTHESES = true;
615     try {
616       doTest();
617     }
618     finally {
619       CodeStyleSettingsManager.getSettings(getProject()).SPACE_WITHIN_METHOD_CALL_PARENTHESES = false;
620     }
621   }
622
623   public void testFillCommonPrefixOnSecondCompletion() throws Throwable {
624     configureByFile(getTestName(false) + ".java");
625     type('g');
626     complete();
627     checkResult()
628     assertStringItems("getBar", "getFoo", "getClass");
629   }
630
631   public void testQualifierAsPackage() throws Throwable {
632     configureByFile(getTestName(false) + ".java");
633     selectItem(myItems[0]);
634     checkResult()
635   }
636
637   public void testQualifierAsPackage2() throws Throwable {
638     doTest();
639   }
640   
641   public void testQualifierAsPackage3() throws Throwable {
642     doTest();
643   }
644   
645   public void testPackageNamedVariableBeforeAssignment() throws Throwable {
646     doTest();
647   }
648
649   public void testFieldWithCastingCaret() throws Throwable { doTest(); }
650
651   public void testInnerEnumConstant() throws Throwable { doTest('\n'); }
652
653   public void testMethodReturnType() throws Throwable {
654     doTest();
655   }
656
657   public void testMethodReturnTypeNoSpace() throws Throwable {
658     configureByFile(getTestName(false) + ".java");
659     selectItem(myItems[0]);
660     checkResult()
661   }
662
663   public void testEnumWithoutConstants() throws Throwable {
664     doTest();
665   }
666
667   public void testDoWhileMethodCall() throws Throwable {
668     doTest();
669   }
670
671   public void testSecondTypeParameterExtends() throws Throwable {
672     doTest();
673   }
674
675   public void testGetterWithExistingNonEmptyParameterList() throws Throwable {
676     doTest();
677   }
678
679   public void testNothingAfterNumericLiteral() throws Throwable { doAntiTest(); }
680
681   public void testSpacesAroundEq() throws Throwable { doTest('='); }
682
683   public void _testClassBeforeCast() throws Throwable { doTest '\n' }
684
685   public void testNoAllClassesOnQualifiedReference() throws Throwable {
686     configureByFile(getTestName(false) + ".java");
687     assertEmpty(myItems);
688     checkResultByFile(getTestName(false) + ".java");
689   }
690
691   public void testFinishClassNameWithDot() throws Throwable {
692     configureByFile(getTestName(false) + ".java");
693     type('.');
694     checkResult()
695   }
696
697   public void testFinishClassNameWithLParen() throws Throwable {
698     configureByFile(getTestName(false) + ".java");
699     type('(');
700     checkResult()
701   }
702
703   public void testSelectNoParameterSignature() throws Throwable {
704     configureByFile(getTestName(false) + ".java");
705     final int parametersCount = ((PsiMethod)getLookup().getCurrentItem().getObject()).getParameterList().getParametersCount();
706     assertEquals(0, parametersCount);
707     type '\n'
708     checkResult()
709   }
710
711   public void testCompletionInsideClassLiteral() throws Throwable {
712     configureByFile(getTestName(false) + ".java");
713     new WriteCommandAction.Simple(getProject(), new PsiFile[0]) {
714       @Override
715       protected void run() throws Throwable {
716         getLookup().finishLookup(Lookup.NORMAL_SELECT_CHAR);
717       }
718     }.execute().throwException();
719     checkResult()
720   }
721
722   public void testFieldNegation() throws Throwable { doTest('!');}
723   public void testDefaultInSwitch() throws Throwable { doTest()}
724   public void testBreakInSwitch() throws Throwable { doTest() }
725
726   public void testSuperInConstructor() throws Throwable {
727     doTest();
728   }
729
730   public void testSuperInConstructorWithParams() throws Throwable {
731     doTest();
732   }
733
734   public void testSuperInMethod() throws Throwable {
735     doTest();
736   }
737
738   public void testSecondMethodParameterName() throws Throwable {
739     doTest();
740   }
741
742   public void testAnnotationAsUsualObject() throws Throwable {
743     doTest();
744   }
745
746   public void testAnnotationAsUsualObjectFromJavadoc() throws Throwable {
747     doTest();
748   }
749
750   public void testAnnotationAsUsualObjectInsideClass() throws Throwable {
751     doTest();
752   }
753
754   public void testAnnotationOnNothingParens() throws Throwable {
755     doTest();
756   }
757
758   public void testMultiResolveQualifier() throws Throwable {
759     doTest();
760   }
761
762   public void testSecondMethodParameter() throws Throwable { doTest(); }
763   public void testReturnInCase() throws Throwable { doTest(); }
764
765   public void testAnnotationWithoutValueMethod() throws Throwable {
766     configureByFile(getTestName(false) + ".java");
767     assertStringItems("bar", "foo");
768   }
769
770   public void testUnnecessaryMethodMerging() throws Throwable {
771     configureByFile(getTestName(false) + ".java");
772     assertStringItems("fofoo", "fofoo");
773   }
774
775   public void testDontCancelPrefixOnTyping() throws Throwable {
776     configureByFile(getTestName(false) + ".java");
777     type('~');
778     assertNull(getLookup());
779     checkResult()
780   }
781
782   public void testAnnotationQualifiedName() throws Throwable {
783     doTest();
784   }
785
786   public void testClassNameGenerics() throws Throwable {
787     configure()
788     type  '\n'
789     checkResult();
790   }
791
792   public void testClassNameAnonymous() throws Throwable {
793     configure()
794     type  '\n'
795     checkResult();
796   }
797
798   public void testClassNameWithInner() throws Throwable { doTest() }
799   public void testClassNameWithInner2() throws Throwable { doTest() }
800
801   public void testClassNameWithInstanceInner() throws Throwable { doTest('\n') }
802
803   public void testDoubleFalse() throws Throwable {
804     configureByFile(getTestName(false) + ".java");
805     assertStringItems("false", "fefefef", "finalize");
806   }
807
808   public void testSameNamedVariableInNestedClasses() throws Throwable {
809     doTest();
810     assertNull(getLookup());
811   }
812
813   public void testHonorUnderscoreInPrefix() throws Throwable {
814     doTest();
815   }
816
817   public void testNoSemicolonAfterExistingParenthesesEspeciallyIfItsACast() throws Throwable { doTest(); }
818   public void testReturningTypeVariable() throws Throwable { doTest(); }
819   public void testReturningTypeVariable2() throws Throwable { doTest(); }
820   public void testReturningTypeVariable3() throws Throwable { doTest(); }
821   public void testImportInGenericType() throws Throwable {
822     configure()
823     myFixture.complete(CompletionType.BASIC, 2)
824     checkResult();
825   }
826
827   public void testCaseTailType() throws Throwable { doTest(); }
828
829   def doPrimitiveTypeTest() {
830     configure()
831     checkResultByFile(getTestName(false) + ".java");
832     assertTrue 'boolean' in myFixture.lookupElementStrings
833   }
834
835   private def configure() {
836     configureByFile(getTestName(false) + ".java")
837   }
838
839   public void testFinalInForLoop() throws Throwable {
840     configure()
841     assertStringItems 'final'
842   }
843
844   public void testFinalInForLoop2() throws Throwable {
845     configure()
846     assertStringItems 'final', 'finalize'
847   }
848
849   public void testOnlyClassesInExtends() throws Throwable {
850     configure()
851     assertStringItems 'Inner'
852   }
853
854   public void testPrimitiveTypesInForLoop() throws Throwable { doPrimitiveTypeTest() }
855   public void testPrimitiveTypesInForLoop2() throws Throwable { doPrimitiveTypeTest() }
856   public void testPrimitiveTypesInForLoop3() throws Throwable { doPrimitiveTypeTest() }
857   public void testPrimitiveTypesInForLoop4() throws Throwable { doPrimitiveTypeTest() }
858   public void testPrimitiveTypesInForLoop5() throws Throwable { doPrimitiveTypeTest() }
859   public void testPrimitiveTypesInForLoop6() throws Throwable { doPrimitiveTypeTest() }
860
861   public void testPrimitiveTypesInForLoopSpace() throws Throwable {
862     configure()
863     myFixture.type ' '
864     checkResultByFile(getTestName(false) + "_after.java")
865   }
866
867   public void testSecondInvocationToFillCommonPrefix() throws Throwable {
868     configure()
869     type('a');
870     complete();
871     assertStringItems("fai1", "fai2", "fai3");
872     checkResult()
873   }
874
875   public void testSuggestInaccessibleOnSecondInvocation() throws Throwable {
876     configure()
877     assertStringItems("_bar", "_goo");
878     complete();
879     assertStringItems("_bar", "_goo", "_foo");
880     getLookup().setCurrentItem(getLookup().getItems().get(2));
881     selectItem(lookup.items[2], Lookup.NORMAL_SELECT_CHAR)
882     checkResult()
883   }
884
885   public void testNoCommonPrefixInsideIdentifier() throws Throwable {
886     final String path = getTestName(false) + ".java";
887     configureByFile(path);
888     checkResultByFile(path);
889     assertStringItems("fai1", "fai2");
890   }
891
892   public void testProtectedInaccessibleOnSecondInvocation() throws Throwable {
893     myFixture.configureByFile(getTestName(false) + ".java");
894     myFixture.complete(CompletionType.BASIC, 2);
895     checkResult()
896   }
897
898   public void testPropertyReferencePrefix() throws Throwable {
899     myFixture.addFileToProject("test.properties", "foo.bar=Foo! Bar!").getVirtualFile();
900     doAntiTest()
901   }
902
903   private void doTest() throws Exception {
904     configure()
905     checkResult();
906   }
907
908   private void doTest(String finishChar) throws Exception {
909     configure()
910     type finishChar
911     checkResult();
912   }
913
914   private void doAntiTest() throws Exception {
915     configure()
916     checkResultByFile(getTestName(false) + ".java");
917     assertEmpty(myItems);
918     assertNull(getLookup());
919   }
920
921   public void testSecondAnonymousClassParameter() throws Throwable { doTest(); }
922
923   public void testSpaceAfterReturn() throws Throwable {
924     configure()
925     type '\n'
926     checkResult()
927   }
928
929   private def checkResult() {
930     checkResultByFile(getTestName(false) + "_after.java")
931   }
932
933   public void testIntersectionTypeMembers() throws Throwable {
934     configure()
935     assertStringItems "fooa", "foob"
936   }
937
938   public void testCastInstanceofedQualifier() throws Throwable { doTest(); }
939   public void testCastComplexInstanceofedQualifier() throws Throwable { doTest(); }
940
941   public void testCastTooComplexInstanceofedQualifier() throws Throwable { doAntiTest(); }
942   public void testDontCastInstanceofedQualifier() throws Throwable { doTest(); }
943   public void testQualifierCastingWithUnknownAssignments() throws Throwable { doTest(); }
944   public void testQualifierCastingBeforeLt() throws Throwable { doTest(); }
945   public void testNoReturnInTernary() throws Throwable { doTest(); }
946
947   public void testOrAssignmentDfa() throws Throwable { doTest(); }
948
949   public void testWildcardsInLookup() throws Exception {
950     configure()
951     assertNotNull(getLookup());
952     type('*fz');
953     final List<LookupElement> list = getLookup().getItems();
954     assertEquals("azzzfzzz", list.get(0).getLookupString());
955     assertEquals("fzazzz", list.get(1).getLookupString());
956   }
957
958   public void testTabReplacesMethodNameWithLocalVariableName() throws Throwable { doTest('\t'); }
959   public void testMethodParameterAnnotationClass() throws Throwable { doTest(); }
960   public void testPrimitiveCastOverwrite() throws Throwable { doTest '\t' }
961   public void testClassReferenceInFor() throws Throwable { doTest ' ' }
962   public void testClassReferenceInFor2() throws Throwable { doTest ' ' }
963   public void testClassReferenceInFor3() throws Throwable {
964     CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
965     try {
966       doTest ' '
967     }
968     finally {
969       CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.FIRST_LETTER
970     }
971   }
972
973   public void testEnumConstantFromEnumMember() throws Throwable { doTest(); }
974
975   public void testPrimitiveMethodParameter() throws Throwable { doTest(); }
976
977   public void testNewExpectedClassParens() throws Throwable { doTest(); }
978
979   public void testQualifyInnerMembers() throws Throwable { doTest('\n') }
980
981   public void testSuggestExpectedTypeMembers() throws Throwable { doTest('\n') }
982   public void testSuggestExpectedTypeMembersInCall() throws Throwable { doTest('\n') }
983   public void testExpectedTypesDotSelectsItem() throws Throwable { doTest('.') }
984
985   public void testExpectedTypeMembersVersusStaticImports() throws Throwable {
986     configure()
987     assertStringItems('FOO', 'FOX')
988   }
989
990   public void testDoubleExpectedTypeFactoryMethod() throws Throwable {
991     configure()
992     assertStringItems('Key', 'create', 'create')
993     assert renderElement(myItems[1]).itemText == 'Key.<Boolean>create'
994     assert renderElement(myItems[2]).itemText == 'Key.create'
995   }
996
997   public void testSuggestExpectedTypeMembersNonImported() throws Throwable {
998     myFixture.addClass("package foo; public class Super { public static final Super FOO = null; }")
999     myFixture.addClass("package foo; public class Usage { public static void foo(Super s) {} }")
1000     doTest('\n')
1001   }
1002
1003   public void testClassNameInIfBeforeIdentifier() throws Throwable {
1004     myFixture.addClass("public class ABCDEFFFFF {}")
1005     doTest('\n')
1006   }
1007
1008   public void testClassNameWithInnersTab() throws Throwable { doTest('\t') }
1009
1010   public void testClassNameWithGenericsTab() throws Throwable {doTest('\t') }
1011   public void testClassNameWithGenericsTab2() throws Throwable {doTest('\t') }
1012
1013   public void testLiveTemplatePrefixTab() throws Throwable {doTest('\t') }
1014
1015   public void testOnlyAnnotationsAfterAt() throws Throwable { doTest() }
1016
1017   public void testOnlyExceptionsInCatch1() throws Exception { doTest() }
1018   public void testOnlyExceptionsInCatch2() throws Exception { doTest() }
1019   public void testOnlyExceptionsInCatch3() throws Exception { doTest() }
1020   public void testOnlyExceptionsInCatch4() throws Exception { doTest() }
1021
1022   public void testCommaAfterVariable() throws Throwable { doTest(',') }
1023
1024   public void testClassAngleBracket() throws Throwable { doTest('<') }
1025   public void testNoArgsMethodSpace() throws Throwable { doTest(' ') }
1026
1027   public void testClassSquareBracket() throws Throwable { doTest('[') }
1028   public void testPrimitiveSquareBracket() throws Throwable { doTest('[') }
1029   public void testVariableSquareBracket() throws Throwable { doTest('[') }
1030   public void testMethodSquareBracket() throws Throwable { doTest('[') }
1031
1032   public void testMethodParameterTypeDot() throws Throwable { doAntiTest() }
1033   public void testNewGenericClass() throws Throwable { doTest('\n') }
1034   public void testNewGenericInterface() throws Throwable { doTest() }
1035   public void testEnumPrivateFinal() throws Throwable { doTest() }
1036
1037   public void testSwitchConstantsFromReferencedClass() throws Throwable { doTest('\n') }
1038
1039   public void testUnfinishedMethodTypeParameter() throws Throwable {
1040     configure()
1041     assertStringItems("MyParameter", "MySecondParameter")
1042   }
1043   public void testUnfinishedMethodTypeParameter2() throws Throwable {
1044     configure()
1045     assertStringItems("MyParameter", "MySecondParameter")
1046   }
1047
1048   public void testSuperProtectedMethod() throws Throwable {
1049     myFixture.addClass """package foo;
1050       public class Bar {
1051           protected void foo() { }
1052       }"""
1053     doTest()
1054   }
1055
1056   public void testTopLevelClassesFromPackaged() throws Throwable {
1057     myFixture.addClass "public class Fooooo {}"
1058     final text = "package foo; class Bar { Fooo<caret> }"
1059     def file = myFixture.addFileToProject("foo/Bar.java", text)
1060     myFixture.configureFromExistingVirtualFile file.virtualFile
1061     assertEmpty myFixture.completeBasic()
1062     myFixture.checkResult text
1063   }
1064
1065   public void testRightShift() throws Throwable {
1066     configure()
1067     assertStringItems("myField1", "myField2");
1068   }
1069
1070   public void testAfterCommonPrefix() throws Throwable {
1071     configure()
1072     type 'eq'
1073     assertStringItems("equals", "equalsIgnoreCase");
1074     complete()
1075     assertStringItems("equals", "equalsIgnoreCase");
1076     type '('
1077     checkResult()
1078   }
1079
1080   public void testClassNameInsideIdentifierInIf() throws Throwable {
1081     configure()
1082     myFixture.complete(CompletionType.BASIC, 2)
1083     type '\n'
1084     checkResult()
1085   }
1086
1087   public void testKeywordSmartEnter() {
1088     configure()
1089     myFixture.performEditorAction(IdeActions.ACTION_CHOOSE_LOOKUP_ITEM_COMPLETE_STATEMENT)
1090     checkResult()
1091   }
1092
1093   public void testImportStringValue() throws Throwable {
1094     myFixture.addClass("package foo; public class StringValue {}")
1095     myFixture.addClass("package java.lang; class StringValue {}")
1096     configure()
1097     myFixture.complete(CompletionType.BASIC, 2)
1098     type ' '
1099     checkResult()
1100   }
1101
1102   public void testPrimitiveArrayWithRBrace() throws Throwable { doTest '[' }
1103
1104   public void testSuggestMembersOfStaticallyImportedClasses() throws Exception {
1105     myFixture.addClass("""package foo;
1106     public class Foo {
1107       public static void foo() {}
1108       public static void bar() {}
1109     }
1110     """)
1111     doTest()
1112   }
1113
1114   public void testSuggestMembersOfStaticallyImportedClassesUnqualifiedOnly() throws Exception {
1115     def old = CodeInsightSettings.instance.SHOW_STATIC_AFTER_INSTANCE
1116     CodeInsightSettings.instance.SHOW_STATIC_AFTER_INSTANCE = true
1117
1118     try {
1119       myFixture.addClass("""package foo;
1120       public class Foo {
1121         public static void foo() {}
1122         public static void bar() {}
1123       }
1124       """)
1125       configure()
1126       assertOneElement(myFixture.getLookupElements())
1127       myFixture.type '\t'
1128       checkResult()
1129     }
1130     finally {
1131       CodeInsightSettings.instance.SHOW_STATIC_AFTER_INSTANCE = old
1132     }
1133   }
1134
1135   public void testInstanceMagicMethod() throws Exception { doTest() }
1136
1137   public void testNoDotOverwrite() throws Exception { doTest('.') }
1138
1139   public void testStaticInnerExtendingOuter() throws Exception { doTest() }
1140   public void testPrimitiveClass() throws Exception { doTest() }
1141   public void testPrimitiveArrayClass() throws Exception { doTest() }
1142   public void testPrimitiveArrayOnlyClass() throws Exception { doAntiTest() }
1143   public void testPrimitiveArrayInAnno() throws Exception { doTest() }
1144
1145   public void testSaxParserCommonPrefix() throws Exception {
1146     myFixture.addClass("public class SAXParser {}")
1147     myFixture.addClass("public class SAXParseException {}")
1148     doTest()
1149   }
1150
1151   public void testNewClassAngleBracket() throws Exception { doTest('<') }
1152   public void testNewClassSquareBracket() throws Exception { doTest('[') }
1153
1154   public void testMethodColon() throws Exception { doTest(':') }
1155   public void testVariableColon() throws Exception { doTest(':') }
1156
1157   public void testNoMethodsInParameterType() {
1158     configure()
1159     assertOrderedEquals myFixture.lookupElementStrings, "final", "float"
1160   }
1161
1162   public void testStaticallyImportedFieldsTwice() {
1163     myFixture.addClass("""
1164       class Foo {
1165         public static final int aZOO;
1166       }
1167     """)
1168     myFixture.configureByText("a.java", """
1169       import static Foo.*
1170       class Bar {{
1171         aZ<caret>a
1172       }}
1173     """)
1174     assertOneElement myFixture.completeBasic()
1175   }
1176
1177   public void testStatementKeywords() {
1178     myFixture.configureByText("a.java", """
1179       class Bar {{
1180         <caret>xxx
1181       }}
1182     """)
1183     myFixture.completeBasic()
1184     final def strings = myFixture.lookupElementStrings
1185     assertTrue 'if' in strings
1186     assertTrue 'while' in strings
1187     assertTrue 'do' in strings
1188     assertTrue 'new' in strings
1189     assertTrue 'try' in strings
1190
1191     strings.remove 'new'
1192     assertFalse 'new' in strings
1193   }
1194
1195   public void testExpressionKeywords() {
1196     myFixture.configureByText("a.java", """
1197       class Bar {{
1198         foo(<caret>xxx)
1199       }}
1200     """)
1201     myFixture.completeBasic()
1202     final def strings = myFixture.lookupElementStrings
1203     assertTrue 'new' in strings
1204   }
1205
1206   public void testImportAsterisk() {
1207     myFixture.configureByText "a.java", "import java.lang.<caret>"
1208     myFixture.completeBasic()
1209     myFixture.type '*\n'
1210     myFixture.checkResult "import java.lang.*<caret>"
1211   }
1212
1213   public void testIntersectionTypesSOE() {
1214     myFixture.configureByText("a.java", """
1215       import java.util.*;
1216       import java.io.*;
1217       class SOE {
1218          public boolean setLocation(Iterable<? extends File> path) {
1219            return true;
1220          }
1221
1222          public void compile(List<File> classpath) {
1223              setLocation(<caret>);
1224          }
1225     }
1226   """)
1227     myFixture.completeBasic()
1228     myFixture.type '*\n'
1229     myFixture.checkResult """
1230       import java.util.*;
1231       import java.io.*;
1232       class SOE {
1233          public boolean setLocation(Iterable<? extends File> path) {
1234            return true;
1235          }
1236
1237          public void compile(List<File> classpath) {
1238              setLocation(classpath);
1239          }
1240     }
1241   """
1242   }
1243
1244   public void testDontPreselectCaseInsensitivePrefixMatch() {
1245     CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
1246     try {
1247       myFixture.configureByText "a.java", "import java.io.*; class Foo {{ int fileSize; fil<caret>x }}"
1248       myFixture.completeBasic()
1249       assert lookup.currentItem.lookupString == 'fileSize'
1250       myFixture.type('e')
1251       
1252       assert lookup.items[0].lookupString == 'File'
1253       assert lookup.items[1].lookupString == 'fileSize'
1254       assert lookup.currentItem == lookup.items[1]
1255     }
1256     finally {
1257       CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.FIRST_LETTER
1258     }
1259   }
1260
1261   public void testNoGenericsWhenChoosingWithParen() {
1262     configure()
1263     myFixture.type 'Ma('
1264     checkResult()
1265   }
1266
1267   public void testNoClosingWhenChoosingWithParenBeforeIdentifier() {
1268     configure()
1269     myFixture.type '('
1270     checkResult()
1271   }
1272
1273 }