diff --git a/src/main/java/analyzer/exercises/leap/LeapAnalyzer.java b/src/main/java/analyzer/exercises/leap/LeapAnalyzer.java
index 038d7c14..acd66a7e 100644
--- a/src/main/java/analyzer/exercises/leap/LeapAnalyzer.java
+++ b/src/main/java/analyzer/exercises/leap/LeapAnalyzer.java
@@ -5,6 +5,8 @@
import analyzer.comments.AvoidHardCodedTestCases;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.ImportDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.expr.BinaryExpr;
import com.github.javaparser.ast.expr.ConditionalExpr;
import com.github.javaparser.ast.expr.IntegerLiteralExpr;
import com.github.javaparser.ast.stmt.IfStmt;
@@ -43,8 +45,7 @@ public void visit(CompilationUnit n, Void arg) {
@Override
public void visit(ImportDeclaration n, Void arg) {
- var name = n.getNameAsString();
- if (DISALLOWED_IMPORTS.stream().anyMatch(name::contains)) {
+ if (isUsingBuiltInMethods(n)) {
this.analysis.addComment(new NoBuiltInMethods());
}
@@ -75,4 +76,24 @@ public void visit(ConditionalExpr n, Void arg) {
this.analysis.addComment(new AvoidConditionalLogic());
super.visit(n, arg);
}
+
+ @Override
+ public void visit(MethodDeclaration n, Void arg) {
+ if (n.getNameAsString().equals("isLeapYear") && hasMoreThanThreeChecks(n)) {
+ this.analysis.addComment(new UseMinimumNumberOfChecks());
+ }
+ super.visit(n, arg);
+ }
+
+ private static boolean isUsingBuiltInMethods(ImportDeclaration node) {
+ var name = node.getNameAsString();
+ return DISALLOWED_IMPORTS.stream().anyMatch(name::contains);
+ }
+
+ private static boolean hasMoreThanThreeChecks(MethodDeclaration node) {
+ var booleanOperators = node.findAll(BinaryExpr.class,
+ x -> x.getOperator() == BinaryExpr.Operator.AND || x.getOperator() == BinaryExpr.Operator.OR);
+
+ return booleanOperators.size() > 2;
+ }
}
diff --git a/src/main/java/analyzer/exercises/leap/UseMinimumNumberOfChecks.java b/src/main/java/analyzer/exercises/leap/UseMinimumNumberOfChecks.java
new file mode 100644
index 00000000..7a909b0a
--- /dev/null
+++ b/src/main/java/analyzer/exercises/leap/UseMinimumNumberOfChecks.java
@@ -0,0 +1,19 @@
+package analyzer.exercises.leap;
+
+import analyzer.Comment;
+import analyzer.CommentType;
+
+/**
+ * @see Markdown Template
+ */
+class UseMinimumNumberOfChecks extends Comment {
+ @Override
+ public String getKey() {
+ return "java.leap.use_minimum_number_of_checks";
+ }
+
+ @Override
+ public CommentType getType() {
+ return CommentType.ACTIONABLE;
+ }
+}
diff --git a/src/test/java/analyzer/exercises/leap/LeapAnalyzerTest.java b/src/test/java/analyzer/exercises/leap/LeapAnalyzerTest.java
index 93099a7f..f807bddc 100644
--- a/src/test/java/analyzer/exercises/leap/LeapAnalyzerTest.java
+++ b/src/test/java/analyzer/exercises/leap/LeapAnalyzerTest.java
@@ -25,7 +25,8 @@ private static Stream testCases() {
Arguments.of("UsesGregorianCalendar.java", new Comment[]{new NoBuiltInMethods()}),
Arguments.of("HardCodedTestCases.java", new Comment[]{new AvoidHardCodedTestCases()}),
Arguments.of("UsesIfStatements.java", new Comment[]{new AvoidConditionalLogic()}),
- Arguments.of("UsesTernary.java", new Comment[]{new AvoidConditionalLogic()})
+ Arguments.of("UsesTernary.java", new Comment[]{new AvoidConditionalLogic()}),
+ Arguments.of("TooManyChecks.java", new Comment[]{new UseMinimumNumberOfChecks()})
);
}
@@ -34,7 +35,7 @@ private static Stream testCases() {
public void testCommentsOnSolution(String solutionFile, Comment... expectedComments) {
var actual = analyzeResourceFile(getResourceFileName(solutionFile));
- assertThat(actual.getComments()).containsExactly(expectedComments);
+ assertThat(actual.getComments()).contains(expectedComments);
}
private static String getResourceFileName(String testFileName) {
diff --git a/src/test/resources/analyzer/exercises/leap/TooManyChecks.java b/src/test/resources/analyzer/exercises/leap/TooManyChecks.java
new file mode 100644
index 00000000..ce273627
--- /dev/null
+++ b/src/test/resources/analyzer/exercises/leap/TooManyChecks.java
@@ -0,0 +1,5 @@
+class Leap {
+ boolean isLeapYear(int year) {
+ return year % 4 == 0 && year % 100 != 0 || year % 100 == 0 && year % 400 == 0;
+ }
+}