aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-20 19:22:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-20 19:22:55 +0100
commitabcddcedb332ac6154c5ef49eab78209a5d07c62 (patch)
tree02ddc238ad5b513b76d43b384e10871ae8af1798 /src/test/java
parent630842133c5de6edd61b28d0a5d704377c1bd962 (diff)
Add serialization to binary format of empty WASM module
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/ExampleTests.java19
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java7
-rw-r--r--src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java52
-rw-r--r--src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap3
-rw-r--r--src/test/java/org/shedlang/compiler/testing/ProcessRunner.java31
5 files changed, 95 insertions, 17 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java
index df0aae24..c5f584d8 100644
--- a/src/test/java/org/shedlang/compiler/backends/ExampleTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/ExampleTests.java
@@ -6,13 +6,12 @@ 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 org.shedlang.compiler.testing.ProcessRunner;
import org.shedlang.compiler.util.P;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Optional;
-import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.zwobble.precisely.AssertThat.assertThat;
@@ -50,21 +49,7 @@ public abstract class ExampleTests {
.orElse(P.vector())
.plus(executableName(binary));
- var process = new ProcessBuilder()
- .command(fullCommand)
- .start();
-
- 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());
-
- return new ExecutionResult(exitCode, stdout, stderr);
- }
+ return ProcessRunner.run(fullCommand);
}
protected abstract Backend backend();
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java b/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java
index 1136e243..d977d70d 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/ExecutionResult.java
@@ -1,4 +1,11 @@
package org.shedlang.compiler.backends.llvm;
public record ExecutionResult(int exitCode, String stdout, String stderr) {
+ public ExecutionResult throwOnError() {
+ if (exitCode == 0) {
+ return this;
+ } else {
+ throw new AssertionError("exit code was " + exitCode + "\nstdout:\n" + stdout + "\nstderr:\n" + stderr);
+ }
+ }
}
diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java
new file mode 100644
index 00000000..5ddad366
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/WasmBinaryFormatModuleTests.java
@@ -0,0 +1,52 @@
+package org.shedlang.compiler.backends.wasm.structure;
+
+import au.com.origin.snapshots.Expect;
+import au.com.origin.snapshots.junit5.SnapshotExtension;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.shedlang.compiler.backends.wasm.structure.ast.WasmModule;
+import org.shedlang.compiler.testing.ProcessRunner;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+@ExtendWith({SnapshotExtension.class})
+public class WasmBinaryFormatModuleTests {
+ private Expect expect;
+
+ @Test
+ public void canSerializeEmptyModule() throws IOException, InterruptedException {
+ var module = WasmModule.builder()
+ .build();
+
+ var result = serializeModule(module);
+
+ expect.toMatchSnapshot(result);
+ }
+
+ private String serializeModule(WasmModule module) throws IOException, InterruptedException {
+ Files.createDirectories(Path.of("tests-tmp"));
+ var temporaryDirectory = Files.createTempDirectory(Path.of("tests-tmp"), "WasmBinaryFormat");
+ var modulePath = temporaryDirectory.resolve("module.wasm");
+
+ try (var outputStream = new FileOutputStream(modulePath.toFile())) {
+ WasmBinaryFormat.serializeModule(module, outputStream);
+ }
+
+ validate(modulePath);
+
+ return objdump(modulePath);
+ }
+
+ private void validate(Path path) throws IOException, InterruptedException {
+ ProcessRunner.run(List.of("wasm-validate", "--enable-exceptions", path.toString()))
+ .throwOnError();
+ }
+
+ private String objdump(Path path) throws IOException, InterruptedException {
+ return ProcessRunner.run(List.of("wasm-objdump", "-dx", path.toString())).throwOnError().stdout();
+ }
+}
diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap b/src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap
new file mode 100644
index 00000000..370ab0d6
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/snapshots/WasmBinaryFormatModuleTests.snap
@@ -0,0 +1,3 @@
+org.shedlang.compiler.backends.wasm.structure.WasmBinaryFormatModuleTests.canSerializeEmptyModule=[
+module.wasm: file format wasm 0x1Section Details:Code Disassembly:
+] \ No newline at end of file
diff --git a/src/test/java/org/shedlang/compiler/testing/ProcessRunner.java b/src/test/java/org/shedlang/compiler/testing/ProcessRunner.java
new file mode 100644
index 00000000..c1bfd481
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/testing/ProcessRunner.java
@@ -0,0 +1,31 @@
+package org.shedlang.compiler.testing;
+
+import org.shedlang.compiler.backends.llvm.ExecutionResult;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ProcessRunner {
+ private ProcessRunner() {
+ }
+
+ public static ExecutionResult run(List<String> command) throws IOException, InterruptedException {
+ var process = new ProcessBuilder()
+ .command(command)
+ .start();
+
+ 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());
+
+ return new ExecutionResult(exitCode, stdout, stderr);
+ }
+ }
+}