1
2
3
4
5 package com.qulice.pmd.rules;
6
7 import java.util.Arrays;
8 import net.sourceforge.pmd.lang.java.ast.ASTAnnotation;
9 import net.sourceforge.pmd.lang.java.ast.ASTExpression;
10 import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration;
11 import net.sourceforge.pmd.lang.java.ast.ASTMethodCall;
12 import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
13 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRulechainRule;
14
15
16
17
18
19 public final class ProhibitPlainJunitAssertionsRule
20 extends AbstractJavaRulechainRule {
21
22
23
24
25 private static final String[] PROHIBITED = {
26 "org.junit.Assert.assert",
27 "junit.framework.Assert.assert",
28 };
29
30 public ProhibitPlainJunitAssertionsRule() {
31 super(
32 ASTMethodDeclaration.class,
33 ASTImportDeclaration.class
34 );
35 }
36
37 @Override
38 public Object visit(final ASTImportDeclaration imp, final Object data) {
39 if (Arrays.stream(ProhibitPlainJunitAssertionsRule.PROHIBITED)
40 .anyMatch(imp.getImportedName()::contains)
41 ) {
42 asCtx(data).addViolation(imp);
43 }
44 return data;
45 }
46
47 @Override
48 public Object visit(final ASTMethodDeclaration method, final Object data) {
49 if (ProhibitPlainJunitAssertionsRule.isJUnitTest(method)) {
50 method.descendants(ASTMethodCall.class)
51 .filter(ProhibitPlainJunitAssertionsRule::isPlainJunitAssert)
52 .toStream()
53 .findAny()
54 .ifPresent(call -> asCtx(data).addViolation(method));
55 }
56 return data;
57 }
58
59 private static boolean isJUnitTest(final ASTMethodDeclaration method) {
60 return method.getDeclaredAnnotations()
61 .toStream()
62 .map(ASTAnnotation::getSimpleName).anyMatch(
63 name -> "Test".equals(name)
64 || "org.junit.Test".equals(name)
65 || "org.junit.jupiter.api.Test".equals(name)
66 );
67 }
68
69 private static boolean isPlainJunitAssert(final ASTMethodCall call) {
70 final ASTExpression qualifier = call.getQualifier();
71 return call.getMethodName().startsWith("assert") && qualifier != null
72 && "Assert".contentEquals(qualifier.getText());
73 }
74 }