View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2024 the original author or authors.
4   //
5   // This library is free software; you can redistribute it and/or
6   // modify it under the terms of the GNU Lesser General Public
7   // License as published by the Free Software Foundation; either
8   // version 2.1 of the License, or (at your option) any later version.
9   //
10  // This library is distributed in the hope that it will be useful,
11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  // Lesser General Public License for more details.
14  //
15  // You should have received a copy of the GNU Lesser General Public
16  // License along with this library; if not, write to the Free Software
17  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ///////////////////////////////////////////////////////////////////////////////////////////////
19  
20  package com.puppycrawl.tools.checkstyle.checks.blocks;
21  
22  import static com.puppycrawl.tools.checkstyle.checks.blocks.NeedBracesCheck.MSG_KEY_NEED_BRACES;
23  
24  import org.junit.jupiter.api.Test;
25  
26  import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
27  import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
28  
29  public class NeedBracesCheckTest extends AbstractModuleTestSupport {
30  
31      @Override
32      protected String getPackageLocation() {
33          return "com/puppycrawl/tools/checkstyle/checks/blocks/needbraces";
34      }
35  
36      @Test
37      public void testIt() throws Exception {
38          final String[] expected = {
39              "30:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "do"),
40              "42:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
41              "43:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
42              "45:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
43              "46:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
44              "59:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
45              "60:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
46              "62:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
47              "64:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
48              "83:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
49              "84:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
50              "86:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
51              "88:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "else"),
52              "90:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
53              "98:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "else"),
54              "100:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
55              "101:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
56              "104:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
57              "105:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
58              "106:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
59              "107:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "do"),
60              "108:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
61              "109:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
62          };
63          verifyWithInlineConfigParser(
64                  getPath("InputNeedBracesTestIt.java"), expected);
65      }
66  
67      @Test
68      public void testItWithAllowsOn() throws Exception {
69          final String[] expected = {
70              "44:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
71              "47:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
72              "61:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
73              "63:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
74              "65:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
75              "85:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
76              "87:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
77              "89:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "else"),
78              "91:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
79              "99:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "else"),
80              "101:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
81              "102:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
82              "105:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
83              "106:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
84              "107:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
85              "108:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "do"),
86              "109:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
87              "110:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
88          };
89          verifyWithInlineConfigParser(
90                  getPath("InputNeedBracesTestItWithAllowsOn.java"), expected);
91      }
92  
93      @Test
94      public void testSingleLineStatements() throws Exception {
95          final String[] expected = {
96              "32:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
97              "38:43: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
98              "47:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
99              "55:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
100             "62:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "do"),
101             "65:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
102             "71:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
103             "100:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
104             "104:11: " + getCheckMessage(MSG_KEY_NEED_BRACES, "else"),
105             "116:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
106             "123:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
107         };
108         verifyWithInlineConfigParser(
109                 getPath("InputNeedBracesSingleLineStatements.java"), expected);
110     }
111 
112     @Test
113     public void testSingleLineLambda() throws Exception {
114         final String[] expected = {
115             "16:29: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
116             "19:22: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
117             "24:60: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
118             "25:27: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
119         };
120         verifyWithInlineConfigParser(
121                 getPath("InputNeedBracesTestSingleLineLambda.java"), expected);
122     }
123 
124     @Test
125     public void testDoNotAllowSingleLineLambda() throws Exception {
126         final String[] expected = {
127             "14:28: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
128             "15:29: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
129             "16:29: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
130             "19:22: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
131             "24:60: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
132             "25:27: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
133         };
134         verifyWithInlineConfigParser(
135                 getPath("InputNeedBracesTestNotAllowSingleLineLambda.java"), expected);
136     }
137 
138     @Test
139     public void testSingleLineCaseDefault() throws Exception {
140         final String[] expected = {
141             "81:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
142             "84:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
143             "131:17: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
144             "133:17: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
145         };
146         verifyWithInlineConfigParser(
147                 getPath("InputNeedBracesTestSingleLineCaseDefault.java"), expected);
148     }
149 
150     @Test
151     public void testSingleLineCaseDefault2() throws Exception {
152         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
153         verifyWithInlineConfigParser(
154                 getPath("InputNeedBracesTestSingleLineCaseDefault2.java"), expected);
155     }
156 
157     @Test
158     public void testSingleLineCaseDefaultNoSingleLine() throws Exception {
159         final String[] expected = {
160             "18:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
161             "19:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
162             "22:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
163             "25:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
164             "33:17: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
165             "34:17: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
166         };
167         verifyWithInlineConfigParser(
168                 getPath("InputNeedBracesTestCaseDefaultNoSingleLine.java"), expected);
169     }
170 
171     @Test
172     public void testCycles() throws Exception {
173         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
174         verifyWithInlineConfigParser(
175                 getPath("InputNeedBracesTestCycles.java"), expected);
176     }
177 
178     @Test
179     public void testConditions() throws Exception {
180         final String[] expected = {
181             "50:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
182             "53:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
183             "65:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
184         };
185         verifyWithInlineConfigParser(
186                 getPath("InputNeedBracesTestConditions.java"), expected);
187     }
188 
189     @Test
190     public void testAllowEmptyLoopBodyTrue() throws Exception {
191         final String[] expected = {
192             "106:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
193         };
194         verifyWithInlineConfigParser(
195                 getPath("InputNeedBracesLoopBodyTrue.java"), expected);
196     }
197 
198     @Test
199     public void testAllowEmptyLoopBodyFalse() throws Exception {
200         final String[] expected = {
201             "19:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
202             "23:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
203             "27:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
204             "28:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
205             "32:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
206             "37:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
207             "42:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
208             "48:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
209             "54:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
210             "59:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
211             "63:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
212             "69:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
213             "76:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
214             "98:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
215             "102:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"),
216             "106:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"),
217             "117:9: " + getCheckMessage(MSG_KEY_NEED_BRACES, "while"),
218         };
219         verifyWithInlineConfigParser(
220                 getPath("InputNeedBracesLoopBodyFalse.java"), expected);
221     }
222 
223     @Test
224     public void testEmptySingleLineDefaultStmt() throws Exception {
225         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
226         verifyWithInlineConfigParser(
227                 getPath("InputNeedBracesEmptySingleLineDefaultStmt.java"), expected);
228     }
229 
230     @Test
231     public void testNeedBracesSwitchExpressionNoSingleLine() throws Exception {
232         final String[] expected = {
233             "16:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
234             "18:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
235             "20:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
236             "23:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
237             "26:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
238             "33:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
239             "36:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
240             "39:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
241             "42:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
242             "49:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
243             "50:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
244             "53:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
245             "56:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
246             "59:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
247             "73:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
248             "80:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
249             "87:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
250             "88:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
251             "89:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
252         };
253         verifyWithInlineConfigParser(
254                 getNonCompilablePath("InputNeedBracesTestSwitchExpressionNoSingleLine.java"),
255             expected);
256     }
257 
258     @Test
259     public void testNeedBracesSwitchExpression() throws Exception {
260         final String[] expected = {
261             "16:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
262             "18:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
263             "20:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
264             "23:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
265             "26:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
266             "33:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
267             "36:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
268             "39:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
269             "42:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
270             "49:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
271             "50:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
272             "53:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
273             "56:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
274             "59:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
275             "73:47: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
276         };
277         verifyWithInlineConfigParser(
278                 getNonCompilablePath("InputNeedBracesTestSwitchExpression.java"),
279             expected);
280     }
281 
282     @Test
283     public void testPatternMatchingForSwitch() throws Exception {
284         final String[] expected = {
285             "17:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
286             "21:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
287             "25:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
288             "28:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
289             "53:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
290             "55:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
291             "58:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
292             "61:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
293             "74:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
294             "78:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
295             "80:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
296             "83:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
297             "88:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
298             "89:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
299             "90:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
300             "96:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
301         };
302         verifyWithInlineConfigParser(
303                 getNonCompilablePath("InputNeedBracesPatternMatchingForSwitch.java"),
304             expected);
305     }
306 
307     @Test
308     public void testPatternMatchingForSwitchAllowSingleLine() throws Exception {
309         final String[] expected = {
310             "17:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
311             "21:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
312             "25:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
313             "28:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
314             "55:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
315             "58:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
316             "61:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
317             "74:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
318             "80:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
319             "83:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
320             "90:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
321         };
322         verifyWithInlineConfigParser(
323                 getNonCompilablePath(
324                         "InputNeedBracesPatternMatchingForSwitchAllowSingleLine.java"),
325             expected);
326     }
327 
328     @Test
329     public void testNeedBracesSwitchExpressionAndLambda() throws Exception {
330         final String[] expected = {
331             "21:24: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
332             "24:24: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
333             "27:24: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
334             "50:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
335             "51:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
336             "56:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
337             "58:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
338             "62:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
339             "63:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
340             "65:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
341             "66:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "default"),
342         };
343         verifyWithInlineConfigParser(
344                 getNonCompilablePath("InputNeedBracesSwitchExpressionAndLambda.java"),
345             expected);
346     }
347 
348     @Test
349     public void testNeedBracesSwitchExpressionAndLambdaAllowSingleLine() throws Exception {
350         final String[] expected = {
351             "27:24: " + getCheckMessage(MSG_KEY_NEED_BRACES, "->"),
352             "46:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
353             "53:13: " + getCheckMessage(MSG_KEY_NEED_BRACES, "case"),
354         };
355         verifyWithInlineConfigParser(
356                 getNonCompilablePath(
357                         "InputNeedBracesSwitchExpressionAndLambdaAllowSingleLine.java"),
358             expected);
359     }
360 
361 }