/**
*
*/
package xapi.test.model;
import static org.junit.Assert.assertEquals;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import xapi.model.impl.PrimitiveSerializerDefault;
import xapi.source.impl.StringCharIterator;
/**
* @author James X. Nelson (james@wetheinter.net, @james)
*
*/
public class SerializationTest {
int iterations;
private PrimitiveSerializerDefault serializer;
@Before
public void before() {
iterations = 0xffff;
serializer = new PrimitiveSerializerDefault();
}
@Test
public void testIntegerSerialization() {
String serialized = serializer.serializeInt(Integer.MAX_VALUE);
int deserialized = serializer.deserializeInt(new StringCharIterator(serialized));
assertEquals(Integer.MAX_VALUE, deserialized);
serialized = serializer.serializeInt(Integer.MAX_VALUE-1);
deserialized = serializer.deserializeInt(new StringCharIterator(serialized));
assertEquals(Integer.MAX_VALUE-1, deserialized);
serialized = serializer.serializeInt(Integer.MIN_VALUE+1);
deserialized = serializer.deserializeInt(new StringCharIterator(serialized));
assertEquals(Integer.MIN_VALUE+1, deserialized);
serialized = serializer.serializeInt(Integer.MIN_VALUE);
deserialized = serializer.deserializeInt(new StringCharIterator(serialized));
assertEquals(Integer.MIN_VALUE, deserialized);
for (int i = iterations; i --> -iterations;) {
serialized = serializer.serializeInt(i);
deserialized = serializer.deserializeInt(new StringCharIterator(serialized));
assertEquals(i, deserialized);
}
}
@Test
public void testLongSerialization() {
String serialized = serializer.serializeLong(Long.MAX_VALUE);
long deserialized = serializer.deserializeLong(new StringCharIterator(serialized));
Assert.assertEquals(Long.MAX_VALUE, deserialized);
serialized = serializer.serializeLong(Long.MAX_VALUE-1);
deserialized = serializer.deserializeLong(new StringCharIterator(serialized));
Assert.assertEquals(Long.MAX_VALUE-1, deserialized);
serialized = serializer.serializeLong(Long.MIN_VALUE);
deserialized = serializer.deserializeLong(new StringCharIterator(serialized));
Assert.assertEquals(Long.MIN_VALUE, deserialized);
serialized = serializer.serializeLong(Long.MIN_VALUE+1);
deserialized = serializer.deserializeLong(new StringCharIterator(serialized));
Assert.assertEquals(Long.MIN_VALUE+1, deserialized);
for (long i = iterations; i --> -iterations;) {
final long value = i*(i-1)*(i+7);
serialized = serializer.serializeLong(value);
deserialized = serializer.deserializeLong(new StringCharIterator(serialized));
Assert.assertEquals(value, deserialized);
}
}
@Test
public void testDoubleSerialization() {
String serialized = serializer.serializeDouble(Double.MAX_VALUE);
double deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.MAX_VALUE, deserialized, 0);
serialized = serializer.serializeDouble(Double.MAX_VALUE-1);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.MAX_VALUE-1, deserialized, 0);
serialized = serializer.serializeDouble(Double.MIN_VALUE);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.MIN_VALUE, deserialized, 0);
serialized = serializer.serializeDouble(Double.MIN_VALUE+1);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.MIN_VALUE+1, deserialized, 0);
serialized = serializer.serializeDouble(Double.POSITIVE_INFINITY);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.POSITIVE_INFINITY, deserialized, 0);
serialized = serializer.serializeDouble(Double.NEGATIVE_INFINITY);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.NEGATIVE_INFINITY, deserialized, 0);
serialized = serializer.serializeDouble(Double.NaN);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(Double.NaN, deserialized, 0);
for (double i = iterations; i --> -iterations;) {
// Test large values
double value = i*i/137.1 * i;
serialized = serializer.serializeDouble(value);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(value, deserialized, 0);
// Test small values. Small values, and 1.0/0 (infinity)
value = 9.1/value;
serialized = serializer.serializeDouble(value);
deserialized = serializer.deserializeDouble(new StringCharIterator(serialized));
assertEquals(value, deserialized, 0);
}
}
@Test
public void testBooleanArraySerialization() {
for (int i = 100; i --> 0;) {
boolean[] testArray = testBooleans(i, 0);
String serialized = serializer.serializeBooleanArray(testArray);
boolean[] deserialized = serializer.deserializeBooleanArray(new StringCharIterator(serialized));
Assert.assertArrayEquals("Array serialization failed for array of size "+i,testArray, deserialized);
testArray = testBooleans(i, 1);
serialized = serializer.serializeBooleanArray(testArray);
deserialized = serializer.deserializeBooleanArray(new StringCharIterator(serialized));
Assert.assertArrayEquals("Array serialization failed for array of size "+i,testArray, deserialized);
}
}
@Test
public void testClassSerialization() {
// First, test primitive class serialization
Class<?> cls = int.class;
String serialized = serializer.serializeClass(cls);
Class<?> deserialized = serializer.deserializeClass(new StringCharIterator(serialized));
Assert.assertEquals(cls, deserialized);
// Next, a simple test class
cls = SerializationTest.class;
serialized = serializer.serializeClass(cls);
deserialized = serializer.deserializeClass(new StringCharIterator(serialized));
Assert.assertEquals(cls, deserialized);
// Now, an array type
cls = SerializationTest[].class;
serialized = serializer.serializeClass(cls);
deserialized = serializer.deserializeClass(new StringCharIterator(serialized));
Assert.assertEquals(cls, deserialized);
cls = long[].class;
serialized = serializer.serializeClass(cls);
deserialized = serializer.deserializeClass(new StringCharIterator(serialized));
Assert.assertEquals(cls, deserialized);
}
/**
* @param i
* @return
*/
private boolean[] testBooleans(int i, final int order) {
final boolean[] test = new boolean[i];
for (;i-->0;) {
test[i] = i%2==order;
}
return test;
}
}