View Javadoc

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.ast.ASTClassOrInterfaceDeclaration;
7   import net.sourceforge.pmd.ast.ASTMethodDeclaration;
8   import net.sourceforge.pmd.ast.ASTName;
9   import net.sourceforge.pmd.ast.ASTPrimaryExpression;
10  import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
11  import net.sourceforge.pmd.ast.ASTStatementExpression;
12  import net.sourceforge.pmd.ast.Node;
13  
14  public class JUnitTestsShouldContainAsserts extends AbstractJUnitRule {
15  
16      public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
17          if (node.isInterface()) {
18              return data;
19          }
20          return super.visit(node, data);
21      }
22  
23      public Object visit(ASTMethodDeclaration method, Object data) {
24          if (isJUnitMethod(method, data))  {
25              if (!containsAssert(method.getBlock(), false)) {
26                  addViolation(data, method);
27              }
28          }
29  		return data;
30  	}
31  
32      private boolean containsAssert(Node n, boolean assertFound) {
33          if (!assertFound) {
34              if (n instanceof ASTStatementExpression) {
35                  if (isAssertOrFailStatement((ASTStatementExpression)n)) {
36                      return true;
37                  }
38              }
39              if (!assertFound) {
40                  for (int i=0;i<n.jjtGetNumChildren() && ! assertFound;i++) {
41                      Node c = n.jjtGetChild(i);
42                      if (containsAssert(c, assertFound)) 
43                          return true;
44                  }
45              }
46          }
47          return false;
48      }
49  
50      /**
51       * Tells if the expression is an assert statement or not.
52       */
53      private boolean isAssertOrFailStatement(ASTStatementExpression expression) {
54          if (expression!=null 
55                  && expression.jjtGetNumChildren()>0
56                  && expression.jjtGetChild(0) instanceof ASTPrimaryExpression
57                  ) {
58              ASTPrimaryExpression pe = (ASTPrimaryExpression) expression.jjtGetChild(0);
59              if (pe.jjtGetNumChildren()> 0 && pe.jjtGetChild(0) instanceof ASTPrimaryPrefix) {
60                  ASTPrimaryPrefix pp = (ASTPrimaryPrefix) pe.jjtGetChild(0);
61                  if (pp.jjtGetNumChildren()>0 && pp.jjtGetChild(0) instanceof ASTName) {
62                      String img = ((ASTName) pp.jjtGetChild(0)).getImage();                                              
63                      if (img != null && (img.startsWith("assert") || img.startsWith("fail") || img.startsWith("Assert.assert") || img.startsWith("Assert.fail") )) {                  
64                          return true;
65                      }
66                  }
67              }
68          }
69          return false;
70      }
71  }