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.AbstractRule;
7   import net.sourceforge.pmd.ast.ASTArguments;
8   import net.sourceforge.pmd.ast.ASTName;
9   import net.sourceforge.pmd.ast.ASTPrimaryExpression;
10  import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
11  
12  import java.util.ArrayList;
13  import java.util.Iterator;
14  import java.util.List;
15  
16  public class JUnitAssertionsShouldIncludeMessage extends AbstractRule {
17  
18      private static class AssertionCall {
19          public int args;
20          public String name;
21  
22          public AssertionCall(int args, String name) {
23              this.args = args;
24              this.name = name;
25          }
26      }
27  
28      private List checks = new ArrayList();
29  
30      public JUnitAssertionsShouldIncludeMessage() {
31          checks.add(new AssertionCall(2, "assertEquals"));
32          checks.add(new AssertionCall(1, "assertTrue"));
33          checks.add(new AssertionCall(1, "assertNull"));
34          checks.add(new AssertionCall(2, "assertSame"));
35          checks.add(new AssertionCall(1, "assertNotNull"));
36          checks.add(new AssertionCall(1, "assertFalse"));
37      }
38  
39      public Object visit(ASTArguments node, Object data) {
40          for (Iterator i = checks.iterator(); i.hasNext();) {
41              AssertionCall call = (AssertionCall) i.next();
42              check(data, node, call.args, call.name);
43          }
44          return super.visit(node, data);
45      }
46  
47      private void check(Object ctx, ASTArguments node, int args, String targetMethodName) {
48          if (node.getArgumentCount() == args && node.jjtGetParent().jjtGetParent() instanceof ASTPrimaryExpression) {
49              ASTPrimaryExpression primary = (ASTPrimaryExpression) node.jjtGetParent().jjtGetParent();
50              if (primary.jjtGetChild(0) instanceof ASTPrimaryPrefix && primary.jjtGetChild(0).jjtGetNumChildren() > 0 && primary.jjtGetChild(0).jjtGetChild(0) instanceof ASTName) {
51                  ASTName name = (ASTName) primary.jjtGetChild(0).jjtGetChild(0);
52                  if (name.getImage().equals(targetMethodName)) {
53                      addViolation(ctx, name);
54                  }
55              }
56          }
57      }
58  }