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  }