package be.bagofwords.db;
import be.bagofwords.db.bloomfilter.LongBloomFilter;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class TestBloomFilter {
@Test
public void testBloomFilterHitRates() {
int numOfExamples = 10000000;
LongBloomFilter bloomFilter = new LongBloomFilter(numOfExamples, 0.05);
Random random = new Random(1204);
List<Long> posExamples = new ArrayList<>();
for (int i = 0; i < numOfExamples; i++) {
long randomVal = random.nextLong();
bloomFilter.put(randomVal);
posExamples.add(randomVal);
}
for (int i = 0; i < numOfExamples; i++) {
Assert.assertTrue(bloomFilter.mightContain(posExamples.get(i)));
}
int overClass = 0;
for (int i = 0; i < numOfExamples; i++) {
long randomVal = random.nextLong();
if (bloomFilter.mightContain(randomVal)) {
overClass++;
}
}
double actualFpp = overClass / (double) numOfExamples;
Assert.assertTrue(actualFpp < 0.1);
}
@Test
public void testBloomFilterLowNumbers() {
int numOfExamples = 1000000;
LongBloomFilter bloomFilter = new LongBloomFilter(numOfExamples, 0.05);
for (int i = 0; i < numOfExamples; i++) {
bloomFilter.put(i);
}
for (int i = 0; i < numOfExamples; i++) {
Assert.assertTrue(bloomFilter.mightContain(i));
}
int overClass = 0;
for (int i = numOfExamples; i < numOfExamples * 2; i++) {
if (bloomFilter.mightContain(i)) {
overClass++;
}
}
double actualFpp = overClass / (double) numOfExamples;
Assert.assertTrue(actualFpp < 0.1);
}
}