/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support;
import java.util.Iterator;
import junit.framework.TestCase;
public class SparseBitmapTest extends TestCase {
public void testAdd() {
SparseBitmap s = new SparseBitmap();
s.add(0, 1);
assertTrue("Didn't contain 0->1 after adding range 0->1", s.contains(0, 1));
assertFalse("Contained 2 after adding range 0->1", s.contains(2, 2));
s.add(3,3);
assertFalse(s.contains(2, 2));
assertTrue(s.contains(3, 3));
assertFalse(s.contains(4, 4));
s.add(0, 5);
assertTrue(s.contains(0, 5));
s.add(10, 15);
assertTrue(s.contains(0, 5));
assertTrue(s.contains(10, 15));
try {
s.add(5, 0);
fail("Didn't throw when adding range 5->0");
} catch (IllegalArgumentException e) {}
assertTrue(s.contains(0, 5));
assertTrue(s.contains(10, 15));
}
public void testClear() {
SparseBitmap s = new SparseBitmap();
s.add(0, 2);
assertTrue(s.contains(1, 1));
s.clear();
assertFalse(s.contains(1, 1));
}
public void testRemove() {
SparseBitmap s = new SparseBitmap();
s.add(0,4);
s.add(10, 14);
assertTrue(s.contains(0, 4));
assertFalse(s.contains(5, 9));
assertTrue(s.contains(10, 14));
//Remove begining of one range
s.remove(10, 11);
assertTrue(s.contains(0, 4));
assertFalse(s.contains(5, 11));
assertTrue(s.contains(12, 14));
//Remove end of one range
s.remove(4, 4);
assertTrue(s.contains(0, 3));
assertFalse(s.contains(4, 11));
assertTrue(s.contains(12, 14));
//Remove empty range
s.remove(4,11);
assertTrue(s.contains(0, 3));
assertFalse(s.contains(4, 11));
assertTrue(s.contains(12, 14));
//Remove from two ranges
s.remove(3,12);
assertTrue(s.contains(0, 2));
assertFalse(s.contains(3, 12));
assertTrue(s.contains(13, 14));
}
public void testNotOverlapping() {
for (int a = 0; a <= 20; a++) {
for (int b = a; b <= 20; b++) {
SparseBitmap s = new SparseBitmap();
s.add(-10, -1);
s.add(3, 10);
s.add(12, 12);
s.add(14, 16);
s.add(17, 17);
s.add(19, 22);
assertEquals(6, s.notOverlapping(-10, 22));
final int notOverlapping = s.notOverlapping(a, b);
final int width = b - a + 1;
final int overlapping = width - notOverlapping;
assertTrue((notOverlapping == 0) == s.contains(a, b));
s.remove(a, b);
assertFalse(s.contains(a, b));
assertEquals(width, s.notOverlapping(a, b));
assertEquals(6 + overlapping, s.notOverlapping(-10, 22));
s.remove(a, b);
assertFalse(s.contains(a, b));
assertEquals(width, s.notOverlapping(a, b));
assertEquals(6 + overlapping, s.notOverlapping(-10, 22));
s.add(a, b);
assertTrue(s.contains(a, b));
assertEquals(0, s.notOverlapping(a, b));
assertEquals(6 - notOverlapping, s.notOverlapping(-10, 22));
s.add(a, b);
assertTrue(s.contains(a, b));
assertEquals(0, s.notOverlapping(a, b));
assertEquals(6 - notOverlapping, s.notOverlapping(-10, 22));
}
}
}
public void testContainsThrowsOnBadRange() {
SparseBitmap s = new SparseBitmap();
try {
s.contains(2, 1);
fail();
} catch (IllegalArgumentException e) {
//Expected
}
}
public void testCombineBackwards() {
SparseBitmap s = new SparseBitmap();
s.add(5, 10);
s.add(0, 5);
Iterator<int[]> it = s.iterator();
assertTrue(it.hasNext());
int[] range = it.next();
assertEquals(0, range[0]);
assertEquals(10, range[1]);
assertFalse(it.hasNext());
}
public void testCombineMiddle() {
SparseBitmap s = new SparseBitmap();
s.add(10, 15);
s.add(0, 5);
s.add(5, 10);
Iterator<int[]> it = s.iterator();
assertTrue(it.hasNext());
int[] range = it.next();
assertEquals(0, range[0]);
assertEquals(15, range[1]);
assertFalse(it.hasNext());
}
public void testCombineAdjacent() {
SparseBitmap s = new SparseBitmap();
s.add(10, 14);
s.add(0, 4);
s.add(5, 9);
Iterator<int[]> it = s.iterator();
assertTrue(it.hasNext());
int[] range = it.next();
assertEquals(0, range[0]);
assertEquals(14, range[1]);
assertFalse(it.hasNext());
}
public void testIteratorDoubleRemove() {
SparseBitmap s = new SparseBitmap();
s.add(1, 2);
s.remove(0, 3);
}
}