diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-20 18:38:07 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-20 18:38:07 +0100 |
| commit | f3c896b942d87ea15d4351b1819a282eef67f624 (patch) | |
| tree | 456e9bb0d43596df1f5ed31f3ae69c8c5d6247d9 /src/test/java/org | |
| parent | 07f659df1466934fb129df8145cc1a3565dd55e2 (diff) | |
Extract abstract class for example tests
Diffstat (limited to 'src/test/java/org')
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); + } } } |
