CavalliumDBEngine/src/test/java/it/cavallium/dbengine/database/collections/TestRanges.java

86 lines
2.8 KiB
Java
Raw Normal View History

2021-03-13 19:01:36 +01:00
package it.cavallium.dbengine.database.collections;
2022-10-02 03:09:50 +02:00
import io.netty5.buffer.Buffer;
import io.netty5.buffer.BufferAllocator;
import it.cavallium.dbengine.database.LLUtils;
2021-03-13 19:01:36 +01:00
import java.util.Arrays;
2021-08-31 15:50:11 +02:00
import org.junit.jupiter.api.AfterAll;
2021-03-13 19:01:36 +01:00
import org.junit.jupiter.api.Assertions;
2021-08-31 15:50:11 +02:00
import org.junit.jupiter.api.BeforeAll;
2021-03-13 19:01:36 +01:00
import org.junit.jupiter.api.Test;
public class TestRanges {
2021-08-31 15:50:11 +02:00
private static BufferAllocator alloc;
@BeforeAll
public static void beforeAll() {
alloc = BufferAllocator.offHeapPooled();
}
@AfterAll
public static void afterAll() {
alloc = BufferAllocator.offHeapPooled();
}
2021-03-13 19:01:36 +01:00
@Test
public void testNextRangeKey() {
testNextRangeKey(new byte[] {0x00, 0x00, 0x00});
testNextRangeKey(new byte[] {0x00, 0x00, 0x01});
testNextRangeKey(new byte[] {0x00, 0x00, 0x02});
testNextRangeKey(new byte[] {0x00, 0x01, 0x02});
testNextRangeKey(new byte[] {0x00, 0x00, (byte) 0xFF});
testNextRangeKey(new byte[] {0x00, 0x01, (byte) 0xFF});
testNextRangeKey(new byte[] {0x00, (byte) 0xFF, (byte) 0xFF});
2021-08-31 15:50:11 +02:00
}
@Test
public void testNextRangeKey2() {
2021-03-13 19:01:36 +01:00
testNextRangeKey(new byte[] {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF});
testNextRangeKey(new byte[] {(byte) 0xFF, (byte) 0, (byte) 0xFF});
testNextRangeKey(new byte[] {(byte) 0xFF, (byte) 0xFF, (byte) 0});
}
public void testNextRangeKey(byte[] prefixKey) {
2021-08-31 15:50:11 +02:00
byte[] firstRangeKey;
2021-11-08 16:33:41 +01:00
Buffer firstRangeKeyBuf = alloc.allocate(prefixKey.length).writeBytes(prefixKey);
try (firstRangeKeyBuf) {
DatabaseMapDictionaryDeep.firstRangeKey(firstRangeKeyBuf, prefixKey.length, 7, 3);
2021-08-31 15:50:11 +02:00
firstRangeKey = LLUtils.toArray(firstRangeKeyBuf);
}
byte[] nextRangeKey;
2021-11-08 16:33:41 +01:00
Buffer nextRangeKeyBuf = alloc.allocate(prefixKey.length).writeBytes(prefixKey);
try (nextRangeKeyBuf) {
DatabaseMapDictionaryDeep.nextRangeKey(nextRangeKeyBuf, prefixKey.length, 7, 3);
2021-08-31 15:50:11 +02:00
nextRangeKey = LLUtils.toArray(nextRangeKeyBuf);
}
2021-03-13 19:01:36 +01:00
if (Arrays.equals(prefixKey, new byte[] {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF})) {
2022-03-16 22:41:51 +01:00
org.assertj.core.api.Assertions
.assertThat(nextRangeKey)
.isEqualTo(new byte[]{(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0});
2021-03-13 19:01:36 +01:00
} else {
long biPrefix = 0;
var s = 0;
for (int i = prefixKey.length - 1; i >= 0; i--) {
biPrefix += ((long) (prefixKey[i] & 0xFF)) << s;
s += Byte.SIZE;
}
var nrPrefix = Arrays.copyOf(nextRangeKey, prefixKey.length);
long biNextPrefix = 0;
s = 0;
for (int i = prefixKey.length - 1; i >= 0; i--) {
biNextPrefix += ((long) (nrPrefix[i] & 0xFF)) << s;
s += Byte.SIZE;
}
Assertions.assertEquals(biPrefix + 1, biNextPrefix);
Assertions.assertArrayEquals(
new byte[7 + 3],
Arrays.copyOfRange(nextRangeKey, prefixKey.length, prefixKey.length + 7 + 3)
);
}
}
}