View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2025 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.api;
21  
22  import static com.google.common.truth.Truth.assertWithMessage;
23  import static com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck.MSG_ORDERING;
24  
25  import java.io.File;
26  import java.nio.charset.StandardCharsets;
27  
28  import org.junit.jupiter.api.Test;
29  
30  import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
31  import com.puppycrawl.tools.checkstyle.DetailAstImpl;
32  import com.puppycrawl.tools.checkstyle.JavaParser;
33  import com.puppycrawl.tools.checkstyle.checks.coding.UnusedLocalVariableCheck;
34  import com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck;
35  
36  public class FullIdentTest extends AbstractModuleTestSupport {
37  
38      @Override
39      protected String getPackageLocation() {
40          return "com/puppycrawl/tools/checkstyle/api/fullident/";
41      }
42  
43      @Test
44      public void testToString() {
45          final DetailAstImpl ast = new DetailAstImpl();
46          ast.setType(TokenTypes.LITERAL_NEW);
47          ast.setColumnNo(14);
48          ast.setLineNo(15);
49          ast.setText("MyTest");
50  
51          final DetailAstImpl parent = new DetailAstImpl();
52          parent.setType(TokenTypes.OBJBLOCK);
53          parent.setColumnNo(4);
54          parent.setLineNo(4);
55          parent.setText("MyParent");
56          parent.setFirstChild(ast);
57  
58          final FullIdent indent = FullIdent.createFullIdent(ast);
59          assertWithMessage("Invalid full indent")
60                  .that(indent.toString())
61                  .isEqualTo("MyTest[15x14]");
62          assertWithMessage("Invalid text")
63                  .that(indent.getText())
64                  .isEqualTo("MyTest");
65          assertWithMessage("Invalid line")
66                  .that(indent.getLineNo())
67                  .isEqualTo(15);
68          assertWithMessage("Invalid column")
69                  .that(indent.getColumnNo())
70                  .isEqualTo(14);
71      }
72  
73      @Test
74      public void testCreateFullIdentBelow() {
75          final DetailAST ast = new DetailAstImpl();
76  
77          final FullIdent indent = FullIdent.createFullIdentBelow(ast);
78          assertWithMessage("Invalid full indent")
79                  .that(indent.getText())
80                  .isEqualTo("");
81      }
82  
83      @Test
84      public void testGetDetailAst() throws Exception {
85          final FileText testFileText = new FileText(
86                  new File(getPath("InputFullIdentTestArrayType.java")).getAbsoluteFile(),
87                  System.getProperty("file.encoding", StandardCharsets.UTF_8.name()));
88          final DetailAST packageDefinitionNode =
89                  JavaParser.parse(new FileContents(testFileText)).getFirstChild();
90          final DetailAST packageName = packageDefinitionNode.getFirstChild().getNextSibling();
91          final FullIdent ident = FullIdent.createFullIdent(packageName);
92          assertWithMessage("Invalid full indent")
93                  .that(ident.getDetailAst().toString())
94                  .isEqualTo("com[1x8]");
95      }
96  
97      @Test
98      public void testNonValidCoordinatesWithNegative() {
99          final FullIdent fullIdent = prepareFullIdentWithCoordinates(14, 15);
100         assertWithMessage("Invalid full indent")
101                 .that(fullIdent.toString())
102                 .isEqualTo("MyTest.MyTestik[15x14]");
103     }
104 
105     @Test
106     public void testNonValidCoordinatesWithZero() {
107         final FullIdent fullIdent = prepareFullIdentWithCoordinates(0, 0);
108         assertWithMessage("Invalid full indent")
109                 .that(fullIdent.toString())
110                 .isEqualTo("MyTest.MyTestik[15x14]");
111     }
112 
113     @Test
114     public void testWithArrayCreateFullIdentWithArrayDeclare() throws Exception {
115         final FileText testFileText = new FileText(
116                 new File(getPath("InputFullIdentTestArrayType.java")).getAbsoluteFile(),
117                 System.getProperty("file.encoding", StandardCharsets.UTF_8.name()));
118         final DetailAST packageDefinitionNode =
119                 JavaParser.parse(new FileContents(testFileText)).getFirstChild();
120         final DetailAST arrayDeclarator = packageDefinitionNode.getNextSibling()
121                 .findFirstToken(TokenTypes.OBJBLOCK)
122                 .findFirstToken(TokenTypes.VARIABLE_DEF)
123                 .findFirstToken(TokenTypes.TYPE)
124                 .getFirstChild();
125         final FullIdent ident = FullIdent.createFullIdent(arrayDeclarator);
126         assertWithMessage("Invalid full indent")
127                 .that(ident.toString())
128                 .isEqualTo("int[][][5x12]");
129     }
130 
131     @Test
132     public void testFullIdentAnnotation() throws Exception {
133         final FileText testFileText = new FileText(
134                 new File(getPath("InputFullIdentAnnotation.java")).getAbsoluteFile(),
135                 System.getProperty("file.encoding", StandardCharsets.UTF_8.name()));
136         final DetailAST packageDefinitionNode =
137                 JavaParser.parse(new FileContents(testFileText)).getFirstChild();
138         final DetailAST methodDef = packageDefinitionNode
139                 .getNextSibling()
140                 .getNextSibling()
141                 .getNextSibling()
142                 .getLastChild()
143                 .findFirstToken(TokenTypes.METHOD_DEF);
144 
145         final DetailAST parameter = methodDef
146                 .findFirstToken(TokenTypes.PARAMETERS)
147                 .getFirstChild()
148                 .getFirstChild()
149                 .getNextSibling()
150                 .getFirstChild();
151 
152         final FullIdent ident = FullIdent.createFullIdent(parameter);
153         assertWithMessage("Invalid full indent")
154                 .that(ident.toString())
155                 .isEqualTo("char[][7x29]");
156     }
157 
158     @Test
159     public void testFullIdentArrayInit() throws Exception {
160         final FileText testFileText = new FileText(
161                 new File(getPath("InputFullIdentArrayInit.java")).getAbsoluteFile(),
162                 System.getProperty("file.encoding", StandardCharsets.UTF_8.name()));
163         final DetailAST packageDefinitionNode =
164                 JavaParser.parse(new FileContents(testFileText)).getFirstChild();
165         final DetailAST variableDef = packageDefinitionNode
166                 .getNextSibling()
167                 .getLastChild()
168                 .findFirstToken(TokenTypes.VARIABLE_DEF);
169 
170         final DetailAST literalInt = variableDef
171                 .findFirstToken(TokenTypes.ASSIGN)
172                 .getFirstChild()
173                 .getFirstChild()
174                 .getFirstChild();
175 
176         final FullIdent ident = FullIdent.createFullIdent(literalInt);
177         assertWithMessage("Invalid full indent")
178                 .that(ident.toString())
179                 .isEqualTo("int[4x32]");
180     }
181 
182     private static FullIdent prepareFullIdentWithCoordinates(int columnNo, int lineNo) {
183         final DetailAstImpl parent = new DetailAstImpl();
184         parent.setType(TokenTypes.TYPE);
185         parent.setColumnNo(1);
186         parent.setLineNo(1);
187         parent.setText("Parent");
188 
189         final DetailAstImpl ast = new DetailAstImpl();
190         ast.setType(TokenTypes.DOT);
191         ast.setColumnNo(1);
192         ast.setLineNo(2);
193         ast.setText("Root");
194 
195         final DetailAstImpl ast2 = new DetailAstImpl();
196         ast2.setType(TokenTypes.LE);
197         ast2.setColumnNo(columnNo);
198         ast2.setLineNo(lineNo);
199         ast2.setText("MyTestik");
200 
201         final DetailAstImpl ast1 = new DetailAstImpl();
202         ast1.setType(TokenTypes.LITERAL_NEW);
203         ast1.setColumnNo(14);
204         ast1.setLineNo(15);
205         ast1.setText("MyTest");
206 
207         parent.addChild(ast);
208         ast.addChild(ast1);
209         ast.addChild(ast2);
210 
211         return FullIdent.createFullIdent(ast);
212     }
213 
214     @Test
215     public void testReturnNoAnnotation() throws Exception {
216         final FileText testFileText = new FileText(
217                 new File(getPath("InputFullIdentReturnNoAnnotation.java")).getAbsoluteFile(),
218                 System.getProperty("file.encoding", StandardCharsets.UTF_8.name()));
219         final DetailAST packageDefinitionNode =
220                 JavaParser.parse(new FileContents(testFileText)).getFirstChild();
221         final DetailAST annotationNode = packageDefinitionNode.getFirstChild();
222         final FullIdent ident = FullIdent.createFullIdent(annotationNode);
223         assertWithMessage("Full ident text should be empty.")
224                 .that(ident.getText())
225                 .isEmpty();
226     }
227 
228     @Test
229     public void testFullyQualifiedStringArray() throws Exception {
230         final FileText testFileText = new FileText(
231                 new File(getPath("InputFullIdentFullyQualifiedStringArray.java")).getAbsoluteFile(),
232                 System.getProperty("file.encoding", StandardCharsets.UTF_8.name()));
233         final DetailAST packageDefinitionNode =
234                 JavaParser.parse(new FileContents(testFileText)).getFirstChild();
235         final DetailAST objectBlock = packageDefinitionNode.getNextSibling().getLastChild();
236         final DetailAST mainMethodNode = objectBlock.findFirstToken(TokenTypes.METHOD_DEF);
237         final DetailAST parameter = mainMethodNode
238                 .findFirstToken(TokenTypes.PARAMETERS).getFirstChild();
239         final DetailAST parameterType = parameter.findFirstToken(TokenTypes.TYPE);
240         final FullIdent ident = FullIdent.createFullIdent(parameterType.getFirstChild());
241 
242         assertWithMessage("Full ident should match expected.")
243                 .that(ident.getText())
244                 .isEqualTo(String[].class.getCanonicalName());
245     }
246 
247     @Test
248     public void testCreateFullIdentBelow2() throws Exception {
249         final String[] expected = {
250             "9:1: " + getCheckMessage(ImportOrderCheck.class,
251                     MSG_ORDERING, "java.util.HashMap"),
252         };
253 
254         verifyWithInlineConfigParser(getPath("InputFullIdent.java"),
255                 expected);
256     }
257 
258     @Test
259     public void testLiteralNewCondition() throws Exception {
260         final String[] expected = {
261             "11:9: " + getCheckMessage(UnusedLocalVariableCheck.class,
262                     UnusedLocalVariableCheck.MSG_UNUSED_LOCAL_VARIABLE, "j"),
263         };
264 
265         verifyWithInlineConfigParser(getPath("InputFullIdentLiteralNewCondition.java"),
266                 expected);
267     }
268 }