forked from exercism/java-test-runner
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTestRunner.java
More file actions
83 lines (69 loc) · 2.92 KB
/
TestRunner.java
File metadata and controls
83 lines (69 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.exercism;
import com.exercism.compiler.ExerciseCompilationException;
import com.exercism.compiler.ExerciseCompiler;
import com.exercism.junit.JUnitTestParser;
import com.exercism.junit.JUnitTestRunner;
import com.exercism.report.Report;
import com.exercism.report.ReportGenerator;
import com.exercism.report.ReportWriter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
public final class TestRunner {
private final JUnitTestParser testParser;
private final JUnitTestRunner testRunner;
private final ReportWriter reportWriter;
private final String slug;
private final String inputDirectory;
public TestRunner(String slug, String inputDirectory, String outputDirectory) {
this.testParser = new JUnitTestParser();
this.reportWriter = new ReportWriter(Paths.get(outputDirectory));
this.testRunner = new JUnitTestRunner();
this.slug = slug;
this.inputDirectory = inputDirectory;
}
public static void main(String[] args) throws IOException {
if (args.length < 3) {
throw new IllegalArgumentException("Not enough arguments, need <slug> <inputDirectory> <outputDirectory>");
}
new TestRunner(args[0], args[1], args[2]).run();
}
private void run() throws IOException {
var sourceFiles = resolveSourceFiles();
var testFiles = resolveTestFiles();
for (File testFile : testFiles) {
testParser.parse(testFile);
}
var filesToCompile = Stream.concat(sourceFiles.stream(), testFiles.stream()).toList();
Report report;
try (var compiler = new ExerciseCompiler(slug)) {
compiler.compile(filesToCompile);
testRunner.test(compiler.getClassLoader(), compiler.getClasspathRoots());
report = ReportGenerator.generate(testRunner.getTestDetails(), testParser.buildTestCodeMap());
} catch (ExerciseCompilationException e) {
report = Report.builder()
.setStatus("error")
.setMessage(e.getMessage())
.build();
}
reportWriter.report(report);
}
private Collection<File> resolveSourceFiles() throws IOException {
var sourcePath = Paths.get(inputDirectory, "src", "main", "java");
return resolveJavaFiles(sourcePath);
}
private Collection<File> resolveTestFiles() throws IOException {
var testPath = Paths.get(inputDirectory, "src", "test", "java");
return resolveJavaFiles(testPath);
}
private static List<File> resolveJavaFiles(Path path) throws IOException {
try (var files = Files.find(path, 10, (file, attrs) -> attrs.isRegularFile() && file.toString().endsWith(".java"))) {
return files.map(Path::toFile).toList();
}
}
}