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.xpath;
21  
22  import static com.google.common.truth.Truth.assertWithMessage;
23  
24  import java.io.File;
25  import java.nio.charset.StandardCharsets;
26  import java.util.Arrays;
27  import java.util.Collections;
28  import java.util.List;
29  
30  import org.junit.jupiter.api.BeforeEach;
31  import org.junit.jupiter.api.Test;
32  
33  import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
34  import com.puppycrawl.tools.checkstyle.JavaParser;
35  import com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent;
36  import com.puppycrawl.tools.checkstyle.api.DetailAST;
37  import com.puppycrawl.tools.checkstyle.api.FileContents;
38  import com.puppycrawl.tools.checkstyle.api.FileText;
39  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
40  import com.puppycrawl.tools.checkstyle.api.Violation;
41  
42  public class XpathQueryGeneratorTest extends AbstractModuleTestSupport {
43  
44      private static final int DEFAULT_TAB_WIDTH = 4;
45  
46      private static DetailAST rootAst;
47  
48      private static FileText fileText;
49  
50      @Override
51      protected String getPackageLocation() {
52          return "com/puppycrawl/tools/checkstyle/xpath/xpathquerygenerator";
53      }
54  
55      @BeforeEach
56      public void init() throws Exception {
57          final File file = new File(getPath("InputXpathQueryGenerator.java"));
58          fileText = new FileText(file,
59                  StandardCharsets.UTF_8.name());
60          rootAst = JavaParser.parseFile(file, JavaParser.Options.WITH_COMMENTS);
61      }
62  
63      @Test
64      public void testClassDef() {
65          final int lineNumber = 12;
66          final int columnNumber = 1;
67          final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
68                  columnNumber, fileText, DEFAULT_TAB_WIDTH);
69          final List<String> actual = queryGenerator.generate();
70          final List<String> expected = Arrays.asList(
71              "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]",
72              "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/MODIFIERS",
73              "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
74                      + "/MODIFIERS/LITERAL_PUBLIC");
75          assertWithMessage("Generated queries do not match expected ones")
76              .that(actual)
77              .isEqualTo(expected);
78      }
79  
80      @Test
81      public void testMethodDef() {
82          final int lineNumber = 45;
83          final int columnNumber = 5;
84          final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
85                  columnNumber, fileText, DEFAULT_TAB_WIDTH);
86          final List<String> actual = queryGenerator.generate();
87          final List<String> expected = Arrays.asList(
88              "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK"
89                  + "/METHOD_DEF[./IDENT[@text='callSomeMethod']]",
90              "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK"
91                  + "/METHOD_DEF[./IDENT[@text='callSomeMethod']]/MODIFIERS",
92              "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK"
93                  + "/METHOD_DEF[./IDENT[@text='callSomeMethod']]/MODIFIERS/LITERAL_PUBLIC");
94          assertWithMessage("Generated queries do not match expected ones")
95              .that(actual)
96              .isEqualTo(expected);
97      }
98  
99      @Test
100     public void testVariableDef() {
101         final int lineNumber = 53;
102         final int columnNumber = 13;
103         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
104                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
105         final List<String> actual = queryGenerator.generate();
106         final List<String> expected = Arrays.asList(
107             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
108                 + "[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
109                 + "./IDENT[@text='callSomeMethod']]/SLIST/LITERAL_FOR/SLIST"
110                 + "/VARIABLE_DEF[./IDENT[@text='d']]",
111             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
112                 + "[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
113                 + "./IDENT[@text='callSomeMethod']]/SLIST/LITERAL_FOR/SLIST"
114                 + "/VARIABLE_DEF[./IDENT[@text='d']]/MODIFIERS",
115             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
116                 + "[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
117                 + "./IDENT[@text='callSomeMethod']]/SLIST/LITERAL_FOR/SLIST"
118                 + "/VARIABLE_DEF[./IDENT[@text='d']]/TYPE",
119             "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
120                 + "[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
121                 + "./IDENT[@text='callSomeMethod']]/SLIST/LITERAL_FOR/SLIST"
122                 + "/VARIABLE_DEF[./IDENT[@text='d']]/TYPE/LITERAL_SHORT");
123         assertWithMessage("Generated queries do not match expected ones")
124             .that(actual)
125             .isEqualTo(expected);
126     }
127 
128     @Test
129     public void testLcurly() {
130         final int lineNumber = 37;
131         final int columnNumber = 20;
132         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
133                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
134         final List<String> actual = queryGenerator.generate();
135         final List<String> expected = Collections.singletonList(
136             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
137                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='Label']]/SLIST/LITERAL_SWITCH/LCURLY");
138         assertWithMessage("Generated queries do not match expected ones")
139             .that(actual)
140             .isEqualTo(expected);
141     }
142 
143     @Test
144     public void testRcurly() {
145         final int lineNumber = 25;
146         final int columnNumber = 5;
147         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
148                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
149         final List<String> actual = queryGenerator.generate();
150         final List<String> expected = Collections.singletonList(
151             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK"
152                 + "/INSTANCE_INIT/SLIST/RCURLY");
153         assertWithMessage("Generated queries do not match expected ones")
154             .that(actual)
155             .isEqualTo(expected);
156     }
157 
158     @Test
159     public void testExpr() {
160         final int lineNumber = 17;
161         final int columnNumber = 50;
162         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
163                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
164         final List<String> actual = queryGenerator.generate();
165         final List<String> expected = Arrays.asList(
166             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
167                     + "/OBJBLOCK/VARIABLE_DEF[./IDENT[@text='mUse4']]/ASSIGN/EXPR",
168             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
169                     + "/OBJBLOCK/VARIABLE_DEF[./IDENT[@text='mUse4']]/ASSIGN/EXPR/DOT");
170         assertWithMessage("Generated queries do not match expected ones")
171             .that(actual)
172             .isEqualTo(expected);
173     }
174 
175     @Test
176     public void testLparen() {
177         final int lineNumber = 45;
178         final int columnNumber = 31;
179         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
180                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
181         final List<String> actual = queryGenerator.generate();
182         final List<String> expected = Collections.singletonList(
183             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK"
184                 + "/METHOD_DEF[./IDENT[@text='callSomeMethod']]/LPAREN");
185         assertWithMessage("Generated queries do not match expected ones")
186             .that(actual)
187             .isEqualTo(expected);
188     }
189 
190     @Test
191     public void testEmpty() {
192         final int lineNumber = 300;
193         final int columnNumber = 300;
194         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
195                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
196         final List<String> actual = queryGenerator.generate();
197         assertWithMessage("Result should be empty")
198             .that(actual)
199             .isEmpty();
200     }
201 
202     @Test
203     public void testPackage() {
204         final int lineNumber = 2;
205         final int columnNumber = 1;
206         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
207                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
208         final List<String> actual = queryGenerator.generate();
209         final List<String> expected = Arrays.asList(
210                 "/COMPILATION_UNIT",
211                 "/COMPILATION_UNIT/PACKAGE_DEF");
212         assertWithMessage("Generated queries do not match expected ones")
213             .that(actual)
214             .isEqualTo(expected);
215     }
216 
217     @Test
218     public void testImport() {
219         final int lineNumber = 5;
220         final int columnNumber = 1;
221         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
222                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
223         final List<String> actual = queryGenerator.generate();
224         final List<String> expected = Collections.singletonList(
225             "/COMPILATION_UNIT/IMPORT[./DOT/IDENT[@text='File']]");
226         assertWithMessage("Generated queries do not match expected ones")
227             .that(actual)
228             .isEqualTo(expected);
229     }
230 
231     @Test
232     public void testMethodParams() {
233         final int lineNumber = 72;
234         final int columnNumber = 30;
235         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
236                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
237         final List<String> actual = queryGenerator.generate();
238         final List<String> expected = Arrays.asList(
239             "/COMPILATION_UNIT/CLASS_DEF"
240                     + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
241                 + "./IDENT[@text='saveUser']]/PARAMETERS",
242             "/COMPILATION_UNIT/CLASS_DEF"
243                     + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
244                 + "./IDENT[@text='saveUser']]/PARAMETERS/PARAMETER_DEF[./IDENT[@text='name']]",
245             "/COMPILATION_UNIT/CLASS_DEF"
246                     + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
247                 + "./IDENT[@text='saveUser']]/PARAMETERS/PARAMETER_DEF[./IDENT[@text='name']]"
248                 + "/MODIFIERS",
249             "/COMPILATION_UNIT/CLASS_DEF"
250                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
251                 + "./IDENT[@text='saveUser']]/PARAMETERS/PARAMETER_DEF[./IDENT[@text='name']]"
252                 + "/TYPE[./IDENT[@text='String']]",
253             "/COMPILATION_UNIT/CLASS_DEF"
254                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
255                 + "./IDENT[@text='saveUser']]/PARAMETERS/PARAMETER_DEF[./IDENT[@text='name']]"
256                 + "/TYPE/IDENT[@text='String']");
257         assertWithMessage("Generated queries do not match expected ones")
258             .that(actual)
259             .isEqualTo(expected);
260     }
261 
262     @Test
263     public void testSwitch() {
264         final int lineNumber = 37;
265         final int columnNumber = 9;
266         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
267                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
268         final List<String> actual = queryGenerator.generate();
269         final List<String> expected = Collections.singletonList(
270             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
271                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='Label']]/SLIST/LITERAL_SWITCH");
272         assertWithMessage("Generated queries do not match expected ones")
273             .that(actual)
274             .isEqualTo(expected);
275     }
276 
277     @Test
278     public void testSwitchCase() {
279         final int lineNumber = 38;
280         final int columnNumber = 13;
281         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
282                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
283         final List<String> actual = queryGenerator.generate();
284         final List<String> expected = Arrays.asList(
285             "/COMPILATION_UNIT/CLASS_DEF"
286                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
287                 + "./IDENT[@text='Label']]/SLIST/LITERAL_SWITCH/CASE_GROUP[1]",
288             "/COMPILATION_UNIT/CLASS_DEF"
289                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
290                 + "./IDENT[@text='Label']]/SLIST/LITERAL_SWITCH/CASE_GROUP/LITERAL_DEFAULT");
291         assertWithMessage("Generated queries do not match expected ones")
292             .that(actual)
293             .isEqualTo(expected);
294     }
295 
296     @Test
297     public void testVariableStringLiteral() {
298         final int lineNumber = 47;
299         final int columnNumber = 26;
300         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
301                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
302         final List<String> actual = queryGenerator.generate();
303         final List<String> expected = Arrays.asList(
304             "/COMPILATION_UNIT/CLASS_DEF"
305                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
306                 + "./IDENT[@text='callSomeMethod']]/SLIST/VARIABLE_DEF[./IDENT[@text='another']]"
307                 + "/ASSIGN/EXPR[./STRING_LITERAL[@text='HelloWorld']]",
308             "/COMPILATION_UNIT/CLASS_DEF"
309                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
310                 + "./IDENT[@text='callSomeMethod']]/SLIST/VARIABLE_DEF[./IDENT[@text='another']]"
311                 + "/ASSIGN/EXPR/STRING_LITERAL[@text='HelloWorld']");
312         assertWithMessage("Generated queries do not match expected ones")
313             .that(actual)
314             .isEqualTo(expected);
315     }
316 
317     @Test
318     public void testComma() {
319         final int lineNumber = 66;
320         final int columnNumber = 36;
321         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
322                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
323         final List<String> actual = queryGenerator.generate();
324         final List<String> expected = Collections.singletonList(
325             "/COMPILATION_UNIT/CLASS_DEF"
326                 + "[./IDENT[@text='InputXpathQueryGenerator']]/OBJBLOCK/METHOD_DEF["
327                 + "./IDENT[@text='foo']]/SLIST/LITERAL_FOR/FOR_ITERATOR/ELIST/COMMA");
328         assertWithMessage("Generated queries do not match expected ones")
329             .that(actual)
330             .isEqualTo(expected);
331     }
332 
333     @Test
334     public void testLiteralVoid() {
335         final int lineNumber = 65;
336         final int columnNumber = 12;
337         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
338                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
339         final List<String> actual = queryGenerator.generate();
340         final List<String> expected = Arrays.asList(
341             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
342                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='foo']]/TYPE",
343             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]"
344                     + "/OBJBLOCK/METHOD_DEF[./IDENT[@text='foo']]/TYPE/LITERAL_VOID");
345         assertWithMessage("Generated queries do not match expected ones")
346             .that(actual)
347             .isEqualTo(expected);
348     }
349 
350     @Test
351     public void testFirstImport() {
352         final int lineNumber = 4;
353         final int columnNumber = 1;
354         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
355                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
356         final List<String> actual = queryGenerator.generate();
357         final List<String> expected = Collections.singletonList(
358                 "/COMPILATION_UNIT/IMPORT[./DOT/IDENT[@text='JToolBar']]");
359         assertWithMessage("Generated queries do not match expected ones")
360             .that(actual)
361             .isEqualTo(expected);
362     }
363 
364     @Test
365     public void testLastImport() {
366         final int lineNumber = 8;
367         final int columnNumber = 1;
368         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
369                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
370         final List<String> actual = queryGenerator.generate();
371         final List<String> expected = Collections.singletonList(
372                 "/COMPILATION_UNIT/IMPORT[./DOT/IDENT[@text='Iterator']]");
373         assertWithMessage("Generated queries do not match expected ones")
374             .that(actual)
375             .isEqualTo(expected);
376     }
377 
378     @Test
379     public void testImportByText() {
380         final int lineNumber = 4;
381         final int columnNumber = 8;
382         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
383                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
384         final List<String> actual = queryGenerator.generate();
385         final List<String> expected = Collections.singletonList(
386                 "/COMPILATION_UNIT/IMPORT/DOT[./IDENT[@text='JToolBar']]/DOT/IDENT[@text='javax']");
387         assertWithMessage("Generated queries do not match expected ones")
388             .that(actual)
389             .isEqualTo(expected);
390     }
391 
392     @Test
393     public void testIdent() {
394         final int lineNumber = 12;
395         final int columnNumber = 14;
396         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
397                 columnNumber, fileText, DEFAULT_TAB_WIDTH);
398         final List<String> actual = queryGenerator.generate();
399         final List<String> expected = Collections.singletonList(
400             "/COMPILATION_UNIT/CLASS_DEF/IDENT[@text='InputXpathQueryGenerator']");
401         assertWithMessage("Generated queries do not match expected ones")
402             .that(actual)
403             .isEqualTo(expected);
404     }
405 
406     @Test
407     public void testTabWidthBeforeMethodDef() throws Exception {
408         final File testFile = new File(getPath(
409                 "InputXpathQueryGeneratorTabWidth.java"));
410         final FileText testFileText = new FileText(testFile,
411                 StandardCharsets.UTF_8.name());
412         final DetailAST detailAst =
413                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
414         final int lineNumber = 4;
415         final int columnNumber = 13;
416         final int tabWidth = 4;
417         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst, lineNumber,
418                 columnNumber, testFileText, tabWidth);
419         final List<String> actual = queryGenerator.generate();
420         final List<String> expected = Arrays.asList(
421                 "/COMPILATION_UNIT/CLASS_DEF"
422                     + "[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]/OBJBLOCK"
423                     + "/METHOD_DEF[./IDENT[@text='toString']]",
424                 "/COMPILATION_UNIT/CLASS_DEF"
425                     + "[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]/OBJBLOCK"
426                     + "/METHOD_DEF[./IDENT[@text='toString']]/MODIFIERS",
427                 "/COMPILATION_UNIT/CLASS_DEF"
428                     + "[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]/OBJBLOCK"
429                     + "/METHOD_DEF[./IDENT[@text='toString']]/MODIFIERS/LITERAL_PUBLIC");
430         assertWithMessage("Generated queries do not match expected ones")
431             .that(actual)
432             .isEqualTo(expected);
433     }
434 
435     @Test
436     public void testTabWidthAfterVoidLiteral() throws Exception {
437         final File testFile = new File(getPath(
438                 "InputXpathQueryGeneratorTabWidth.java"));
439         final FileText testFileText = new FileText(testFile,
440                 StandardCharsets.UTF_8.name());
441         final DetailAST detailAst =
442                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
443         final int lineNumber = 8;
444         final int columnNumber = 41;
445         final int tabWidth = 8;
446         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst, lineNumber,
447                 columnNumber, testFileText, tabWidth);
448         final List<String> actual = queryGenerator.generate();
449         final List<String> expected = Arrays.asList(
450                 "/COMPILATION_UNIT/CLASS_DEF"
451                     + "[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]/OBJBLOCK"
452                     + "/METHOD_DEF[./IDENT[@text='getName']]/TYPE",
453                 "/COMPILATION_UNIT/CLASS_DEF"
454                     + "[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]/OBJBLOCK"
455                     + "/METHOD_DEF[./IDENT[@text='getName']]/TYPE/LITERAL_VOID");
456         assertWithMessage("Generated queries do not match expected ones")
457             .that(actual)
458             .isEqualTo(expected);
459     }
460 
461     @Test
462     public void testTabWidthBeforeSlist() throws Exception {
463         final File testFile = new File(getPath("InputXpathQueryGeneratorTabWidth.java"));
464         final FileText testFileText = new FileText(testFile,
465                 StandardCharsets.UTF_8.name());
466         final DetailAST detailAst =
467                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
468         final int lineNumber = 12;
469         final int columnNumber = 57;
470         final int tabWidth = 8;
471         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst, lineNumber,
472                 columnNumber, testFileText, tabWidth);
473         final List<String> actual = queryGenerator.generate();
474         final List<String> expected = Collections.singletonList(
475                 "/COMPILATION_UNIT/CLASS_DEF"
476                     + "[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]/OBJBLOCK"
477                     + "/METHOD_DEF[./IDENT[@text='tabAfterMe']]/SLIST");
478         assertWithMessage("Generated queries do not match expected ones")
479             .that(actual)
480             .isEqualTo(expected);
481     }
482 
483     @Test
484     public void testTabWidthEndOfLine() throws Exception {
485         final File testFile = new File(getPath("InputXpathQueryGeneratorTabWidth.java"));
486         final FileText testFileText = new FileText(testFile,
487                 StandardCharsets.UTF_8.name());
488         final DetailAST detailAst =
489                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
490         final int lineNumber = 16;
491         final int columnNumber = 58;
492         final int tabWidth = 8;
493         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst, lineNumber,
494                 columnNumber, testFileText, tabWidth);
495         final List<String> actual = queryGenerator.generate();
496         final List<String> expected = Collections.singletonList(
497                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGeneratorTabWidth']]"
498                     + "/OBJBLOCK/VARIABLE_DEF[./IDENT[@text='endLineTab']]/SEMI");
499         assertWithMessage("Generated queries do not match expected ones")
500             .that(actual)
501             .isEqualTo(expected);
502     }
503 
504     @Test
505     public void testClassDefWithTokenType() {
506         final int lineNumber = 12;
507         final int columnNumber = 1;
508         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(rootAst, lineNumber,
509                 columnNumber, TokenTypes.CLASS_DEF, fileText, DEFAULT_TAB_WIDTH);
510         final List<String> actual = queryGenerator.generate();
511         final List<String> expected = Collections.singletonList(
512                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]");
513         assertWithMessage("Generated queries do not match expected ones")
514             .that(actual)
515             .isEqualTo(expected);
516     }
517 
518     @Test
519     public void testConstructorWithTreeWalkerAuditEvent() {
520         final Violation violation = new Violation(12, 1, "messages.properties", null,
521                 null, null, null, null, null);
522         final TreeWalkerAuditEvent event = new TreeWalkerAuditEvent(new FileContents(fileText),
523                 "InputXpathQueryGenerator", violation, rootAst);
524         final XpathQueryGenerator queryGenerator =
525                 new XpathQueryGenerator(event, DEFAULT_TAB_WIDTH);
526         final List<String> actual = queryGenerator.generate();
527         final List<String> expected = Arrays.asList(
528                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]",
529                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/MODIFIERS",
530                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator']]/MODIFIERS"
531                     + "/LITERAL_PUBLIC");
532         assertWithMessage("Generated queries do not match expected ones")
533             .that(actual)
534             .isEqualTo(expected);
535     }
536 
537     @Test
538     public void testEscapeCharacters() throws Exception {
539         final File testFile = new File(getPath("InputXpathQueryGeneratorEscapeCharacters.java"));
540         final FileText testFileText = new FileText(testFile,
541                 StandardCharsets.UTF_8.name());
542         final DetailAST detailAst =
543                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
544         final int tabWidth = 8;
545 
546         final int lineNumberOne = 4;
547         final int columnNumberOne = 22;
548         final XpathQueryGenerator queryGeneratorOne = new XpathQueryGenerator(detailAst,
549                 lineNumberOne, columnNumberOne, testFileText, tabWidth);
550         final List<String> actualTestOne = queryGeneratorOne.generate();
551         final List<String> expectedTestOne = Arrays.asList(
552                 "/COMPILATION_UNIT/CLASS_DEF"
553                         + "[./IDENT[@text='InputXpathQueryGeneratorEscapeCharacters']]/"
554                         + "OBJBLOCK/VARIABLE_DEF[./IDENT[@text='testOne']]/ASSIGN/EXPR[./"
555                         + "STRING_LITERAL[@text='&lt;&gt;&apos;&apos;\\&quot;&amp;abc;&amp;lt;"
556                         + "\\u0080\\n']]",
557                 "/COMPILATION_UNIT/CLASS_DEF"
558                         + "[./IDENT[@text='InputXpathQueryGeneratorEscapeCharacters']]/"
559                         + "OBJBLOCK/VARIABLE_DEF[./IDENT[@text='testOne']]/ASSIGN/EXPR/"
560                         + "STRING_LITERAL[@text='&lt;&gt;&apos;&apos;\\&quot;&amp;abc;&amp;lt;"
561                         + "\\u0080\\n']"
562         );
563         assertWithMessage("Generated queries do not match expected ones")
564             .that(actualTestOne)
565             .isEqualTo(expectedTestOne);
566 
567         final int lineNumberTwo = 6;
568         final int columnNumberTwo = 22;
569         final XpathQueryGenerator queryGeneratorTwo = new XpathQueryGenerator(detailAst,
570                 lineNumberTwo, columnNumberTwo, testFileText, tabWidth);
571         final List<String> actualTestTwo = queryGeneratorTwo.generate();
572         final List<String> expectedTestTwo = Arrays.asList(
573                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT"
574                         + "[@text='InputXpathQueryGeneratorEscapeCharacters']]/"
575                         + "OBJBLOCK/VARIABLE_DEF[./IDENT[@text='testTwo']]/ASSIGN/EXPR[./"
576                         + "STRING_LITERAL[@text='&amp;#0;&amp;#X0\\u0001\\r']]",
577                 "/COMPILATION_UNIT/CLASS_DEF"
578                         + "[./IDENT[@text='InputXpathQueryGeneratorEscapeCharacters']]/"
579                         + "OBJBLOCK/VARIABLE_DEF[./IDENT[@text='testTwo']]/ASSIGN/EXPR/"
580                         + "STRING_LITERAL[@text='&amp;#0;&amp;#X0\\u0001\\r']"
581         );
582         assertWithMessage("Generated queries do not match expected ones")
583             .that(actualTestTwo)
584             .isEqualTo(expectedTestTwo);
585     }
586 
587     @Test
588     public void testTextBlocks() throws Exception {
589         final File testFile = new File(getNonCompilablePath(
590                 "InputXpathQueryGeneratorTextBlock.java"));
591         final FileText testFileText = new FileText(testFile,
592                 StandardCharsets.UTF_8.name());
593         final DetailAST detailAst =
594                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
595         final int tabWidth = 8;
596 
597         final int lineNumber = 6;
598         final int columnNumber = 25;
599         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst,
600                 lineNumber, columnNumber, testFileText, tabWidth);
601         final List<String> actual = queryGenerator.generate();
602         final List<String> expected = Collections.singletonList(
603             "/COMPILATION_UNIT/CLASS_DEF"
604                     + "[./IDENT[@text='InputXpathQueryGeneratorTextBlock']]/OBJBLOCK/"
605                     + "VARIABLE_DEF[./IDENT[@text='testOne']]/ASSIGN/EXPR/"
606                     + "TEXT_BLOCK_LITERAL_BEGIN/TEXT_BLOCK_CONTENT[@text='\\n        "
607                     + "&amp;1line\\n        &gt;2line\\n        &lt;3line\\n        ']"
608             );
609         assertWithMessage("Generated queries do not match expected ones")
610                 .that(expected)
611                 .isEqualTo(actual);
612     }
613 
614     @Test
615     public void testTextBlocksWithNewLine() throws Exception {
616         final File testFile = new File(getNonCompilablePath(
617                 "InputXpathQueryGeneratorTextBlockNewLine.java"));
618         final FileText testFileText = new FileText(testFile,
619                 StandardCharsets.UTF_8.name());
620         final DetailAST detailAst =
621                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
622         final int tabWidth = 8;
623 
624         final int lineNumber = 6;
625         final int columnNumber = 25;
626         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst,
627                 lineNumber, columnNumber, testFileText, tabWidth);
628         final List<String> actual = queryGenerator.generate();
629         final List<String> expected = Collections.singletonList(
630                 "/COMPILATION_UNIT/CLASS_DEF"
631                         + "[./IDENT[@text='InputXpathQueryGeneratorTextBlockNewLine']]/OBJBLOCK/"
632                         + "VARIABLE_DEF[./IDENT[@text='testOne']]/ASSIGN/EXPR/"
633                         + "TEXT_BLOCK_LITERAL_BEGIN/TEXT_BLOCK_CONTENT[@text='\\n        "
634                         + "&amp;1line\\n\\n        &gt;2line\\n        &lt;3line\\n        ']"
635         );
636         assertWithMessage("Generated queries do not match expected ones")
637                 .that(expected)
638                 .isEqualTo(actual);
639     }
640 
641     @Test
642     public void testTextBlocksWithNewCrlf() throws Exception {
643         final File testFile = new File(getNonCompilablePath(
644                 "InputXpathQueryGeneratorTextBlockCrlf.java"));
645         final FileText testFileText = new FileText(testFile,
646                 StandardCharsets.UTF_8.name());
647         final DetailAST detailAst =
648                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
649         final int tabWidth = 8;
650 
651         final int lineNumber = 6;
652         final int columnNumber = 25;
653         final XpathQueryGenerator queryGenerator = new XpathQueryGenerator(detailAst,
654                 lineNumber, columnNumber, testFileText, tabWidth);
655         final List<String> actual = queryGenerator.generate();
656         final List<String> expected = Collections.singletonList(
657                 "/COMPILATION_UNIT/CLASS_DEF"
658                         + "[./IDENT[@text='InputXpathQueryGeneratorTextBlockCrlf']]/OBJBLOCK/"
659                         + "VARIABLE_DEF[./IDENT[@text='testOne']]/ASSIGN/EXPR/"
660                         + "TEXT_BLOCK_LITERAL_BEGIN/TEXT_BLOCK_CONTENT[@text='\\r\\n        "
661                         + "&amp;1line\\r\\n\\r\\n        &gt;2line\\r\\n        &lt;3line\\r\\n"
662                         + "        ']"
663         );
664         assertWithMessage("Generated queries do not match expected ones")
665                 .that(expected)
666                 .isEqualTo(actual);
667     }
668 
669     @Test
670     public void testXpath() throws Exception {
671         final File testFile =
672                 new File(getPath("InputXpathQueryGenerator2.java"));
673         final FileText testFileText = new FileText(testFile,
674                 StandardCharsets.UTF_8.name());
675         final DetailAST detailAst =
676                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
677         final int tabWidth = 8;
678 
679         final int lineNumberOne = 7;
680         final int columnNumberOne = 12;
681         final XpathQueryGenerator queryGeneratorOne = new XpathQueryGenerator(detailAst,
682                 lineNumberOne, columnNumberOne, testFileText, tabWidth);
683         final List<String> actualTestOne = queryGeneratorOne.generate();
684         final List<String> expectedTestOne = List.of(
685                 "/COMPILATION_UNIT/CLASS_DEF"
686                         + "[./IDENT[@text='InputXpathQueryGenerator2']]"
687                         + "/OBJBLOCK/ENUM_DEF[./IDENT[@text='Foo3']]/OBJBLOCK/COMMA[2]"
688         );
689         assertWithMessage("Generated queries do not match expected ones")
690             .that(actualTestOne)
691             .isEqualTo(expectedTestOne);
692     }
693 
694     @Test
695     public void testXpath2() throws Exception {
696         final File testFile =
697                 new File(getPath("InputXpathQueryGenerator3.java"));
698         final FileText testFileText = new FileText(testFile,
699                 StandardCharsets.UTF_8.name());
700         final DetailAST detailAst =
701                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
702         final int tabWidth = 8;
703 
704         final int lineNumber3 = 13;
705         final int columnNumber3 = 21;
706         final XpathQueryGenerator queryGenerator3 = new XpathQueryGenerator(detailAst,
707                 lineNumber3, columnNumber3, testFileText, tabWidth);
708         final List<String> actualTest3 = queryGenerator3.generate();
709         final List<String> expectedTest3 = List.of(
710                 "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator3']]"
711                         + "/OBJBLOCK/SEMI[1]"
712         );
713         assertWithMessage("Generated queries do not match expected ones")
714                 .that(actualTest3)
715                 .isEqualTo(expectedTest3);
716     }
717 
718     @Test
719     public void testXpath3() throws Exception {
720         final File testFile =
721                 new File(getPath("InputXpathQueryGenerator4.java"));
722         final FileText testFileText = new FileText(testFile,
723                 StandardCharsets.UTF_8.name());
724         final DetailAST detailAst =
725                 JavaParser.parseFile(testFile, JavaParser.Options.WITHOUT_COMMENTS);
726         final int tabWidth = 8;
727 
728         final int lineNumber2 = 10;
729         final int columnNumber2 = 17;
730         final XpathQueryGenerator queryGenerator2 = new XpathQueryGenerator(detailAst,
731                 lineNumber2, columnNumber2, testFileText, tabWidth);
732         final List<String> actualTest = queryGenerator2.generate();
733         final List<String> expectedXpathQueries = Arrays.asList(
734             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator4']]"
735                 + "/OBJBLOCK/METHOD_DEF["
736                 + "./IDENT[@text='methodFallThruCustomWords']]/SLIST/LITERAL_WHILE/SLIST"
737                 + "/LITERAL_SWITCH/CASE_GROUP[./SLIST/EXPR/POST_INC/IDENT[@text='i']]",
738             "/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='InputXpathQueryGenerator4']]"
739                 + "/OBJBLOCK/METHOD_DEF["
740                 + "./IDENT[@text='methodFallThruCustomWords']]/SLIST/LITERAL_WHILE/SLIST"
741                 + "/LITERAL_SWITCH/CASE_GROUP/LITERAL_DEFAULT"
742         );
743         assertWithMessage("Generated queries do not match expected ones")
744             .that(actualTest)
745             .isEqualTo(expectedXpathQueries);
746     }
747 }