Skip to content

Commit 850c4e2

Browse files
committed
Add DirectBufferProxyTest
1 parent 654a5bc commit 850c4e2

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package org.lmdbjava;
2+
3+
import java.nio.ByteOrder;
4+
import java.util.Comparator;
5+
import java.util.HashSet;
6+
import java.util.LinkedHashMap;
7+
import java.util.Random;
8+
import java.util.Set;
9+
import org.agrona.DirectBuffer;
10+
import org.agrona.MutableDirectBuffer;
11+
import org.agrona.concurrent.UnsafeBuffer;
12+
import org.assertj.core.api.Assertions;
13+
import org.junit.jupiter.api.Test;
14+
15+
class DirectBufferProxyTest {
16+
17+
@Test
18+
public void verifyComparators_int() {
19+
final Random random = new Random(203948);
20+
final MutableDirectBuffer buffer1native = new UnsafeBuffer(new byte[Integer.BYTES]);
21+
final MutableDirectBuffer buffer2native = new UnsafeBuffer(new byte[Integer.BYTES]);
22+
final MutableDirectBuffer buffer1be = new UnsafeBuffer(new byte[Integer.BYTES]);
23+
final MutableDirectBuffer buffer2be = new UnsafeBuffer(new byte[Integer.BYTES]);
24+
final int[] values = random.ints().filter(i -> i >= 0).limit(5_000_000).toArray();
25+
26+
final LinkedHashMap<CompareType, Comparator<DirectBuffer>> comparators = new LinkedHashMap<>();
27+
comparators.put(CompareType.INTEGER_KEY, DirectBufferProxy::compareAsIntegerKeys);
28+
comparators.put(CompareType.LEXICOGRAPHIC, DirectBufferProxy::compareLexicographically);
29+
30+
final LinkedHashMap<CompareType, ComparatorResult> results =
31+
new LinkedHashMap<>(comparators.size());
32+
final Set<ComparatorResult> uniqueResults = new HashSet<>(comparators.size());
33+
34+
for (int i = 1; i < values.length; i++) {
35+
final int val1 = values[i - 1];
36+
final int val2 = values[i];
37+
buffer1native.putInt(0, val1, ByteOrder.nativeOrder());
38+
buffer2native.putInt(0, val2, ByteOrder.nativeOrder());
39+
buffer1be.putInt(0, val1, ByteOrder.BIG_ENDIAN);
40+
buffer2be.putInt(0, val2, ByteOrder.BIG_ENDIAN);
41+
42+
uniqueResults.clear();
43+
44+
// Make sure all comparators give the same result for the same inputs
45+
comparators.forEach(
46+
(compareType, comparator) -> {
47+
final ComparatorResult result;
48+
// IntegerKey comparator expects keys to have been written in native order so need
49+
// different buffers.
50+
if (compareType == CompareType.INTEGER_KEY) {
51+
result = TestUtils.compare(comparator, buffer1native, buffer2native);
52+
} else {
53+
result = TestUtils.compare(comparator, buffer1be, buffer2be);
54+
}
55+
results.put(compareType, result);
56+
uniqueResults.add(result);
57+
});
58+
59+
if (uniqueResults.size() != 1) {
60+
Assertions.fail(
61+
"Comparator mismatch for values: " + val1 + " and " + val2 + ". Results: " + results);
62+
}
63+
}
64+
}
65+
66+
@Test
67+
public void verifyComparators_long() {
68+
final Random random = new Random(203948);
69+
final MutableDirectBuffer buffer1native = new UnsafeBuffer(new byte[Long.BYTES]);
70+
final MutableDirectBuffer buffer2native = new UnsafeBuffer(new byte[Long.BYTES]);
71+
final MutableDirectBuffer buffer1be = new UnsafeBuffer(new byte[Long.BYTES]);
72+
final MutableDirectBuffer buffer2be = new UnsafeBuffer(new byte[Long.BYTES]);
73+
final long[] values = random.longs().filter(i -> i >= 0).limit(5_000_000).toArray();
74+
75+
final LinkedHashMap<CompareType, Comparator<DirectBuffer>> comparators = new LinkedHashMap<>();
76+
comparators.put(CompareType.INTEGER_KEY, DirectBufferProxy::compareAsIntegerKeys);
77+
comparators.put(CompareType.LEXICOGRAPHIC, DirectBufferProxy::compareLexicographically);
78+
79+
final LinkedHashMap<CompareType, ComparatorResult> results =
80+
new LinkedHashMap<>(comparators.size());
81+
final Set<ComparatorResult> uniqueResults = new HashSet<>(comparators.size());
82+
83+
for (int i = 1; i < values.length; i++) {
84+
final long val1 = values[i - 1];
85+
final long val2 = values[i];
86+
buffer1native.putLong(0, val1, ByteOrder.nativeOrder());
87+
buffer2native.putLong(0, val2, ByteOrder.nativeOrder());
88+
buffer1be.putLong(0, val1, ByteOrder.BIG_ENDIAN);
89+
buffer2be.putLong(0, val2, ByteOrder.BIG_ENDIAN);
90+
91+
uniqueResults.clear();
92+
93+
// Make sure all comparators give the same result for the same inputs
94+
comparators.forEach(
95+
(compareType, comparator) -> {
96+
final ComparatorResult result;
97+
// IntegerKey comparator expects keys to have been written in native order so need
98+
// different buffers.
99+
if (compareType == CompareType.INTEGER_KEY) {
100+
result = TestUtils.compare(comparator, buffer1native, buffer2native);
101+
} else {
102+
result = TestUtils.compare(comparator, buffer1be, buffer2be);
103+
}
104+
results.put(compareType, result);
105+
uniqueResults.add(result);
106+
});
107+
108+
if (uniqueResults.size() != 1) {
109+
Assertions.fail(
110+
"Comparator mismatch for values: " + val1 + " and " + val2 + ". Results: " + results);
111+
}
112+
}
113+
}
114+
}

0 commit comments

Comments
 (0)