package the8472.test.bencode;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static the8472.utils.Functional.tap;
import java.util.stream.IntStream;
import org.junit.Test;
import lbms.plugins.mldht.kad.Key;
public class KeyTest {
@Test
public void testCompareTo() {
assertTrue(Key.MIN_KEY.compareTo(Key.MAX_KEY) < 0);
assertTrue(Key.MAX_KEY.compareTo(Key.MIN_KEY) > 0);
assertEquals(Key.MAX_KEY.compareTo(Key.MAX_KEY), 0);
assertTrue(Key.MIN_KEY.compareTo(Key.createRandomKey()) < 0);
}
@Test
public void testThreeWayDistance() {
Key rnd = Key.createRandomKey();
Key neighbor = new Key(tap(rnd.getHash(), b -> b[15] ^= 0x5a));
Key far = new Key(tap(rnd.getHash(), b -> b[13] ^= 0x01));
assertEquals(rnd.threeWayDistance(neighbor, far) , -1);
assertEquals(rnd.threeWayDistance(far, neighbor) , 1);
assertEquals(rnd.threeWayDistance(far, far) , 0);
assertEquals(rnd.threeWayDistance(neighbor, Key.MAX_KEY) , -1);
assertEquals(rnd.threeWayDistance(neighbor, Key.MIN_KEY) , -1);
assertEquals(rnd.threeWayDistance(far, Key.MAX_KEY) , -1);
assertEquals(rnd.threeWayDistance(far, Key.MIN_KEY) , -1);
assertEquals(rnd.threeWayDistance(Key.createRandomKey(), far) , 1);
assertEquals(rnd.threeWayDistance(Key.createRandomKey(), neighbor) , 1);
}
@Test
public void testLeadingBit() {
assertEquals(-1, Key.MIN_KEY.leadingOneBit());
assertEquals(13, Key.setBit(13).leadingOneBit());
}
@Test
public void testHashCode() {
int hammingWeights[] = IntStream.range(0, 512).map(i -> Integer.bitCount(Key.createRandomKey().hashCode())).sorted().toArray();
int median = hammingWeights[hammingWeights.length/2];
assertEquals(median, 16);
}
}