package water.util;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import water.TestUtil;
import java.util.Random;
public class IcedBitSetTest extends TestUtil {
@BeforeClass() public static void setup() { stall_till_cloudsize(1); }
static void check(IcedBitSet bs, int bitoff, Integer[] idx) {
String correct = "{";
if (bitoff > 0) {
correct += "..." + bitoff + " 0-bits... ";
}
for (int i=bitoff; i<bs.size(); ++i) {
if (ArrayUtils.find(idx, i) != -1) {
Assert.assertTrue(bs.contains(i));
correct +="1";
}
else {
Assert.assertTrue(!bs.contains(i));
correct +="0";
}
if ((i-bitoff+1)%8 == 0 && i != bs.size()-1) correct += " ";
}
correct += "}";
String s = bs.toString();
// System.out.println(s);
// System.out.println(correct);
Assert.assertTrue(s.equals(correct));
}
static void fill(IcedBitSet bs, Integer[] idx) {
Random rng = new Random();
for (int i = 0; i < idx.length; ++i) {
idx[i] = rng.nextInt(bs.size());
bs.set(idx[i]);
}
}
@Test public void fill8() {
int len = 8;
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 2)];
fill(bs, idx);
Assert.assertEquals(bs.size(), 32);
check(bs, 0, idx);
}
@Test public void fill17() {
int len = 17;
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 2)];
fill(bs, idx);
Assert.assertEquals(bs.size(), 32);
check(bs, 0, idx);
}
@Test public void fill16() {
int len = 16;
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 2)];
fill(bs, idx);
Assert.assertEquals(bs.size(), 32);
check(bs, 0, idx);
}
@Test public void fill32() {
int len = 32;
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 2)];
fill(bs, idx);
Assert.assertEquals(bs.size(), len);
check(bs, 0, idx);
}
@Test public void fill33() {
int len = 33;
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 2)];
fill(bs, idx);
Assert.assertEquals(bs.size(), Math.max(32,len));
check(bs, 0, idx);
}
@Test public void fillHalf() {
int len = 10 + (int) (10000 * new Random().nextDouble());
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 2)];
fill(bs, idx);
Assert.assertEquals(bs.size(), Math.max(32,len));
check(bs, 0, idx);
}
@Test (expected = AssertionError.class) public void outOfBounds() {
int len = 32 + (int) (10000 * new Random().nextDouble());
IcedBitSet bs = new IcedBitSet(len);
bs.set(len);
}
@Test public void fillSparse() {
int len = 10 + (int) (10000 * new Random().nextDouble());
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 200)];
fill(bs, idx);
Assert.assertEquals(bs.size(), Math.max(32,len));
check(bs, 0, idx);
}
@Test public void clear() {
int len = 10 + (int) (10000 * new Random().nextDouble());
IcedBitSet bs = new IcedBitSet(len);
Integer[] idx = new Integer[(int) Math.floor(len / 200)];
fill(bs, idx);
Assert.assertEquals(bs.size(), Math.max(32,len));
check(bs, 0, idx);
for( Integer I : idx) bs.clear(I);
check(bs, 0, new Integer[]{});
}
@Ignore
@Test public void bitOff() {
int len = 113 + (int) (10000 * new Random().nextDouble());
int bitoff = (int) (100 * new Random().nextDouble());
IcedBitSet bs = new IcedBitSet(len,bitoff);
Integer[] idx = new Integer[(int) Math.floor(len / 4)];
Random rng = new Random();
for (int i = 0; i < idx.length; ) {
int val = rng.nextInt(len);
if (val > bitoff) {
idx[i] = val;
bs.set(idx[i]);
++i;
}
}
Assert.assertEquals(bs.size(), len);
check(bs, bitoff, idx);
for( Integer I : idx ) bs.clear(I);
check(bs, bitoff, new Integer[]{});
}
}