Skip to content

Commit

Permalink
Try to fix workshop by adding mockito check
Browse files Browse the repository at this point in the history
  • Loading branch information
rickie committed Oct 31, 2023
1 parent 6639f36 commit 99edaf1
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 125 deletions.
4 changes: 0 additions & 4 deletions workshop/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,14 @@
<dependency>
<groupId>com.google.auto</groupId>
<artifactId>auto-common</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service-annotations</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.auto.value</groupId>
<artifactId>auto-value-annotations</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
Expand All @@ -91,7 +88,6 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,45 +1,45 @@
package tech.picnic.errorprone.workshop.bugpatterns;

import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
import static com.google.errorprone.BugPattern.StandardTags.SIMPLIFICATION;
import static com.google.errorprone.matchers.ChildMultiMatcher.MatchType.AT_LEAST_ONE;
import static com.google.errorprone.matchers.Matchers.annotations;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.isType;

import com.google.auto.service.AutoService;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
import com.google.errorprone.bugpatterns.BugChecker;
import com.google.errorprone.bugpatterns.BugChecker.MethodTreeMatcher;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.matchers.Matcher;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;

/** A {@link BugChecker} that flags empty methods that seemingly can simply be deleted. */
@AutoService(BugChecker.class)
@BugPattern(
summary = "Empty method can likely be deleted",
severity = WARNING,
tags = SIMPLIFICATION)
@SuppressWarnings("UnusedVariable" /* This check is yet to be implemented as part of the demo */)
public final class DeleteEmptyMethod extends BugChecker implements MethodTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Matcher<Tree> PERMITTED_ANNOTATION =
annotations(AT_LEAST_ONE, anyOf(isType("java.lang.Override")));

/** Instantiates a new {@link DeleteEmptyMethod} instance. */
public DeleteEmptyMethod() {}

