From b92d46a9fc641afca93571e1b398b968816b1b57 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 21 Jun 2023 20:59:37 +0100 Subject: Add LEB128 encoding --- .../wasm/structure/Leb128EncodingTests.java | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/structure/Leb128EncodingTests.java (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/structure/Leb128EncodingTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/structure/Leb128EncodingTests.java new file mode 100644 index 00000000..de7f39e9 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/structure/Leb128EncodingTests.java @@ -0,0 +1,82 @@ +package org.shedlang.compiler.backends.wasm.structure; + +import org.junit.jupiter.api.Test; + +import java.util.HexFormat; + +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class Leb128EncodingTests { + @Test + public void unsignedEncoding() { + assertUnsignedInt32Encoding(0x0, "00"); + assertUnsignedInt32Encoding(0x1, "01"); + assertUnsignedInt32Encoding(0x7F, "7f"); + assertUnsignedInt32Encoding(0x80, "8001"); + assertUnsignedInt32Encoding(0xffffffff, "ffffffff0f"); + } + + private void assertUnsignedInt32Encoding(int value, String expectedHex) { + var writer = new BinaryWriter(); + Leb128Encoding.encodeUnsignedInt32(value, writer); + assertByteArray(writer.toBytes(), expectedHex); + } + + @Test + public void paddedUnsignedEncoding() { + assertPaddedUnsignedInt32Encoding(0x0, "8080808000"); + assertPaddedUnsignedInt32Encoding(0x1, "8180808000"); + assertPaddedUnsignedInt32Encoding(0x7F, "ff80808000"); + assertPaddedUnsignedInt32Encoding(0x80, "8081808000"); + assertPaddedUnsignedInt32Encoding(0xffffffff, "ffffffff0f"); + } + + private void assertPaddedUnsignedInt32Encoding(int value, String expectedHex) { + var writer = new BinaryWriter(); + Leb128Encoding.encodePaddedUnsignedInt32(value, writer); + assertByteArray(writer.toBytes(), expectedHex); + } + + @Test + public void signedEncoding() { + assertSignedInt32Encoding(0x0, "00"); + assertSignedInt32Encoding(0x1, "01"); + assertSignedInt32Encoding(0x3F, "3f"); + assertSignedInt32Encoding(0x40, "c000"); + assertSignedInt32Encoding(0x7F, "ff00"); + assertSignedInt32Encoding(0x80, "8001"); + assertSignedInt32Encoding(-0x1, "7f"); + assertSignedInt32Encoding(-0x40, "40"); + assertSignedInt32Encoding(-0x41, "bf7f"); + } + + private void assertSignedInt32Encoding(int value, String expectedHex) { + var writer = new BinaryWriter(); + Leb128Encoding.encodeSignedInt32(value, writer); + assertByteArray(writer.toBytes(), expectedHex); + } + + @Test + public void paddedSignedEncoding() { + assertPaddedSignedInt32Encoding(0x0, "8080808000"); + assertPaddedSignedInt32Encoding(0x1, "8180808000"); + assertPaddedSignedInt32Encoding(0x3F, "bf80808000"); + assertPaddedSignedInt32Encoding(0x40, "c080808000"); + assertPaddedSignedInt32Encoding(0x7F, "ff80808000"); + assertPaddedSignedInt32Encoding(0x80, "8081808000"); + assertPaddedSignedInt32Encoding(-0x1, "ffffffff7f"); + assertPaddedSignedInt32Encoding(-0x40, "c0ffffff7f"); + assertPaddedSignedInt32Encoding(-0x41, "bfffffff7f"); + } + + private void assertPaddedSignedInt32Encoding(int value, String expectedHex) { + var writer = new BinaryWriter(); + Leb128Encoding.encodePaddedSignedInt32(value, writer); + assertByteArray(writer.toBytes(), expectedHex); + } + + private void assertByteArray(byte[] actual, String expectedHex) { + assertThat(HexFormat.of().formatHex(actual), equalTo(expectedHex)); + } +} -- cgit v1.2.3