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.checks.javadoc;
21  
22  import static com.google.common.truth.Truth.assertWithMessage;
23  import static com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck.MSG_JAVADOC_MISSING;
24  
25  import org.junit.jupiter.api.Test;
26  
27  import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport;
28  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
29  import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
30  
31  public class MissingJavadocTypeCheckTest extends AbstractModuleTestSupport {
32  
33      @Override
34      protected String getPackageLocation() {
35          return "com/puppycrawl/tools/checkstyle/checks/javadoc/missingjavadoctype";
36      }
37  
38      @Test
39      public void testGetRequiredTokens() {
40          final MissingJavadocTypeCheck missingJavadocTypeCheck = new MissingJavadocTypeCheck();
41          assertWithMessage(
42                  "MissingJavadocTypeCheck#getRequiredTokens should return empty array by default")
43                          .that(missingJavadocTypeCheck.getRequiredTokens())
44                          .isEmpty();
45      }
46  
47      @Test
48      public void testGetAcceptableTokens() {
49          final MissingJavadocTypeCheck missingJavadocTypeCheck = new MissingJavadocTypeCheck();
50  
51          final int[] actual = missingJavadocTypeCheck.getAcceptableTokens();
52          final int[] expected = {
53              TokenTypes.INTERFACE_DEF,
54              TokenTypes.CLASS_DEF,
55              TokenTypes.ENUM_DEF,
56              TokenTypes.ANNOTATION_DEF,
57              TokenTypes.RECORD_DEF,
58          };
59  
60          assertWithMessage("Default acceptable tokens are invalid")
61                  .that(actual)
62                  .isEqualTo(expected);
63      }
64  
65      @Test
66      public void testTagsOne() throws Exception {
67          final String[] expected = {
68              "14:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
69              "44:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
70              "69:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
71          };
72          verifyWithInlineConfigParser(
73                  getPath("InputMissingJavadocTypeTagsOne.java"), expected);
74      }
75  
76      @Test
77      public void testTagsTwo() throws Exception {
78          final String[] expected = {
79              "20:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
80          };
81          verifyWithInlineConfigParser(
82                  getPath("InputMissingJavadocTypeTagsTwo.java"), expected);
83      }
84  
85      @Test
86      public void testTagsThree() throws Exception {
87          final String[] expected = {
88              "20:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
89          };
90          verifyWithInlineConfigParser(
91                  getPath("InputMissingJavadocTypeTagsThree.java"), expected);
92      }
93  
94      @Test
95      public void testTagsFour() throws Exception {
96          final String[] expected = {
97              "20:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
98          };
99          verifyWithInlineConfigParser(
100                 getPath("InputMissingJavadocTypeTagsFour.java"), expected);
101     }
102 
103     @Test
104     public void testInner() throws Exception {
105         final String[] expected = {
106             "19:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
107             "26:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
108             "32:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
109         };
110         verifyWithInlineConfigParser(
111                 getPath("InputMissingJavadocTypeInner.java"), expected);
112     }
113 
114     @Test
115     public void testMissingJavadocTypePublicOnly1One() throws Exception {
116         final String[] expected = {
117             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
118             "15:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
119             "20:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
120             "40:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
121         };
122         verifyWithInlineConfigParser(
123                 getPath("InputMissingJavadocTypePublicOnly1One.java"), expected);
124     }
125 
126     @Test
127     public void testMissingJavadocTypePublicOnly1Two() throws Exception {
128         final String[] expected = {
129             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
130         };
131         verifyWithInlineConfigParser(
132                 getPath("InputMissingJavadocTypePublicOnly1Two.java"), expected);
133     }
134 
135     @Test
136     public void testMissingJavadocTypePublicOnly2One() throws Exception {
137         final String[] expected = {
138             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
139         };
140         verifyWithInlineConfigParser(
141                 getPath("InputMissingJavadocTypePublicOnly2One.java"), expected);
142     }
143 
144     @Test
145     public void testMissingJavadocTypePublicOnly2Two() throws Exception {
146         final String[] expected = {
147             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
148         };
149         verifyWithInlineConfigParser(
150                 getPath("InputMissingJavadocTypePublicOnly2Two.java"), expected);
151     }
152 
153     @Test
154     public void testPublic() throws Exception {
155         final String[] expected = {
156             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
157             "44:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
158         };
159         verifyWithInlineConfigParser(
160                 getPath("InputMissingJavadocTypeScopeInnerInterfaces1.java"),
161                expected);
162     }
163 
164     @Test
165     public void testProtest() throws Exception {
166         final String[] expected = {
167             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
168             "35:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
169             "44:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
170             "71:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
171         };
172         verifyWithInlineConfigParser(
173                 getPath("InputMissingJavadocTypeScopeInnerInterfaces2.java"),
174                expected);
175     }
176 
177     @Test
178     public void testPkg() throws Exception {
179         final String[] expected = {
180             "22:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
181             "24:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
182             "26:13: " + getCheckMessage(MSG_JAVADOC_MISSING),
183         };
184         verifyWithInlineConfigParser(
185                 getPath("InputMissingJavadocTypeScopeInnerClasses1.java"), expected);
186     }
187 
188     @Test
189     public void testEclipse() throws Exception {
190         final String[] expected = {
191             "22:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
192         };
193         verifyWithInlineConfigParser(
194                 getPath("InputMissingJavadocTypeScopeInnerClasses2.java"), expected);
195     }
196 
197     @Test
198     public void testScopesOne() throws Exception {
199         final String[] expected = {
200             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
201             "25:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
202             "37:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
203             "49:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
204         };
205         verifyWithInlineConfigParser(
206                 getPath("InputMissingJavadocTypeNoJavadoc1One.java"),
207                expected);
208     }
209 
210     @Test
211     public void testScopesTwo() throws Exception {
212         final String[] expected = {
213             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
214             "15:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
215             "26:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
216             "38:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
217             "50:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
218             "62:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
219             "74:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
220         };
221         verifyWithInlineConfigParser(
222                 getPath("InputMissingJavadocTypeNoJavadoc1Two.java"),
223                expected);
224     }
225 
226     @Test
227     public void testLimitViolationsBySpecifyingTokens() throws Exception {
228         final String[] expected = {
229             "15:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
230         };
231         verifyWithInlineConfigParser(
232                 getPath("InputMissingJavadocTypeNoJavadocOnInterface.java"),
233                expected);
234     }
235 
236     @Test
237     public void testMissingJavadocTypeNoJavadoc2One() throws Exception {
238         final String[] expected = {
239             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
240             "25:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
241         };
242         verifyWithInlineConfigParser(
243                 getPath("InputMissingJavadocTypeNoJavadoc2One.java"),
244                expected);
245     }
246 
247     @Test
248     public void testMissingJavadocTypeNoJavadoc2Two() throws Exception {
249         final String[] expected = {
250             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
251         };
252         verifyWithInlineConfigParser(
253                 getPath("InputMissingJavadocTypeNoJavadoc2Two.java"),
254                expected);
255     }
256 
257     @Test
258     public void testMissingJavadocTypeNoJavadoc3One() throws Exception {
259         final String[] expected = {
260             "37:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
261             "49:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
262         };
263         verifyWithInlineConfigParser(
264                 getPath("InputMissingJavadocTypeNoJavadoc3One.java"),
265                expected);
266     }
267 
268     @Test
269     public void testMissingJavadocTypeNoJavadoc3Two() throws Exception {
270         final String[] expected = {
271             "15:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
272             "26:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
273             "38:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
274             "50:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
275             "62:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
276             "74:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
277         };
278         verifyWithInlineConfigParser(
279                 getPath("InputMissingJavadocTypeNoJavadoc3Two.java"),
280                expected);
281     }
282 
283     @Test
284     public void testDontAllowUnusedParameterTag() throws Exception {
285         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
286         verifyWithInlineConfigParser(
287                 getPath("InputMissingJavadocTypeUnusedParamInJavadocForClass.java"),
288                 expected);
289     }
290 
291     @Test
292     public void testSkipAnnotationsDefault() throws Exception {
293 
294         final String[] expected = {
295             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
296             "17:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
297             "21:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
298         };
299         verifyWithInlineConfigParser(
300                 getPath("InputMissingJavadocTypeSkipAnnotations1.java"),
301             expected);
302     }
303 
304     @Test
305     public void testSkipAnnotationsWithFullyQualifiedName() throws Exception {
306         final String[] expected = {
307             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
308             "17:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
309             "21:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
310         };
311         verifyWithInlineConfigParser(
312                 getPath("InputMissingJavadocTypeSkipAnnotations2.java"),
313                 expected);
314     }
315 
316     @Test
317     public void testSkipAnnotationsAllowed() throws Exception {
318 
319         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
320         verifyWithInlineConfigParser(
321                 getPath("InputMissingJavadocTypeSkipAnnotations3.java"),
322             expected);
323     }
324 
325     @Test
326     public void testSkipAnnotationsNotAllowed() throws Exception {
327 
328         final String[] expected = {
329             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
330             "17:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
331             "21:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
332         };
333         verifyWithInlineConfigParser(
334                 getPath("InputMissingJavadocTypeSkipAnnotations4.java"),
335             expected);
336     }
337 
338     @Test
339     public void testMissingJavadocTypeCheckRecords() throws Exception {
340 
341         final String[] expected = {
342             "14:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
343             "15:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
344             "19:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
345             "23:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
346             "31:9: " + getCheckMessage(MSG_JAVADOC_MISSING),
347             "32:13: " + getCheckMessage(MSG_JAVADOC_MISSING),
348             "41:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
349         };
350         verifyWithInlineConfigParser(
351                 getNonCompilablePath("InputMissingJavadocTypeRecords.java"),
352             expected);
353     }
354 
355     @Test
356     public void testInterfaceMemberScopeIsPublic() throws Exception {
357 
358         final String[] expected = {
359             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
360             "15:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
361             "19:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
362         };
363         verifyWithInlineConfigParser(
364                 getPath("InputMissingJavadocTypeInterfaceMemberScopeIsPublic.java"),
365             expected);
366     }
367 
368     @Test
369     public void testQualifiedAnnotation1() throws Exception {
370         final String[] expected = {
371             "16:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
372             "20:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
373             "23:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
374         };
375         verifyWithInlineConfigParser(
376             getPath("InputMissingJavadocTypeQualifiedAnnotation1.java"), expected);
377     }
378 
379     @Test
380     public void testQualifiedAnnotation2() throws Exception {
381         final String[] expected = {
382             "20:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
383             "23:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
384         };
385         verifyWithInlineConfigParser(
386             getPath("InputMissingJavadocTypeQualifiedAnnotation2.java"), expected);
387     }
388 
389     @Test
390     public void testQualifiedAnnotation3() throws Exception {
391         final String[] expected = {
392             "16:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
393             "22:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
394         };
395         verifyWithInlineConfigParser(
396             getPath("InputMissingJavadocTypeQualifiedAnnotation3.java"), expected);
397     }
398 
399     @Test
400     public void testQualifiedAnnotation4() throws Exception {
401         final String[] expected = {
402             "17:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
403             "21:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
404         };
405         verifyWithInlineConfigParser(
406             getPath("InputMissingJavadocTypeQualifiedAnnotation4.java"), expected);
407     }
408 
409     @Test
410     public void testQualifiedAnnotation5() throws Exception {
411         final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
412         verifyWithInlineConfigParser(
413             getPath("InputMissingJavadocTypeQualifiedAnnotation5.java"), expected);
414     }
415 
416     @Test
417     public void testMultipleQualifiedAnnotation() throws Exception {
418         final String[] expected = {
419             "29:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
420             "38:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
421         };
422         verifyWithInlineConfigParser(
423             getPath("InputMissingJavadocTypeMultipleQualifiedAnnotation.java"), expected);
424     }
425 
426     @Test
427     public void testQualifiedAnnotationWithParameters() throws Exception {
428         final String[] expected = {
429             "33:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
430             "37:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
431             "42:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
432             "50:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
433         };
434         verifyWithInlineConfigParser(
435             getPath("InputMissingJavadocTypeQualifiedAnnotationWithParameters.java"),
436             expected);
437     }
438 
439     @Test
440     public void testMissingJavadocTypeAboveComments() throws Exception {
441         final String[] expected = {
442             "13:1: " + getCheckMessage(MSG_JAVADOC_MISSING),
443             "27:5: " + getCheckMessage(MSG_JAVADOC_MISSING),
444         };
445         verifyWithInlineConfigParser(
446             getPath("InputMissingJavadocTypeAboveComments.java"),
447             expected);
448     }
449 
450 }