1 4 package net.sourceforge.pmd.rules.junit; 5 6 import net.sourceforge.pmd.AbstractRule; 7 import net.sourceforge.pmd.Rule; 8 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration; 9 import net.sourceforge.pmd.ast.ASTMethodDeclaration; 10 import net.sourceforge.pmd.ast.ASTName; 11 import net.sourceforge.pmd.ast.ASTPrimaryExpression; 12 import net.sourceforge.pmd.ast.ASTPrimaryPrefix; 13 import net.sourceforge.pmd.ast.ASTResultType; 14 import net.sourceforge.pmd.ast.ASTStatementExpression; 15 import net.sourceforge.pmd.ast.ASTTypeParameters; 16 import net.sourceforge.pmd.ast.Node; 17 18 public class JUnitTestsShouldContainAsserts extends AbstractRule implements Rule { 19 20 public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { 21 if (node.isInterface()) { 22 return data; 23 } 24 return super.visit(node, data); 25 } 26 27 public Object visit(ASTMethodDeclaration method, Object data) { 28 if (!method.isPublic() || method.isAbstract() || method.isNative() || method.isStatic()) { 29 return data; } 31 32 Node node = method.jjtGetChild(0); 33 if (node instanceof ASTTypeParameters) { 34 node = method.jjtGetChild(1); 35 } 36 if (((ASTResultType)node).isVoid() && method.getMethodName().startsWith("test")) { 37 if (!containsAssert(method.getBlock(), false)) { 38 addViolation(data, method); 39 } 40 } 41 return data; 42 } 43 44 private boolean containsAssert(Node n, boolean assertFound) { 45 if (!assertFound) { 46 if (n instanceof ASTStatementExpression) { 47 if (isAssertOrFailStatement((ASTStatementExpression)n)) { 48 return true; 49 } 50 } 51 if (!assertFound) { 52 for (int i=0;i<n.jjtGetNumChildren() && ! assertFound;i++) { 53 Node c = n.jjtGetChild(i); 54 if (containsAssert(c, assertFound)) 55 return true; 56 } 57 } 58 } 59 return false; 60 } 61 62 65 private boolean isAssertOrFailStatement(ASTStatementExpression expression) { 66 if (expression!=null 67 && expression.jjtGetNumChildren()>0 68 && expression.jjtGetChild(0) instanceof ASTPrimaryExpression 69 ) { 70 ASTPrimaryExpression pe = (ASTPrimaryExpression) expression.jjtGetChild(0); 71 if (pe.jjtGetNumChildren()> 0 && pe.jjtGetChild(0) instanceof ASTPrimaryPrefix) { 72 ASTPrimaryPrefix pp = (ASTPrimaryPrefix) pe.jjtGetChild(0); 73 if (pp.jjtGetNumChildren()>0 && pp.jjtGetChild(0) instanceof ASTName) { 74 ASTName n = (ASTName) pp.jjtGetChild(0); 75 if (n.getImage()!=null && (n.getImage().startsWith("assert") || n.getImage().startsWith("fail") )) { 76 return true; 77 } 78 } 79 } 80 } 81 return false; 82 } 83 } 84 | Popular Tags |