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