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