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.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                 getNonCompilablePath("InputFallThrough3.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                 getNonCompilablePath("InputFallThrough4.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             "19:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
344             "22:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
345         };
346         verifyWithInlineConfigParser(
347                 getNonCompilablePath("InputFallThrough5.java"),
348                 expected);
349     }
350 
351     @Test
352     public void testReliefCommentBetweenMultipleComment() throws Exception {
353         final String[] expected = {};
354         verifyWithInlineConfigParser(
355                 getPath("InputFallThrough8.java"),
356                 expected);
357     }
358 
359     @Test
360     public void testLabeledBreak() throws Exception {
361         final String[] expected = {
362             "51:17: " + getCheckMessage(MSG_FALL_THROUGH),
363             "55:17: " + getCheckMessage(MSG_FALL_THROUGH),
364             "69:17: " + getCheckMessage(MSG_FALL_THROUGH),
365             "78:17: " + getCheckMessage(MSG_FALL_THROUGH),
366             "88:17: " + getCheckMessage(MSG_FALL_THROUGH),
367         };
368         verifyWithInlineConfigParser(
369                 getPath("InputFallThroughLabeledBreak.java"),
370                 expected);
371 
372     }
373 
374     @Test
375     public void testSwitchLabeledRules() throws Exception {
376         final String[] expected = {};
377 
378         verifyWithInlineConfigParser(
379                 getNonCompilablePath("InputFallThroughSwitchRules.java"),
380                 expected);
381     }
382 
383     @Test
384     public void testInlineSingleCase() throws Exception {
385         final String[] expected = {
386             "12:17: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
387         };
388 
389         verifyWithInlineConfigParser(
390                 getPath("InputFallThroughInlineSingleCase.java"),
391                 expected);
392     }
393 
394     @Test
395     public void testInlineMultipleComment() throws Exception {
396         final String[] expected = {};
397 
398         verifyWithInlineConfigParser(
399                 getPath("InputFallThroughMultipleReliefPatterns.java"),
400                 expected);
401     }
402 
403     @Test
404     public void testFallThroughWithoutReliefPattern() throws Exception {
405         final String[] expected = {
406             "21:9: " + getCheckMessage(MSG_FALL_THROUGH),
407             "45:9: " + getCheckMessage(MSG_FALL_THROUGH),
408             "54:9: " + getCheckMessage(MSG_FALL_THROUGH),
409             "60:9: " + getCheckMessage(MSG_FALL_THROUGH),
410             "77:9: " + getCheckMessage(MSG_FALL_THROUGH),
411             "94:9: " + getCheckMessage(MSG_FALL_THROUGH),
412         };
413         verifyWithInlineConfigParser(
414                 getPath("InputFallThroughWithoutReliefPattern.java"),
415                 expected);
416     }
417 
418     @Test
419     public void testFallThroughWithPatternMatching() throws Exception {
420         final String[] expected = {
421             "19:13: " + getCheckMessage(MSG_FALL_THROUGH),
422             "22:13: " + getCheckMessage(MSG_FALL_THROUGH),
423             "31:13: " + getCheckMessage(MSG_FALL_THROUGH),
424             "35:13: " + getCheckMessage(MSG_FALL_THROUGH),
425             "44:13: " + getCheckMessage(MSG_FALL_THROUGH),
426         };
427 
428         verifyWithInlineConfigParser(
429                 getNonCompilablePath("InputFallThroughWithPatternMatching.java"),
430                 expected);
431     }
432 
433     @Test
434     public void testFallThroughWithPatternMatchingCheckLastCase() throws Exception {
435         final String[] expected = {
436             "19:13: " + getCheckMessage(MSG_FALL_THROUGH),
437             "21:13: " + getCheckMessage(MSG_FALL_THROUGH),
438             "21:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
439             "33:13: " + getCheckMessage(MSG_FALL_THROUGH),
440             "36:13: " + getCheckMessage(MSG_FALL_THROUGH),
441             "36:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
442             "48:13: " + getCheckMessage(MSG_FALL_THROUGH),
443             "61:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
444         };
445 
446         verifyWithInlineConfigParser(
447                 getNonCompilablePath("InputFallThroughWithPatternMatchingCheckLastCase.java"),
448                 expected);
449     }
450 }