View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2025 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.coding;
21  
22  import static com.google.common.truth.Truth.assertWithMessage;
23  import static com.puppycrawl.tools.checkstyle.checks.coding.FallThroughCheck.MSG_FALL_THROUGH;
24  import static com.puppycrawl.tools.checkstyle.checks.coding.FallThroughCheck.MSG_FALL_THROUGH_LAST;
25  
26  import org.junit.jupiter.api.Test;
27  
28  import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
29  import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
30  
31  public class FallThroughCheckTest extends AbstractModuleTestSupport {
32  
33      @Override
34      protected String getPackageLocation() {
35          return "com/puppycrawl/tools/checkstyle/checks/coding/fallthrough";
36      }
37  
38      @Test
39      public void testDefault() throws Exception {
40          final String[] expected = {
41              "22:13: " + getCheckMessage(MSG_FALL_THROUGH),
42              "46:13: " + getCheckMessage(MSG_FALL_THROUGH),
43              "55:13: " + getCheckMessage(MSG_FALL_THROUGH),
44              "61:13: " + getCheckMessage(MSG_FALL_THROUGH),
45              "78:13: " + getCheckMessage(MSG_FALL_THROUGH),
46              "95:13: " + getCheckMessage(MSG_FALL_THROUGH),
47              "131:13: " + getCheckMessage(MSG_FALL_THROUGH),
48              "187:11: " + getCheckMessage(MSG_FALL_THROUGH),
49              "377:11: " + getCheckMessage(MSG_FALL_THROUGH),
50              "380:11: " + getCheckMessage(MSG_FALL_THROUGH),
51              "382:27: " + getCheckMessage(MSG_FALL_THROUGH),
52              "424:13: " + getCheckMessage(MSG_FALL_THROUGH),
53              "432:9: " + getCheckMessage(MSG_FALL_THROUGH),
54              "444:9: " + getCheckMessage(MSG_FALL_THROUGH),
55              "454:9: " + getCheckMessage(MSG_FALL_THROUGH),
56              "490:9: " + getCheckMessage(MSG_FALL_THROUGH),
57              "491:9: " + getCheckMessage(MSG_FALL_THROUGH),
58              "492:9: " + getCheckMessage(MSG_FALL_THROUGH),
59              "529:15: " + getCheckMessage(MSG_FALL_THROUGH),
60              "531:15: " + getCheckMessage(MSG_FALL_THROUGH),
61              "533:15: " + getCheckMessage(MSG_FALL_THROUGH),
62              "535:15: " + getCheckMessage(MSG_FALL_THROUGH),
63              "537:15: " + getCheckMessage(MSG_FALL_THROUGH),
64          };
65          verifyWithInlineConfigParser(
66                  getPath("InputFallThroughDefault.java"),
67                 expected);
68      }
69  
70      @Test
71      public void testTryWithResources() throws Exception {
72          final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
73          verifyWithInlineConfigParser(
74                  getNonCompilablePath("InputFallThrough.java"),
75                 expected);
76      }
77  
78      @Test
79      public void testTryCatchInSwitch() throws Exception {
80          final String[] expected = {
81              "37:13: " + getCheckMessage(MSG_FALL_THROUGH),
82          };
83          verifyWithInlineConfigParser(getPath("InputFallThroughTryCatchInSwitch.java"), expected);
84      }
85  
86      @Test
87      public void testStringSwitch() throws Exception {
88          final String[] expected = {
89              "21:9: " + getCheckMessage(MSG_FALL_THROUGH),
90          };
91          verifyWithInlineConfigParser(getPath("InputFallThroughStringSwitch.java"), expected);
92      }
93  
94      @Test
95      public void testCharacterSwitch() throws Exception {
96          final String[] expected = {
97              "19:13: " + getCheckMessage(MSG_FALL_THROUGH),
98              "30:13: " + getCheckMessage(MSG_FALL_THROUGH),
99              "38:13: " + getCheckMessage(MSG_FALL_THROUGH),
100             "44:17: " + getCheckMessage(MSG_FALL_THROUGH),
101             "48:13: " + getCheckMessage(MSG_FALL_THROUGH),
102             "63:13: " + getCheckMessage(MSG_FALL_THROUGH),
103         };
104         verifyWithInlineConfigParser(getPath("InputFallThroughCharacterSwitch.java"), expected);
105     }
106 
107     @Test
108     public void testLastCaseGroup() throws Exception {
109         final String[] expected = {
110             "22:13: " + getCheckMessage(MSG_FALL_THROUGH),
111             "46:13: " + getCheckMessage(MSG_FALL_THROUGH),
112             "55:13: " + getCheckMessage(MSG_FALL_THROUGH),
113             "61:13: " + getCheckMessage(MSG_FALL_THROUGH),
114             "78:13: " + getCheckMessage(MSG_FALL_THROUGH),
115             "95:13: " + getCheckMessage(MSG_FALL_THROUGH),
116             "131:13: " + getCheckMessage(MSG_FALL_THROUGH),
117             "131:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
118             "187:11: " + getCheckMessage(MSG_FALL_THROUGH),
119             "377:11: " + getCheckMessage(MSG_FALL_THROUGH),
120             "380:11: " + getCheckMessage(MSG_FALL_THROUGH),
121             "382:40: " + getCheckMessage(MSG_FALL_THROUGH),
122             "384:11: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
123             "424:13: " + getCheckMessage(MSG_FALL_THROUGH),
124             "432:9: " + getCheckMessage(MSG_FALL_THROUGH),
125             "444:9: " + getCheckMessage(MSG_FALL_THROUGH),
126             "454:9: " + getCheckMessage(MSG_FALL_THROUGH),
127             "491:9: " + getCheckMessage(MSG_FALL_THROUGH),
128             "492:9: " + getCheckMessage(MSG_FALL_THROUGH),
129         };
130         verifyWithInlineConfigParser(
131                 getPath("InputFallThrough.java"),
132                expected);
133     }
134 
135     @Test
136     public void testOwnPattern() throws Exception {
137 
138         final String[] expected = {
139             "22:13: " + getCheckMessage(MSG_FALL_THROUGH),
140             "46:13: " + getCheckMessage(MSG_FALL_THROUGH),
141             "55:13: " + getCheckMessage(MSG_FALL_THROUGH),
142             "61:13: " + getCheckMessage(MSG_FALL_THROUGH),
143             "78:13: " + getCheckMessage(MSG_FALL_THROUGH),
144             "95:13: " + getCheckMessage(MSG_FALL_THROUGH),
145             "131:13: " + getCheckMessage(MSG_FALL_THROUGH),
146             "153:11: " + getCheckMessage(MSG_FALL_THROUGH),
147             "178:11: " + getCheckMessage(MSG_FALL_THROUGH),
148             "187:11: " + getCheckMessage(MSG_FALL_THROUGH),
149             "194:11: " + getCheckMessage(MSG_FALL_THROUGH),
150             "212:11: " + getCheckMessage(MSG_FALL_THROUGH),
151             "230:11: " + getCheckMessage(MSG_FALL_THROUGH),
152             "260:26: " + getCheckMessage(MSG_FALL_THROUGH),
153             "274:11: " + getCheckMessage(MSG_FALL_THROUGH),
154             "289:11: " + getCheckMessage(MSG_FALL_THROUGH),
155             "292:11: " + getCheckMessage(MSG_FALL_THROUGH),
156             "296:11: " + getCheckMessage(MSG_FALL_THROUGH),
157             "298:25: " + getCheckMessage(MSG_FALL_THROUGH),
158             "314:11: " + getCheckMessage(MSG_FALL_THROUGH),
159             "317:11: " + getCheckMessage(MSG_FALL_THROUGH),
160             "319:25: " + getCheckMessage(MSG_FALL_THROUGH),
161             "335:11: " + getCheckMessage(MSG_FALL_THROUGH),
162             "338:11: " + getCheckMessage(MSG_FALL_THROUGH),
163             "340:23: " + getCheckMessage(MSG_FALL_THROUGH),
164             "356:11: " + getCheckMessage(MSG_FALL_THROUGH),
165             "359:11: " + getCheckMessage(MSG_FALL_THROUGH),
166             "361:30: " + getCheckMessage(MSG_FALL_THROUGH),
167             "424:13: " + getCheckMessage(MSG_FALL_THROUGH),
168             "432:9: " + getCheckMessage(MSG_FALL_THROUGH),
169             "444:9: " + getCheckMessage(MSG_FALL_THROUGH),
170             "454:9: " + getCheckMessage(MSG_FALL_THROUGH),
171             "481:12: " + getCheckMessage(MSG_FALL_THROUGH),
172             "490:9: " + getCheckMessage(MSG_FALL_THROUGH),
173             "491:9: " + getCheckMessage(MSG_FALL_THROUGH),
174             "492:9: " + getCheckMessage(MSG_FALL_THROUGH),
175         };
176         verifyWithInlineConfigParser(
177                 getPath("InputFallThrough3.java"),
178                expected);
179     }
180 
181     @Test
182     public void testOwnPatternTryWithResources() throws Exception {
183 
184         final String[] expected = {
185             "54:9: " + getCheckMessage(MSG_FALL_THROUGH),
186             "58:9: " + getCheckMessage(MSG_FALL_THROUGH),
187             "64:9: " + getCheckMessage(MSG_FALL_THROUGH),
188             "70:9: " + getCheckMessage(MSG_FALL_THROUGH),
189             "77:9: " + getCheckMessage(MSG_FALL_THROUGH),
190         };
191         verifyWithInlineConfigParser(
192                 getNonCompilablePath("InputFallThrough2.java"),
193                expected);
194     }
195 
196     @Test
197     public void testWithEmoji() throws Exception {
198         final String[] expected = {
199             "22:17: " + getCheckMessage(MSG_FALL_THROUGH),
200             "25:17: " + getCheckMessage(MSG_FALL_THROUGH),
201             "49:17: " + getCheckMessage(MSG_FALL_THROUGH),
202             "52:17: " + getCheckMessage(MSG_FALL_THROUGH),
203         };
204         verifyWithInlineConfigParser(
205                 getPath("InputFallThroughWithEmoji.java"), expected);
206     }
207 
208     @Test
209     public void testTokensNotNull() {
210         final FallThroughCheck check = new FallThroughCheck();
211         assertWithMessage("Acceptable tokens should not be null")
212             .that(check.getAcceptableTokens())
213             .isNotNull();
214         assertWithMessage("Default tokens should not be null")
215             .that(check.getDefaultTokens())
216             .isNotNull();
217         assertWithMessage("Required tokens should not be null")
218             .that(check.getRequiredTokens())
219             .isNotNull();
220     }
221 
222     @Test
223     public void testFallThroughNoElse() throws Exception {
224         final String[] expected = {
225             "28:13: " + getCheckMessage(MSG_FALL_THROUGH),
226             "43:13: " + getCheckMessage(MSG_FALL_THROUGH),
227             "47:13: " + getCheckMessage(MSG_FALL_THROUGH),
228             "54:13: " + getCheckMessage(MSG_FALL_THROUGH),
229             "68:13: " + getCheckMessage(MSG_FALL_THROUGH),
230             "75:13: " + getCheckMessage(MSG_FALL_THROUGH),
231             "88:21: " + getCheckMessage(MSG_FALL_THROUGH),
232             "94:13: " + getCheckMessage(MSG_FALL_THROUGH),
233             "96:13: " + getCheckMessage(MSG_FALL_THROUGH),
234         };
235         verifyWithInlineConfigParser(
236                 getPath("InputFallThrough2.java"),
237             expected);
238     }
239 
240     @Test
241     public void testYield() throws Exception {
242         final String[] expected = {
243             "19:9: " + getCheckMessage(MSG_FALL_THROUGH),
244         };
245         verifyWithInlineConfigParser(
246                 getPath("InputFallThrough9.java"),
247                 expected);
248     }
249 
250     @Test
251     public void testLastCase() throws Exception {
252         final String[] expected = {
253             "48:11: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
254             "83:11: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
255         };
256         verifyWithInlineConfigParser(
257                 getPath("InputFallThrough4.java"),
258                 expected);
259     }
260 
261     @Test
262     public void testIfElse() throws Exception {
263         final String[] expected = {
264             "94:13: " + getCheckMessage(MSG_FALL_THROUGH),
265         };
266         verifyWithInlineConfigParser(
267                 getPath("InputFallThrough5.java"),
268                 expected);
269     }
270 
271     @Test
272     public void testFallThrough() throws Exception {
273         final String[] expected = {
274             "23:13: " + getCheckMessage(MSG_FALL_THROUGH),
275             "27:13: " + getCheckMessage(MSG_FALL_THROUGH),
276             "52:13: " + getCheckMessage(MSG_FALL_THROUGH),
277             "65:13: " + getCheckMessage(MSG_FALL_THROUGH),
278             "80:13: " + getCheckMessage(MSG_FALL_THROUGH),
279             "94:13: " + getCheckMessage(MSG_FALL_THROUGH),
280             "109:13: " + getCheckMessage(MSG_FALL_THROUGH),
281         };
282         verifyWithInlineConfigParser(
283                 getPath("InputFallThrough6.java"),
284                 expected);
285     }
286 
287     @Test
288     public void testFallThroughNonCompilable4() throws Exception {
289         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
290         verifyWithInlineConfigParser(
291                 getPath("InputFallThrough10.java"),
292                 expected);
293     }
294 
295     @Test
296     public void testFallThroughComment() throws Exception {
297         final String[] expected = {
298             "20:13: " + getCheckMessage(MSG_FALL_THROUGH),
299             "43:13: " + getCheckMessage(MSG_FALL_THROUGH),
300         };
301         verifyWithInlineConfigParser(
302                 getPath("InputFallThroughFallThroughLotsOfComment.java"),
303                 expected);
304     }
305 
306     @Test
307     public void testFallThroughComment2() throws Exception {
308         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
309         verifyWithInlineConfigParser(
310                 getPath("InputFallThroughFallThroughLotsOfComment2.java"),
311                 expected);
312     }
313 
314     @Test
315     public void testFallThrough7() throws Exception {
316         final String[] expected = {
317             "21:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
318             "36:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
319             "50:13: " + getCheckMessage(MSG_FALL_THROUGH),
320             "50:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
321             "64:13: " + getCheckMessage(MSG_FALL_THROUGH),
322             "111:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
323         };
324         verifyWithInlineConfigParser(
325                 getPath("InputFallThrough7.java"),
326                 expected);
327     }
328 
329     @Test
330     public void testLastLine() throws Exception {
331         final String[] expected = {
332             "21:13: " + getCheckMessage(MSG_FALL_THROUGH),
333             "99:39: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
334         };
335         verifyWithInlineConfigParser(
336                 getPath("InputFallThroughLastLineCommentCheck.java"),
337                 expected);
338     }
339 
340     @Test
341     public void testLastLine2() throws Exception {
342         final String[] expected = {
343             "24:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
344             "31:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
345             "38:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
346         };
347         verifyWithInlineConfigParser(
348                 getPath("InputFallThrough11.java"),
349                 expected);
350     }
351 
352     @Test
353     public void testReliefCommentBetweenMultipleComment() throws Exception {
354         final String[] expected = {};
355         verifyWithInlineConfigParser(
356                 getPath("InputFallThrough8.java"),
357                 expected);
358     }
359 
360     @Test
361     public void testLabeledBreak() throws Exception {
362         final String[] expected = {
363             "51:17: " + getCheckMessage(MSG_FALL_THROUGH),
364             "55:17: " + getCheckMessage(MSG_FALL_THROUGH),
365             "69:17: " + getCheckMessage(MSG_FALL_THROUGH),
366             "78:17: " + getCheckMessage(MSG_FALL_THROUGH),
367             "88:17: " + getCheckMessage(MSG_FALL_THROUGH),
368         };
369         verifyWithInlineConfigParser(
370                 getPath("InputFallThroughLabeledBreak.java"),
371                 expected);
372 
373     }
374 
375     @Test
376     public void testSwitchLabeledRules() throws Exception {
377         final String[] expected = {};
378 
379         verifyWithInlineConfigParser(
380                 getPath("InputFallThroughSwitchRules.java"),
381                 expected);
382     }
383 
384     @Test
385     public void testInlineSingleCase() throws Exception {
386         final String[] expected = {
387             "12:17: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
388         };
389 
390         verifyWithInlineConfigParser(
391                 getPath("InputFallThroughInlineSingleCase.java"),
392                 expected);
393     }
394 
395     @Test
396     public void testInlineMultipleComment() throws Exception {
397         final String[] expected = {};
398 
399         verifyWithInlineConfigParser(
400                 getPath("InputFallThroughMultipleReliefPatterns.java"),
401                 expected);
402     }
403 
404     @Test
405     public void testFallThroughWithoutReliefPattern() throws Exception {
406         final String[] expected = {
407             "21:9: " + getCheckMessage(MSG_FALL_THROUGH),
408             "45:9: " + getCheckMessage(MSG_FALL_THROUGH),
409             "54:9: " + getCheckMessage(MSG_FALL_THROUGH),
410             "60:9: " + getCheckMessage(MSG_FALL_THROUGH),
411             "77:9: " + getCheckMessage(MSG_FALL_THROUGH),
412             "94:9: " + getCheckMessage(MSG_FALL_THROUGH),
413         };
414         verifyWithInlineConfigParser(
415                 getPath("InputFallThroughWithoutReliefPattern.java"),
416                 expected);
417     }
418 
419     @Test
420     public void testFallThroughWithPatternMatching() throws Exception {
421         final String[] expected = {
422             "19:13: " + getCheckMessage(MSG_FALL_THROUGH),
423             "22:13: " + getCheckMessage(MSG_FALL_THROUGH),
424             "31:13: " + getCheckMessage(MSG_FALL_THROUGH),
425             "35:13: " + getCheckMessage(MSG_FALL_THROUGH),
426             "44:13: " + getCheckMessage(MSG_FALL_THROUGH),
427         };
428 
429         verifyWithInlineConfigParser(
430                 getPath("InputFallThroughWithPatternMatching.java"),
431                 expected);
432     }
433 
434     @Test
435     public void testFallThroughWithPatternMatchingCheckLastCase() throws Exception {
436         final String[] expected = {
437             "19:13: " + getCheckMessage(MSG_FALL_THROUGH),
438             "21:13: " + getCheckMessage(MSG_FALL_THROUGH),
439             "21:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
440             "33:13: " + getCheckMessage(MSG_FALL_THROUGH),
441             "36:13: " + getCheckMessage(MSG_FALL_THROUGH),
442             "36:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
443             "48:13: " + getCheckMessage(MSG_FALL_THROUGH),
444             "61:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
445         };
446 
447         verifyWithInlineConfigParser(
448                 getPath("InputFallThroughWithPatternMatchingCheckLastCase.java"),
449                 expected);
450     }
451 }