package com.github.hoffart.dmap.test;
import static org.junit.Assert.*;
import com.github.hoffart.dmap.util.ByteArray;
import com.github.hoffart.dmap.util.ByteArrayUtils;
import com.github.hoffart.dmap.util.ByteUtils;
import org.junit.Assert;
import org.junit.Test;
public class ByteArrayUtilsTest {
@Test
public void testDirectKeyMatch() {
ByteArray[] keys = new ByteArray[10];
for(int i=0; i<keys.length; ++i) {
keys[i] = new ByteArray(ByteUtils.getBytes(i));
}
Assert.assertEquals(new ByteArray(ByteUtils.getBytes(5)), ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(5))));
}
@Test
public void testForTargetInRangeButNotMatchingAnyKeys() {
ByteArray[] keys = new ByteArray[5];
int value = 1;
// 1->(2,3,4), 5->(6,7,8), 9->(10,11,12), 13->(14,15,16), 17->(18,19,20,....)
for(int i=0; i<keys.length; ++i) {
keys[i] = new ByteArray(ByteUtils.getBytes(value));
value+=4;
}
assertEquals(new ByteArray(ByteUtils.getBytes(9)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(12))));
assertEquals(new ByteArray(ByteUtils.getBytes(5)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(8))));
}
@Test
public void testForTargetGreaterThanLastElement() {
ByteArray[] keys = new ByteArray[5];
int value = 1;
// 1->(2,3,4), 5->(6,7,8), 9->(10,11,12), 13->(14,15,16), 17->(18,19,20,....)
for(int i=0; i<keys.length; ++i) {
keys[i] = new ByteArray(ByteUtils.getBytes(value));
value+=4;
}
// In this case, the last blocks start key should be returned (though the block might not contain the actual key)
assertEquals(new ByteArray(ByteUtils.getBytes(17)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(50))));
}
@Test
public void testForTargetLessThanFirstElement() {
ByteArray[] keys = new ByteArray[5];
int value = 1;
// 1 - 17
for(int i=0; i<keys.length; ++i) {
keys[i] = new ByteArray(ByteUtils.getBytes(value+=4));
}
assertEquals(null,
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(0))));
}
@Test
public void testMoreScenarios() {
ByteArray[] keys = new ByteArray[8];
int value = 0;
// The keys are incremented by 32 = > 0,32,64,....224
for(int i=0;i<keys.length;i++) {
keys[i] = new ByteArray(ByteUtils.getBytes(value));
value+=32;
}
// any key less than 32 will be in block 1 starting with 0
assertEquals(new ByteArray(ByteUtils.getBytes(0)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(31))));
// any key >=32 and less than 64 will be in block 2 starting with 32
assertEquals(new ByteArray(ByteUtils.getBytes(32)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(32))));
assertEquals(new ByteArray(ByteUtils.getBytes(32)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(33))));
assertEquals(new ByteArray(ByteUtils.getBytes(32)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(63))));
// any key >= 64 and less than 96 will be in block 3 starting with 64
assertEquals(new ByteArray(ByteUtils.getBytes(64)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(64))));
assertEquals(new ByteArray(ByteUtils.getBytes(64)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(65))));
// any key >=96 and less than 128 will be in block 4 starting with 96
assertEquals(new ByteArray(ByteUtils.getBytes(96)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(96))));
assertEquals(new ByteArray(ByteUtils.getBytes(96)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(127))));
// any key >=128 and less than 160 will be in block 5 starting with 128
assertEquals(new ByteArray(ByteUtils.getBytes(128)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(128))));
assertEquals(new ByteArray(ByteUtils.getBytes(128)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(159))));
// any key >=192 and less than 224 will be in block 7 starting with 192
assertEquals(new ByteArray(ByteUtils.getBytes(192)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(223))));
// any key >=224 will be in the last block 8 starting with 224
assertEquals(new ByteArray(ByteUtils.getBytes(224)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(270))));
assertEquals(new ByteArray(ByteUtils.getBytes(224)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(1024))));
assertEquals(new ByteArray(ByteUtils.getBytes(224)),
ByteArrayUtils.findMaxElementLessThanTarget(keys, new ByteArray(ByteUtils.getBytes(1024*1024))));
}
}