package freenet.support;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.Random;
public class SortedIntSetTest extends TestCase {
private static final int[] SORTED_UNIQUE = new int[] {
/*0,*/ 1, 2, /*3,*/ 4, 5, 6, 7, 8, 9, 10, /*11,*/ 12, 13, 14, 15 /*, 16*/
};
private static final int[] NOT_IN_SET = new int[] {
0, 3, 11, 16
};
private final Random r = new Random(0);
public void testPush() {
int[] shuffled = shuffle(SORTED_UNIQUE);
SortedIntSet s = new SortedIntSet();
for (int i = 0; i < shuffled.length; i++) {
assertTrue(s.push(shuffled[i]));
int[] sortedPrefix = Arrays.copyOf(shuffled, i + 1);
Arrays.sort(sortedPrefix);
assertTrue(Arrays.equals(s.toIntArray(), sortedPrefix));
assertFalse(s.push(shuffled[i]));
assertTrue(Arrays.equals(s.toIntArray(), sortedPrefix));
}
}
public void testAdd() {
int[] shuffled = shuffle(SORTED_UNIQUE);
SortedIntSet s = new SortedIntSet();
for (int i = 0; i < shuffled.length; i++) {
s.add(shuffled[i]);
int[] sortedPrefix = Arrays.copyOf(shuffled, i + 1);
Arrays.sort(sortedPrefix);
assertTrue(Arrays.equals(s.toIntArray(), sortedPrefix));
try {
s.add(shuffled[i]);
fail("add() returned despite element already added");
} catch (IllegalArgumentException e) {
// Expected.
}
assertTrue(Arrays.equals(s.toIntArray(), sortedPrefix));
}
}
public void testRemove() {
int[] shuffled = shuffle(SORTED_UNIQUE);
SortedIntSet s = new SortedIntSet(SORTED_UNIQUE);
for (int i = shuffled.length - 1; i >= 0; i--) {
assertTrue(s.remove(shuffled[i]));
int[] sortedPrefix = Arrays.copyOf(shuffled, i);
Arrays.sort(sortedPrefix);
assertTrue(Arrays.equals(s.toIntArray(), sortedPrefix));
assertFalse(s.remove(shuffled[i]));
for (int x : NOT_IN_SET) {
assertFalse(s.remove(x));
}
assertTrue(Arrays.equals(s.toIntArray(), sortedPrefix));
}
}
public void testContains() {
int[] shuffled = shuffle(SORTED_UNIQUE);
SortedIntSet s = new SortedIntSet();
for (int x : shuffled) {
assertFalse(s.contains(x));
s.add(x);
assertTrue(s.contains(x));
}
shuffled = shuffle(SORTED_UNIQUE);
for (int x : shuffled) {
assertTrue(s.contains(x));
s.remove(x);
assertFalse(s.contains(x));
}
}
private int[] shuffle(int[] data) {
int[] result = Arrays.copyOf(data, data.length);
for (int i = 0; i < result.length; i++) {
int j = r.nextInt(result.length - i);
int t = result[i];
result[i] = result[j];
result[j] = t;
}
return result;
}
}