1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules.junit;
5
6 import net.sourceforge.pmd.AbstractRule;
7 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
8 import net.sourceforge.pmd.ast.ASTMethodDeclarator;
9
10 import java.util.Iterator;
11 import java.util.List;
12
13 public class TestClassWithoutTestCases extends AbstractRule {
14
15 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
16 if (node.isAbstract() || node.isInterface() || node.isNested()) {
17 return data;
18 }
19
20 String className = node.getImage();
21 if (className.endsWith("Test")) {
22 List m = node.findChildrenOfType(ASTMethodDeclarator.class);
23 boolean testsFound = false;
24 if (m != null) {
25 for (Iterator it = m.iterator(); it.hasNext() && !testsFound;) {
26 ASTMethodDeclarator md = (ASTMethodDeclarator) it.next();
27 if (!isInInnerClassOrInterface(md)
28 && md.getImage().startsWith("test")) {
29 testsFound = true;
30 }
31 }
32 }
33
34 if (!testsFound) {
35 addViolation(data, node);
36 }
37
38 }
39 return data;
40 }
41
42 private boolean isInInnerClassOrInterface(ASTMethodDeclarator md) {
43 ASTClassOrInterfaceDeclaration p = (ASTClassOrInterfaceDeclaration) md.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
44 return p != null && p.isNested();
45 }
46 }