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.ASTArguments; 7 import net.sourceforge.pmd.ast.ASTName; 8 import net.sourceforge.pmd.ast.ASTPrimaryExpression; 9 import net.sourceforge.pmd.ast.ASTPrimaryPrefix; 10 11 import java.util.ArrayList; 12 import java.util.List; 13 14 public class JUnitAssertionsShouldIncludeMessage 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 JUnitAssertionsShouldIncludeMessage() { 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 = (ASTPrimaryExpression) node.jjtGetParent().jjtGetParent(); 47 if (primary.jjtGetChild(0) instanceof ASTPrimaryPrefix && primary.jjtGetChild(0).jjtGetNumChildren() > 0 && primary.jjtGetChild(0).jjtGetChild(0) instanceof ASTName) { 48 ASTName name = (ASTName) primary.jjtGetChild(0).jjtGetChild(0); 49 if (name.hasImageEqualTo(targetMethodName)) { 50 addViolation(ctx, name); 51 } 52 } 53 } 54 } 55 }