List<int[]> merged = MapList.coalesceRanges(ranges);
assertEquals(1, merged.size());
assertArrayEquals(new int[] { 1, 7 }, merged.get(0));
+ // verify input list is unchanged
+ assertEquals(4, ranges.size());
+ assertArrayEquals(new int[] { 1, 3 }, ranges.get(0));
+ assertArrayEquals(new int[] { 4, 5 }, ranges.get(1));
+ assertArrayEquals(new int[] { 5, 5 }, ranges.get(2));
+ assertArrayEquals(new int[] { 5, 7 }, ranges.get(3));
// merging in reverse direction:
ranges.clear();
assertArrayEquals(new int[] { 1, 6 }, merged.get(0));
assertArrayEquals(new int[] { 12, 7 }, merged.get(1));
}
+
+ /**
+ * Test the method that merges a list of ranges where possible
+ */
+ @Test(groups = { "Functional" })
+ public void testCoalesceRanges_withOverlap()
+ {
+ List<int[]> ranges = new ArrayList<int[]>();
+ ranges.add(new int[] { 1, 3 });
+ ranges.add(new int[] { 2, 5 });
+
+ /*
+ * [2, 5] should extend [1, 3]
+ */
+ List<int[]> merged = MapList.coalesceRanges(ranges);
+ assertEquals(1, merged.size());
+ assertArrayEquals(new int[] { 1, 5 }, merged.get(0));
+
+ /*
+ * a subsumed interval should be dropped
+ */
+ ranges.clear();
+ ranges.add(new int[] { 1, 6 });
+ ranges.add(new int[] { 2, 4 });
+ merged = MapList.coalesceRanges(ranges);
+ assertEquals(1, merged.size());
+ assertArrayEquals(new int[] { 1, 6 }, merged.get(0));
+
+ ranges.clear();
+ ranges.add(new int[] { 1, 5 });
+ ranges.add(new int[] { 1, 6 });
+ merged = MapList.coalesceRanges(ranges);
+ assertEquals(1, merged.size());
+ assertArrayEquals(new int[] { 1, 6 }, merged.get(0));
+
+ /*
+ * merge duplicate ranges
+ */
+ ranges.clear();
+ ranges.add(new int[] { 1, 3 });
+ ranges.add(new int[] { 1, 3 });
+ merged = MapList.coalesceRanges(ranges);
+ assertEquals(1, merged.size());
+ assertArrayEquals(new int[] { 1, 3 }, merged.get(0));
+
+ /*
+ * reverse direction
+ */
+ ranges.clear();
+ ranges.add(new int[] { 9, 5 });
+ ranges.add(new int[] { 9, 4 });
+ ranges.add(new int[] { 8, 3 });
+ ranges.add(new int[] { 3, 2 });
+ ranges.add(new int[] { 1, 0 });
+ merged = MapList.coalesceRanges(ranges);
+ assertEquals(1, merged.size());
+ assertArrayEquals(new int[] { 9, 0 }, merged.get(0));
+ }
}