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             "112:11: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
256         };
257         verifyWithInlineConfigParser(
258                 getPath("InputFallThrough4.java"),
259                 expected);
260     }
261 
262     @Test
263     public void testIfElse() throws Exception {
264         final String[] expected = {
265             "94:13: " + getCheckMessage(MSG_FALL_THROUGH),
266         };
267         verifyWithInlineConfigParser(
268                 getPath("InputFallThrough5.java"),
269                 expected);
270     }
271 
272     @Test
273     public void testFallThrough() throws Exception {
274         final String[] expected = {
275             "23:13: " + getCheckMessage(MSG_FALL_THROUGH),
276             "27:13: " + getCheckMessage(MSG_FALL_THROUGH),
277             "52:13: " + getCheckMessage(MSG_FALL_THROUGH),
278             "65:13: " + getCheckMessage(MSG_FALL_THROUGH),
279             "80:13: " + getCheckMessage(MSG_FALL_THROUGH),
280             "94:13: " + getCheckMessage(MSG_FALL_THROUGH),
281             "109:13: " + getCheckMessage(MSG_FALL_THROUGH),
282         };
283         verifyWithInlineConfigParser(
284                 getPath("InputFallThrough6.java"),
285                 expected);
286     }
287 
288     @Test
289     public void testFallThroughNonCompilable4() throws Exception {
290         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
291         verifyWithInlineConfigParser(
292                 getNonCompilablePath("InputFallThrough4.java"),
293                 expected);
294     }
295 
296     @Test
297     public void testFallThroughComment() throws Exception {
298         final String[] expected = {
299             "20:13: " + getCheckMessage(MSG_FALL_THROUGH),
300             "43:13: " + getCheckMessage(MSG_FALL_THROUGH),
301         };
302         verifyWithInlineConfigParser(
303                 getPath("InputFallThroughFallThroughLotsOfComment.java"),
304                 expected);
305     }
306 
307     @Test
308     public void testFallThroughComment2() throws Exception {
309         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
310         verifyWithInlineConfigParser(
311                 getPath("InputFallThroughFallThroughLotsOfComment2.java"),
312                 expected);
313     }
314 
315     @Test
316     public void testFallThrough7() throws Exception {
317         final String[] expected = {
318             "21:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
319             "36:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
320             "50:13: " + getCheckMessage(MSG_FALL_THROUGH),
321             "50:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
322             "64:13: " + getCheckMessage(MSG_FALL_THROUGH),
323             "111:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
324         };
325         verifyWithInlineConfigParser(
326                 getPath("InputFallThrough7.java"),
327                 expected);
328     }
329 
330     @Test
331     public void testLastLine() throws Exception {
332         final String[] expected = {
333             "21:13: " + getCheckMessage(MSG_FALL_THROUGH),
334             // until https://github.com/checkstyle/checkstyle/issues/13553
335             "33:13: " + getCheckMessage(MSG_FALL_THROUGH),
336             "99:39: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
337             // until https://github.com/checkstyle/checkstyle/issues/13553
338             "107:11: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
339         };
340         verifyWithInlineConfigParser(
341                 getPath("InputFallThroughLastLineCommentCheck.java"),
342                 expected);
343     }
344 
345     @Test
346     public void testLastLine2() throws Exception {
347         final String[] expected = {
348             "19:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
349             "22:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
350         };
351         verifyWithInlineConfigParser(
352                 getNonCompilablePath("InputFallThrough5.java"),
353                 expected);
354     }
355 
356     @Test
357     public void testReliefCommentBetweenMultipleComment() throws Exception {
358         final String[] expected = {
359             // until https://github.com/checkstyle/checkstyle/issues/13553
360             "25:17: " + getCheckMessage(MSG_FALL_THROUGH),
361             // until https://github.com/checkstyle/checkstyle/issues/13553
362             "34:13: " + getCheckMessage(MSG_FALL_THROUGH_LAST),
363         };
364         verifyWithInlineConfigParser(
365                 getPath("InputFallThrough8.java"),
366                 expected);
367     }
368 }