Skip to content

Commit 3d96cb6

Browse files
authored
Make Hamming check for method refs (#321)
This is to ensure that the Hamming analyzer considers the use of method references when checking the solution. Fixes #303.
1 parent 22749ea commit 3d96cb6

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)