Skip to content

Commit 8ab8ffe

Browse files
committed
Make Hamming check for method refs
This is to ensure that the Hamming analyzer considers the use of method references when checking the solution. Fixes #303.
1 parent 22749ea commit 8ab8ffe

6 files changed

Lines changed: 74 additions & 3 deletions

File tree

src/main/java/analyzer/exercises/hamming/HammingWalker.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.github.javaparser.ast.expr.CharLiteralExpr;
88
import com.github.javaparser.ast.expr.LambdaExpr;
99
import com.github.javaparser.ast.expr.MethodCallExpr;
10+
import com.github.javaparser.ast.expr.MethodReferenceExpr;
1011
import com.github.javaparser.ast.nodeTypes.NodeWithRange;
1112
import com.github.javaparser.ast.stmt.*;
1213

@@ -75,9 +76,12 @@ private boolean isMethodCall(Statement statement) {
7576
}
7677

7778
private Stream<String> getMethodCallNames(Statement statement) {
78-
return statement.findAll(MethodCallExpr.class).stream()
79-
.map(MethodCallExpr::getNameAsString)
80-
.distinct();
79+
Stream<String> methodCalled = statement.findAll(MethodCallExpr.class).stream()
80+
.map(MethodCallExpr::getNameAsString);
81+
Stream<String> methodRefs = statement.findAll(MethodReferenceExpr.class).stream()
82+
.map(MethodReferenceExpr::getIdentifier);
83+
84+
return Stream.concat(methodCalled, methodRefs).distinct();
8185
}
8286

8387
private Optional<MethodDeclaration> findGetHammingDistanceMethod() {

src/test/java/analyzer/AnalyzerIntegrationTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ void global(String scenario) throws IOException {
3838
"OptimalWithCalculationInGetHammingDistance",
3939
"OptimalWithValidationMethod",
4040
"UsesCharacterLiterals",
41+
"UsesHelperMethodInLambda",
42+
"UsesHelperMethodInMethodRef",
4143
"UsesStreamReduce",
4244
})
4345
void hamming(String scenario) throws IOException {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"comments": []
3+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"comments": [
3+
{
4+
"comment": "java.hamming.calculate_distance_in_constructor",
5+
"params": {},
6+
"type": "actionable"
7+
},
8+
{
9+
"comment": "java.general.feedback_request",
10+
"params": {},
11+
"type": "informative"
12+
}
13+
]
14+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import java.util.stream.IntStream;
2+
3+
public class Hamming {
4+
private final int distance;
5+
6+
public Hamming(String leftStrand, String rightStrand) {
7+
if (leftStrand.length() != rightStrand.length()) {
8+
throw new IllegalArgumentException("strands must be of equal length");
9+
}
10+
11+
this.distance = (int) IntStream.range(0, leftStrand.length())
12+
.filter(i -> leftStrand.charAt(i) != rightStrand.charAt(i))
13+
.count();
14+
}
15+
16+
public int getHammingDistance() {
17+
return distance;
18+
}
19+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import java.util.Objects;
2+
import java.util.stream.IntStream;
3+
4+
public class Hamming {
5+
private final int length;
6+
private final String leftStrand;
7+
private final String rightStrand;
8+
9+
public Hamming(String leftStrand, String rightStrand) {
10+
this.leftStrand = Objects.requireNonNull(leftStrand);
11+
this.rightStrand = Objects.requireNonNull(rightStrand);
12+
13+
if (leftStrand.length() != rightStrand.length()) {
14+
throw new IllegalArgumentException("strands must be of equal length");
15+
}
16+
17+
this.length = leftStrand.length();
18+
}
19+
20+
public int getHammingDistance() {
21+
return IntStream.range(0, length)
22+
.map(this::doesLetterMatch)
23+
.sum();
24+
}
25+
26+
private int doesLetterMatch(int i) {
27+
return leftStrand.charAt(i) == rightStrand.charAt(i) ? 0 : 1;
28+
}
29+
}

0 commit comments

Comments
 (0)