package com.browseengine.bobo.util.test;
import junit.framework.TestCase;
import org.apache.lucene.search.DocIdSetIterator;
import com.browseengine.bobo.util.BigByteArray;
import com.browseengine.bobo.util.BigIntArray;
import com.browseengine.bobo.util.BigSegmentedArray;
import com.browseengine.bobo.util.BigShortArray;
import com.browseengine.bobo.util.LazyBigIntArray;
public class BigSegmentedArrayTest extends TestCase {
public static void testEmptyArray() {
emptyArrayTestHelper(new BigIntArray(0));
emptyArrayTestHelper(new BigByteArray(0));
emptyArrayTestHelper(new BigShortArray(0));
emptyArrayTestHelper(new LazyBigIntArray(0));
}
private static void emptyArrayTestHelper(BigSegmentedArray array) {
assertEquals(0, array.get(0));
assertEquals(0, array.size());
}
public static void testCountUp() {
countUpTestHelper(new BigIntArray(Short.MAX_VALUE * 2));
countUpTestHelper(new LazyBigIntArray(Short.MAX_VALUE * 2));
countUpTestHelper(new BigShortArray(Short.MAX_VALUE * 2));
countUpTestHelper(new BigByteArray(Short.MAX_VALUE * 2));
}
private static void countUpTestHelper(BigSegmentedArray array) {
initialize(array);
assertEquals(Short.MAX_VALUE * 2, array.size());
for (int i = 0; i < array.size(); i++) {
assertEquals(i % array.maxValue(), array.get(i));
}
}
public static void testFindValues() {
findValueHelper(new BigIntArray(Short.MAX_VALUE * 2));
findValueHelper(new LazyBigIntArray(Short.MAX_VALUE * 2));
findValueHelper(new BigShortArray(Short.MAX_VALUE * 2));
findValueHelper(new BigByteArray(Short.MAX_VALUE * 2));
}
private static void findValueHelper(BigSegmentedArray array) {
final int a = array.maxValue() / 16;
final int b = a * 2;
final int c = a * 3;
array.add(1000, a);
array.add(2000, b);
assertEquals(1000, array.findValue(a, 0, 2000));
assertEquals(DocIdSetIterator.NO_MORE_DOCS, array.findValue(a, 1001, 2000));
assertEquals(2000, array.findValue(b, 2000, 3000));
array.fill(c);
assertEquals(DocIdSetIterator.NO_MORE_DOCS, array.findValue(b, 2000, 3000));
assertEquals(4000, array.findValue(c, 4000, 4000));
}
public static void testFindValueRange() {
findValueRangeHelper(new BigIntArray(Short.MAX_VALUE * 2));
findValueRangeHelper(new LazyBigIntArray(Short.MAX_VALUE * 2));
findValueRangeHelper(new BigShortArray(Short.MAX_VALUE * 2));
findValueRangeHelper(new BigByteArray(Short.MAX_VALUE * 2));
}
private static void findValueRangeHelper(BigSegmentedArray array) {
final int a = array.maxValue() / 16;
final int b = a * 2;
final int d = a * 4;
final int e = a * 5;
array.add(10000, b);
assertEquals(DocIdSetIterator.NO_MORE_DOCS, array.findValueRange(d, e, 0, array.size()));
assertEquals(10000, array.findValueRange(a, e, 0, array.size()));
assertEquals(10000, array.findValueRange(a, e, 10000, array.size()));
assertEquals(10000, array.findValueRange(a, e, 0, 10000));
assertEquals(10000, array.findValueRange(a, b, 9000, 10100));
assertEquals(10000, array.findValueRange(b, e, 9000, 10000));
assertEquals(10000, array.findValueRange(b, b, 9000, 10000));
}
public static void testFill() {
fillTestHelper(new BigIntArray(Short.MAX_VALUE << 1));
fillTestHelper(new LazyBigIntArray(Short.MAX_VALUE << 1));
fillTestHelper(new BigShortArray(Short.MAX_VALUE << 1));
fillTestHelper(new BigByteArray(Short.MAX_VALUE << 1));
}
private static void fillTestHelper(BigSegmentedArray array) {
final int a = array.maxValue() / 4;
final int b = array.maxValue() / 2;
final int c = array.maxValue() - 1;
assertEquals(0, array.get(20000));
array.fill(a);
assertEquals(a, array.get(20000));
array.add(20000, b);
assertEquals(b, array.get(20000));
assertEquals(a, array.get(20001));
assertEquals(20000, array.findValue(b, 0, 21000));
array.fill(c);
assertEquals(c, array.get(20000));
assertEquals(c, array.get(40000));
assertEquals(c, array.get(0));
}
public static BigSegmentedArray initialize(BigSegmentedArray array) {
for (int i = 0; i < array.size(); i++) {
array.add(i, i % array.maxValue());
}
return array;
}
}