completion tests should reflect real-life item order
[idea/community.git] / java / java-tests / testSrc / com / intellij / codeInsight / completion / SmartTypeCompletionTest.java
1 package com.intellij.codeInsight.completion;
2
3 import com.intellij.JavaTestUtil;
4 import com.intellij.codeInsight.CodeInsightSettings;
5 import com.intellij.codeInsight.lookup.Lookup;
6 import com.intellij.codeInsight.lookup.LookupElement;
7 import com.intellij.codeInsight.lookup.LookupElementPresentation;
8 import com.intellij.codeInsight.lookup.PsiTypeLookupItem;
9 import com.intellij.codeInsight.template.SmartCompletionContextType;
10 import com.intellij.codeInsight.template.Template;
11 import com.intellij.codeInsight.template.TemplateContextType;
12 import com.intellij.codeInsight.template.TemplateManager;
13 import com.intellij.codeInsight.template.impl.TemplateImpl;
14 import com.intellij.codeInsight.template.impl.TemplateSettings;
15 import com.intellij.openapi.fileEditor.FileDocumentManager;
16 import com.intellij.openapi.util.Condition;
17 import com.intellij.psi.codeStyle.CodeStyleSettings;
18 import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
19 import com.intellij.util.containers.ContainerUtil;
20
21 public class SmartTypeCompletionTest extends LightFixtureCompletionTestCase {
22
23   @Override
24   protected String getBasePath() {
25     return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/completion/smartType/";
26   }
27
28   public void testParenAfterCast1() throws Exception {
29     String path = "/parenAfterCast";
30
31     configureByFile(path + "/before1.java");
32     checkResultByFile(path + "/after1.java");
33   }
34
35   public void testParenAfterCast2() throws Exception {
36     String path = "/parenAfterCast";
37
38     configureByFile(path + "/before2.java");
39     checkResultByFile(path + "/after2.java");
40   }
41
42
43   public void testParenAfterCast3() throws Exception {
44     String path = "/parenAfterCast";
45
46     configureByFile(path + "/before3.java");
47     checkResultByFile(path + "/after3.java");
48   }
49
50   public void testParenAfterCall1() throws Exception {
51     String path = "/parenAfterCall";
52
53     configureByFile(path + "/before1.java");
54     checkResultByFile(path + "/after1.java");
55   }
56
57   public void testParenAfterCall2() throws Exception {
58     String path = "/parenAfterCall";
59
60     configureByFile(path + "/before2.java");
61     checkResultByFile(path + "/after2.java");
62   }
63
64   public void testParenAfterCall3() throws Exception {
65     String path = "/parenAfterCall";
66
67     configureByFile(path + "/before3.java");
68     checkResultByFile(path + "/after3.java");
69   }
70
71   public void testParenAfterCall4() throws Exception {
72     String path = "/parenAfterCall";
73
74     configureByFile(path + "/before4.java");
75     checkResultByFile(path + "/after4.java");
76   }
77
78   public void testParenAfterCall5() throws Exception {
79     String path = "/parenAfterCall";
80
81     configureByFile(path + "/before5.java");
82     checkResultByFile(path + "/after5.java");
83   }
84
85   public void testParenAfterCall6() throws Exception {
86     String path = "/parenAfterCall";
87
88     configureByFile(path + "/before6.java");
89     checkResultByFile(path + "/after6.java");
90   }
91   
92   public void testParenAfterCall1_SpaceWithinMethodCallParens() throws Exception {
93     String path = "/parenAfterCall";
94
95     CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(getProject());
96     myFixture.configureByFile(path + "/before1.java");
97     styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES = true;
98     try{
99       complete();
100     }
101     finally{
102       styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES = false;
103     }
104     checkResultByFile(path + "/after1_space.java");
105   }
106
107   public void testParenAfterIf1() throws Exception {
108     String path = "/parenAfterIf";
109
110     configureByFile(path + "/before1.java");
111     checkResultByFile(path + "/after1.java");
112   }
113
114   public void testParenAfterIf2() throws Exception {
115     String path = "/parenAfterIf";
116
117     configureByFile(path + "/before2.java");
118     checkResultByFile(path + "/after2.java");
119   }
120
121   public void testForceLookupForAbstractClasses() throws Exception {
122     String path = "/afterNew";
123
124     configureByFile(path + "/before9.java");
125     checkResultByFile(path + "/after9.java");
126   }
127
128   public void testAfterNew1() throws Exception {
129     String path = "/afterNew";
130
131     configureByFile(path + "/before1.java");
132     select();
133     checkResultByFile(path + "/after1.java");
134   }
135
136   public void testAfterNew2() throws Exception {
137     String path = "/afterNew";
138
139     configureByFile(path + "/before2.java");
140     select();
141     checkResultByFile(path + "/after2.java");
142   }
143
144   public void testAfterNew3() throws Exception {
145     String path = "/afterNew";
146
147     configureByFile(path + "/before3.java");
148     select();
149     checkResultByFile(path + "/after3.java");
150   }
151
152   public void testAfterNew4() throws Exception {
153     String path = "/afterNew";
154
155     configureByFile(path + "/before4.java");
156     select();
157     checkResultByFile(path + "/after4.java");
158   }
159
160   public void testAfterNew5() throws Exception {
161     String path = "/afterNew";
162
163     configureByFile(path + "/before5.java");
164     select();
165     checkResultByFile(path + "/after5.java");
166   }
167
168   public void testAfterNew6() throws Exception {
169     String path = "/afterNew";
170
171     configureByFile(path + "/before6.java");
172     select();
173     checkResultByFile(path + "/after6.java");
174   }
175
176   public void testAfterNew7() throws Exception {
177     String path = "/afterNew";
178
179     configureByFile(path + "/before7.java");
180     select();
181     checkResultByFile(path + "/after7.java");
182   }
183
184   public void testAfterNew8() throws Exception {
185     String path = "/afterNew";
186
187     configureByFile(path + "/before8.java");
188     select();
189     checkResultByFile(path + "/after8.java");
190   }
191
192   public void testAfterNew9() throws Exception {
193     String path = "/afterNew";
194
195     configureByFile(path + "/before10.java");
196     select();
197     checkResultByFile(path + "/after10.java");
198   }
199
200   public void testAfterNew10() throws Exception {
201     String path = "/afterNew";
202
203     configureByFile(path + "/before12.java");
204     //select();
205     checkResultByFile(path + "/after12.java");
206   }
207
208   public void testAfterNew11() throws Exception {
209     String path = "/afterNew";
210
211     configureByFile(path + "/before13.java");
212     //select();
213     checkResultByFile(path + "/after13.java");
214   }
215
216   public void testAfterThrowNew1() throws Exception {
217     String path = "/afterNew";
218
219     configureByFile(path + "/before14.java");
220     //select();
221     checkResultByFile(path + "/after14.java");
222   }
223
224   public void testAfterThrowNew2() throws Exception {
225     String path = "/afterNew";
226
227     configureByFile(path + "/before15.java");
228     //select();
229     checkResultByFile(path + "/after15.java");
230   }
231
232   public void testAfterThrowNew3() throws Exception {
233     String path = "/afterNew";
234
235     configureByFile(path + "/before16.java");
236     //select();
237     checkResultByFile(path + "/after16.java");
238   }
239
240   public void testCastInThrow() throws Exception { doTest(); }
241
242   public void testParenAfterNewWithinInnerExpr() throws Exception {
243     String path = "/afterNew";
244
245     configureByFile(path + "/LastArgInInnerNewBefore.java");
246     checkResultByFile(path + "/LastArgInInnerNewAfter.java");
247
248     //configureByFile(path + "/LastArgInInnerNewBefore2.java");
249     //performAction();
250     //checkResultByFile(path + "/LastArgInInnerNewAfter2.java");
251
252     configureByFile(path + "/LastArgInInnerNewBefore3.java");
253     checkResultByFile(path + "/LastArgInInnerNewAfter3.java");
254
255     configureByFile(path + "/LastArgInInnerNewBefore4.java");
256     checkResultByFile(path + "/LastArgInInnerNewAfter4.java");
257   }
258
259   public void testReturn1() throws Exception{
260     String path = "/return";
261     configureByFile(path + "/before1.java");
262     checkResultByFile(path + "/after1.java");
263   }
264
265   public void testReturn2() throws Exception{
266     String path = "/return";
267
268     configureByFile(path + "/before2.java");
269     checkResultByFile(path + "/after2.java");
270   }
271
272   public void testReturn3() throws Exception{
273     String path = "/return";
274
275     configureByFile(path + "/before3.java");
276     checkResultByFile(path + "/after3.java");
277   }
278
279   public void testGenerics1() throws Exception {
280     String path = "/generics";
281
282     configureByFile(path + "/before1.java");
283     checkResultByFile(path + "/after1.java");
284   }
285
286   public void testGenerics2() throws Exception {
287     String path = "/generics";
288
289     configureByFile(path + "/before2.java");
290     checkResultByFile(path + "/after2.java");
291   }
292
293   public void testGenerics3() throws Exception {
294     String path = "/generics";
295
296     configureByFile(path + "/before3.java");
297     checkResultByFile(path + "/after3.java");
298   }
299
300   public void testGenerics4() throws Exception {
301     String path = "/generics";
302
303     configureByFile(path + "/before4.java");
304     checkResultByFile(path + "/after4.java");
305   }
306
307   public void testGenerics5() throws Exception {
308     String path = "/generics";
309
310     configureByFile(path + "/before5.java");
311     checkResultByFile(path + "/after5.java");
312   }
313
314   public void testAfterInstanceOf1() throws Exception {
315     String path = "/afterInstanceOf";
316
317     configureByFile(path + "/before1.java");
318     checkResultByFile(path + "/after1.java");
319   }
320
321   public void testAfterInstanceOf2() throws Exception {
322     String path = "/afterInstanceOf";
323
324     configureByFile(path + "/before2.java");
325     checkResultByFile(path + "/after2.java");
326   }
327
328   public void testInsideCatch() throws Exception { doTest(); }
329
330   public void testGenerics6() throws Exception {
331     String path = "/generics";
332
333     configureByFile(path + "/before6.java");
334     checkResultByFile(path + "/after6.java");
335   }
336
337   public void testWildcardNew1() throws Exception {
338     String path = "/generics";
339
340     configureByFile(path + "/before7.java");
341     checkResultByFile(path + "/after7.java");
342   }
343
344   public void testWildcardNew2() throws Exception {
345     String path = "/generics";
346
347     configureByFile(path + "/before8.java");
348     checkResultByFile(path + "/after8.java");
349   }
350
351   public void testWildcardEliminated() throws Exception {
352     String path = "/generics";
353
354     configureByFile(path + "/before9.java");
355     checkResultByFile(path + "/after9.java");
356   }
357
358   public void testBug1() throws Exception { doTest(); }
359
360   public void testQualifiedThis() throws Exception { doTest(); }
361
362   public void testBug2() throws Exception {
363     configureByFile("/Bug2.java");
364   }
365
366
367   public void testSillyAssignment1() throws Exception {
368     configureByFile("/Silly1.java");
369     checkResultByFile("/Silly1.java");
370   }
371
372   public void testVarargs1() throws Exception { doTest(); }
373
374   public void testEnumConstInSwitch() throws Exception { doTest(); }
375
376   public void testEnumConstInSwitchOutside() throws Exception { doTest(); }
377
378   public void testIntConstInSwitch() throws Exception { doTest(); }
379
380   public void testDoubleEmptyArray() throws Exception {
381     configureByTestName();
382     checkResultByFile("/"+getTestName(false) + ".java");
383     assertEquals(2, myItems.length);
384   }
385
386   public void testCollectionsEmptySetInMethodCall() throws Throwable { doTest(); }
387
388   public void testCollectionsEmptySetInTernary() throws Throwable { doTest(); }
389
390   public void testStringConstantInAnno() throws Throwable { doTest(); }
391
392   public void testCollectionsEmptySetInTernary2() throws Throwable { doTest(); }
393
394   public void testConstructorOnSeparateLineInMethodCall() throws Throwable { doTest(); }
395
396   public void testConstructorWithExistingParens() throws Throwable { doTest(); }
397
398   public void testMethodAnnotationNamedParameter() throws Throwable { doTest(); }
399   
400   public void testInheritedClass() throws Throwable { doTest(); }
401
402   public void testClassLiteralInAnno1() throws Throwable { doTest(); }
403
404   public void testMeaninglessExplicitWildcardParam() throws Throwable { doTest(); }
405
406   public void testExplicitWildcardArrayParam() throws Throwable { doTest(); }
407
408   public void testCatchInAnonymous() throws Throwable { doTest(); }
409
410   public void testThrowRuntimeException() throws Throwable { doTest(); }
411
412   public void testParameterizedConstructor() throws Throwable { doTest(); }
413
414   public void testNewInnerClassNameShortPrefix() throws Throwable { doTest(); }
415
416   public void testNewInnerOfParameterizedClass() throws Throwable { doTest(); }
417
418   public void testQualifiedThisInAnonymousConstructor() throws Throwable { doTest(); }
419
420   public void testExceptionTwice() throws Throwable { doTest(); }
421
422   public void testExceptionTwice2() throws Throwable { doTest(); }
423
424   public void testNewInnerRunnable() throws Throwable { doTest(); }
425
426   public void testArrayAccessIndex() throws Throwable { doTest(); }
427
428   public void testThrowExceptionConstructor() throws Throwable { doTest(); }
429
430   public void testJavadocThrows() throws Throwable { doTest(); }
431
432   public void testDoNotExcludeAssignedVariable() throws Throwable { doTest(); }
433
434   public void testArrayIndexTailType() throws Throwable { doTest(); }
435
436   public void testPrivateOverloads() throws Throwable { doTest(); }
437
438   public void testPolyadicExpression() throws Throwable { doTest(); }
439
440   public void testCastAutoboxing() throws Throwable {
441     doItemTest();
442   }
443   public void testCastAutoboxing2() throws Throwable {
444     doItemTest();
445   }
446   public void testCastAutoboxing3() throws Throwable {
447     doItemTest();
448   }
449   public void testCastWildcards() throws Throwable { doTest(); }
450
451   public void testNoSecondMethodTypeArguments() throws Throwable { doTest(Lookup.REPLACE_SELECT_CHAR); }
452
453   public void testNoFieldsInSuperConstructorCall() throws Throwable { doTest(); }
454
455   public void testNoUninitializedFieldsInConstructor() throws Throwable {
456     configureByTestName();
457     assertStringItems("aac", "aab");
458   }
459   public void testFieldsSetInAnotherConstructor() throws Throwable { doTest(); }
460   public void testFieldsSetAbove() throws Throwable { doTest(); }
461
462   public void testHonorSelection() throws Throwable {
463     configureByTestName();
464     select();
465     checkResultByTestName();
466   }
467
468   public void testTypeParametersInheritors() throws Throwable {
469     configureByTestName();
470     assertStringItems("Foo", "Bar", "Goo");
471     select();
472     checkResultByTestName();
473   }
474
475   public void testVoidExpectedType() throws Throwable {
476     configureByTestName();
477     assertStringItems("notify", "notifyAll", "wait", "wait", "wait", "getClass", "equals", "hashCode", "toString");
478     type('e');
479     assertEquals("equals", assertOneElement(getLookup().getItems()).getLookupString());
480     select();
481     checkResultByTestName();
482   }
483
484   public void testDoubleSemicolonPenetration() throws Throwable { doTest(); }
485
486   public void testTypeParametersInheritorsComma() throws Throwable { doTest(); }
487
488   public void testTypeParametersInheritorsInExpression() throws Throwable { doTest(); }
489
490   //do we need to see all Object inheritors at all?
491   public void _testTypeParametersObjectInheritors() throws Throwable { doTest(); }
492
493   public void testDoubleThis() throws Throwable {
494     doTest();
495     assertNull(myItems);
496   }
497
498   public void testSmartFinish() throws Throwable { doTest(Lookup.COMPLETE_STATEMENT_SELECT_CHAR); }
499
500   public void testSillyAssignmentInTernary() throws Throwable { doTest(); }
501
502   public void testSameFieldInAnotherObject() throws Throwable { doTest(); }
503
504   public void testUnqualifiedConstantInSwitch() throws Throwable { doTest(); }
505
506   public void testAmbiguousConstant() throws Throwable { doTest(); }
507
508   public void testSameNamedFieldAndLocal() throws Throwable { doTest(); }
509
510   public void testNoTailWhenNoPairBracket() throws Throwable { doTestNoPairBracket(Lookup.NORMAL_SELECT_CHAR); }
511
512   public void testNoTailWhenNoPairBracket2() throws Throwable { doTestNoPairBracket(Lookup.NORMAL_SELECT_CHAR); }
513
514   public void testAnonymousNoPairBracket() throws Throwable { doTestNoPairBracket(Lookup.NORMAL_SELECT_CHAR); }
515
516   private void doTestNoPairBracket(final char c) throws Exception {
517     boolean old = CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET;
518     CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = false;
519     try {
520       doTest(c);
521     }
522     finally {
523       CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET = old;
524     }
525   }
526
527   public void testNoConstructorTailWhenNoPairBracket() throws Throwable { doTestNoPairBracket(Lookup.NORMAL_SELECT_CHAR); }
528
529   public void testConstructorNoPairBracketSemicolon() throws Throwable { doTestNoPairBracket(';'); }
530
531   public void testMethodNoPairBracketComma() throws Throwable { doTestNoPairBracket(','); }
532
533   public void testAbstractClassTwice() throws Throwable {
534     configureByTestName();
535     assertOneElement(myItems);
536   }
537
538   public void testConstantTwice() throws Throwable { doTest(); }
539
540   public void testConstantTwice2() throws Throwable {
541     configureByTestName();
542     assertEquals(2, myItems.length);
543   }
544
545   public void testNoKeyConstant() throws Throwable {
546     configureByTestName();
547     assertStringItems("A_KEY", "create");
548   }
549
550   public void testUserDataListAddAll() throws Throwable {
551     doTest();
552   }
553
554   public void testStaticSubclass() throws Throwable {
555     doTest();
556   }
557
558   public void testMethodCallDot() throws Throwable { doTest(); }
559   public void testNegateVariable() throws Throwable { doTest(); }
560
561   public void testExclamationMethodFinish() throws Throwable { doTest('!'); }
562   public void testExclamationVariableFinish() throws Throwable { doTest('!'); }
563   public void testExclamationStaticFieldFinish() throws Throwable { doTest('!'); }
564   public void testExclamationFinishNonBoolean() throws Throwable { doTest('!'); }
565
566   public void testExcludeDeclaredConstant() throws Throwable { doTest(); }
567
568   public void testTabMethodInBinaryExpression() throws Throwable { doTest('\t'); }
569
570   public void testIfConditionBinaryExpression() throws Throwable { doTest(); }
571
572   public void testDelegationToParent() throws Throwable { doTest(); }
573
574   public void testBeforeBinaryExpressionInMethodCall() throws Throwable { doTest(); }
575
576   public void testAssignableToAfterCast() throws Throwable { doTest(); }
577
578   public void testInstanceMethodParametersFromStaticContext() throws Throwable { doTest(); }
579
580   public void testInstanceMethodParametersFromStaticContext2() throws Throwable { doTest(); }
581
582   public void testBeforeCastToArray() throws Throwable { doTest(); }
583
584   public void testHidingFields() throws Throwable { doTest(); }
585
586   public void testVoidCast() throws Throwable { doAntiTest(); }
587
588   public void testIntPlusLongNotDouble() throws Throwable { doTest(); }
589
590   public void testNestedAssignments() throws Throwable { doTest(); }
591
592   public void testAfterNewInTernary() throws Throwable { doTest(); }
593
594   public void testSuggestAnythingWhenWildcardExpected() throws Throwable {
595     configureByTestName();
596     assertStringItems("X", "Y", "Z");
597   }
598
599   public void testNewVararg() throws Throwable {
600     configureByTestName();
601     assertStringItems("Foo", "Foo");
602     assertEquals(0, myItems[0].as(PsiTypeLookupItem.class).getBracketsCount());
603     assertEquals(1, myItems[1].as(PsiTypeLookupItem.class).getBracketsCount());
604   }
605
606   public void testInsideStringLiteral() throws Throwable { doAntiTest(); }
607
608   public void testDefaultAnnoParam() throws Throwable { doTest(); }
609
610   public void testCastGenericQualifier() throws Throwable { doTest(); }
611
612   public void testEverythingDoubles() throws Throwable {
613     configureByTestName();
614     assertStringItems("hashCode", "indexOf", "lastIndexOf", "size");
615   }
616
617   public void testNonStaticInnerClass() throws Throwable {
618     configureByTestName();
619     assertEmpty(myItems);
620     checkResultByFile("/" + getTestName(false) + ".java");
621   }
622
623   //todo 2nd completion
624   public void _testDefaultAnnoParam2() throws Throwable { doTest(); }
625
626   public void testLiveTemplate() throws Throwable {
627     final Template template = TemplateManager.getInstance(getProject()).createTemplate("foo", "zzz");
628     template.addTextSegment("FooFactory.createFoo()");
629     final SmartCompletionContextType completionContextType =
630       ContainerUtil.findInstance(TemplateContextType.EP_NAME.getExtensions(), SmartCompletionContextType.class);
631     ((TemplateImpl)template).getTemplateContext().setEnabled(completionContextType, true);
632     TemplateSettings.getInstance().addTemplate(template);
633     try {
634       doTest();
635     }
636     finally {
637       TemplateSettings.getInstance().removeTemplate(template);
638     }
639   }
640
641   public void testInThisExpression() throws Throwable { doTest(); }
642
643   public void testSuggestNull() throws Throwable { doTest(); }
644
645   public void testNoNullAfterDot() throws Throwable {
646     configureByTestName();
647     assertEmpty(myItems);
648     checkResultByFile("/" + getTestName(false) + ".java");
649   }
650
651   public void testDefaultAnnoMethodValue() throws Throwable { doTest(); }
652
653   public void testNewAnonymousFunction() throws Throwable { doTest(); }
654
655   public void testUseIntConstantsFromTargetClass() throws Throwable { doTest(); }
656   public void testUseIntConstantsFromTargetClassReturnValue() throws Throwable { doTest(); }
657   public void testUseIntConstantsFromConstructedClass() throws Throwable { doTest(); }
658   public void testUseIntConstantsInPlus() throws Throwable { doTest(); }
659   public void testUseIntConstantsInOr() throws Throwable { doTest(); }
660
661   public void testExtraSemicolonAfterMethodParam() throws Throwable {
662     CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(getProject());
663     styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES = true;
664     try{
665       doTest();
666     }
667     finally{
668       styleSettings.SPACE_WITHIN_METHOD_CALL_PARENTHESES = false;
669     }
670   }
671
672   public void testAssignFromTheSameFieldOfAnotherObject() throws Throwable {
673     doTest();
674   }
675
676   public void testTailAfterInstanceOf() throws Throwable {
677     doTest();
678   }
679
680   public void testSuggestInstanceofedValue() throws Throwable {
681     doTest();
682   }
683
684   public void testSuggestInstanceofedValueInTernary() throws Throwable {
685     doTest();
686   }
687
688   public void testSuggestInstanceofedValueInComplexIf() throws Throwable { doTest(); }
689
690   public void testSuggestInstanceofedValueInElseNegated() throws Throwable { doTest(); }
691
692   public void testSuggestInstanceofedValueAfterReturn() throws Throwable { doTest(); }
693
694   public void testNoInstanceofedValueWhenBasicSuits() throws Throwable { doTest(); }
695
696   public void testSuggestCastedValueAfterCast() throws Throwable { doTest(); }
697
698   public void testNoInstanceofedValueInElse() throws Throwable { doAntiTest(); }
699
700   public void testNoInstanceofedValueInThenNegated() throws Throwable { doAntiTest(); }
701
702   public void testNoInstanceofedValueInElseWithComplexIf() throws Throwable { doAntiTest(); }
703
704   public void testReplaceWholeReferenceChain() throws Throwable { doTest(Lookup.REPLACE_SELECT_CHAR); }
705
706   public void testInstanceofedInsideAnonymous() throws Throwable { doTest(Lookup.REPLACE_SELECT_CHAR); }
707
708   public void testDoubleTrueInOverloadedMethodCall() throws Throwable { doTest(Lookup.REPLACE_SELECT_CHAR); }
709
710   public void testMethodColon() throws Exception { doFirstItemTest(':'); }
711   public void testVariableColon() throws Exception { doFirstItemTest(':'); }
712
713   private void doFirstItemTest(char c) throws Exception {
714     configureByTestName();
715     select(c);
716     checkResultByTestName();
717   }
718
719   public void testOneElementArray() throws Throwable { doTest(); }
720
721   public void testCastToArray() throws Throwable { doTest(); }
722
723   public void testDontAutoCastWhenAlreadyCasted() throws Throwable {
724     configureByTestName();
725     assertEquals("s", myItems[0].getLookupString());
726     assertEquals("copyValueOf", myItems[1].getLookupString());
727     select();
728     checkResultByTestName();
729   }
730
731   public void testAutoCastWhenAlreadyCasted() throws Throwable { doTest(); }
732
733   public void testCommaDoublePenetration() throws Throwable {
734     doFirstItemTest(',');
735   }
736
737   public void testSuperMethodArguments() throws Throwable {
738     configureByTestName();
739     getLookup().setCurrentItem(getLookup().getItems().get(1));
740     select();
741     checkResultByTestName();
742   }
743
744   public void testDelegateMethodArguments() throws Throwable {
745     configureByTestName();
746     getLookup().setCurrentItem(getLookup().getItems().get(1));
747     select();
748     checkResultByTestName();
749   }
750
751   public void testSameMethodArgumentsInIf() throws Throwable {
752     configureByTestName();
753     getLookup().setCurrentItem(getLookup().getItems().get(1));
754     select();
755     checkResultByTestName();
756   }
757
758   public void testSuperConstructorArguments() throws Throwable {
759     configureByTestName();
760     getLookup().setCurrentItem(getLookup().getItems().get(2));
761     select();
762     checkResultByTestName();
763   }
764
765   public void testSameNamedArguments() throws Throwable {
766     configureByTestName();
767     getLookup().setCurrentItem(getLookup().getItems().get(4));
768     select();
769     checkResultByTestName();
770   }
771
772   public void testWrongAnonymous() throws Throwable {
773     configureByTestName();
774     select();
775     checkResultByTestName();
776   }
777
778   private void doAntiTest() throws Exception {
779     configureByTestName();
780     assertEmpty(myItems);
781     checkResultByFile("/" + getTestName(false) + ".java");
782   }
783
784   public void testAfterNewWithGenerics() throws Exception {
785     doActionTest();
786   }
787
788   public void testClassLiteral() throws Exception {
789     doActionTest();
790     assertStringItems("String.class");
791
792     LookupElementPresentation p = new LookupElementPresentation();
793     myFixture.getLookupElements()[0].renderElement(p);
794     assertEquals("String.class", p.getItemText());
795     assertEquals(" (java.lang)", p.getTailText());
796     assertNull(p.getTypeText());
797   }
798   public void testNoClassLiteral() throws Exception {
799     doActionTest();
800     assertStringItems("Object.class", "getClass", "forName", "forName");
801   }
802
803   public void testClassLiteralInAnno2() throws Throwable {
804     doItemTest();
805   }
806
807   public void testClassLiteralInheritors() throws Throwable {
808     doItemTest();
809   }
810
811   public void testInsertOverride() throws Exception {
812     CodeStyleSettings styleSettings = CodeStyleSettingsManager.getSettings(getProject());
813     styleSettings.INSERT_OVERRIDE_ANNOTATION = true;
814     doItemTest();
815   }
816
817   public void testForeach() throws Exception {
818     doActionTest();
819   }
820
821   public void testIDEADEV2626() throws Exception {
822     doActionTest();
823   }
824
825   public void testCastWith2TypeParameters() throws Throwable { doTest(); }
826   public void testClassLiteralInArrayAnnoInitializer() throws Throwable { doTest(); }
827   public void testClassLiteralInArrayAnnoInitializer2() throws Throwable { doTest(); }
828
829   public void testAnnotation() throws Exception {
830     doTest();
831     assertStringItems("ElementType.ANNOTATION_TYPE", "ElementType.CONSTRUCTOR",
832                       "ElementType.FIELD", "ElementType.LOCAL_VARIABLE",
833                       "ElementType.METHOD", "ElementType.PACKAGE", "ElementType.PARAMETER",
834                       "ElementType.TYPE", "ElementType.TYPE_PARAMETER", "ElementType.TYPE_USE");
835   }
836
837   public void testAnnotation2() throws Exception {
838     doTest();
839     assertStringItems("RetentionPolicy.CLASS", "RetentionPolicy.RUNTIME", "RetentionPolicy.SOURCE");
840   }
841   public void testAnnotation2_2() throws Exception {
842     doTest();
843     assertSameElements(myFixture.getLookupElementStrings(), "RetentionPolicy.CLASS", "RetentionPolicy.SOURCE", "RetentionPolicy.RUNTIME");
844   }
845
846   public void testAnnotation3() throws Exception {
847     doTest();
848   }
849
850   public void testAnnotation3_2() throws Exception {
851     doTest();
852   }
853
854   public void testAnnotation4() throws Exception {
855     doTest();
856
857     assertStringItems("false", "true");
858   }
859
860   public void testAnnotation5() throws Exception {
861     doTest();
862
863     assertStringItems("CONNECTION", "NO_CONNECTION");
864   }
865
866   public void testAnnotation6() throws Exception {
867     doTest();
868
869     assertStringItems("ElementType.ANNOTATION_TYPE", "ElementType.CONSTRUCTOR",
870                       "ElementType.FIELD", "ElementType.LOCAL_VARIABLE",
871                       "ElementType.METHOD", "ElementType.PACKAGE", "ElementType.PARAMETER",
872                       "ElementType.TYPE", "ElementType.TYPE_PARAMETER", "ElementType.TYPE_USE");
873   }
874
875   public void testArrayClone() throws Exception {
876     doTest();
877   }
878
879   public void testIDEADEV5150() throws Exception {
880     doTest();
881   }
882
883   public void testIDEADEV7835() throws Exception {
884     doTest();
885   }
886
887   public void testTypeArgs1() throws Exception {
888     doTest();
889   }
890
891   public void testTypeArgs2() throws Exception {
892     doTest();
893   }
894
895   public void testIfConditionExpectedType() throws Exception { doTest(); }
896
897   public void testUnboundTypeArgs() throws Exception { doTest(); }
898   public void testUnboundTypeArgs2() throws Exception { doTest(); }
899   public void testSameTypeArg() throws Exception { doTest(); }
900
901   public void testIDEADEV2668() throws Exception {
902     doTest();
903   }
904
905   public void testExcessiveTail() throws Exception {
906     doTest();
907   }
908
909   public void testExtendsInTypeCast() throws Exception {
910     doTest();
911   }
912
913   public void testTabMethodCall() throws Exception {
914     doFirstItemTest(Lookup.REPLACE_SELECT_CHAR);
915   }
916
917   public void testConstructorArgsSmartEnter() throws Exception { doTest(Lookup.COMPLETE_STATEMENT_SELECT_CHAR); }
918
919   private void configureByTestName() {
920     configureByFile("/" + getTestName(false) + ".java");
921   }
922
923   public void testIDEADEV13148() throws Exception {
924     configureByFile("/IDEADEV13148.java");
925     assertStringItems("false", "true"); //todo don't suggest boolean literals in synchronized
926   }
927
928   public void testOverloadedMethods() throws Throwable {
929     doTest();
930   }
931
932   public void testNoCommaBeforeVarargs() throws Throwable { doTest(); }
933
934   public void testEnumField() throws Throwable {
935     doItemTest();
936   }
937
938   public void testEnumField1() throws Exception {
939     doTest();
940     assertEquals(4, myItems.length);
941   }
942
943   public void testInsertTypeParametersOnImporting() throws Throwable { doTest(); }
944
945   public void testEmptyListInReturn() throws Throwable { doItemTest(); }
946
947   public void testEmptyListInReturn2() throws Throwable { doTest(); }
948
949   public void testEmptyListInReturnTernary() throws Throwable { doItemTest(); }
950
951   public void testEmptyListBeforeSemicolon() throws Throwable { doItemTest(); }
952
953   public void testEmptyListWithCollectionsPrefix() throws Throwable { doItemTest(); }
954
955   public void testForeachLoopVariableInIterableExpression() throws Throwable { doAntiTest(); }
956
957   public void testStaticallyImportedMagicMethod() throws Throwable {
958     configureByTestName();
959     assertStringItems("foo");
960     selectItem(myItems[0], '\t');
961     checkResultByTestName();
962   }
963
964   public void _testCallVarargArgument() throws Throwable { doTest(); }
965
966   public void testTabToReplaceClassKeyword() throws Throwable {
967     configureByTestName();
968     selectItem(myItems[0], Lookup.REPLACE_SELECT_CHAR);
969     checkResultByTestName();
970   }
971
972   public void testNoTypeParametersForToArray() throws Throwable {
973     doTest();
974   }
975
976   public void testStaticallyImportedField() throws Throwable { doTest(); }
977   public void testSiblingOfAStaticallyImportedField() throws Throwable { doTest(); }
978   public void testPrimitiveArrayClassInMethod() throws Throwable { doTest(); }
979   public void testPrimitiveClassInAnno() throws Throwable { doTest(); }
980   public void testNewInnerClassOfSuper() throws Throwable { doTest(); }
981   public void testAssertThatMatcher() throws Throwable { doTest(); }
982
983   public void testInferFromCall() throws Throwable {
984     doTest();
985   }
986
987   public void testInferFromCall1() throws Throwable {
988     doTest();
989   }
990
991   public void testCastToParameterizedType() throws Throwable { doActionTest(); }
992
993   public void testInnerEnumInMethod() throws Throwable {
994     doItemTest();
995   }
996
997   public void testEnumAsDefaultAnnotationParam() throws Throwable { doTest(); }
998
999   public void testNewAbstractInsideAnonymous() throws Throwable { doTest(); }
1000
1001   public void testFilterPrivateConstructors() throws Throwable { doTest(); }
1002
1003   public void testExplicitMethodTypeParametersQualify() throws Throwable { doTest(); }
1004   public void testExplicitMethodTypeParametersOverZealous() throws Throwable { doTest(); }
1005   public void testExplicitMethodTypeParametersFromSuperClass() throws Throwable { doTest(); }
1006
1007   public void testWildcardedInstanceof() throws Throwable { doTest(); }
1008   public void testWildcardedInstanceof2() throws Throwable { doTest(); }
1009   public void testWildcardedInstanceof3() throws Throwable { doTest(); }
1010
1011   public void testCheckStaticImportsType() throws Throwable { doAntiTest(); }
1012   public void testThisFieldAssignedToItself() throws Throwable { doAntiTest(); }
1013
1014   public void testCaseMissingEnumValue() throws Throwable { doTest(); }
1015   public void testCaseMissingEnumValue2() throws Throwable { doTest(); }
1016
1017   public void testTypeVariableInstanceOf() throws Throwable {
1018     configureByTestName();
1019     performAction();
1020     assertStringItems("Bar", "Goo");
1021   }
1022
1023   public void testNoWrongSubstitutorFromStats() throws Throwable {
1024     doTest();
1025     FileDocumentManager.getInstance().saveDocument(myFixture.getEditor().getDocument());
1026     doTest(); // stats are changed now
1027   }
1028
1029   public void testCommonPrefixWithSelection() throws Throwable {
1030     doItemTest();
1031   }
1032
1033   public void testNewAbstractClassWithConstructorArgs() throws Throwable {
1034     doItemTest();
1035   }
1036
1037   public void testArrayInitializerBeforeVarargs() throws Throwable { doTest(); }
1038   public void testDuplicateMembersFromSuperClass() throws Throwable { doTest(); }
1039
1040   public void testMemberImportStatically() {
1041     configureByTestName();
1042     StaticallyImportable item = myItems[0].as(StaticallyImportable.CLASS_CONDITION_KEY);
1043     assertNotNull(item);
1044     assertTrue(item.canBeImported());
1045     assertTrue(myItems[1].as(StaticallyImportable.CLASS_CONDITION_KEY).canBeImported());
1046     item.setShouldBeImported(true);
1047     type('\n');
1048     checkResultByTestName();
1049   }
1050
1051   public void testNoNewEnum() throws Throwable {
1052     configureByTestName();
1053     assertStringItems("Foo");
1054   }
1055
1056   public void testDuplicateMembersFromSuperClassInAnotherFile() throws Throwable {
1057     myFixture.addClass("class Super { public static final Super FOO = null; }");
1058     doTest();
1059   }
1060
1061   public void testInsideGenericClassLiteral() throws Throwable {
1062     configureByTestName();
1063     assertStringItems("String.class", "StringBuffer.class", "StringBuilder.class");
1064   }
1065
1066   public void testArrayAnnoParameter() throws Throwable {
1067     doActionTest();
1068   }
1069
1070   public void testInnerClassImports() throws Throwable {
1071     CodeStyleSettingsManager.getSettings(getProject()).INSERT_INNER_CLASS_IMPORTS = true;
1072     try {
1073       myFixture.addClass("package java.awt.geom; public class Point2D { public static class Double {} }");
1074       doActionTest();
1075     }
1076     finally {
1077       CodeStyleSettingsManager.getSettings(getProject()).INSERT_INNER_CLASS_IMPORTS = false;
1078     }
1079   }
1080
1081   public void testCastWithGenerics() throws Throwable {
1082     doActionTest();
1083   }
1084
1085   public void testInnerEnum() throws Exception {
1086     configureByTestName();
1087
1088     getLookup().setCurrentItem(ContainerUtil.find(myItems, new Condition<LookupElement>() {
1089       @Override
1090       public boolean value(final LookupElement lookupItem) {
1091         return "Bar.Fubar.Bar".equals(lookupItem.getLookupString());
1092       }
1093     }));
1094     select('\n');
1095     checkResultByTestName();
1096   }
1097
1098   public void testQualifiedAfterNew() throws Exception {
1099     myFixture.addClass("package foo; public interface Foo<T> {}");
1100     myFixture.addClass("package bar; public class Bar implements foo.Foo {}");
1101     doTest();
1102   }
1103
1104   public void testTabAfterNew() throws Exception {
1105     doFirstItemTest('\t');
1106   }
1107
1108   public void testNonStaticField() throws Exception { doAntiTest(); }
1109
1110   private void doActionTest() throws Exception {
1111     configureByTestName();
1112     checkResultByTestName();
1113   }
1114
1115   private void doItemTest() throws Exception {
1116     doFirstItemTest('\n');
1117   }
1118
1119   private void performAction() {
1120     complete();
1121   }
1122
1123   private void doTest() throws Exception {
1124     doTest(Lookup.NORMAL_SELECT_CHAR);
1125   }
1126
1127   private void doTest(final char c) throws Exception {
1128     boolean old = CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_SMART_TYPE_COMPLETION;
1129     if (c != Lookup.NORMAL_SELECT_CHAR) {
1130       CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_SMART_TYPE_COMPLETION = false;
1131     }
1132
1133     try {
1134       configureByTestName();
1135       if (myItems != null && myItems.length == 1) {
1136         select(c);
1137       }
1138       checkResultByTestName();
1139     }
1140     finally {
1141       if (c != Lookup.NORMAL_SELECT_CHAR) {
1142         CodeInsightSettings.getInstance().AUTOCOMPLETE_ON_SMART_TYPE_COMPLETION = old;
1143       }
1144     }
1145
1146   }
1147
1148   private void checkResultByTestName() {
1149     checkResultByFile("/" + getTestName(false) + "-out.java");
1150   }
1151
1152   @Override
1153   protected void complete() {
1154     myItems = myFixture.complete(CompletionType.SMART);
1155   }
1156
1157   private void select() {
1158     select(Lookup.NORMAL_SELECT_CHAR);
1159   }
1160
1161   private void select(final char c) {
1162     final Lookup lookup = getLookup();
1163     if (lookup != null) {
1164       selectItem(lookup.getCurrentItem(), c);
1165     }
1166   }
1167
1168 }