package com.github.davidmoten.rtree;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.junit.Test;
import com.github.davidmoten.guavamini.Sets;
import com.github.davidmoten.junit.Asserts;
import com.github.davidmoten.rtree.geometry.Circle;
import com.github.davidmoten.rtree.geometry.Geometries;
import com.github.davidmoten.rtree.geometry.Geometry;
import com.github.davidmoten.rtree.geometry.Line;
import com.github.davidmoten.rtree.geometry.Point;
import com.github.davidmoten.rtree.geometry.Rectangle;
public class SerializersTest {
@Test
public void testJavaIoSerialization() throws IOException {
Serializer<String, Point> serializer = Serializers.flatBuffers().javaIo();
checkRoundTripPoint(serializer);
}
@Test
public void testStringPointSerialization() throws IOException {
Serializer<String, Point> serializer = Serializers.flatBuffers().utf8();
checkRoundTripPoint(serializer);
}
@Test
public void testStringRectangleSerialization() throws IOException {
Serializer<String, Rectangle> serializer = Serializers.flatBuffers().utf8();
Entry<String, Rectangle> a = Entries.entry("hello", Geometries.rectangle(1, 2, 3, 4));
Entry<String, Rectangle> b = Entries.entry("there", Geometries.rectangle(3, 4, 5, 6));
check(serializer, a, b);
}
@Test
public void testStringCircleSerialization() throws IOException {
Serializer<String, Circle> serializer = Serializers.flatBuffers().utf8();
Entry<String, Circle> a = Entries.entry("hello", Geometries.circle(1, 2, 3));
Entry<String, Circle> b = Entries.entry("there", Geometries.circle(3, 4, 5));
check(serializer, a, b);
}
@Test
public void testStringLineSerialization() throws IOException {
Serializer<String, Line> serializer = Serializers.flatBuffers().utf8();
Entry<String, Line> a = Entries.entry("hello", Geometries.line(1, 2, 3, 4));
Entry<String, Line> b = Entries.entry("there", Geometries.line(3, 4, 5, 6));
check(serializer, a, b);
}
@SuppressWarnings("unchecked")
@Test
public void testAddToFlatBuffers() throws IOException {
Entry<String, Point> a = Entries.entry("hello", Geometries.point(1, 2));
Entry<String, Point> b = Entries.entry("there", Geometries.point(3, 4));
Entry<String, Point> c = Entries.entry("you", Geometries.point(5, 6));
RTree<String, Point> tree = RTree.create();
tree = tree.add(a).add(b);
Serializer<String, Point> serializer = Serializers.flatBuffers().utf8();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
serializer.write(tree, bytes);
bytes.close();
byte[] array = bytes.toByteArray();
RTree<String, Point> tree2 = serializer.read(new ByteArrayInputStream(array), array.length,
InternalStructure.SINGLE_ARRAY);
tree2 = tree2.add(c);
assertEquals(Sets.newHashSet(a, b, c),
Sets.newHashSet(tree2.entries().toList().toBlocking().single()));
}
@SuppressWarnings("unchecked")
@Test
public void testDeleteFromFlatBuffers() throws IOException {
Entry<String, Point> a = Entries.entry("hello", Geometries.point(1, 2));
Entry<String, Point> b = Entries.entry("there", Geometries.point(3, 4));
RTree<String, Point> tree = RTree.create();
tree = tree.add(a).add(b);
Serializer<String, Point> serializer = Serializers.flatBuffers().utf8();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
serializer.write(tree, bytes);
bytes.close();
byte[] array = bytes.toByteArray();
RTree<String, Point> tree2 = serializer.read(new ByteArrayInputStream(array), array.length,
InternalStructure.SINGLE_ARRAY);
tree2 = tree2.delete(a);
assertEquals(Sets.newHashSet(b),
Sets.newHashSet(tree2.entries().toList().toBlocking().single()));
}
@SuppressWarnings("unchecked")
@Test
public void testAddToFlatBuffersWhenRootNodeIsNonLeaf() throws IOException {
Entry<String, Point> a = Entries.entry("hello", Geometries.point(1, 2));
Entry<String, Point> b = Entries.entry("there", Geometries.point(3, 4));
Entry<String, Point> c = Entries.entry("you", Geometries.point(5, 6));
Entry<String, Point> d = Entries.entry("smart", Geometries.point(7, 8));
Entry<String, Point> e = Entries.entry("person", Geometries.point(9, 10));
RTree<String, Point> tree = RTree.create();
tree = tree.add(a).add(b).add(c).add(d).add(e);
Serializer<String, Point> serializer = Serializers.flatBuffers().utf8();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
serializer.write(tree, bytes);
bytes.close();
byte[] array = bytes.toByteArray();
RTree<String, Point> tree2 = serializer.read(new ByteArrayInputStream(array), array.length,
InternalStructure.SINGLE_ARRAY);
tree2 = tree2.add(c);
assertEquals(Sets.newHashSet(a, b, c, d, e),
Sets.newHashSet(tree2.entries().toList().toBlocking().single()));
}
@SuppressWarnings("unchecked")
@Test
public void testDeleteFromFlatBuffersWhenRootNodeIsNonLeaf() throws IOException {
Entry<String, Point> a = Entries.entry("hello", Geometries.point(1, 2));
Entry<String, Point> b = Entries.entry("there", Geometries.point(3, 4));
Entry<String, Point> c = Entries.entry("you", Geometries.point(5, 6));
Entry<String, Point> d = Entries.entry("smart", Geometries.point(7, 8));
Entry<String, Point> e = Entries.entry("person", Geometries.point(9, 10));
RTree<String, Point> tree = RTree.create();
tree = tree.add(a).add(b).add(c).add(d).add(e);
Serializer<String, Point> serializer = Serializers.flatBuffers().utf8();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
serializer.write(tree, bytes);
bytes.close();
byte[] array = bytes.toByteArray();
RTree<String, Point> tree2 = serializer.read(new ByteArrayInputStream(array), array.length,
InternalStructure.SINGLE_ARRAY);
tree2 = tree2.delete(b);
assertEquals(Sets.newHashSet(a, c, d, e),
Sets.newHashSet(tree2.entries().toList().toBlocking().single()));
}
@Test
public void canRoundTripEmptyTree() throws IOException {
RTree<String, Point> tree = RTree.create();
Serializer<String, Point> serializer = Serializers.flatBuffers().utf8();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
serializer.write(tree, bytes);
bytes.close();
byte[] array = bytes.toByteArray();
RTree<String, Point> tree2 = serializer.read(new ByteArrayInputStream(array), array.length,
InternalStructure.SINGLE_ARRAY);
assertTrue(tree2.isEmpty());
}
private static void checkRoundTripPoint(Serializer<String, Point> serializer)
throws IOException {
Entry<String, Point> a = Entries.entry("hello", Geometries.point(1, 2));
Entry<String, Point> b = Entries.entry("there", Geometries.point(3, 4));
check(serializer, a, b);
}
@SuppressWarnings("unchecked")
private static <S extends Geometry> void check(Serializer<String, S> serializer,
Entry<String, S> a, Entry<String, S> b) throws IOException {
RTree<String, S> tree = RTree.create();
tree = tree.add(a).add(b);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
serializer.write(tree, bytes);
bytes.close();
{
ByteArrayInputStream input = new ByteArrayInputStream(bytes.toByteArray());
RTree<String, S> tree2 = serializer.read(input, bytes.size(),
InternalStructure.DEFAULT);
assertEquals(2, tree2.size());
assertEquals(Sets.newHashSet(a, b),
Sets.newHashSet(tree2.entries().toList().toBlocking().single()));
}
{
ByteArrayInputStream input = new ByteArrayInputStream(bytes.toByteArray());
RTree<String, S> tree2 = serializer.read(input, bytes.size(),
InternalStructure.SINGLE_ARRAY);
assertEquals(2, tree2.size());
assertEquals(Sets.newHashSet(a, b),
Sets.newHashSet(tree2.entries().toList().toBlocking().single()));
}
}
@Test
public void isUtilityClass() {
Asserts.assertIsUtilityClass(Serializers.class);
}
}