// Copyright 2014 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.test.util; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Random; import marmot.util.SerialUtils; import org.junit.Test; public class SerialUtilsTest { void roundTripTest(double[] expected, double eps, double delta) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(baos); SerialUtils.writeSparseArray(oos, expected, eps); oos.close(); } catch (IOException e) { throw new RuntimeException(e); } double[] actual; byte[] array = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(array); try { ObjectInputStream ois = new ObjectInputStream(bais); actual = SerialUtils.readSparseArray(ois); } catch (IOException e) { throw new RuntimeException(e); } assertArrayEquals(expected, actual, delta); } @Test public void trivialTest() { double eps = 1e-10; double delta = eps; double[] expected; expected = null; roundTripTest(expected, eps, delta); expected = new double[0]; roundTripTest(expected, eps, delta); } @Test public void normalTest() { double eps = 1e-2; double delta = 1e-1; double[] expected = { 1.0, 0.0, 1.0, 0.0, 0.5, 0.11, 0.01, 0.001 }; roundTripTest(expected, eps, delta); } @Test public void bigTest() { double[] expected = new double[10000000]; Random random = new Random(42L); for (int i = 0; i < expected.length; i++) { expected[i] = random.nextGaussian(); } double eps = 1e-2; double delta = 1e-1; roundTripTest(expected, eps, delta); } @Test public void zeroOffsetTest() { double[] expected = {1.0, 0.0, 0.0, 0.0}; double eps = 1e-2; double delta = 1e-1; roundTripTest(expected, eps, delta); } @Test public void bigOffsetTest() { double[] expected = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}; double eps = 1e-2; double delta = 1e-1; roundTripTest(expected, eps, delta); } }