package org.djutils.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import org.djunits.unit.DirectionUnit;
import org.djunits.unit.DurationUnit;
import org.djunits.unit.LengthUnit;
import org.djunits.unit.TimeUnit;
import org.djunits.value.vdouble.scalar.Length;
import org.djunits.value.vdouble.scalar.Time;
import org.djunits.value.vfloat.scalar.FloatDirection;
import org.djunits.value.vfloat.scalar.FloatDuration;
import org.djutils.data.serialization.TextSerializationException;
import org.djutils.data.serialization.TextSerializer;
import org.junit.Test;
/**
* TestTextSerializers tests the (de)serialization of the different classes from/into text.
*
* Copyright (c) 2020-2020 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
* for project information https://djutils.org. The DJUTILS project is
* distributed under a three-clause BSD-style license, which can be found at
* https://djutils.org/docs/license.html.
* @author Alexander Verbraeck
* @author Peter Knoppers
* @author Wouter Schakel
*/
public class TestTextSerializers
{
/**
* Test the serializers of the primitive types.
* @throws TextSerializationException when serializer could not be found
*/
@Test
public void testPrimitiveSerializers() throws TextSerializationException
{
int i = 10;
TextSerializer> serializer = TextSerializer.resolve(int.class);
assertEquals(i, serializer.deserialize(serializer.serialize(i)));
double d = 124.5;
serializer = TextSerializer.resolve(double.class);
assertEquals(d, serializer.deserialize(serializer.serialize(d)));
float f = 11.4f;
serializer = TextSerializer.resolve(float.class);
assertEquals(f, serializer.deserialize(serializer.serialize(f)));
long l = 100_456_678L;
serializer = TextSerializer.resolve(long.class);
assertEquals(l, serializer.deserialize(serializer.serialize(l)));
short s = (short) 12.34;
serializer = TextSerializer.resolve(short.class);
assertEquals(s, serializer.deserialize(serializer.serialize(s)));
byte b = (byte) 67;
serializer = TextSerializer.resolve(byte.class);
assertEquals(b, serializer.deserialize(serializer.serialize(b)));
char c = 'a';
serializer = TextSerializer.resolve(char.class);
assertEquals(c, serializer.deserialize(serializer.serialize(c)));
boolean t = true;
serializer = TextSerializer.resolve(boolean.class);
assertEquals(t, serializer.deserialize(serializer.serialize(t)));
}
/**
* Test the serializers of the Number types, Boolean and Character.
* @throws TextSerializationException when serializer could not be found
*/
@Test
public void testNumberSerializers() throws TextSerializationException
{
Integer i = 10;
TextSerializer> serializer = TextSerializer.resolve(i.getClass());
assertEquals(i, serializer.deserialize(serializer.serialize(i)));
Double d = 124.5;
serializer = TextSerializer.resolve(d.getClass());
assertEquals(d, serializer.deserialize(serializer.serialize(d)));
Float f = 11.4f;
serializer = TextSerializer.resolve(f.getClass());
assertEquals(f, serializer.deserialize(serializer.serialize(f)));
Long l = 100_456_678L;
serializer = TextSerializer.resolve(l.getClass());
assertEquals(l, serializer.deserialize(serializer.serialize(l)));
Short s = (short) 12.34;
serializer = TextSerializer.resolve(s.getClass());
assertEquals(s, serializer.deserialize(serializer.serialize(s)));
Byte b = (byte) 67;
serializer = TextSerializer.resolve(b.getClass());
assertEquals(b, serializer.deserialize(serializer.serialize(b)));
Character c = 'a';
serializer = TextSerializer.resolve(c.getClass());
assertEquals(c, serializer.deserialize(serializer.serialize(c)));
Boolean t = true;
serializer = TextSerializer.resolve(t.getClass());
assertEquals(t, serializer.deserialize(serializer.serialize(t)));
}
/**
* Test the serializer of the String type.
* @throws TextSerializationException when serializer could not be found
*/
@Test
public void testStringSerializer() throws TextSerializationException
{
String s = "abc, &%#";
TextSerializer> serializer = TextSerializer.resolve(s.getClass());
assertEquals(s, serializer.deserialize(serializer.serialize(s)));
}
/**
* Test the errors for the serializers.
* @throws TextSerializationException when serializer could not be found
*/
@Test
public void testSerializerErrors() throws TextSerializationException
{
try
{
TextSerializer.resolve(Object.class);
fail("resolving an unknown serializer should have raised an exception");
}
catch (TextSerializationException tse)
{
// ok
}
try
{
TextSerializer.resolve(null);
fail("null class should have raised an exception");
}
catch (NullPointerException npe)
{
// ok
}
Exception e = new TextSerializationException();
assertNull(e.getMessage());
assertNull(e.getCause());
e = new TextSerializationException("bla");
assertEquals("bla", e.getMessage());
assertNull(e.getCause());
e = new TextSerializationException(new IllegalArgumentException("abc"));
assertNotNull(e.getMessage()); // something about the cause is added automatically
assertEquals(IllegalArgumentException.class, e.getCause().getClass());
assertEquals("abc", e.getCause().getMessage());
e = new TextSerializationException("bla", new IllegalArgumentException("abc"));
assertEquals("bla", e.getMessage());
assertEquals(IllegalArgumentException.class, e.getCause().getClass());
assertEquals("abc", e.getCause().getMessage());
}
/**
* Test the serializers of the DoubleScalar and FloatScalar types.
* @throws TextSerializationException when serializer could not be found
*/
@Test
public void testScalarSerializers() throws TextSerializationException
{
Length length = new Length(20.0, LengthUnit.KILOMETER);
TextSerializer> serializer = TextSerializer.resolve(length.getClass());
assertEquals(length, serializer.deserialize(serializer.serialize(length)));
// repeat to test caching
length = new Length(123.456, LengthUnit.MILE);
serializer = TextSerializer.resolve(length.getClass());
assertEquals(length, serializer.deserialize(serializer.serialize(length)));
Time time = new Time(10.0, TimeUnit.BASE_DAY);
serializer = TextSerializer.resolve(time.getClass());
assertEquals(time, serializer.deserialize(serializer.serialize(time)));
FloatDuration duration = new FloatDuration(12.5f, DurationUnit.WEEK);
serializer = TextSerializer.resolve(duration.getClass());
assertEquals(duration, serializer.deserialize(serializer.serialize(duration)));
// repeat to test caching
duration = new FloatDuration(876.32f, DurationUnit.MINUTE);
serializer = TextSerializer.resolve(duration.getClass());
assertEquals(duration, serializer.deserialize(serializer.serialize(duration)));
FloatDirection direction = new FloatDirection(80.5, DirectionUnit.EAST_DEGREE);
serializer = TextSerializer.resolve(direction.getClass());
assertEquals(direction, serializer.deserialize(serializer.serialize(direction)));
}
}