1
2
3
4
5 package com.qulice.pmd.rules;
6
7 import net.sourceforge.pmd.lang.java.ast.ASTBlock;
8 import net.sourceforge.pmd.lang.java.ast.ASTExpression;
9 import net.sourceforge.pmd.lang.java.ast.ASTMethodCall;
10 import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRulechainRule;
12 import net.sourceforge.pmd.lang.java.rule.internal.TestFrameworksUtil;
13 import net.sourceforge.pmd.lang.java.symbols.JTypeDeclSymbol;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public final class UnitTestShouldIncludeAssertRule
32 extends AbstractJavaRulechainRule {
33
34
35
36
37 public UnitTestShouldIncludeAssertRule() {
38 super(ASTMethodDeclaration.class);
39 }
40
41 @Override
42 public Object visit(final ASTMethodDeclaration method, final Object data) {
43 final ASTBlock body = method.getBody();
44 if (body != null
45 && TestFrameworksUtil.isTestMethod(method)
46 && !TestFrameworksUtil.isExpectAnnotated(method)
47 && body.descendants(ASTMethodCall.class)
48 .crossFindBoundaries(true)
49 .none(UnitTestShouldIncludeAssertRule::isAssertion)) {
50 asCtx(data).addViolation(method);
51 }
52 return data;
53 }
54
55 private static boolean isAssertion(final ASTMethodCall call) {
56 return TestFrameworksUtil.isProbableAssertCall(call)
57 || UnitTestShouldIncludeAssertRule.isAffirmCall(call);
58 }
59
60 private static boolean isAffirmCall(final ASTMethodCall call) {
61 final ASTExpression qualifier = call.getQualifier();
62 return "affirm".equals(call.getMethodName())
63 && call.getArguments().isEmpty()
64 && qualifier != null
65 && UnitTestShouldIncludeAssertRule.isAssertion(qualifier);
66 }
67
68 private static boolean isAssertion(final ASTExpression expr) {
69 final JTypeDeclSymbol symbol = expr.getTypeMirror().getSymbol();
70 return symbol != null
71 && "Assertion".equals(symbol.getSimpleName());
72 }
73 }