View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2026 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.HiddenFieldCheck.MSG_KEY;
24  
25  import java.io.File;
26  import java.util.Optional;
27  import java.util.function.Predicate;
28  
29  import org.junit.jupiter.api.Test;
30  
31  import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
32  import com.puppycrawl.tools.checkstyle.JavaParser;
33  import com.puppycrawl.tools.checkstyle.api.DetailAST;
34  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
35  import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil;
36  import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
37  
38  public class HiddenFieldCheckTest
39      extends AbstractModuleTestSupport {
40  
41      @Override
42      public String getPackageLocation() {
43          return "com/puppycrawl/tools/checkstyle/checks/coding/hiddenfield";
44      }
45  
46      @Test
47      public void testStaticVisibilityFromLambdas() throws Exception {
48          final String[] expected = {
49              "31:34: " + getCheckMessage(MSG_KEY, "value"),
50              "64:31: " + getCheckMessage(MSG_KEY, "languageCode"),
51              "74:35: " + getCheckMessage(MSG_KEY, "number"),
52              "87:35: " + getCheckMessage(MSG_KEY, "id"),
53              "115:33: " + getCheckMessage(MSG_KEY, "note"),
54              "141:48: " + getCheckMessage(MSG_KEY, "stringValue"),
55              "141:69: " + getCheckMessage(MSG_KEY, "intValue"),
56              "155:69: " + getCheckMessage(MSG_KEY, "doubleValue"),
57              "168:51: " + getCheckMessage(MSG_KEY, "firstString"),
58              "168:64: " + getCheckMessage(MSG_KEY, "secondString"),
59              "187:49: " + getCheckMessage(MSG_KEY, "first"),
60              "214:62: " + getCheckMessage(MSG_KEY, "mPi"),
61              "231:27: " + getCheckMessage(MSG_KEY, "justSomeList"),
62              "231:61: " + getCheckMessage(MSG_KEY, "justSomeMap"),
63              "246:55: " + getCheckMessage(MSG_KEY, "someObject"),
64              "255:52: " + getCheckMessage(MSG_KEY, "someObject"),
65          };
66          verifyWithInlineConfigParser(
67                  getPath("InputHiddenFieldLambdas.java"), expected);
68      }
69  
70      @Test
71      public void testStaticVisibilityFromAnonymousClasses() throws Exception {
72          final String[] expected = {
73              "22:45: " + getCheckMessage(MSG_KEY, "other"),
74              "28:42: " + getCheckMessage(MSG_KEY, "other"),
75              "36:49: " + getCheckMessage(MSG_KEY, "other"),
76              "46:53: " + getCheckMessage(MSG_KEY, "other"),
77              "58:26: " + getCheckMessage(MSG_KEY, "someField"),
78          };
79          verifyWithInlineConfigParser(
80                  getPath("InputHiddenFieldStaticVisibility.java"), expected);
81      }
82  
83      @Test
84      public void testHiddenFieldBasic() throws Exception {
85          final String[] expected = {
86              "21:13: " + getCheckMessage(MSG_KEY, "hidden"),
87              "30:13: " + getCheckMessage(MSG_KEY, "hidden"),
88              "35:18: " + getCheckMessage(MSG_KEY, "hidden"),
89              "50:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
90              "59:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
91              "60:17: " + getCheckMessage(MSG_KEY, "hidden"),
92              "65:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
93              "69:22: " + getCheckMessage(MSG_KEY, "hidden"),
94              "81:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
95              "82:17: " + getCheckMessage(MSG_KEY, "hidden"),
96              "87:13: " + getCheckMessage(MSG_KEY, "hidden"),
97          };
98          verifyWithInlineConfigParser(
99                   getPath("InputHiddenFieldBasic.java"), expected);
100     }
101 
102     @Test
103     public void testHiddenFieldInterface() throws Exception {
104         final String[] expected = {
105         };
106         verifyWithInlineConfigParser(
107                  getPath("InputHiddenFieldInterface.java"), expected);
108     }
109 
110     @Test
111     public void testHiddenFieldStatic() throws Exception {
112         final String[] expected = {
113             "22:13: " + getCheckMessage(MSG_KEY, "hidden"),
114             "27:13: " + getCheckMessage(MSG_KEY, "hidden"),
115             "32:13: " + getCheckMessage(MSG_KEY, "hidden"),
116             "36:13: " + getCheckMessage(MSG_KEY, "hidden"),
117 
118         };
119         verifyWithInlineConfigParser(
120                  getPath("InputHiddenFieldStatic.java"), expected);
121     }
122 
123     @Test
124     public void testHiddenFieldPropertySetter() throws Exception {
125         final String[] expected = {
126         };
127         verifyWithInlineConfigParser(
128                  getPath("InputHiddenFieldPropertySetter.java"), expected);
129     }
130 
131     @Test
132     public void testHiddenFieldEnum() throws Exception {
133         final String[] expected = {
134             "30:17: " + getCheckMessage(MSG_KEY, "hidden"),
135             "47:13: " + getCheckMessage(MSG_KEY, "hidden"),
136             "53:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
137         };
138         verifyWithInlineConfigParser(
139                  getPath("InputHiddenFieldEnum.java"), expected);
140     }
141 
142     @Test
143     public void testHiddenFieldMisc() throws Exception {
144         final String[] expected = {
145         };
146         verifyWithInlineConfigParser(
147                  getPath("InputHiddenFieldMisc.java"), expected);
148     }
149 
150     @Test
151     public void testHiddenField2Basic() throws Exception {
152         final String[] expected = {
153             "21:13: " + getCheckMessage(MSG_KEY, "hidden"),
154             "24:39: " + getCheckMessage(MSG_KEY, "hidden"),
155             "31:13: " + getCheckMessage(MSG_KEY, "hidden"),
156             "36:18: " + getCheckMessage(MSG_KEY, "hidden"),
157             "41:33: " + getCheckMessage(MSG_KEY, "hidden"),
158             "52:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
159             "55:26: " + getCheckMessage(MSG_KEY, "innerHidden"),
160             "61:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
161             "62:17: " + getCheckMessage(MSG_KEY, "hidden"),
162             "67:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
163             "71:22: " + getCheckMessage(MSG_KEY, "hidden"),
164             "76:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
165             "78:17: " + getCheckMessage(MSG_KEY, "hidden"),
166             "84:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
167             "85:17: " + getCheckMessage(MSG_KEY, "hidden"),
168             "90:13: " + getCheckMessage(MSG_KEY, "hidden"),
169         };
170         verifyWithInlineConfigParser(
171                  getPath("InputHiddenField2Basic.java"), expected);
172     }
173 
174     @Test
175     public void testHiddenField2Interface() throws Exception {
176         final String[] expected = {
177         };
178         verifyWithInlineConfigParser(
179                  getPath("InputHiddenField2Interface.java"), expected);
180     }
181 
182     @Test
183     public void testHiddenField2Static() throws Exception {
184         final String[] expected = {
185             "22:13: " + getCheckMessage(MSG_KEY, "hidden"),
186             "27:13: " + getCheckMessage(MSG_KEY, "hidden"),
187             "32:13: " + getCheckMessage(MSG_KEY, "hidden"),
188             "36:13: " + getCheckMessage(MSG_KEY, "hidden"),
189             "63:23: " + getCheckMessage(MSG_KEY, "y"),
190         };
191         verifyWithInlineConfigParser(
192                  getPath("InputHiddenField2Static.java"), expected);
193     }
194 
195     @Test
196     public void testHiddenField2PropertySetter() throws Exception {
197         final String[] expected = {
198             "21:29: " + getCheckMessage(MSG_KEY, "prop"),
199             "27:29: " + getCheckMessage(MSG_KEY, "prop"),
200             "33:29: " + getCheckMessage(MSG_KEY, "prop"),
201             "45:28: " + getCheckMessage(MSG_KEY, "prop"),
202             "64:41: " + getCheckMessage(MSG_KEY, "prop"),
203             "78:29: " + getCheckMessage(MSG_KEY, "prop"),
204             "89:42: " + getCheckMessage(MSG_KEY, "prop2"),
205         };
206         verifyWithInlineConfigParser(
207                  getPath("InputHiddenField2PropertySetter.java"), expected);
208     }
209 
210     @Test
211     public void testHiddenField2Enum() throws Exception {
212         final String[] expected = {
213             "30:17: " + getCheckMessage(MSG_KEY, "hidden"),
214             "40:31: " + getCheckMessage(MSG_KEY, "hidden"),
215             "47:13: " + getCheckMessage(MSG_KEY, "hidden"),
216             "53:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
217         };
218         verifyWithInlineConfigParser(
219                  getPath("InputHiddenField2Enum.java"), expected);
220     }
221 
222     @Test
223     public void testHiddenField2Misc() throws Exception {
224         final String[] expected = {
225             "19:45: " + getCheckMessage(MSG_KEY, "x"),
226             "24:34: " + getCheckMessage(MSG_KEY, "xAxis"),
227             "31:23: " + getCheckMessage(MSG_KEY, "i"),
228         };
229         verifyWithInlineConfigParser(
230                  getPath("InputHiddenField2Misc.java"), expected);
231     }
232 
233     @Test
234     public void testHiddenField3Basic() throws Exception {
235         final String[] expected = {
236             "21:13: " + getCheckMessage(MSG_KEY, "hidden"),
237             "24:39: " + getCheckMessage(MSG_KEY, "hidden"),
238             "31:13: " + getCheckMessage(MSG_KEY, "hidden"),
239             "36:18: " + getCheckMessage(MSG_KEY, "hidden"),
240             "41:33: " + getCheckMessage(MSG_KEY, "hidden"),
241             "62:17: " + getCheckMessage(MSG_KEY, "hidden"),
242             "71:22: " + getCheckMessage(MSG_KEY, "hidden"),
243             "78:17: " + getCheckMessage(MSG_KEY, "hidden"),
244             "85:17: " + getCheckMessage(MSG_KEY, "hidden"),
245             "90:13: " + getCheckMessage(MSG_KEY, "hidden"),
246         };
247         verifyWithInlineConfigParser(
248                  getPath("InputHiddenField3Basic.java"), expected);
249     }
250 
251     @Test
252     public void testHiddenField3Interface() throws Exception {
253         final String[] expected = {
254         };
255         verifyWithInlineConfigParser(
256                  getPath("InputHiddenField3Interface.java"), expected);
257     }
258 
259     @Test
260     public void testHiddenField3Static() throws Exception {
261         final String[] expected = {
262             "22:13: " + getCheckMessage(MSG_KEY, "hidden"),
263             "27:13: " + getCheckMessage(MSG_KEY, "hidden"),
264             "32:13: " + getCheckMessage(MSG_KEY, "hidden"),
265             "36:13: " + getCheckMessage(MSG_KEY, "hidden"),
266             "63:23: " + getCheckMessage(MSG_KEY, "y"),
267         };
268         verifyWithInlineConfigParser(
269                  getPath("InputHiddenField3Static.java"), expected);
270     }
271 
272     @Test
273     public void testHiddenField3PropertySetter() throws Exception {
274         final String[] expected = {
275             "21:29: " + getCheckMessage(MSG_KEY, "prop"),
276             "27:29: " + getCheckMessage(MSG_KEY, "prop"),
277             "33:29: " + getCheckMessage(MSG_KEY, "prop"),
278             "45:28: " + getCheckMessage(MSG_KEY, "prop"),
279             "64:41: " + getCheckMessage(MSG_KEY, "prop"),
280             "78:29: " + getCheckMessage(MSG_KEY, "prop"),
281             "89:42: " + getCheckMessage(MSG_KEY, "prop2"),
282         };
283         verifyWithInlineConfigParser(
284                  getPath("InputHiddenField3PropertySetter.java"), expected);
285     }
286 
287     @Test
288     public void testHiddenField3Enum() throws Exception {
289         final String[] expected = {
290             "30:17: " + getCheckMessage(MSG_KEY, "hidden"),
291             "40:31: " + getCheckMessage(MSG_KEY, "hidden"),
292             "47:13: " + getCheckMessage(MSG_KEY, "hidden"),
293             "53:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
294         };
295         verifyWithInlineConfigParser(
296                  getPath("InputHiddenField3Enum.java"), expected);
297     }
298 
299     @Test
300     public void testHiddenField3Misc() throws Exception {
301         final String[] expected = {
302             "18:45: " + getCheckMessage(MSG_KEY, "x"),
303             "23:34: " + getCheckMessage(MSG_KEY, "xAxis"),
304         };
305         verifyWithInlineConfigParser(
306                  getPath("InputHiddenField3Misc.java"), expected);
307     }
308 
309     @Test
310     public void testHiddenField4Basic() throws Exception {
311         final String[] expected = {
312             "21:13: " + getCheckMessage(MSG_KEY, "hidden"),
313             "24:39: " + getCheckMessage(MSG_KEY, "hidden"),
314             "31:13: " + getCheckMessage(MSG_KEY, "hidden"),
315             "36:18: " + getCheckMessage(MSG_KEY, "hidden"),
316             "41:33: " + getCheckMessage(MSG_KEY, "hidden"),
317             "52:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
318             "55:26: " + getCheckMessage(MSG_KEY, "innerHidden"),
319             "61:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
320             "62:17: " + getCheckMessage(MSG_KEY, "hidden"),
321             "67:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
322             "71:22: " + getCheckMessage(MSG_KEY, "hidden"),
323             "76:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
324             "78:17: " + getCheckMessage(MSG_KEY, "hidden"),
325             "84:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
326             "85:17: " + getCheckMessage(MSG_KEY, "hidden"),
327             "90:13: " + getCheckMessage(MSG_KEY, "hidden"),
328         };
329         verifyWithInlineConfigParser(
330                  getPath("InputHiddenField4Basic.java"), expected);
331     }
332 
333     @Test
334     public void testHiddenField4Interface() throws Exception {
335         final String[] expected = {
336         };
337         verifyWithInlineConfigParser(
338                  getPath("InputHiddenField4Interface.java"), expected);
339     }
340 
341     @Test
342     public void testHiddenField4Static() throws Exception {
343         final String[] expected = {
344             "22:13: " + getCheckMessage(MSG_KEY, "hidden"),
345             "27:13: " + getCheckMessage(MSG_KEY, "hidden"),
346             "32:13: " + getCheckMessage(MSG_KEY, "hidden"),
347             "36:13: " + getCheckMessage(MSG_KEY, "hidden"),
348             "63:23: " + getCheckMessage(MSG_KEY, "y"),
349         };
350         verifyWithInlineConfigParser(
351                  getPath("InputHiddenField4Static.java"), expected);
352     }
353 
354     @Test
355     public void testHiddenField4PropertySetter() throws Exception {
356         final String[] expected = {
357             "27:29: " + getCheckMessage(MSG_KEY, "prop"),
358             "33:29: " + getCheckMessage(MSG_KEY, "prop"),
359             "45:28: " + getCheckMessage(MSG_KEY, "prop"),
360             "64:41: " + getCheckMessage(MSG_KEY, "prop"),
361             "89:42: " + getCheckMessage(MSG_KEY, "prop2"),
362         };
363         verifyWithInlineConfigParser(
364                  getPath("InputHiddenField4PropertySetter.java"), expected);
365     }
366 
367     @Test
368     public void testHiddenField4Enum() throws Exception {
369         final String[] expected = {
370             "30:17: " + getCheckMessage(MSG_KEY, "hidden"),
371             "40:31: " + getCheckMessage(MSG_KEY, "hidden"),
372             "47:13: " + getCheckMessage(MSG_KEY, "hidden"),
373             "53:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
374         };
375         verifyWithInlineConfigParser(
376                  getPath("InputHiddenField4Enum.java"), expected);
377     }
378 
379     @Test
380     public void testHiddenField4Misc() throws Exception {
381         final String[] expected = {
382             "21:45: " + getCheckMessage(MSG_KEY, "x"),
383             "44:45: " + getCheckMessage(MSG_KEY, "prop"),
384             "69:46: " + getCheckMessage(MSG_KEY, "prop2"),
385         };
386         verifyWithInlineConfigParser(
387                  getPath("InputHiddenField4Misc.java"), expected);
388     }
389 
390     /** Tests ignoreSetter and setterCanReturnItsClass properties. */
391     @Test
392     public void testHiddenField5Basic() throws Exception {
393         final String[] expected = {
394             "21:13: " + getCheckMessage(MSG_KEY, "hidden"),
395             "24:39: " + getCheckMessage(MSG_KEY, "hidden"),
396             "31:13: " + getCheckMessage(MSG_KEY, "hidden"),
397             "36:18: " + getCheckMessage(MSG_KEY, "hidden"),
398             "41:33: " + getCheckMessage(MSG_KEY, "hidden"),
399             "52:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
400             "55:26: " + getCheckMessage(MSG_KEY, "innerHidden"),
401             "61:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
402             "62:17: " + getCheckMessage(MSG_KEY, "hidden"),
403             "67:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
404             "71:22: " + getCheckMessage(MSG_KEY, "hidden"),
405             "76:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
406             "78:17: " + getCheckMessage(MSG_KEY, "hidden"),
407             "84:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
408             "85:17: " + getCheckMessage(MSG_KEY, "hidden"),
409             "90:13: " + getCheckMessage(MSG_KEY, "hidden"),
410         };
411         verifyWithInlineConfigParser(
412                 getPath("InputHiddenField5Basic.java"), expected);
413     }
414 
415     @Test
416     public void testHiddenField5Interface() throws Exception {
417         final String[] expected = {
418         };
419         verifyWithInlineConfigParser(
420                 getPath("InputHiddenField5Interface.java"), expected);
421     }
422 
423     @Test
424     public void testHiddenField5PropertySetter() throws Exception {
425         final String[] expected = {
426             "27:29: " + getCheckMessage(MSG_KEY, "prop"),
427             "33:29: " + getCheckMessage(MSG_KEY, "prop"),
428             "45:28: " + getCheckMessage(MSG_KEY, "prop"),
429         };
430         verifyWithInlineConfigParser(
431                 getPath("InputHiddenField5PropertySetter.java"), expected);
432     }
433 
434     @Test
435     public void testHiddenField5Static() throws Exception {
436         final String[] expected = {
437             "22:13: " + getCheckMessage(MSG_KEY, "hidden"),
438             "27:13: " + getCheckMessage(MSG_KEY, "hidden"),
439             "32:13: " + getCheckMessage(MSG_KEY, "hidden"),
440             "36:13: " + getCheckMessage(MSG_KEY, "hidden"),
441             "63:23: " + getCheckMessage(MSG_KEY, "y"),
442         };
443         verifyWithInlineConfigParser(
444                 getPath("InputHiddenField5Static.java"), expected);
445     }
446 
447     @Test
448     public void testHiddenField5Enum() throws Exception {
449         final String[] expected = {
450             "30:17: " + getCheckMessage(MSG_KEY, "hidden"),
451             "40:31: " + getCheckMessage(MSG_KEY, "hidden"),
452             "47:13: " + getCheckMessage(MSG_KEY, "hidden"),
453             "53:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
454         };
455         verifyWithInlineConfigParser(
456                 getPath("InputHiddenField5Enum.java"), expected);
457     }
458 
459     @Test
460     public void testHiddenField5Misc() throws Exception {
461         final String[] expected = {
462             "20:45: " + getCheckMessage(MSG_KEY, "x"),
463         };
464         verifyWithInlineConfigParser(
465                 getPath("InputHiddenField5Misc.java"), expected);
466     }
467 
468     /** Tests ignoreConstructorParameter property. */
469     @Test
470     public void testIgnoreConstructorParameter()
471             throws Exception {
472         final String[] expected = {
473             "29:13: " + getCheckMessage(MSG_KEY, "hidden"),
474             "38:13: " + getCheckMessage(MSG_KEY, "hidden"),
475             "43:18: " + getCheckMessage(MSG_KEY, "hidden"),
476             "48:33: " + getCheckMessage(MSG_KEY, "hidden"),
477             "59:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
478             "68:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
479             "69:17: " + getCheckMessage(MSG_KEY, "hidden"),
480             "74:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
481             "78:22: " + getCheckMessage(MSG_KEY, "hidden"),
482             "83:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
483             "85:17: " + getCheckMessage(MSG_KEY, "hidden"),
484             "91:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
485             "92:17: " + getCheckMessage(MSG_KEY, "hidden"),
486             "97:13: " + getCheckMessage(MSG_KEY, "hidden"),
487             "115:29: " + getCheckMessage(MSG_KEY, "prop"),
488             "121:29: " + getCheckMessage(MSG_KEY, "prop"),
489             "127:29: " + getCheckMessage(MSG_KEY, "prop"),
490             "139:28: " + getCheckMessage(MSG_KEY, "prop"),
491             "153:13: " + getCheckMessage(MSG_KEY, "hidden"),
492             "158:13: " + getCheckMessage(MSG_KEY, "hidden"),
493             "163:13: " + getCheckMessage(MSG_KEY, "hidden"),
494             "167:13: " + getCheckMessage(MSG_KEY, "hidden"),
495             "194:23: " + getCheckMessage(MSG_KEY, "y"),
496             "215:17: " + getCheckMessage(MSG_KEY, "hidden"),
497             "232:13: " + getCheckMessage(MSG_KEY, "hidden"),
498             "238:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
499             "245:41: " + getCheckMessage(MSG_KEY, "x"),
500             "251:30: " + getCheckMessage(MSG_KEY, "xAxis"),
501             "268:41: " + getCheckMessage(MSG_KEY, "prop"),
502             "282:29: " + getCheckMessage(MSG_KEY, "prop"),
503             "293:42: " + getCheckMessage(MSG_KEY, "prop2"),
504             "305:19: " + getCheckMessage(MSG_KEY, "i"),
505         };
506         verifyWithInlineConfigParser(
507                 getPath("InputHiddenField6.java"), expected);
508     }
509 
510     /** Test against a class with field declarations in different order. */
511     @Test
512     public void testReordered()
513             throws Exception {
514         final String[] expected = {
515             "30:13: " + getCheckMessage(MSG_KEY, "hidden"),
516             "33:40: " + getCheckMessage(MSG_KEY, "hidden"),
517             "40:13: " + getCheckMessage(MSG_KEY, "hidden"),
518             "45:18: " + getCheckMessage(MSG_KEY, "hidden"),
519             "50:33: " + getCheckMessage(MSG_KEY, "hidden"),
520             "61:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
521             "64:26: " + getCheckMessage(MSG_KEY, "innerHidden"),
522             "70:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
523             "71:17: " + getCheckMessage(MSG_KEY, "hidden"),
524             "76:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
525             "80:22: " + getCheckMessage(MSG_KEY, "hidden"),
526             "85:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
527             "87:17: " + getCheckMessage(MSG_KEY, "hidden"),
528             "93:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
529             "94:17: " + getCheckMessage(MSG_KEY, "hidden"),
530             "100:13: " + getCheckMessage(MSG_KEY, "hidden"),
531             "122:17: " + getCheckMessage(MSG_KEY, "hidden"),
532             "135:21: " + getCheckMessage(MSG_KEY, "hidden"),
533             "142:13: " + getCheckMessage(MSG_KEY, "hidden"),
534             "148:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
535         };
536         verifyWithInlineConfigParser(
537                 getPath("InputHiddenFieldReorder.java"), expected);
538     }
539 
540     @Test
541     public void testIgnoreAbstractMethods() throws Exception {
542 
543         final String[] expected = {
544             "30:13: " + getCheckMessage(MSG_KEY, "hidden"),
545             "33:34: " + getCheckMessage(MSG_KEY, "hidden"),
546             "40:13: " + getCheckMessage(MSG_KEY, "hidden"),
547             "45:18: " + getCheckMessage(MSG_KEY, "hidden"),
548             "50:33: " + getCheckMessage(MSG_KEY, "hidden"),
549             "61:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
550             "64:26: " + getCheckMessage(MSG_KEY, "innerHidden"),
551             "70:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
552             "71:17: " + getCheckMessage(MSG_KEY, "hidden"),
553             "76:22: " + getCheckMessage(MSG_KEY, "innerHidden"),
554             "80:22: " + getCheckMessage(MSG_KEY, "hidden"),
555             "85:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
556             "87:17: " + getCheckMessage(MSG_KEY, "hidden"),
557             "93:17: " + getCheckMessage(MSG_KEY, "innerHidden"),
558             "94:17: " + getCheckMessage(MSG_KEY, "hidden"),
559             "99:13: " + getCheckMessage(MSG_KEY, "hidden"),
560             "117:29: " + getCheckMessage(MSG_KEY, "prop"),
561             "123:29: " + getCheckMessage(MSG_KEY, "prop"),
562             "129:29: " + getCheckMessage(MSG_KEY, "prop"),
563             "141:28: " + getCheckMessage(MSG_KEY, "prop"),
564             "155:13: " + getCheckMessage(MSG_KEY, "hidden"),
565             "160:13: " + getCheckMessage(MSG_KEY, "hidden"),
566             "165:13: " + getCheckMessage(MSG_KEY, "hidden"),
567             "169:13: " + getCheckMessage(MSG_KEY, "hidden"),
568             "196:23: " + getCheckMessage(MSG_KEY, "y"),
569             "217:17: " + getCheckMessage(MSG_KEY, "hidden"),
570             "227:22: " + getCheckMessage(MSG_KEY, "hidden"),
571             "234:13: " + getCheckMessage(MSG_KEY, "hidden"),
572             "240:13: " + getCheckMessage(MSG_KEY, "hiddenStatic"),
573             "253:30: " + getCheckMessage(MSG_KEY, "xAxis"),
574             "270:41: " + getCheckMessage(MSG_KEY, "prop"),
575             "284:29: " + getCheckMessage(MSG_KEY, "prop"),
576             "295:42: " + getCheckMessage(MSG_KEY, "prop2"),
577             "307:19: " + getCheckMessage(MSG_KEY, "i"),
578         };
579         verifyWithInlineConfigParser(
580                 getPath("InputHiddenField7.java"), expected);
581     }
582 
583     @Test
584     public void testReceiverParameter() throws Exception {
585         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
586         verifyWithInlineConfigParser(
587                 getPath("InputHiddenFieldReceiver.java"), expected);
588     }
589 
590     @Test
591     public void testHiddenFieldEnhancedInstanceof() throws Exception {
592 
593         final String[] expected = {
594             "26:39: " + getCheckMessage(MSG_KEY, "price"),
595             "37:35: " + getCheckMessage(MSG_KEY, "hiddenStaticField"),
596         };
597         verifyWithInlineConfigParser(
598                 getPath("InputHiddenFieldEnhancedInstanceof.java"), expected);
599     }
600 
601     @Test
602     public void testHiddenFieldSwitchExpression() throws Exception {
603 
604         final String[] expected = {
605             "28:13: " + getCheckMessage(MSG_KEY, "x"),
606             "32:30: " + getCheckMessage(MSG_KEY, "word"),
607             "33:35: " + getCheckMessage(MSG_KEY, "otherWord"),
608             "35:21: " + getCheckMessage(MSG_KEY, "y"),
609             "39:21: " + getCheckMessage(MSG_KEY, "z"),
610             "43:21: " + getCheckMessage(MSG_KEY, "a"),
611             "47:21: " + getCheckMessage(MSG_KEY, "b"),
612             "54:13: " + getCheckMessage(MSG_KEY, "x"),
613             "58:30: " + getCheckMessage(MSG_KEY, "word"),
614             "59:35: " + getCheckMessage(MSG_KEY, "otherWord"),
615             "61:21: " + getCheckMessage(MSG_KEY, "y"),
616             "65:21: " + getCheckMessage(MSG_KEY, "z"),
617             "69:21: " + getCheckMessage(MSG_KEY, "a"),
618             "73:21: " + getCheckMessage(MSG_KEY, "b"),
619         };
620         verifyWithInlineConfigParser(
621                 getPath("InputHiddenFieldSwitchExpression.java"), expected);
622     }
623 
624     @Test
625     public void testHiddenFieldRecords() throws Exception {
626 
627         final String[] expected = {
628             "23:17: " + getCheckMessage(MSG_KEY, "myHiddenInt"),
629             "28:17: " + getCheckMessage(MSG_KEY, "myHiddenInt"),
630             "36:17: " + getCheckMessage(MSG_KEY, "hiddenField"),
631             "44:39: " + getCheckMessage(MSG_KEY, "hiddenStaticField"),
632             "59:39: " + getCheckMessage(MSG_KEY, "price"),
633             "68:21: " + getCheckMessage(MSG_KEY, "x"),
634             "72:20: " + getCheckMessage(MSG_KEY, "string"),
635             "82:21: " + getCheckMessage(MSG_KEY, "x"),
636             "86:20: " + getCheckMessage(MSG_KEY, "string"),
637         };
638         verifyWithInlineConfigParser(
639                 getPath("InputHiddenFieldRecords.java"), expected);
640     }
641 
642     @Test
643     public void testHiddenFieldLambdasInNestedScope() throws Exception {
644         final String[] expected = {
645             "21:34: " + getCheckMessage(MSG_KEY, "value"),
646         };
647         verifyWithInlineConfigParser(
648             getPath("InputHiddenFieldLambdas2.java"), expected);
649     }
650 
651     @Test
652     public void testClassNestedInRecord() throws Exception {
653 
654         final String[] expected = {
655             "23:26: " + getCheckMessage(MSG_KEY, "a"),
656         };
657         verifyWithInlineConfigParser(
658             getPath("InputHiddenFieldClassNestedInRecord.java"),
659             expected);
660     }
661 
662     @Test
663     public void testHiddenFieldInnerRecordsImplicitlyStatic() throws Exception {
664 
665         final String[] expected = {
666             "35:30: " + getCheckMessage(MSG_KEY, "pointer"),
667         };
668 
669         verifyWithInlineConfigParser(
670                 getPath("InputHiddenFieldInnerRecordsImplicitlyStatic.java"),
671                 expected);
672     }
673 
674     @Test
675     public void testHiddenFieldRecordsImplicitlyStaticClassComparison() throws Exception {
676 
677         final String[] expected = {
678             "46:27: " + getCheckMessage(MSG_KEY, "x"),
679         };
680 
681         verifyWithInlineConfigParser(
682                 getPath("InputHiddenFieldRecordsImplicitlyStaticClassComparison.java"),
683                 expected);
684     }
685 
686     @Test
687     public void testHiddenFieldRecordPattern() throws Exception {
688 
689         final String[] expected = {
690             "24:46: " + getCheckMessage(MSG_KEY, "s"),
691             "24:53: " + getCheckMessage(MSG_KEY, "x"),
692             "32:39: " + getCheckMessage(MSG_KEY, "s"),
693             "32:46: " + getCheckMessage(MSG_KEY, "x"),
694             "41:45: " + getCheckMessage(MSG_KEY, "s"),
695             "41:52: " + getCheckMessage(MSG_KEY, "x"),
696             "41:63: " + getCheckMessage(MSG_KEY, "z"),
697             "49:37: " + getCheckMessage(MSG_KEY, "s"),
698             "49:44: " + getCheckMessage(MSG_KEY, "x"),
699         };
700         verifyWithInlineConfigParser(
701                 getNonCompilablePath("InputHiddenFieldRecordPattern.java"), expected);
702     }
703 
704     /**
705      * We cannot reproduce situation when visitToken is called and leaveToken is not.
706      * So, we have to use reflection to be sure that even in such situation
707      * state of the field will be cleared.
708      *
709      * @throws Exception when code tested throws exception
710      */
711     @Test
712     public void testClearState() throws Exception {
713         final HiddenFieldCheck check = new HiddenFieldCheck();
714         final DetailAST root = JavaParser.parseFile(new File(getPath("InputHiddenField8.java")),
715                 JavaParser.Options.WITHOUT_COMMENTS);
716         final Optional<DetailAST> classDef = TestUtil.findTokenInAstByPredicate(root,
717             ast -> ast.getType() == TokenTypes.CLASS_DEF);
718 
719         assertWithMessage("Ast should contain CLASS_DEF")
720                 .that(classDef.isPresent())
721                 .isTrue();
722         assertWithMessage("State is not cleared on beginTree")
723                 .that(
724                     TestUtil.isStatefulFieldClearedDuringBeginTree(check, classDef.orElseThrow(),
725                         "frame", new CheckIfStatefulFieldCleared()))
726                 .isTrue();
727     }
728 
729     private static final class CheckIfStatefulFieldCleared implements Predicate<Object> {
730 
731         @Override
732         public boolean test(Object frame) {
733             boolean result = frame != null;
734 
735             // verify object is cleared
736             if (result
737                     && (TestUtil.getInternalState(frame, "parent", Boolean.class) != null
738                         || !TestUtil.<Boolean>getInternalState(frame, "staticType", Boolean.class)
739                         || TestUtil.getInternalState(frame, "frameName", Boolean.class) != null)) {
740                 result = false;
741             }
742 
743             return result;
744         }
745 
746     }
747 
748 }