package edu.stanford.nlp.util; import junit.framework.TestCase; import java.util.*; /** * Test for the interval tree * * @author Angel Chang */ public class IntervalTreeTest extends TestCase { private void checkOverlapping(Collection<Interval<Integer>> all, Collection<Interval<Integer>> overlapping, Interval<Integer> target) { for (Interval<Integer> interval: all) { assertNotNull(interval); } for (Interval<Integer> interval: overlapping) { assertTrue(interval.overlaps(target)); } List<Interval<Integer>> rest = new ArrayList<Interval<Integer>>(all); rest.removeAll(overlapping); for (Interval<Integer> interval: rest) { assertNotNull(interval); assertFalse("Should not overlap: " + interval + " with " + target, interval.overlaps(target)); } } public void testGetOverlapping() throws Exception { Interval<Integer> a = Interval.toInterval(249210699, 249212659); Interval<Integer> before = Interval.toInterval(249210000, 249210600); Interval<Integer> included = Interval.toInterval(249210800, 249212000); Interval<Integer> after = Interval.toInterval(249213000, 249214000); IntervalTree<Integer, Interval<Integer>> tree = new IntervalTree<Integer, Interval<Integer>>(); tree.add(a); List<Interval<Integer>> overlapping1 = tree.getOverlapping(before); assertTrue(overlapping1.isEmpty()); List<Interval<Integer>> overlapping2 = tree.getOverlapping(included); assertTrue(overlapping2.size() == 1); List<Interval<Integer>> overlapping3 = tree.getOverlapping(after); assertTrue(overlapping3.isEmpty()); // Remove a tree.remove(a); assertTrue(tree.size() == 0); int n = 20000; // Add a bunch of interval before adding a for (int i = 0; i < n; i++) { int x = i; int y = i+1; Interval<Integer> interval = Interval.toInterval(x,y); tree.add(interval); } tree.add(a); overlapping1 = tree.getOverlapping(before); assertTrue(overlapping1.isEmpty()); overlapping2 = tree.getOverlapping(included); assertTrue(overlapping2.size() == 1); overlapping3 = tree.getOverlapping(after); assertTrue(overlapping3.isEmpty()); assertTrue(tree.height() < 20); // Try balancing the tree // System.out.println("Height is " + tree.height()); tree.check(); tree.balance(); int height = tree.height(); assertTrue(height < 20); tree.check(); overlapping1 = tree.getOverlapping(before); assertTrue(overlapping1.isEmpty()); overlapping2 = tree.getOverlapping(included); assertTrue(overlapping2.size() == 1); overlapping3 = tree.getOverlapping(after); assertTrue(overlapping3.isEmpty()); // Clear tree tree.clear(); assertTrue(tree.size() == 0); // Add a bunch of random interval before adding a Random rand = new Random(); List<Interval<Integer>> list = new ArrayList<Interval<Integer>>(n+1); for (int i = 0; i < n; i++) { int x = rand.nextInt(); int y = rand.nextInt(); Interval<Integer> interval = Interval.toValidInterval(x,y); tree.add(interval); list.add(interval); } tree.add(a); list.add(a); overlapping1 = tree.getOverlapping(before); checkOverlapping(list, overlapping1, before); overlapping2 = tree.getOverlapping(included); checkOverlapping(list, overlapping2, included); overlapping3 = tree.getOverlapping(after); checkOverlapping(list, overlapping3, after); } public void testIteratorRandom() throws Exception { int n = 1000; IntervalTree<Integer, Interval<Integer>> tree = new IntervalTree<Integer, Interval<Integer>>(); Random rand = new Random(); List<Interval<Integer>> list = new ArrayList<Interval<Integer>>(n+1); for (int i = 0; i < n; i++) { int x = rand.nextInt(); int y = rand.nextInt(); Interval<Integer> interval = Interval.toValidInterval(x,y); tree.add(interval); list.add(interval); } Collections.sort(list); Interval<Integer> next = null; Iterator<Interval<Integer>> iterator = tree.iterator(); for (int i = 0; i < list.size(); i++) { assertTrue("HasItem " + i, iterator.hasNext()); next = iterator.next(); assertEquals("Item " + i, list.get(i), next); } assertFalse("No more items", iterator.hasNext()); } public void testIteratorOrdered() throws Exception { int n = 1000; IntervalTree<Integer, Interval<Integer>> tree = new IntervalTree<Integer, Interval<Integer>>(); List<Interval<Integer>> list = new ArrayList<Interval<Integer>>(n+1); for (int i = 0; i < n; i++) { int x = i; int y = i+1; Interval<Integer> interval = Interval.toValidInterval(x,y); tree.add(interval); list.add(interval); } Collections.sort(list); Interval<Integer> next = null; Iterator<Interval<Integer>> iterator = tree.iterator(); for (int i = 0; i < list.size(); i++) { assertTrue("HasItem " + i, iterator.hasNext()); next = iterator.next(); assertEquals("Item " + i, list.get(i), next); } assertFalse("No more items", iterator.hasNext()); } }