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 org.checkstyle.suppressionxpathfilter;
21  
22  import java.io.File;
23  import java.util.List;
24  
25  import org.junit.jupiter.api.Test;
26  
27  import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
28  import com.puppycrawl.tools.checkstyle.checks.coding.FinalLocalVariableCheck;
29  
30  public class XpathRegressionFinalLocalVariableTest extends AbstractXpathTestSupport {
31  
32      private final String checkName = FinalLocalVariableCheck.class.getSimpleName();
33  
34      @Override
35      protected String getCheckName() {
36          return checkName;
37      }
38  
39      @Test
40      public void testMethodDef() throws Exception {
41          final File fileToProcess = new
42                  File(getPath("InputXpathFinalLocalVariableMethodDef.java"));
43  
44          final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
45  
46          final String[] expectedViolation = {
47              "5:13: " + getCheckMessage(FinalLocalVariableCheck.class,
48                      FinalLocalVariableCheck.MSG_KEY, "x"),
49          };
50  
51          final List<String> expectedXpathQueries = List.of(
52                  "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
53                          + "[@text='InputXpathFinalLocalVariableMethodDef']]"
54                          + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='testMethod']]"
55                          + "/SLIST/VARIABLE_DEF/IDENT[@text='x']"
56          );
57  
58          runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
59      }
60  
61      @Test
62      public void testForLoop() throws Exception {
63          final File fileToProcess = new
64                  File(getPath("InputXpathFinalLocalVariableForLoop.java"));
65  
66          final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
67  
68          final String[] expectedViolation = {
69              "6:17: " + getCheckMessage(FinalLocalVariableCheck.class,
70                      FinalLocalVariableCheck.MSG_KEY, "x"),
71          };
72  
73          final List<String> expectedXpathQueries = List.of(
74              "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
75                      + "[@text='InputXpathFinalLocalVariableForLoop']]"
76                      + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='method2']]/SLIST/"
77                      + "LITERAL_FOR/SLIST/VARIABLE_DEF/IDENT[@text='x']"
78          );
79  
80          runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
81      }
82  
83      @Test
84      public void testSwitchCase() throws Exception {
85          final File fileToProcess = new
86                  File(getPath("InputXpathFinalLocalVariableSwitchCase.java"));
87  
88          final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
89  
90          final String[] expectedViolation = {
91              "8:25: " + getCheckMessage(FinalLocalVariableCheck.class,
92                      FinalLocalVariableCheck.MSG_KEY, "foo"),
93          };
94  
95          final List<String> expectedXpathQueries = List.of(
96              "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
97                      + "[@text='InputXpathFinalLocalVariableSwitchCase']]"
98                      + "/OBJBLOCK/CLASS_DEF[./IDENT[@text='InnerClass']]"
99                      + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='method']]/SLIST/"
100                     + "LITERAL_SWITCH/CASE_GROUP/SLIST/VARIABLE_DEF/IDENT[@text='foo']"
101         );
102 
103         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
104     }
105 
106     @Test
107     public void testInnerClass() throws Exception {
108         final File fileToProcess = new
109                 File(getPath("InputXpathFinalLocalVariableInnerClass.java"));
110 
111         final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
112 
113         final String[] expectedViolation = {
114             "7:17: " + getCheckMessage(FinalLocalVariableCheck.class,
115                     FinalLocalVariableCheck.MSG_KEY, "shouldBeFinal"),
116         };
117 
118         final List<String> expectedXpathQueries = List.of(
119             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
120                     + "[@text='InputXpathFinalLocalVariableInnerClass']]"
121                     + "/OBJBLOCK/CLASS_DEF[./IDENT[@text='InnerClass']]"
122                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='test1']]"
123                     + "/SLIST/VARIABLE_DEF/IDENT[@text='shouldBeFinal']"
124         );
125 
126         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
127     }
128 
129     @Test
130     public void testParameterDef() throws Exception {
131         final File fileToProcess = new
132                 File(getPath("InputXpathFinalLocalVariableParameterDef.java"));
133 
134         final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
135         moduleConfig.addProperty("tokens", "PARAMETER_DEF");
136 
137         final String[] expectedViolation = {
138             "4:28: " + getCheckMessage(FinalLocalVariableCheck.class,
139                     FinalLocalVariableCheck.MSG_KEY, "aArg"),
140         };
141 
142         final List<String> expectedXpathQueries = List.of(
143             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
144                     + "[@text='InputXpathFinalLocalVariableParameterDef']]"
145                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='method']]"
146                     + "/PARAMETERS/PARAMETER_DEF/IDENT[@text='aArg']"
147         );
148 
149         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
150     }
151 
152     @Test
153     public void testEnhancedFor() throws Exception {
154         final File fileToProcess = new
155                 File(getPath("InputXpathFinalLocalVariableEnhancedFor.java"));
156 
157         final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
158         moduleConfig.addProperty("validateEnhancedForLoopVariable", "true");
159 
160         final String[] expectedViolation = {
161             "8:20: " + getCheckMessage(FinalLocalVariableCheck.class,
162                     FinalLocalVariableCheck.MSG_KEY, "a"),
163         };
164 
165         final List<String> expectedXpathQueries = List.of(
166             "/COMPILATION_UNIT/CLASS_DEF"
167                     + "[./IDENT[@text='InputXpathFinalLocalVariableEnhancedFor']]"
168                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='method1']]"
169                     + "/SLIST/LITERAL_FOR/FOR_EACH_CLAUSE/VARIABLE_DEF/IDENT[@text='a']"
170         );
171 
172         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
173     }
174 
175     @Test
176     public void testCtor() throws Exception {
177         final File fileToProcess = new
178                 File(getPath("InputXpathFinalLocalVariableCtor.java"));
179 
180         final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
181         moduleConfig.addProperty("tokens", "PARAMETER_DEF");
182 
183         final String[] expectedViolation = {
184             "4:42: " + getCheckMessage(FinalLocalVariableCheck.class,
185                     FinalLocalVariableCheck.MSG_KEY, "a"),
186         };
187 
188         final List<String> expectedXpathQueries = List.of(
189             "/COMPILATION_UNIT/CLASS_DEF"
190                     + "[./IDENT[@text='InputXpathFinalLocalVariableCtor']]"
191                     + "/OBJBLOCK/CTOR_DEF[./IDENT"
192                     + "[@text='InputXpathFinalLocalVariableCtor']]"
193                     + "/PARAMETERS/PARAMETER_DEF/IDENT[@text='a']"
194         );
195 
196         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
197     }
198 
199     @Test
200     public void testTryBlock() throws Exception {
201         final File fileToProcess = new
202                 File(getPath("InputXpathFinalLocalVariableTryBlock.java"));
203 
204         final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
205 
206         final String[] expectedViolation = {
207             "6:17: " + getCheckMessage(FinalLocalVariableCheck.class,
208                     FinalLocalVariableCheck.MSG_KEY, "start"),
209         };
210 
211         final List<String> expectedXpathQueries = List.of(
212             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
213                     + "[@text='InputXpathFinalLocalVariableTryBlock']]"
214                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='checkCodeBlock']]"
215                     + "/SLIST/LITERAL_TRY/SLIST/VARIABLE_DEF/IDENT[@text='start']"
216         );
217 
218         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
219     }
220 
221     @Test
222     public void testConditionals() throws Exception {
223         final File fileToProcess = new
224                 File(getPath("InputXpathFinalLocalVariableConditionals.java"));
225 
226         final DefaultConfiguration moduleConfig = createModuleConfig(FinalLocalVariableCheck.class);
227 
228         final String[] expectedViolation = {
229             "11:25: " + getCheckMessage(FinalLocalVariableCheck.class,
230                     FinalLocalVariableCheck.MSG_KEY, "body"),
231         };
232 
233         final List<String> expectedXpathQueries = List.of(
234             "/COMPILATION_UNIT/CLASS_DEF"
235                     + "[./IDENT[@text='InputXpathFinalLocalVariableConditionals']]"
236                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='checkCodeBlock']]/SLIST/LITERAL_TRY"
237                     + "/SLIST/LITERAL_IF/LITERAL_ELSE/LITERAL_IF"
238                     + "/SLIST/VARIABLE_DEF/IDENT[@text='body']"
239         );
240 
241         runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
242     }
243 }