// compact (zero,two] and then (four,six]
mt.compact(tok(1));
mt.compact(tok(5));
assertEquals(6, mt.size());
assertEquals(new Range(tok(-1), tok(2)), mt.get(tok(2)));
assertEquals(new Range(tok(2), tok(3)), mt.get(tok(3)));
assertEquals(new Range(tok(3), tok(4)), mt.get(tok(4)));
assertEquals(new Range(tok(4), tok(6)), mt.get(tok(5)));
assertEquals(new Range(tok(6), tok(7)), mt.get(tok(7)));
assertEquals(new Range(tok(7), tok(-1)), mt.get(tok(-1)));
// compacted ranges should be at depth 2, and the rest at 3
for (int i : new int[]{2,6}){ assertEquals((byte)2, mt.get(tok(i)).depth); }
for (int i : new int[]{3,4,7,-1}){ assertEquals((byte)3, mt.get(tok(i)).depth); }
// compact (two,four] and then (six,zero]
mt.compact(tok(3));
mt.compact(tok(7));
assertEquals(4, mt.size());
assertEquals(new Range(tok(-1), tok(2)), mt.get(tok(2)));
assertEquals(new Range(tok(2), tok(4)), mt.get(tok(4)));
assertEquals(new Range(tok(4), tok(6)), mt.get(tok(5)));
assertEquals(new Range(tok(6), tok(-1)), mt.get(tok(-1)));
for (int i : new int[]{2,4,5,-1}){ assertEquals((byte)2, mt.get(tok(i)).depth); }
// compact (zero,four]
mt.compact(tok(2));
assertEquals(3, mt.size());
assertEquals(new Range(tok(-1), tok(4)), mt.get(tok(2)));
assertEquals(new Range(tok(4), tok(6)), mt.get(tok(6)));
assertEquals(new Range(tok(6), tok(-1)), mt.get(tok(-1)));
// compact (four, zero]
mt.compact(tok(6));
assertEquals(2, mt.size());
assertEquals(new Range(tok(-1), tok(4)), mt.get(tok(2)));
assertEquals(new Range(tok(4), tok(-1)), mt.get(tok(6)));
assertEquals((byte)1, mt.get(tok(2)).depth);
assertEquals((byte)1, mt.get(tok(6)).depth);
// compact (zero, zero] (the root)
mt.compact(tok(4));
assertEquals(1, mt.size());
assertEquals(new Range(tok(-1), tok(-1)), mt.get(tok(-1)));
assertEquals((byte)0, mt.get(tok(-1)).depth);
}