/** * Copyright (c) 2016, All Contributors (see CONTRIBUTORS file) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.eventsourcing.layout; import com.eventsourcing.layout.binary.BinarySerialization; import lombok.Builder; import lombok.SneakyThrows; import lombok.Value; import lombok.experimental.Accessors; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.math.BigDecimal; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.*; import static org.testng.Assert.*; public class SerializerTest { public static final String PI = "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019"; private Layout<TestClass> layout; private ObjectSerializer<TestClass> serializer; private ObjectDeserializer<TestClass> deserializer; @Value @Accessors(fluent = true) public static class SomeValue { private final String value; } @Value @Builder public static class TestClass { private final byte pByte; private final Byte oByte; private final byte[] pByteArr; private final Byte[] oByteArr; private final short pShort; private final Short oShort; private final int pInt; private final Integer oInt; private final long pLong; private final Long oLong; private final float pFloat; private final Float oFloat; private final double pDouble; private final Double oDouble; private final boolean pBoolean; private final Boolean oBoolean; private final String str; private final UUID uuid; public enum E {A, B} private final E e; private final SomeValue value; private final List<List<String>> list; private final Map<String, List<String>> map; private final Optional<String> optional; private final BigDecimal bigDecimal; private final BigInteger bigInteger; private final Date date; public TestClass(byte pByte, Byte oByte, byte[] pByteArr, Byte[] oByteArr, short pShort, Short oShort, int pInt, Integer oInt, long pLong, Long oLong, float pFloat, Float oFloat, double pDouble, Double oDouble, boolean pBoolean, Boolean oBoolean, String str, UUID uuid, E e, SomeValue value, List<List<String>> list, Map<String, List<String>> map, Optional<String> optional, BigDecimal bigDecimal, BigInteger bigInteger, Date date) { this.pByte = pByte; this.oByte = oByte; this.pByteArr = pByteArr; this.oByteArr = oByteArr; this.pShort = pShort; this.oShort = oShort; this.pInt = pInt; this.oInt = oInt; this.pLong = pLong; this.oLong = oLong; this.pFloat = pFloat; this.oFloat = oFloat; this.pDouble = pDouble; this.oDouble = oDouble; this.pBoolean = pBoolean; this.oBoolean = oBoolean; this.str = str; this.uuid = uuid; this.e = e; this.value = value; this.list = list; this.map = map; this.optional = optional; this.bigDecimal = bigDecimal; this.bigInteger = bigInteger; this.date = date; } } @BeforeClass @SneakyThrows public void setUp() { layout = Layout.forClass(TestClass.class); BinarySerialization serialization = BinarySerialization.getInstance(); serializer = serialization.getSerializer(TestClass.class); deserializer = serialization.getDeserializer(TestClass.class); assertTrue(layout.getProperties().size() > 0); } @Test public void byteSerialization() { TestClass test = TestClass.builder().pByte(Byte.MIN_VALUE).oByte(Byte.MAX_VALUE).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPByte(), Byte.MIN_VALUE); assertEquals(deserialized.getOByte(), (Byte) Byte.MAX_VALUE); } @Test public void byteArraySerialization() { TestClass test = TestClass.builder().pByteArr(new byte[]{Byte.MIN_VALUE}).oByteArr(new Byte[]{Byte.MAX_VALUE}) .build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPByteArr(), new byte[]{Byte.MIN_VALUE}); assertEquals(deserialized.getOByteArr(), new Byte[]{Byte.MAX_VALUE}); } @Test public void shortSerialization() { TestClass test = TestClass.builder().pShort(Short.MIN_VALUE).oShort(Short.MAX_VALUE).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPShort(), Short.MIN_VALUE); assertEquals(deserialized.getOShort(), (Short) Short.MAX_VALUE); } @Test public void intSerialization() { TestClass test = TestClass.builder().pInt(Integer.MIN_VALUE).oInt(Integer.MAX_VALUE).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPInt(), Integer.MIN_VALUE); assertEquals(deserialized.getOInt(), (Integer) Integer.MAX_VALUE); } @Test public void longSerialization() { TestClass test = TestClass.builder().pLong(Long.MIN_VALUE).oLong(Long.MAX_VALUE).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPLong(), Long.MIN_VALUE); assertEquals(deserialized.getOLong(), (Long) Long.MAX_VALUE); } @Test public void floatSerialization() { TestClass test = TestClass.builder().pFloat(Float.MIN_VALUE).oFloat(Float.MAX_VALUE).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPFloat(), Float.MIN_VALUE); assertEquals(deserialized.getOFloat(), Float.MAX_VALUE); } @Test public void doubleSerialization() { TestClass test = TestClass.builder().pDouble(Double.MIN_VALUE).oDouble(Double.MAX_VALUE).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getPDouble(), Double.MIN_VALUE); assertEquals(deserialized.getODouble(), Double.MAX_VALUE); } @Test public void booleanSerialization() { TestClass test = TestClass.builder().pBoolean(true).oBoolean(false).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.isPBoolean(), true); assertEquals(deserialized.getOBoolean(), (Boolean) false); } @Test public void stringSerialization() { TestClass test = TestClass.builder().str("test").build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getStr(), "test"); } @Test public void uuidSerialization() { UUID uuid = UUID.randomUUID(); TestClass test = TestClass.builder().uuid(uuid).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getUuid(), uuid); } @Test public void enumSerialization() { TestClass test = TestClass.builder().e(TestClass.E.A).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getE(), TestClass.E.A); } @Test public void layoutSerialization() { TestClass test = TestClass.builder().value(new SomeValue("test")).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getValue().value(), "test"); } @Test public void nullLayoutSerialization() { TestClass test = TestClass.builder().build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getValue().value(), ""); // it is an empty string because we don't preserve String nullity } @Test public void listSerialization() { LinkedList<List<String>> list = new LinkedList<>(); list.add(new LinkedList<>(Arrays.asList("Hello"))); TestClass test = TestClass.builder().list(list).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getList().get(0).get(0), "Hello"); } @Test public void mapSerialization() { Map<String, List<String>> map = new HashMap<>(); LinkedList<String> list = new LinkedList<>(Arrays.asList("Hello")); map.put("test", list); TestClass test = TestClass.builder().map(map).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getMap().get("test").get(0), "Hello"); } @Test public void optionalSerialization() { TestClass test = TestClass.builder().build(); assertNull(test.getOptional()); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertFalse(deserialized.getOptional().isPresent()); test = TestClass.builder().optional(Optional.empty()).build(); buffer = serializer.serialize(test); buffer.rewind(); deserialized = deserializer.deserialize(buffer); assertFalse(deserialized.getOptional().isPresent()); test = TestClass.builder().optional(Optional.of("hello")).build(); buffer = serializer.serialize(test); buffer.rewind(); deserialized = deserializer.deserialize(buffer); assertTrue(deserialized.getOptional().isPresent()); assertEquals(deserialized.getOptional().get(), "hello"); } @Test public void bigDecimalSerialization() { TestClass test = TestClass.builder().bigDecimal(new BigDecimal(PI)).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getBigDecimal(), new BigDecimal(PI)); } @Test public void bigIntegerSerialization() { TestClass test = TestClass.builder().bigInteger(new BigInteger("1000")).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getBigInteger(), new BigInteger("1000")); } @Test public void dateSerialization() { Date date = new Date(); TestClass test = TestClass.builder().date(date).build(); ByteBuffer buffer = serializer.serialize(test); buffer.rewind(); TestClass deserialized = deserializer.deserialize(buffer); assertEquals(deserialized.getDate(), date); } }