aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-20 18:38:07 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-20 18:38:07 +0100
commitf3c896b942d87ea15d4351b1819a282eef67f624 (patch)
tree456e9bb0d43596df1f5ed31f3ae69c8c5d6247d9 /src/test/java
parent07f659df1466934fb129df8145cc1a3565dd55e2 (diff)
Extract abstract class for example tests
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/ExampleTests.java46
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java4
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java63
3 files changed, 72 insertions, 41 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java
new file mode 100644
index 00000000..2b453d4a
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java
@@ -0,0 +1,46 @@
+package org.shedlang.compiler.backends;
+
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+import org.shedlang.compiler.ShedCompiler;
+import org.shedlang.compiler.backends.llvm.ExecutionResult;
+import org.shedlang.compiler.config.ProjectConfig;
+import org.shedlang.compiler.filesystem.ShedCompilerFiles;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
+
+public abstract class ExampleTests {
+ @TestFactory
+ public Stream<DynamicTest> tests() {
+ var examplesRoot = ShedCompilerFiles.getRoot().resolve("examples");
+ return Arrays.stream(examplesRoot.toFile()
+ .listFiles(file -> file.isDirectory()))
+ .map(exampleDirectory -> DynamicTest.dynamicTest(
+ exampleDirectory.getName(),
+ () -> {
+ var backend = backend();
+ var compiler = new ShedCompiler();
+ compiler.compile(exampleDirectory.toPath(), backend);
+
+ var config = ProjectConfig.read(exampleDirectory.toPath());
+ for (var example : config.examples()) {
+ var result = run(List.of(config.targetDir().resolve(backend.name()).resolve(example.bin()).toString()));
+
+ assertThat(result.stderr(), equalTo(""));
+ assertThat(result.stdout(), equalTo(example.expectedOutput()));
+ assertThat(result.exitCode(), equalTo(0));
+ }
+ }
+ ));
+ }
+
+ protected abstract Backend backend();
+
+ protected abstract ExecutionResult run(List<String> commands) throws IOException, InterruptedException;
+}
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java b/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java
new file mode 100644
index 00000000..1136e243
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java
@@ -0,0 +1,4 @@
+package org.shedlang.compiler.backends.llvm;
+
+public record ExecutionResult(int exitCode, String stdout, String stderr) {
+}
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java
index 40047ea7..4822efdd 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java
@@ -1,54 +1,35 @@
package org.shedlang.compiler.backends.llvm;
-import org.junit.jupiter.api.DynamicTest;
-import org.junit.jupiter.api.TestFactory;
-import org.shedlang.compiler.ShedCompiler;
-import org.shedlang.compiler.config.ProjectConfig;
-import org.shedlang.compiler.filesystem.ShedCompilerFiles;
+import org.shedlang.compiler.backends.Backend;
+import org.shedlang.compiler.backends.ExampleTests;
+import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import static org.zwobble.precisely.AssertThat.assertThat;
-import static org.zwobble.precisely.Matchers.equalTo;
-
-public class LlvmExampleTests {
- @TestFactory
- public Stream<DynamicTest> tests() {
- var examplesRoot = ShedCompilerFiles.getRoot().resolve("examples");
- return Arrays.stream(examplesRoot.toFile()
- .listFiles(file -> file.isDirectory()))
- .map(exampleDirectory -> DynamicTest.dynamicTest(
- exampleDirectory.getName(),
- () -> {
- var backend = new LlvmBackend();
- var compiler = new ShedCompiler();
- compiler.compile(exampleDirectory.toPath(), backend);
+public class LlvmExampleTests extends ExampleTests {
+ @Override
+ protected Backend backend() {
+ return new LlvmBackend();
+ }
- var config = ProjectConfig.read(exampleDirectory.toPath());
- for (var example : config.examples()) {
- var process = new ProcessBuilder()
- .command(List.of(config.targetDir().resolve(backend.name()).resolve(example.bin()).toString()))
- .start();
+ @Override
+ protected ExecutionResult run(List<String> command) throws IOException, InterruptedException {
+ var process = new ProcessBuilder()
+ .command(command)
+ .start();
- var exitCode = process.waitFor();
+ var exitCode = process.waitFor();
- try (
- var stdoutReader = process.inputReader(StandardCharsets.UTF_8);
- var stderrReader = process.errorReader(StandardCharsets.UTF_8)
- ) {
- var stdout = stdoutReader.lines().collect(Collectors.joining());
- var stderr = stderrReader.lines().collect(Collectors.joining());
+ try (
+ var stdoutReader = process.inputReader(StandardCharsets.UTF_8);
+ var stderrReader = process.errorReader(StandardCharsets.UTF_8)
+ ) {
+ var stdout = stdoutReader.lines().collect(Collectors.joining());
+ var stderr = stderrReader.lines().collect(Collectors.joining());
- assertThat(stderr, equalTo(""));
- assertThat(stdout, equalTo(example.expectedOutput()));
- }
- assertThat(exitCode, equalTo(0));
- }
- }
- ));
+ return new ExecutionResult(exitCode, stdout, stderr);
+ }
}
}