From 51adea5ab485faec4f4f39b2ed2843b42fccc022 Mon Sep 17 00:00:00 2001 From: sandemiroren1 <106872486+sandemiroren1@users.noreply.github.com> Date: Tue, 11 Jul 2023 12:26:56 +0200 Subject: [PATCH] FEAT: Method called check anywhere (#234) --- README.md | 1 + .../checks/MethodCalledAnywhere.java | 33 +++++++++++++++++ .../checks/MethodCalledAnywhereTest.java | 35 +++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 andy/src/main/java/nl/tudelft/cse1110/andy/codechecker/checks/MethodCalledAnywhere.java create mode 100644 andy/src/test/java/unit/codechecker/checks/MethodCalledAnywhereTest.java diff --git a/README.md b/README.md index bb8029be..7632e6e8 100644 --- a/README.md +++ b/README.md @@ -300,6 +300,7 @@ Andy provides different checks for JUnit, Mockito, and JQWik tests: - `LoopInTestMethods`: checks whether there is a loop in a test method. - `UseOfStringLiterals`: checks whether there is a string literal in a test method. - `MethodCalledInTestMethod`: checks whether a method was invoked in a test method. + - `MethodCalledAnywhere`: checks whether a method was invoked in any scope. - Mockito: - `MockClass`: Checks whether a class was mocked in the test suite. diff --git a/andy/src/main/java/nl/tudelft/cse1110/andy/codechecker/checks/MethodCalledAnywhere.java b/andy/src/main/java/nl/tudelft/cse1110/andy/codechecker/checks/MethodCalledAnywhere.java new file mode 100644 index 00000000..0859d45c --- /dev/null +++ b/andy/src/main/java/nl/tudelft/cse1110/andy/codechecker/checks/MethodCalledAnywhere.java @@ -0,0 +1,33 @@ +package nl.tudelft.cse1110.andy.codechecker.checks; + +import org.eclipse.jdt.core.dom.MethodInvocation; + +public class MethodCalledAnywhere extends Check { + private final String methodToBeCalled; + private boolean methodWasCalled = false; + + public MethodCalledAnywhere(String methodToBeCalled) { + this.methodToBeCalled = methodToBeCalled; + } + + @Override + public boolean visit(MethodInvocation mi) { + + String methodName = mi.getName().toString(); + + if (methodToBeCalled.equals(methodName)) + methodWasCalled = true; + + return super.visit(mi); + } + + + @Override + public boolean result() { + return methodWasCalled; + } + + public String toString() { + return methodToBeCalled + " method is called"; + } +} \ No newline at end of file diff --git a/andy/src/test/java/unit/codechecker/checks/MethodCalledAnywhereTest.java b/andy/src/test/java/unit/codechecker/checks/MethodCalledAnywhereTest.java new file mode 100644 index 00000000..dd940628 --- /dev/null +++ b/andy/src/test/java/unit/codechecker/checks/MethodCalledAnywhereTest.java @@ -0,0 +1,35 @@ +package unit.codechecker.checks; + +import nl.tudelft.cse1110.andy.codechecker.checks.Check; +import nl.tudelft.cse1110.andy.codechecker.checks.MethodCalledAnywhere; +import nl.tudelft.cse1110.andy.codechecker.checks.MethodCalledInTestMethod; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MethodCalledAnywhereTest extends ChecksBaseTest { + + @ParameterizedTest + @CsvSource(value={ + "update, true", + "save, true", + "persist, true", + "retrieve, true", + "ceil, false", + }) + void methodInvocationsInTestMethod(String methodName, boolean expectation) { + Check check = new MethodCalledAnywhere(methodName); + run("MethodCalled.java", check); + assertThat(check.result()).isEqualTo(expectation); + } + + @Test + void shouldIgnoreAnonymousClasses() { // was breaking in midterm 2021 + Check check = new MethodCalledInTestMethod("getPoints"); + run("StackOverflowTestWithAnonymousClass.java", check); + assertThat(check.result()).isTrue(); + } + +}