Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert hamming and two-fer unit tests to golden tests #88

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/main/java/analyzer/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ private static Options validateOptions(String... args) {
}

private static List<CompilationUnit> parseInput(Options options) throws IOException {
var sourceRoot = new SourceRoot(Path.of(options.inputDirectory, "src/main/java"));
var sourceDirectory = Path.of(options.inputDirectory, "src/main/java");
if (!sourceDirectory.toFile().exists()) {
return List.of();
}

var sourceRoot = new SourceRoot(sourceDirectory);
var compilationUnits = new ArrayList<CompilationUnit>();
for (ParseResult<CompilationUnit> parseResult : sourceRoot.tryToParse()) {
compilationUnits.add(parseResult.getResult().get());
Expand Down
10 changes: 0 additions & 10 deletions src/main/java/analyzer/exercises/hamming/HammingAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,6 @@ public void analyze(List<CompilationUnit> compilationUnits, Analysis analysis) {

compilationUnits.forEach(cu -> cu.walk(ClassOrInterfaceDeclaration.class, walker));

if (!walker.hasHammingClass()) {
analysis.addComment(new UseProperClassName("Hamming"));
return;
}

if (!walker.hasGetHammingDistanceMethod()) {
analysis.addComment(new UseProperMethodName("getHammingDistance"));
return;
}

if (!walker.hasConstructor()) {
analysis.addComment(new MustUseConstructor());
return;
Expand Down
29 changes: 6 additions & 23 deletions src/main/java/analyzer/exercises/hamming/HammingWalker.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package analyzer.exercises.hamming;

import static com.google.common.collect.ImmutableSet.toImmutableSet;

import com.github.javaparser.Range;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.ConstructorDeclaration;
Expand All @@ -10,37 +8,32 @@
import com.github.javaparser.ast.expr.LambdaExpr;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.nodeTypes.NodeWithRange;
import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.ForEachStmt;
import com.github.javaparser.ast.stmt.ForStmt;
import com.github.javaparser.ast.stmt.Statement;
import com.github.javaparser.ast.stmt.ThrowStmt;
import com.github.javaparser.ast.stmt.WhileStmt;
import com.github.javaparser.ast.stmt.*;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;

import static com.google.common.collect.MoreCollectors.toOptional;

import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Stream;

import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.collect.MoreCollectors.toOptional;

class HammingWalker implements Consumer<ClassOrInterfaceDeclaration> {
private ClassOrInterfaceDeclaration hammingClass;
private List<ConstructorDeclaration> constructors = ImmutableList.of();
private ConstructorDeclaration constructor;
private ListMultimap<String, MethodDeclaration> methods = ImmutableListMultimap.of();
private Set<String> methodsCalledByConstructor = new HashSet<>();
private final Set<String> methodsCalledByConstructor = new HashSet<>();
private boolean constructorHasIfStatements;
private boolean constructorThrowsIllegalArgumentDirectly;
private boolean constructorMayCalculateDistanceDirectly;
private MethodDeclaration getHammingDistanceMethod;
private Set<String> methodsCalledByGetHammingDistance = new HashSet<>();
private final Set<String> methodsCalledByGetHammingDistance = new HashSet<>();
private boolean getHammingDistanceMayCalculateDistanceDirectly;

@Override
Expand Down Expand Up @@ -128,8 +121,6 @@ private Optional<MethodDeclaration> findGetHammingDistanceMethod() {
}

private void walkGetHammingDistanceMethod(MethodDeclaration getHammingDistanceMethod) {
this.getHammingDistanceMethod = getHammingDistanceMethod;

getHammingDistanceMethod.getBody().ifPresent(this::walkGetHammingDistanceMethod);
}

Expand Down Expand Up @@ -178,14 +169,6 @@ private Stream<String> getMethodsCalledBy(BlockStmt body) {
.flatMap(this::getMethodCallNames);
}

public boolean hasHammingClass() {
return hammingClass != null;
}

public boolean hasGetHammingDistanceMethod() {
return getHammingDistanceMethod != null;
}

public boolean hasConstructor() {
return constructor != null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,7 @@ public void analyze(List<CompilationUnit> compilationUnits, Analysis analysis) {

compilationUnits.forEach(cu -> cu.walk(walker));

if (!walker.hasClassTwofer) {
analysis.addComment(new UseProperClassName("Twofer"));
} else if (!walker.hasMethodTwofer) {
analysis.addComment(new UseProperMethodName("twofer"));
} else if (walker.hasHardCodedTestCases) {
if (walker.hasHardCodedTestCases) {
analysis.addComment(new AvoidHardCodedTestCases());
} else if (walker.usesLambda) {
// could be used later for additional comments?
Expand Down
16 changes: 6 additions & 10 deletions src/main/java/analyzer/exercises/twofer/TwoferWalker.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package analyzer.exercises.twofer;

import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.expr.ConditionalExpr;
import com.github.javaparser.ast.expr.LambdaExpr;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.StringLiteralExpr;
import com.github.javaparser.ast.stmt.*;

import java.util.function.Consumer;

class TwoferWalker implements Consumer<Node> {
boolean hasClassTwofer;
boolean hasMethodTwofer;
boolean hasHardCodedTestCases;
boolean usesIfStatement;
boolean usesConditional;
Expand All @@ -21,11 +21,7 @@ class TwoferWalker implements Consumer<Node> {

@Override
public void accept(Node node) {
if (node instanceof ClassOrInterfaceDeclaration) {
this.hasClassTwofer = ((ClassOrInterfaceDeclaration) node).getName().toString().equals("Twofer");
} else if (node instanceof MethodDeclaration methodDeclaration && methodDeclaration.getNameAsString().equals("twofer")) {
this.hasMethodTwofer = true;
} else if (node instanceof StringLiteralExpr && !this.hasHardCodedTestCases) {
if (node instanceof StringLiteralExpr && !this.hasHardCodedTestCases) {
this.hasHardCodedTestCases = node.toString().contains("Alice") || node.toString().contains("Bob");
} else if (node instanceof ReturnStmt) {
this.returnCount++;
Expand Down
14 changes: 2 additions & 12 deletions src/test/java/analyzer/AnalyzerTest.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
package analyzer;

import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;

import java.util.List;

public abstract class AnalyzerTest {
protected abstract Analyzer getAnalyzer();

protected Analysis analyzeResourceFile(String resourceFileName) {
var resource = getClass().getResourceAsStream(resourceFileName);
return analyze(StaticJavaParser.parse(resource));
}

protected Analysis analyzeString(String javaCode) {
return analyze(StaticJavaParser.parse(javaCode));
}

private Analysis analyze(CompilationUnit compilationUnit) {
protected Analysis analyze(String javaCode) {
var analysis = new Analysis();
getAnalyzer().analyze(List.of(compilationUnit), analysis);
getAnalyzer().analyze(List.of(StaticJavaParser.parse(javaCode)), analysis);
return analysis;
}
}
4 changes: 2 additions & 2 deletions src/test/java/analyzer/exercises/GlobalAnalyzerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ protected Analyzer getAnalyzer() {
@MethodSource
@ParameterizedTest
public void solutionsWithMainMethod(String solution) {
var actual = analyzeString(solution);
var actual = analyze(solution);
assertThat(actual.getComments()).contains(new DoNotUseMainMethod());
}

Expand All @@ -44,7 +44,7 @@ public static void main(String[] args) {}
@MethodSource
@ParameterizedTest
public void solutionsWithPrintStatements(String solution) {
var actual = analyzeString(solution);
var actual = analyze(solution);
assertThat(actual.getComments()).contains(new AvoidPrintStatements());
}

Expand Down

This file was deleted.

50 changes: 0 additions & 50 deletions src/test/java/analyzer/exercises/twofer/TwoferAnalyzerTest.java

This file was deleted.

This file was deleted.

This file was deleted.

Loading