@Override
public Description matchMethod(MethodTree tree, VisitorState state) {
// XXX: Part 1: Ensure that we only delete methods that contain no statements.
// XXX: Part 2: Don't delete methods that are annotated with `@Override`.

return Description.NO_MATCH;
}
}
// XXX: Add at least two more of these.
// SLF4J; fixen van de juiste class reference; en of private static final is. Eventueel de naam nog
// checken dat die LOG is.
//package tech.picnic.errorprone.workshop.bugpatterns;
//
//import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
//import static com.google.errorprone.BugPattern.StandardTags.SIMPLIFICATION;
//import static com.google.errorprone.matchers.ChildMultiMatcher.MatchType.AT_LEAST_ONE;
//import static com.google.errorprone.matchers.Matchers.annotations;
//import static com.google.errorprone.matchers.Matchers.anyOf;
//import static com.google.errorprone.matchers.Matchers.isType;
//
//import com.google.auto.service.AutoService;
//import com.google.errorprone.BugPattern;
//import com.google.errorprone.VisitorState;
//import com.google.errorprone.bugpatterns.BugChecker;
//import com.google.errorprone.bugpatterns.BugChecker.MethodTreeMatcher;
//import com.google.errorprone.matchers.Description;
//import com.google.errorprone.matchers.Matcher;
//import com.sun.source.tree.MethodTree;
//import com.sun.source.tree.Tree;
//
///** A {@link BugChecker} that flags empty methods that seemingly can simply be deleted. */
//@AutoService(BugChecker.class)
//@BugPattern(
// summary = "Empty method can likely be deleted",
// severity = WARNING,
// tags = SIMPLIFICATION)
//@SuppressWarnings("UnusedVariable" /* This check is yet to be implemented as part of the demo */)
//public final class DeleteEmptyMethod extends BugChecker implements MethodTreeMatcher {
// private static final long serialVersionUID = 1L;
// private static final Matcher<Tree> PERMITTED_ANNOTATION =
// annotations(AT_LEAST_ONE, anyOf(isType("java.lang.Override")));
//
// /** Instantiates a new {@link DeleteEmptyMethod} instance. */
// public DeleteEmptyMethod() {}
//
// @Override
// public Description matchMethod(MethodTree tree, VisitorState state) {
// // XXX: Part 1: Ensure that we only delete methods that contain no statements.
// // XXX: Part 2: Don't delete methods that are annotated with `@Override`.
//
// return Description.NO_MATCH;
// }
//}
//// XXX: Add at least two more of these.
//// SLF4J; fixen van de juiste class reference; en of private static final is. Eventueel de naam nog
//// checken dat die LOG is.
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,16 @@
summary = "Don't unnecessarily pass a type to Mockito's `mock(Class)` and `spy(Class)` methods",
severity = SUGGESTION,
tags = SIMPLIFICATION)
public final class MockitoMockClassReference extends BugChecker
public final class MockMockitoClassReference extends BugChecker
implements MethodInvocationTreeMatcher {
private static final long serialVersionUID = 1L;
private static final Matcher<MethodInvocationTree> MOCKITO_MOCK_OR_SPY_WITH_HARDCODED_TYPE =
allOf(
argument(0, allOf(isSameType(Class.class.getName()), not(isVariable()))),
staticMethod().onClass("org.mockito.Mockito").namedAnyOf("mock", "spy"));

/** Instantiates a new {@link MockitoMockClassReference} instance. */
public MockitoMockClassReference() {}
/** Instantiates a new {@link MockMockitoClassReference} instance. */
public MockMockitoClassReference() {}

@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,73 +1,73 @@
package tech.picnic.errorprone.workshop.bugpatterns;

import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
import com.google.errorprone.CompilationTestHelper;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

final class DeleteEmptyMethodTest {
@Disabled("Implement the logic in `DeleteEmptyMethod.java`")
@Test
void identification() {
CompilationTestHelper.newInstance(DeleteEmptyMethod.class, getClass())
.addSourceLines(
"A.java",
"class A {",
" Object m1() {",
" return null;",
" }",
"",
" void m2() {",
" System.out.println(42);",
" }",
"",
" // BUG: Diagnostic contains:",
" static void m3() {}",
"",
" interface F {",
" void fun();",
" }",
"}")
.addSourceLines(
"B.java",
"final class B implements A.F {",
" @Override",
" public void fun() {}",
"",
" /** Javadoc. */",
" // BUG: Diagnostic contains:",
" void m4() {}",
"",
" void m5() {",
" // Single-line comment.",
" }",
"}")
.doTest();
}

@Disabled("Implement the logic in `DeleteEmptyMethod.java`")
@Test
void replacement() {
BugCheckerRefactoringTestHelper.newInstance(DeleteEmptyMethod.class, getClass())
.addInputLines(
"A.java",
"final class A {",
" void instanceMethod() {}",
"",
" static void staticMethod() {}",
"",
" static void staticMethodWithComment() {",
" /* Foo. */",
" }",
"}")
.addOutputLines(
"A.java",
"final class A {",
" static void staticMethodWithComment() {",
" /* Foo. */",
" }",
"}")
.doTest(TestMode.TEXT_MATCH);
}
}
//package tech.picnic.errorprone.workshop.bugpatterns;
//
//import com.google.errorprone.BugCheckerRefactoringTestHelper;
//import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode;
//import com.google.errorprone.CompilationTestHelper;
//import org.junit.jupiter.api.Disabled;
//import org.junit.jupiter.api.Test;
//
//final class DeleteEmptyMethodTest {
// @Disabled("Implement the logic in `DeleteEmptyMethod.java`")
// @Test
// void identification() {
// CompilationTestHelper.newInstance(DeleteEmptyMethod.class, getClass())
// .addSourceLines(
// "A.java",
// "class A {",
// " Object m1() {",
// " return null;",
// " }",
// "",
// " void m2() {",
// " System.out.println(42);",
// " }",
// "",
// " // BUG: Diagnostic contains:",
// " static void m3() {}",
// "",
// " interface F {",
// " void fun();",
// " }",
// "}")
// .addSourceLines(
// "B.java",
// "final class B implements A.F {",
// " @Override",
// " public void fun() {}",
// "",
// " /** Javadoc. */",
// " // BUG: Diagnostic contains:",
// " void m4() {}",
// "",
// " void m5() {",
// " // Single-line comment.",
// " }",
// "}")
// .doTest();
// }
//
// @Disabled("Implement the logic in `DeleteEmptyMethod.java`")
// @Test
// void replacement() {
// BugCheckerRefactoringTestHelper.newInstance(DeleteEmptyMethod.class, getClass())
// .addInputLines(
// "A.java",
// "final class A {",
// " void instanceMethod() {}",
// "",
// " static void staticMethod() {}",
// "",
// " static void staticMethodWithComment() {",
// " /* Foo. */",
// " }",
// "}")
// .addOutputLines(
// "A.java",
// "final class A {",
// " static void staticMethodWithComment() {",
// " /* Foo. */",
// " }",
// "}")
// .doTest(TestMode.TEXT_MATCH);
// }
//}

0 comments on commit 99edaf1

Please sign in to comment.