JUnitAssertionsShouldIncludeMessageRule.java
01 /**
02  * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03  */
04 package net.sourceforge.pmd.lang.java.rule.junit;
05 
06 import net.sourceforge.pmd.lang.java.ast.ASTArguments;
07 import net.sourceforge.pmd.lang.java.ast.ASTName;
08 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
09 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
10 
11 import java.util.ArrayList;
12 import java.util.List;
13 
14 public class JUnitAssertionsShouldIncludeMessageRule extends AbstractJUnitRule {
15 
16     private static class AssertionCall {
17         public int args;
18         public String name;
19 
20         public AssertionCall(int args, String name) {
21             this.args = args;
22             this.name = name;
23         }
24     }
25 
26     private List<AssertionCall> checks = new ArrayList<AssertionCall>();
27 
28     public JUnitAssertionsShouldIncludeMessageRule() {
29         checks.add(new AssertionCall(2"assertEquals"));
30         checks.add(new AssertionCall(1"assertTrue"));
31         checks.add(new AssertionCall(1"assertNull"));
32         checks.add(new AssertionCall(2"assertSame"));
33         checks.add(new AssertionCall(1"assertNotNull"));
34         checks.add(new AssertionCall(1"assertFalse"));
35     }
36 
37     public Object visit(ASTArguments node, Object data) {
38         for (AssertionCall call : checks) {
39             check(data, node, call.args, call.name);
40         }
41         return super.visit(node, data);
42     }
43 
44     private void check(Object ctx, ASTArguments node, int args, String targetMethodName) {
45         if (node.getArgumentCount() == args && node.jjtGetParent().jjtGetParent() instanceof ASTPrimaryExpression) {
46             ASTPrimaryExpression primary = (ASTPrimaryExpressionnode.jjtGetParent().jjtGetParent();
47             if (primary.jjtGetChild(0instanceof ASTPrimaryPrefix && primary.jjtGetChild(0).jjtGetNumChildren() && primary.jjtGetChild(0).jjtGetChild(0instanceof ASTName) {
48                 ASTName name = (ASTNameprimary.jjtGetChild(0).jjtGetChild(0);
49                 if (name.hasImageEqualTo(targetMethodName)) {
50                     addViolation(ctx, name);
51                 }
52             }
53         }
54     }
55 }