package com.github.davidmoten.rtree;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import com.github.davidmoten.guavamini.Sets;
import com.github.davidmoten.rtree.geometry.Geometries;
import com.github.davidmoten.rtree.geometry.HasGeometry;
import com.github.davidmoten.rtree.geometry.ListPair;
import com.github.davidmoten.rtree.internal.Util;
import com.github.davidmoten.rtree.internal.util.Pair;
public class QuadraticSplitterTest {
@Test
public void testWorstCombinationOn3() {
final Mbr r1 = r(1);
final Mbr r2 = r(100);
final Mbr r3 = r(3);
final Pair<Mbr> pair = SplitterQuadratic.worstCombination(Arrays.asList(r1, r2, r3));
assertEquals(r1, pair.value1());
assertEquals(r2, pair.value2());
}
@Test
public void testWorstCombinationOnTwoEntries() {
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final Pair<Mbr> pair = SplitterQuadratic.worstCombination(Arrays.asList(r1, r2));
assertEquals(r1, pair.value1());
assertEquals(r2, pair.value2());
}
@Test
public void testWorstCombinationOn4() {
final Mbr r1 = r(2);
final Mbr r2 = r(1);
final Mbr r3 = r(3);
final Mbr r4 = r(4);
final Pair<Mbr> pair = SplitterQuadratic.worstCombination(Arrays.asList(r1, r2, r3, r4));
assertEquals(r2, pair.value1());
assertEquals(r4, pair.value2());
}
@Test
public void testGetBestCandidateForGroup1() {
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final List<Mbr> list = Collections.singletonList(r1);
final List<Mbr> group = Collections.singletonList(r2);
final Mbr r = SplitterQuadratic.getBestCandidateForGroup(list, group, Util.mbr(group));
assertEquals(r1, r);
}
@Test
public void testGetBestCandidateForGroup2() {
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final Mbr r3 = r(10);
final List<Mbr> list = Collections.singletonList(r1);
final List<Mbr> group = Arrays.asList(r2, r3);
final Mbr r = SplitterQuadratic.getBestCandidateForGroup(list, group, Util.mbr(group));
assertEquals(r1, r);
}
@Test
public void testGetBestCandidateForGroup3() {
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final Mbr r3 = r(10);
final List<Mbr> list = Arrays.asList(r1, r2);
final List<Mbr> group = Arrays.asList(r3);
final Mbr r = SplitterQuadratic.getBestCandidateForGroup(list, group, Util.mbr(group));
assertEquals(r2, r);
}
@Test
public void testSplit() {
final SplitterQuadratic q = new SplitterQuadratic();
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final Mbr r3 = r(100);
final Mbr r4 = r(101);
final ListPair<Mbr> pair = q.split(Arrays.asList(r1, r2, r3, r4), 2);
assertEquals(Sets.newHashSet(r1, r2), Sets.newHashSet(pair.group1().list()));
assertEquals(Sets.newHashSet(r3, r4), Sets.newHashSet(pair.group2().list()));
}
@Test
public void testSplit2() {
final SplitterQuadratic q = new SplitterQuadratic();
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final Mbr r3 = r(100);
final Mbr r4 = r(101);
final Mbr r5 = r(103);
final ListPair<Mbr> pair = q.split(Arrays.asList(r1, r2, r3, r4, r5), 2);
assertEquals(Sets.newHashSet(r1, r2), Sets.newHashSet(pair.group1().list()));
assertEquals(Sets.newHashSet(r3, r4, r5), Sets.newHashSet(pair.group2().list()));
}
@Test
public void testSplit3() {
final SplitterQuadratic q = new SplitterQuadratic();
final Mbr r1 = r(1);
final Mbr r2 = r(2);
final Mbr r3 = r(100);
final Mbr r4 = r(101);
final Mbr r5 = r(103);
final Mbr r6 = r(104);
final ListPair<Mbr> pair = q.split(Arrays.asList(r1, r2, r3, r4, r5, r6), 3);
assertEquals(Sets.newHashSet(r1, r2, r3), Sets.newHashSet(pair.group1().list()));
assertEquals(Sets.newHashSet(r4, r5, r6), Sets.newHashSet(pair.group2().list()));
}
@Test(expected = RuntimeException.class)
public void testExceptionForSplitEmptyList() {
final SplitterQuadratic q = new SplitterQuadratic();
q.split(Collections.<HasGeometry> emptyList(), 3);
}
private static Mbr r(int n) {
return new Mbr(Geometries.rectangle(n, n, n + 1, n + 1));
}
}