From b19b322cfd64bc409a627f8ff420026678d46270 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Thu, 18 Mar 2021 13:15:23 +0100 Subject: [PATCH] Fix Int52, add tests --- pom.xml | 23 +++++++ .../generator/nativedata/Int52Serializer.java | 30 ++++++-- .../nativedata/TestInt52Serializer.java | 69 +++++++++++++++++++ 3 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 src/test/java/it/cavallium/data/generator/nativedata/TestInt52Serializer.java diff --git a/pom.xml b/pom.xml index f17d6b7..1785981 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,17 @@ maven-plugin-plugin 3.6.0 + + maven-surefire-plugin + 3.0.0-M5 + + + org.junit.jupiter + junit-jupiter-engine + 5.7.0 + + + @@ -130,5 +141,17 @@ log4j-slf4j-impl 2.12.1 + + org.junit.jupiter + junit-jupiter-api + 5.7.0 + test + + + org.hamcrest + hamcrest-core + + + \ No newline at end of file diff --git a/src/main/java/it/cavallium/data/generator/nativedata/Int52Serializer.java b/src/main/java/it/cavallium/data/generator/nativedata/Int52Serializer.java index 8239835..efa0260 100644 --- a/src/main/java/it/cavallium/data/generator/nativedata/Int52Serializer.java +++ b/src/main/java/it/cavallium/data/generator/nativedata/Int52Serializer.java @@ -12,22 +12,42 @@ public class Int52Serializer implements DataSerializer { @Override public void serialize(DataOutput dataOutput, @NotNull Int52 data) throws IOException { - dataOutput.write(toByteArray(data.getValue())); + serializeValue(dataOutput, data); } @NotNull @Override public Int52 deserialize(DataInput dataInput) throws IOException { - byte[] bytes = new byte[7]; - dataInput.readFully(bytes); - return Int52.fromLong(fromByteArray(bytes)); + return deserializeValue(dataInput); + } + + public static void serializeValue(DataOutput dataOutput, @NotNull Int52 data) throws IOException { + long value = data.getValue(); + + for(int i = 0; i < 7; i++) { + dataOutput.writeByte(((int)((value >> (6 - i) * 8) & (i == 0 ? 0b00001111L : 255L)))); + } + } + + public static Int52 deserializeValue(DataInput dataInput) throws IOException { + long value = 0; + + return Int52.fromLong( + ((long) dataInput.readUnsignedByte() & 0b00001111) << 48 + | ((long) dataInput.readUnsignedByte()) << 40 + | ((long) dataInput.readUnsignedByte() << 32) + | ((long) dataInput.readUnsignedByte() << 24) + | ((long) dataInput.readUnsignedByte()) << 16 + | ((long) dataInput.readUnsignedByte()) << 8 + | ((long) dataInput.readUnsignedByte()) + ); } public static byte[] toByteArray(long value) { byte[] result = new byte[7]; for(int i = 6; i >= 0; --i) { - result[i] = (byte)((int)(value & (i == 6 ? 0b00001111L : 255L))); + result[i] = (byte)((int)(value & (i == 0 ? 0b00001111L : 255L))); value >>= 8; } diff --git a/src/test/java/it/cavallium/data/generator/nativedata/TestInt52Serializer.java b/src/test/java/it/cavallium/data/generator/nativedata/TestInt52Serializer.java new file mode 100644 index 0000000..a8132fe --- /dev/null +++ b/src/test/java/it/cavallium/data/generator/nativedata/TestInt52Serializer.java @@ -0,0 +1,69 @@ +package it.cavallium.data.generator.nativedata; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.jetbrains.annotations.Nullable; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestInt52Serializer { + + @Test + public void testInt52Serialization() throws IOException { + for (int i = 0; i <= 300; i++) { + testInt52Serialization(i); + } + testInt52Serialization(0xF_FF_FF_FF_FF_FF_FFL); + } + + public void testInt52Serialization(long n) throws IOException { + var serializer = new Int52Serializer(); + byte[] out; + try (var baos = new ByteArrayOutputStream()) { + try (var dos = new DataOutputStream(baos)) { + serializer.serialize(dos, Int52.fromLong(n)); + } + out = baos.toByteArray(); + } + + var bais = new ByteArrayInputStream(out); + var dis = new DataInputStream(bais); + Assertions.assertEquals(n, serializer.deserialize(dis).longValue(), "Deserialized number differ"); + } + + @Test + public void testInt52OptionalSerialization() throws IOException { + testInt52OptionalSerialization(null); + for (long i = 0; i <= 300; i++) { + testInt52OptionalSerialization(i); + } + testInt52OptionalSerialization(0xF_FF_FF_FF_FF_FF_FFL); + } + + public void testInt52OptionalSerialization(@Nullable Long n) throws IOException { + var serializer = new NullableInt52Serializer(); + byte[] out; + try (var baos = new ByteArrayOutputStream()) { + try (var dos = new DataOutputStream(baos)) { + if (n == null) { + serializer.serialize(dos, NullableInt52.empty()); + } else { + serializer.serialize(dos, NullableInt52.of(Int52.fromLong(n))); + } + } + out = baos.toByteArray(); + } + + var bais = new ByteArrayInputStream(out); + var dis = new DataInputStream(bais); + if (n == null) { + Assertions.assertNull(serializer.deserialize(dis).getNullable(), "Deserialized number is not empty"); + } else { + Assertions.assertEquals(n, serializer.deserialize(dis).get().longValue(), "Deserialized number differ"); + } + } + +}