diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-21 20:59:37 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-21 20:59:37 +0100 |
| commit | b92d46a9fc641afca93571e1b398b968816b1b57 (patch) | |
| tree | 63e8f70e5a06b632e2e6de7bbb982fabc0820c5e /src/test/java | |
| parent | 46471000c1851940777f6dce77fa9a4bc2fe877c (diff) | |
Add LEB128 encoding
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/backends/wasm/structure/Leb128EncodingTests.java | 82 |
1 files changed, 82 insertions, 0 deletions
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)); + } +} |
