package com.limegroup.gnutella.util;
import java.util.NoSuchElementException;
import junit.framework.Test;
/**
* Unit tests for IntSet
*/
public class IntSetTest extends BaseTestCase {
IntSet s, s1, s2;
public IntSetTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(IntSetTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testSearch() throws Exception {
//Test search(..) by manually modifying the rep. It's important to test
//even and odd length lists here.
s=new TestingIntSet();
assertEquals(-1, search(s, 0));
s.list.add(newInterval(0)); //[0]
assertEquals(-1, search(s, -1));
assertEquals(0, search(s, 0));
assertEquals(0, search(s, 1));
s.list.add(newInterval(10)); //[0, 10]
assertEquals(-1, search(s, -1));
assertEquals(0, search(s, 0));
assertEquals(0, search(s, 1));
assertEquals(1, search(s, 10));
assertEquals(1, search(s, 11));
s.list.add(newInterval(20)); //[0, 10, 20]
assertEquals(-1, search(s, -1));
assertEquals(0, search(s, 0));
assertEquals(0, search(s, 1));
assertEquals(1, search(s, 10));
assertEquals(1, search(s, 11));
assertEquals(2, search(s, 20));
assertEquals(2, search(s, 21));
s.list.add(newInterval(30)); //[0, 10, 20, 30]
assertEquals(-1, search(s, -1));
assertEquals(0, search(s, 0));
assertEquals(0, search(s, 9));
assertEquals(1, search(s, 10));
assertEquals(1, search(s, 19));
assertEquals(2, search(s, 20));
assertEquals(2, search(s, 29));
assertEquals(3, search(s, 30));
assertEquals(3, search(s, 31));
}
public void testAddAndContainsAtEndpoints() throws Exception {
//Test add/contains endpoint tests.
s=new TestingIntSet(); //[]
assertTrue(! s.contains(10));
assertTrue(s.add(10)); //[10]
assertEquals(1, s.size());
assertTrue(s.contains(10));
assertTrue(s.add(9)); //[9-10]
assertEquals(2, s.size());
assertTrue(s.contains(9));
assertTrue(s.contains(10));
assertTrue(s.add(7)); //[7, 9-10]
assertEquals(3, s.size());
assertTrue(s.contains(7));
assertTrue(s.contains(9));
assertTrue(s.contains(10));
assertTrue(s.add(11)); //[7, 9-11]
assertTrue(s.contains(7));
assertTrue(s.contains(9));
assertTrue(s.contains(10));
assertTrue(s.contains(11));
assertTrue(s.add(13)); //[7, 9-11, 13]
assertTrue(s.contains(7));
assertTrue(! s.contains(8));
assertTrue(s.contains(9));
assertTrue(s.contains(10));
assertTrue(s.contains(11));
assertTrue(!s.contains(12));
assertTrue(s.contains(13));
assertTrue(! s.add(7));
assertEquals(5, s.size());
assertTrue(!s.add(9));
assertEquals(5, s.size());
assertTrue(! s.add(10));
assertTrue(! s.add(11));
}
public void testAddAndContainsAtMiddle() throws Exception {
//Test add/contains middle tests.
s=new TestingIntSet();
s.add(0);
s.add(4); //[0, 4]
assertTrue(s.add(1)); //[0-1, 4]
assertTrue(s.contains(1));
assertTrue(s.add(3)); //[0-1, 3-4]
assertEquals(4, s.size());
assertTrue(s.contains(1));
assertTrue(s.contains(3));
assertTrue(s.add(2)); //[0-4]
assertTrue(s.contains(1));
assertTrue(s.contains(2));
assertTrue(s.contains(3));
assertTrue(s.contains(4));
s=new TestingIntSet();
s.add(0);
s.add(4); //[0, 4]
assertTrue(s.add(2)); //[0, 2, 4]
assertTrue(s.contains(2));
}
public void testRemove() throws Exception {
//Test remove methods.
s=new TestingIntSet();
s.add(1); s.add(2); s.add(3);
s.add(4); s.add(5); //[1-5]
assertTrue(!s.remove(6));
assertTrue(s.remove(1)); //[2-5]
assertEquals(4, s.size());
assertTrue(! s.contains(1));
assertTrue(s.contains(2));
assertTrue(s.contains(3));
assertTrue(s.contains(4));
assertTrue(s.contains(5));
assertTrue(s.remove(5)); //[2-4]
assertTrue(! s.contains(1));
assertTrue(s.contains(2));
assertTrue(s.contains(3));
assertTrue(s.contains(4));
assertTrue(! s.contains(5));
assertTrue(s.remove(3)); //[2,4]
assertTrue(s.size()==2);
assertTrue(! s.contains(1));
assertTrue(s.contains(2));
assertTrue(! s.contains(3));
assertTrue(s.contains(4));
assertTrue(! s.contains(5));
assertTrue(s.remove(2)); //[4]
assertTrue(! s.contains(1));
assertTrue(!s.contains(2));
assertTrue(! s.contains(3));
assertTrue(s.contains(4));
assertTrue(! s.contains(5));
assertTrue(s.remove(4)); //[]
assertTrue(! s.contains(1));
assertTrue(! s.contains(2));
assertTrue(! s.contains(3));
assertTrue(! s.contains(4));
assertTrue(! s.contains(5));
}
public void testIterator() throws Exception {
//Test iterator() method
s=new TestingIntSet();
IntSet.IntSetIterator iter=s.iterator();
assertTrue(! iter.hasNext());
s.add(1);
s.add(4); s.add(5);
s.add(7); s.add(8); s.add(9); //[1, 4-5, 7-9]
iter=s.iterator();
assertEquals(1, iter.next());
assertTrue(iter.hasNext());
assertEquals(4, iter.next());
assertEquals(5, iter.next());
assertEquals(7, iter.next());
assertEquals(8, iter.next());
assertEquals(9, iter.next());
assertTrue(! iter.hasNext());
try {
iter.next();
fail("no such element expected");
} catch (NoSuchElementException e) {
}
}
public void testAddAll() throws Exception {
//Test addAll method
s1=new TestingIntSet(); s1.add(1); s1.add(2); //[1-2]
s2=new TestingIntSet(); s2.add(1); //[1]
assertTrue(! s1.addAll(s2)); //s1 unchanged
assertTrue(s1.contains(1));
assertTrue(s1.contains(2));
assertTrue(s2.addAll(s1)); //s2 equals s1
assertTrue(s2.contains(1));
assertTrue(s2.contains(2));
}
public void testRetainAll() throws Exception {
//Test retainAll method
s1=new TestingIntSet(); s1.add(1); s1.add(2); //[1-2]
s2=new TestingIntSet(); s2.add(1); //[1]
assertTrue(! s2.retainAll(s1)); //s2 unchanged
assertTrue(s2.contains(1));
assertTrue(! s2.contains(2));
assertTrue(s1.retainAll(s2)); //s1 equals s2
assertTrue(s1.contains(1));
assertTrue(! s1.contains(2));
}
private static int search(IntSet s, int num) throws Exception {
return ((Integer)PrivilegedAccessor.invokeMethod(
s, "search", new Object[] {new Integer(num)},
new Class[] {int.class})).intValue();
}
private static Object newInterval(int num) throws Exception {
Class interval = PrivilegedAccessor.getClass(
IntSet.class, "Interval");
return PrivilegedAccessor.invokeConstructor(
interval, new Object[] { new Integer(num) },
new Class[] { int.class } );
}
/**
* Checks invariants.
*/
private static class TestingIntSet extends IntSet {
public boolean add(int x) {
try {
repOk();
return super.add(x);
} finally {
repOk();
}
}
public boolean remove(int x) {
try {
repOk();
return super.remove(x);
} finally {
repOk();
}
}
}
}