package org.limewire.collection; import java.util.List; import java.util.NoSuchElementException; import junit.framework.Test; import org.limewire.util.BaseTestCase; import org.limewire.util.PrivilegedAccessor; /** * Unit tests for <code>IntSet</code>. */ @SuppressWarnings("unchecked") 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)); add(s, newInterval(0)); // [0] assertEquals(-1, search(s, -1)); assertEquals(0, search(s, 0)); assertEquals(0, search(s, 1)); add(s, 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)); add(s, 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)); add(s, 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 testCopyConstructor() throws Exception { s1=new IntSet(); s1.add(1); s1.add(2); //[1-2] s2=new IntSet(s1); 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 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 testRemoveAll() throws Exception { s1=new TestingIntSet(); s1.add(1); s1.add(2); //[1-2] s2=new TestingIntSet(); s2.add(1); //[1] assertTrue(s1.removeAll(s2)); //s2 unchanged assertTrue(!s1.contains(1)); assertTrue(s1.contains(2)); assertTrue(!s2.removeAll(s1)); //s1 equals s2 assertTrue(!s1.contains(1)); assertTrue(s1.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[] { num }, new Class[] { int.class }); } private static Object newInterval(int num) throws Exception { Class interval = PrivilegedAccessor.getClass(IntSet.class, "Interval"); return PrivilegedAccessor.invokeConstructor(interval, new Object[] { num }, new Class[] { int.class }); } private static void add(IntSet set, Object o) throws Exception { List list = (List) PrivilegedAccessor.getValue(set, "list"); list.add(o); } /** * Checks invariants. */ private static class TestingIntSet extends IntSet { @Override public boolean add(int x) { try { repOk(); return super.add(x); } finally { repOk(); } } @Override public boolean remove(int x) { try { repOk(); return super.remove(x); } finally { repOk(); } } } }