Skip to content

Commit

Permalink
Suggest to use no more than 3 checks
Browse files Browse the repository at this point in the history
  • Loading branch information
sanderploegsma committed Jan 20, 2024
1 parent 59dc03f commit fd6f664
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 4 deletions.
25 changes: 23 additions & 2 deletions src/main/java/analyzer/exercises/leap/LeapAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}

Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package analyzer.exercises.leap;

import analyzer.Comment;
import analyzer.CommentType;

/**
* @see <a href="https://github.com/exercism/website-copy/blob/main/analyzer-comments/java/leap/use_minimum_number_of_checks.md">Markdown Template</a>
*/
class UseMinimumNumberOfChecks extends Comment {
@Override
public String getKey() {
return "java.leap.use_minimum_number_of_checks";
}

@Override
public CommentType getType() {
return CommentType.ACTIONABLE;
}
}
5 changes: 3 additions & 2 deletions src/test/java/analyzer/exercises/leap/LeapAnalyzerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ private static Stream<Arguments> 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()})
);
}

Expand All @@ -34,7 +35,7 @@ private static Stream<Arguments> 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) {
Expand Down
5 changes: 5 additions & 0 deletions src/test/resources/analyzer/exercises/leap/TooManyChecks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Leap {
boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 100 == 0 && year % 400 == 0;
}
}

0 comments on commit fd6f664

Please sign in to comment.