@Test
 public void removeIntervalsAndCacheDoesNothingWhenOtherIntervalsIsEmpty() {
   CompoundInterval ci = createCompoundIntervalWithoutRegister();
   ci.add(new MappedBasicInterval(DEFAULT_END + 1, DEFAULT_END + 2, null));
   ci.add(new MappedBasicInterval(DEFAULT_END + 2, DEFAULT_END + 3, null));
   CompoundInterval cached = ci.removeIntervalsAndCache(new CompoundInterval(null));
   assertThat(ci.size(), is(3));
   assertThat(cached.isEmpty(), is(true));
 }
 @Test
 public void removeIntervalsAndCacheWorksWhenOtherIntervalIsASubset() {
   CompoundInterval ci = createCompoundIntervalWithoutRegister();
   ci.add(new MappedBasicInterval(DEFAULT_END + 1, DEFAULT_END + 2, null));
   ci.add(new MappedBasicInterval(DEFAULT_END + 2, DEFAULT_END + 3, null));
   ci.add(new MappedBasicInterval(DEFAULT_END + 1, DEFAULT_END + 4, null));
   ci.add(new MappedBasicInterval(DEFAULT_BEGIN, DEFAULT_END + 1, null));
   CompoundInterval toRemove = new CompoundInterval(DEFAULT_END + 1, DEFAULT_END + 2, null);
   toRemove.add(new MappedBasicInterval(DEFAULT_BEGIN, DEFAULT_END, null));
   CompoundInterval cached = ci.removeIntervalsAndCache(toRemove);
   assertThat(cached.size(), is(2));
   assertThat(
       cached.contains(new MappedBasicInterval(DEFAULT_BEGIN, DEFAULT_END, null)), is(true));
   assertThat(
       cached.contains(new MappedBasicInterval(DEFAULT_END + 1, DEFAULT_END + 2, null)), is(true));
   assertThat(ci.size(), is(3));
   assertThat(
       ci.contains(new MappedBasicInterval(DEFAULT_BEGIN, DEFAULT_END + 1, null)), is(true));
   assertThat(
       ci.contains(new MappedBasicInterval(DEFAULT_END + 1, DEFAULT_END + 4, null)), is(true));
   assertThat(
       ci.contains(new MappedBasicInterval(DEFAULT_END + 2, DEFAULT_END + 3, null)), is(true));
 }
 @Test
 public void addNonIntersectingStopIntervalNeedNotBeInIntervalThatsMerged() {
   CompoundInterval ci = createCompoundIntervalWithoutRegister();
   CompoundInterval toMerge = new CompoundInterval(DEFAULT_END + 1, DEFAULT_END + 2, null);
   BasicInterval otherInterval = new BasicInterval(DEFAULT_END + 1, DEFAULT_END + 3);
   toMerge.add(otherInterval);
   BasicInterval otherInterval2 = new BasicInterval(DEFAULT_END + 2, DEFAULT_END + 4);
   toMerge.add(otherInterval2);
   BasicInterval stop = new BasicInterval(DEFAULT_END + 1, DEFAULT_END + 4);
   ci.addNonIntersectingInterval(toMerge, stop);
   assertThat(ci.size(), is(3));
   assertThat(ci.getLowerBound(), is(DEFAULT_BEGIN));
   assertThat(ci.getUpperBound(), is(DEFAULT_END + 3));
 }
 @Test
 public void addNonIntersectingSetAddsAllIntervalsInTheOtherCompoundInterval() {
   CompoundInterval ci = createCompoundIntervalWithoutRegister();
   CompoundInterval toMerge = new CompoundInterval(DEFAULT_END + 1, DEFAULT_END + 2, null);
   BasicInterval otherInterval = new BasicInterval(DEFAULT_END + 1, DEFAULT_END + 3);
   toMerge.add(otherInterval);
   BasicInterval otherInterval2 = new BasicInterval(DEFAULT_END + 2, DEFAULT_END + 4);
   toMerge.add(otherInterval2);
   BasicInterval stop = new BasicInterval(DEFAULT_END + 5, DEFAULT_END + 6);
   ci.addNonIntersectingInterval(toMerge, stop);
   assertThat(ci.size(), is(4));
   assertThat(ci.getLowerBound(), is(DEFAULT_BEGIN));
   assertThat(ci.getUpperBound(), is(DEFAULT_END + 4));
 }
 @Test
 public void copyStopsAtTheRightPointWhenRequired() {
   BasicInterval bi = new BasicInterval(DEFAULT_BEGIN, DEFAULT_END);
   CompoundInterval toCopy = new CompoundInterval(bi, null);
   BasicInterval bi2 = new BasicInterval(DEFAULT_END, DEFAULT_END + 1);
   BasicInterval bi3 = new BasicInterval(DEFAULT_END + 1, DEFAULT_END + 2);
   toCopy.add(bi2);
   toCopy.add(bi3);
   Register r = new Register(2);
   CompoundInterval copy = toCopy.copy(r, bi2);
   assertThat(copy.getRegister(), is(r));
   assertThat(copy.contains(bi), is(true));
   assertThat(copy.contains(bi2), is(true));
   assertThat(copy.contains(bi3), is(false));
   assertThat(copy.size(), is(2));
 }
 @Test
 public void copyCopiesAllIntervalsToNewCompoundIntervalWithRightRegister() {
   BasicInterval bi = new BasicInterval(DEFAULT_BEGIN, DEFAULT_END);
   CompoundInterval toCopy = new CompoundInterval(bi, null);
   BasicInterval bi2 = new BasicInterval(DEFAULT_END, DEFAULT_END + 1);
   BasicInterval bi3 = new BasicInterval(DEFAULT_END + 1, DEFAULT_END + 2);
   toCopy.add(bi2);
   toCopy.add(bi3);
   Register r = new Register(2);
   CompoundInterval copy = toCopy.copy(r);
   assertThat(copy.getRegister(), is(r));
   assertThat(copy.contains(bi), is(true));
   assertThat(copy.contains(bi2), is(true));
   assertThat(copy.contains(bi3), is(true));
   assertThat(copy.size(), is(3));
 }