30231e71d21b7be20a0f422860b06a5f7517868c
[idea/community.git] / java / java-tests / testSrc / com / intellij / java / psi / formatter / java / JavaFormatterBracesTest.java
1 /*
2  * Copyright 2000-2017 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.java.psi.formatter.java;
17
18 import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
19
20 /**
21  * Is intended to hold specific java formatting tests for 'braces placement' settings (
22  * <code>Project Settings - Code Style - Alignment and Braces</code>).
23  *
24  * @author Denis Zhdanov
25  * @since Apr 27, 2010 6:39:24 PM
26  */
27 public class JavaFormatterBracesTest extends AbstractJavaFormatterTest {
28
29   public void testBracePositioningAtPreviousLine() throws Exception {
30     // Inspired by IDEADEV-18529
31     doTextTest(
32       "public class TestBed\n" +
33       "{\n" +
34       "    public void methodOne()\n" +
35       "    {\n" +
36       "        //code...\n" +
37       "    }\n" +
38       "\n" +
39       "    @SomeAnnotation\n" +
40       "            <T extends Comparable> void methodTwo(T item) {\n" +
41       "        //code...\n" +
42       "    }\n" +
43       "\n" +
44       "    private void methodThree(String s) {\n" +
45       "        //code...\n" +
46       "    }\n" +
47       "}",
48
49       "public class TestBed {\n" +
50       "    public void methodOne() {\n" +
51       "        //code...\n" +
52       "    }\n" +
53       "\n" +
54       "    @SomeAnnotation\n" +
55       "    <T extends Comparable> void methodTwo(T item) {\n" +
56       "        //code...\n" +
57       "    }\n" +
58       "\n" +
59       "    private void methodThree(String s) {\n" +
60       "        //code...\n" +
61       "    }\n" +
62       "}");
63   }
64
65   public void testSimpleBlockInOneLinesAndForceBraces() throws Exception {
66     // Inspired by IDEA-19328
67     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
68     getSettings().IF_BRACE_FORCE = CommonCodeStyleSettings.FORCE_BRACES_ALWAYS;
69
70     doMethodTest(
71       "if (x > y) System.out.println(\"foo!\");",
72
73       "if (x > y) { System.out.println(\"foo!\"); }"
74     );
75   }
76
77   public void testEnforcingBracesForExpressionEndingWithLineComment() throws Exception {
78     // Inspired by IDEA-57936
79     getSettings().IF_BRACE_FORCE = CommonCodeStyleSettings.FORCE_BRACES_ALWAYS;
80
81     doMethodTest(
82       "if (true) i = 1; // Cool if\n" +
83       "else i = 2;",
84
85       "if (true) {\n" +
86       "    i = 1; // Cool if\n" +
87       "} else {\n" +
88       "    i = 2;\n" +
89       "}"
90     );
91   }
92
93   public void testMoveBraceOnNextLineForAnnotatedMethod() throws Exception {
94     // Inspired by IDEA-59336
95     getSettings().METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
96     getSettings().KEEP_SIMPLE_METHODS_IN_ONE_LINE = true;
97
98     doClassTest(
99       "@Override\n" +
100       "public int hashCode() {\n" +
101       "}\n" +
102       "@Deprecated\n" +
103       "void foo() {\n" +
104       "}",
105       "@Override\n" +
106       "public int hashCode()\n" +
107       "{\n" +
108       "}\n" +
109       "\n" +
110       "@Deprecated\n" +
111       "void foo()\n" +
112       "{\n" +
113       "}"
114     );
115   }
116   
117   public void testKeepSimpleClassesAndInterfacesInOneLine() {
118     // Inspired by IDEA-65433
119     getSettings().KEEP_SIMPLE_CLASSES_IN_ONE_LINE = true;
120     
121     String[] tests = {
122       "class Test {}",
123       
124       "interface Test {}",
125       
126       "class Test {\n" +
127       "    void test() {\n" +
128       "        new Object() {};\n" +
129       "    }\n" +
130       "}",
131       
132       "class Test {\n" +
133       "    void test() {\n" +
134       "        bind(new TypeLiteral<MyType>() {}).toProvider(MyProvider.class);\n" +
135       "    }\n" +
136       "}"
137     };
138
139     for (String test : tests) {
140       doTextTest(test, test);
141     }
142   }
143
144   public void testKeepSimpleClassesInOneLineAndLeftBraceOnNextLine() throws Exception {
145     // Inspired by IDEA-75053.
146     getSettings().KEEP_SIMPLE_CLASSES_IN_ONE_LINE = true;
147     getSettings().CLASS_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
148     
149     String text =
150       "class Test\n" +
151       "{\n" +
152       "    void foo() {\n" +
153       "        bind(new TypeLiteral<MyType>() {}).toProvider(MyProvider.class);\n" +
154       "    }\n" +
155       "}";
156     doTextTest(text, text);
157   }
158
159   public void testSimpleMethodsInOneLineEvenIfExceedsRightMargin() {
160     getSettings().KEEP_SIMPLE_METHODS_IN_ONE_LINE = true;
161     getSettings().RIGHT_MARGIN = 90;
162     String text = "public class Repr2 {\n" +
163                   "    public void start() { System.out.println(\"kfjsdkfjsdkfjskdjfslkdjfklsdjfklsdjfksjdfkljsdkfjsd!\"); }\n" +
164                   "}";
165     doTextTest(text, text);
166   }
167
168   public void testKeepSimpleBlocksInOneLine_OnIfStatementsThenBlock() throws Exception {
169     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
170     String singleLine = "if (2 > 3) { System.out.println(\"AA!\"); }";
171
172     getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
173     doMethodTest(singleLine, singleLine);
174
175     getSettings().BRACE_STYLE = CommonCodeStyleSettings.END_OF_LINE;
176     doMethodTest(singleLine, singleLine);
177   }
178
179   public void testKeepSimpleBlocksInOneLine_OnIfStatementsElseBlock() throws Exception {
180     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
181
182     String before = "if (2 > 3) {\n" +
183                     "    System.out.println(\"AA!\");\n" +
184                     "} else { int a = 3; }";
185
186     String afterNextLineOption = "if (2 > 3)\n" +
187                                  "{\n" +
188                                  "    System.out.println(\"AA!\");\n" +
189                                  "} else { int a = 3; }";
190
191     getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
192     doMethodTest(before, afterNextLineOption);
193
194     getSettings().BRACE_STYLE = CommonCodeStyleSettings.END_OF_LINE;
195     doMethodTest(before, before);
196   }
197
198   public void testIfStatement_WhenBraceOnNextLine_AndKeepSimpleBlockInOneLineEnabled() throws Exception {
199     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
200     getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
201     String before = "if (2 > 3) {\n" +
202                     "    System.out.println(\"AA!\");\n" +
203                     "}";
204     String after = "if (2 > 3)\n" +
205                    "{\n" +
206                    "    System.out.println(\"AA!\");\n" +
207                    "}";
208     doMethodTest(before, after);
209   }
210
211   public void testIfStatementElseBranchIsOnNewLine() throws Exception {
212     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
213     getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
214     String before = "if (2 > 3) {\n" +
215                     "    System.out.println(\"AA!\");\n" +
216                     "} else {\n" +
217                     "    int a = 3;\n" +
218                     "}";
219     String after = "if (2 > 3)\n" +
220                    "{\n" +
221                    "    System.out.println(\"AA!\");\n" +
222                    "} else\n" +
223                    "{\n" +
224                    "    int a = 3;\n" +
225                    "}";
226     doMethodTest(before, after);
227   }
228
229   public void testIfElseBranchesKeepedInOneLine() throws Exception {
230     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
231     getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
232
233     String singleLine = "if (2 > 3) { System.out.println(\"AA!\"); } else { System.out.println(\"BBB!!\"); }";
234     String multiLine = "if (2 > 3) { System.out.println(\"AA!\"); }\n" +
235                        "else { System.out.println(\"BBB!!\"); }";
236
237     getSettings().ELSE_ON_NEW_LINE = false;
238     doMethodTest(singleLine, singleLine);
239     doMethodTest(multiLine, singleLine);
240
241     getSettings().ELSE_ON_NEW_LINE = true;
242     doMethodTest(singleLine, multiLine);
243     doMethodTest(multiLine, multiLine);
244   }
245
246   public void testMethodBraceOnNextLineIfWrapped() {
247     getSettings().METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_IF_WRAPPED;
248     getSettings().METHOD_PARAMETERS_WRAP = CommonCodeStyleSettings.WRAP_AS_NEEDED;
249     getSettings().RIGHT_MARGIN = 50;
250     doClassTest(
251       "public static void main(int state, int column, int width, int rate) {\n" +
252       "}\n",
253       "public static void main(int state, int column,\n" +
254       "                        int width, int rate)\n" +
255       "{\n" +
256       "}\n"
257     );
258   }
259
260   public void testIDEA127110() {
261     getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true;
262     getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_IF_WRAPPED;
263     doMethodTest(
264       "if (   1 > 2) {\n" +
265       "\n" +
266       "} else {\n" +
267       "\n" +
268       "}\n" +
269       "\n" +
270       "try {\n" +
271       "\n" +
272       "} catch (     Exception e) {\n" +
273       "\n" +
274       "} finally {\n" +
275       "\n" +
276       "}",
277       "if (1 > 2) {\n" +
278       "\n" +
279       "} else {\n" +
280       "\n" +
281       "}\n" +
282       "\n" +
283       "try {\n" +
284       "\n" +
285       "} catch (Exception e) {\n" +
286       "\n" +
287       "} finally {\n" +
288       "\n" +
289       "}"
290     );
291   }
292
293   public void testConstructorLeftBraceWithComment() {
294     getSettings().METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_IF_WRAPPED;
295     doClassTest(
296       "/**\n" +
297       " *\n" +
298       " */\n" +
299       "  public Test() {\n" +
300       "}\n",
301       "/**\n" +
302       " *\n" +
303       " */\n" +
304       "public Test() {\n" +
305       "}\n"
306     );
307   }
308
309   public void testConstructorLeftBraceWithAnnotation() {
310     getSettings().METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_IF_WRAPPED;
311     doClassTest(
312       "   @Deprecated\n" +
313       "public Test() {\n" +
314       "}\n",
315       "@Deprecated\n" +
316       "public Test() {\n" +
317       "}\n"
318     );
319   }
320
321   public void testConstructorLeftBraceWithEndLineComment() {
322     getSettings().METHOD_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_IF_WRAPPED;
323     doClassTest(
324       "// comment\n" +
325       "  public Test() {\n" +
326       "}\n",
327       "// comment\n" +
328       "public Test() {\n" +
329       "}\n"
330     );
331   }
332
333   public void testAnonClassCodeBlock_BracesIndented() {
334     getSettings().CLASS_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE_SHIFTED;
335     doTextTest(
336       "class X {\n" +
337       "    public void run() {\n" +
338       "        Runnable a = new Runnable() {\n" +
339       "            @Override\n" +
340       "            public void run() {\n" +
341       "                \n" +
342       "            }\n" +
343       "        };\n" +
344       "    }\n" +
345       "}",
346
347       "class X\n" +
348       "    {\n" +
349       "    public void run() {\n" +
350       "        Runnable a = new Runnable()\n" +
351       "            {\n" +
352       "            @Override\n" +
353       "            public void run() {\n" +
354       "\n" +
355       "            }\n" +
356       "            };\n" +
357       "    }\n" +
358       "    }"
359     );
360   }
361
362   public void testMethodIsSimple_IfCodeBlockHasNoLinefeeds() {
363     getSettings().KEEP_SIMPLE_METHODS_IN_ONE_LINE = true;
364     doClassTest(
365       "public ModelAndView handleRequestInternalEmptyMulti(\n" +
366       "        final HttpServletRequest httpServletRequest,\n" +
367       "      final HttpServletResponse response)\n" +
368       "      throws IOException {}",
369       "public ModelAndView handleRequestInternalEmptyMulti(\n" +
370       "        final HttpServletRequest httpServletRequest,\n" +
371       "        final HttpServletResponse response)\n" +
372       "        throws IOException {}"
373     );
374   }
375   
376   public void testLambdaBrace() {
377     getSettings().LAMBDA_BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE;
378     doMethodTest(
379       "Runnable r = () -> {\n" +
380       "};",
381       "Runnable r = () ->\n" +
382       "{\n" +
383       "};"
384     );
385   }
386   
387   public void testLambdaBraceMoveToPrevLine() {
388     getSettings().LAMBDA_BRACE_STYLE = CommonCodeStyleSettings.END_OF_LINE;
389     getSettings().KEEP_LINE_BREAKS = false;
390     doMethodTest(
391       "Runnable r = () ->\n" + 
392       "{\n" +
393       "};", 
394       "Runnable r = () -> {\n" +
395       "};");
396   }
397
398 }