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 java.util.Iterator;
7 import java.util.List;
8
9 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
10 import net.sourceforge.pmd.ast.ASTMethodDeclaration;
11
12 public class TestClassWithoutTestCases extends AbstractJUnitRule {
13
14 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
15 if (node.isAbstract() || node.isInterface() || node.isNested()) {
16 return data;
17 }
18
19 List<ASTMethodDeclaration> m = node.findChildrenOfType(ASTMethodDeclaration.class);
20 boolean testsFound = false;
21
22 if (m != null) {
23 for (Iterator<ASTMethodDeclaration> it = m.iterator(); it.hasNext() && !testsFound;) {
24 ASTMethodDeclaration md = it.next();
25 if (!isInInnerClassOrInterface(md)
26 && isJUnitMethod(md, data))
27 testsFound = true;
28 }
29 }
30
31 if (!testsFound) {
32 addViolation(data, node);
33 }
34
35 return data;
36 }
37
38 private boolean isInInnerClassOrInterface(ASTMethodDeclaration md) {
39 ASTClassOrInterfaceDeclaration p = md.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
40 return p != null && p.isNested();
41 }
42 }