package org.limewire.collection; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import junit.framework.Test; import org.limewire.util.BaseTestCase; public class SparseIntSetTest extends BaseTestCase { public SparseIntSetTest(String name) { super(name); } public static Test suite() { return buildTestSuite(SparseIntSetTest.class); } public void testAdd() throws Exception { Set<Integer> sparseSet = new SparseIntSet(); assertTrue(sparseSet.add(5)); assertFalse(sparseSet.add(5)); assertTrue(sparseSet.contains(5)); assertEquals(1,sparseSet.size()); } public void testAddAll() throws Exception { Set<Integer> treeSet = new TreeSet<Integer>(); SparseIntSet sparseSet = new SparseIntSet(); // test addAll which doesn't modify any elements for (int i = 0; i < 1000; i++) { int random = (int)(Math.random() * 1000); treeSet.add(random); sparseSet.add(random); } int size = sparseSet.size(); assertFalse(sparseSet.addAll(treeSet)); assertEquals(size, sparseSet.size()); treeSet.clear(); sparseSet = new SparseIntSet(); // test that addAll from a SortedSet is optimized // and will not allocate more memory than needed for (int i = 0; i < 10; i++) treeSet.add(i); sparseSet.addAll(treeSet); assertEquals(10, sparseSet.size()); assertEquals(40, sparseSet.getActualMemoryUsed()); sparseSet.compact(); assertEquals(40, sparseSet.getActualMemoryUsed()); assertTrue(sparseSet.containsAll(treeSet)); // merge with 1 element extra treeSet.clear(); sparseSet = new SparseIntSet(); for (int i = 0; i < 10; i++) { if (i % 2 == 0) treeSet.add(i); //0, 2 .. 8 else sparseSet.add(i); // 1, 3 .. 9 } assertEquals(5, sparseSet.size()); assertEquals(5, treeSet.size()); assertTrue(sparseSet.addAll(treeSet)); assertEquals(10, sparseSet.size()); assertEquals(40, sparseSet.getActualMemoryUsed()); // merge small with big treeSet.clear(); sparseSet = new SparseIntSet(); for (int i = 0; i < 10; i+=2) // 0, 2, 4.. 8 sparseSet.add(i); for (int i = 5; i < 15; i++) // 5, 6, 7.. 14 treeSet.add(i); assertTrue(sparseSet.addAll(treeSet)); assertEquals(13, sparseSet.size()); assertTrue(sparseSet.containsAll(treeSet)); assertTrue(treeSet.addAll(sparseSet)); assertEquals(13, treeSet.size()); assertTrue(treeSet.containsAll(sparseSet)); // merge with empty treeSet.clear(); sparseSet = new SparseIntSet(); sparseSet.add(1); assertFalse(sparseSet.addAll(treeSet)); assertTrue(sparseSet.contains(1)); assertEquals(1, sparseSet.size()); // merge with bigger gaps treeSet.clear(); sparseSet = new SparseIntSet(); for (int i = 0; i < 25; i+=5) // 0, 5, 10, 15, 20 sparseSet.add(i); for (int i = 5; i < 15; i++) // 5, 6, 7.. 14 treeSet.add(i); assertTrue(sparseSet.addAll(treeSet)); assertEquals(13, sparseSet.size()); assertTrue(sparseSet.containsAll(treeSet)); assertTrue(treeSet.addAll(sparseSet)); assertEquals(13, treeSet.size()); assertTrue(treeSet.containsAll(sparseSet)); } public void testSortedProperty() throws Exception { Set<Integer> treeSet = new TreeSet<Integer>(); Set<Integer> sparseSet = new SparseIntSet(); for (int i = 0; i < 1000; i++) { int random = (int)(Math.random() * 1000); treeSet.add(random); sparseSet.add(random); } assertEquals(treeSet.size(),sparseSet.size()); assertTrue(treeSet.containsAll(sparseSet)); assertTrue(sparseSet.containsAll(treeSet)); Iterator<Integer> treeIterator = treeSet.iterator(); Iterator<Integer> sparseIterator = sparseSet.iterator(); for (int i = 0; i < treeSet.size(); i++) assertEquals(treeIterator.next(),sparseIterator.next()); } public void testRemoveAll() throws Exception { Set<Integer> treeSet = new TreeSet<Integer>(); Set<Integer> sparseSet = new SparseIntSet(); for (int i = 0; i < 1000; i++) sparseSet.add(i); assertEquals(1000,sparseSet.size()); for (int i = 900; i < 1000; i++) treeSet.add(i); assertTrue(sparseSet.removeAll(treeSet)); assertFalse(sparseSet.removeAll(treeSet)); assertEquals(900,sparseSet.size()); for (int i = 0; i < 900; i++) assertTrue(sparseSet.contains(i)); for (int i = 900; i < 1000; i++) assertFalse(sparseSet.contains(i)); } public void testRetainAll() throws Exception { Set<Integer> treeSet = new TreeSet<Integer>(); Set<Integer> sparseSet = new SparseIntSet(); for (int i = 0; i < 1000; i++) sparseSet.add(i); for (int i = 800; i < 900; i++) treeSet.add(i); assertTrue(sparseSet.retainAll(treeSet)); assertFalse(sparseSet.retainAll(treeSet)); for (int i = 0; i < 800; i++) assertFalse(sparseSet.contains(i)); for (int i = 800; i < 900; i++) assertTrue(sparseSet.contains(i)); for (int i = 900; i < 1000; i++) assertFalse(sparseSet.contains(i)); } public void testCompact() throws Exception { SparseIntSet sparseSet = new SparseIntSet(); for (int i = 0; i < 1000; i++) sparseSet.add(i); assertGreaterThan(4000, sparseSet.getActualMemoryUsed()); sparseSet.compact(); assertEquals(4000, sparseSet.getActualMemoryUsed()); } public void testNextSetBit() throws Exception { SparseIntSet sparseSet = new SparseIntSet(); for (int i = 0; i < 1000; i++) sparseSet.add(i); sparseSet.add(2000); assertEquals(999, sparseSet.nextSetBit(999)); assertEquals(2000, sparseSet.nextSetBit(1000)); assertEquals(2000, sparseSet.nextSetBit(2000)); assertEquals(-1, sparseSet.nextSetBit(2001)); } }