2
* See the file LICENSE for redistribution information.
4
* Copyright (c) 2002, 2010 Oracle and/or its affiliates. All rights reserved.
9
package com.sleepycat.bind.tuple.test;
11
import junit.framework.Test;
12
import junit.framework.TestCase;
13
import junit.framework.TestSuite;
15
import com.sleepycat.bind.tuple.TupleOutput;
16
import com.sleepycat.util.test.SharedTestUtils;
21
public class TupleOrderingTest extends TestCase {
23
private TupleOutput out;
24
private byte[] prevBuf;
26
public static void main(String[] args) {
27
junit.framework.TestResult tr =
28
junit.textui.TestRunner.run(suite());
29
if (tr.errorCount() > 0 ||
30
tr.failureCount() > 0) {
37
public static Test suite() {
38
TestSuite suite = new TestSuite(TupleOrderingTest.class);
42
public TupleOrderingTest(String name) {
50
SharedTestUtils.printTestName("TupleOrderingTest." + getName());
51
out = new TupleOutput();
56
public void tearDown() {
58
/* Ensure that GC can cleanup. */
64
* Each tuple written must be strictly less than (by comparison of bytes)
65
* the tuple written just before it. The check() method compares bytes
66
* just written to those written before the previous call to check().
68
private void check() {
73
private void check(int dataIndex) {
75
byte[] buf = new byte[out.size()];
76
System.arraycopy(out.getBufferBytes(), out.getBufferOffset(),
78
if (prevBuf != null) {
80
int len = Math.min(prevBuf.length, buf.length);
81
boolean areEqual = true;
82
for (int i = 0; i < len; i += 1) {
83
int val1 = prevBuf[i] & 0xFF;
84
int val2 = buf[i] & 0xFF;
88
} else if (val1 > val2) {
94
if (prevBuf.length < buf.length) {
96
} else if (prevBuf.length > buf.length) {
98
errOffset = buf.length + 1;
101
if (errOffset != -1 || areEqual) {
102
StringBuffer msg = new StringBuffer();
103
if (errOffset != -1) {
104
msg.append("Left >= right at byte offset " + errOffset);
105
} else if (areEqual) {
106
msg.append("Bytes are equal");
108
throw new IllegalStateException();
110
msg.append("\nLeft hex bytes: ");
111
for (int i = 0; i < prevBuf.length; i += 1) {
113
int val = prevBuf[i] & 0xFF;
114
if ((val & 0xF0) == 0) {
117
msg.append(Integer.toHexString(val));
119
msg.append("\nRight hex bytes:");
120
for (int i = 0; i < buf.length; i += 1) {
122
int val = buf[i] & 0xFF;
123
if ((val & 0xF0) == 0) {
126
msg.append(Integer.toHexString(val));
128
if (dataIndex >= 0) {
129
msg.append("\nData index: " + dataIndex);
131
fail(msg.toString());
138
private void reset() {
144
public void testString() {
146
final String[] DATA = {
147
"", "\u0001", "\u0002",
148
"A", "a", "ab", "b", "bb", "bba",
150
new String(new char[] { 0x7F }),
151
new String(new char[] { 0x7F, 0 }),
152
new String(new char[] { 0xFF }),
153
new String(new char[] { Character.MAX_VALUE }),
155
for (int i = 0; i < DATA.length; i += 1) {
156
out.writeString(DATA[i]);
160
out.writeString("a");
162
out.writeString("a");
165
out.writeString("a");
167
out.writeString("a");
169
out.writeString("a");
170
out.writeString("b");
172
out.writeString("aa");
174
out.writeString("b");
178
public void testFixedString() {
180
final char[][] DATA = {
181
{}, {'a'}, {'a', 'b'}, {'b'}, {'b', 'b'}, {0x7F}, {0xFF},
183
for (int i = 0; i < DATA.length; i += 1) {
184
out.writeString(DATA[i]);
189
public void testChars() {
191
final char[][] DATA = {
192
{}, {0}, {'a'}, {'a', 0}, {'a', 'b'}, {'b'}, {'b', 'b'},
193
{0x7F}, {0x7F, 0}, {0xFF}, {0xFF, 0},
195
for (int i = 0; i < DATA.length; i += 1) {
196
out.writeChars(DATA[i]);
201
public void testBytes() {
203
final char[][] DATA = {
204
{}, {0}, {'a'}, {'a', 0}, {'a', 'b'}, {'b'}, {'b', 'b'},
207
for (int i = 0; i < DATA.length; i += 1) {
208
out.writeBytes(DATA[i]);
213
public void testBoolean() {
215
final boolean[] DATA = {
218
for (int i = 0; i < DATA.length; i += 1) {
219
out.writeBoolean(DATA[i]);
224
public void testUnsignedByte() {
229
for (int i = 0; i < DATA.length; i += 1) {
230
out.writeUnsignedByte(DATA[i]);
235
public void testUnsignedShort() {
238
0, 1, 0xFE, 0xFF, 0x800, 0x7FFF, 0xFFFF
240
for (int i = 0; i < DATA.length; i += 1) {
241
out.writeUnsignedShort(DATA[i]);
246
public void testUnsignedInt() {
248
final long[] DATA = {
249
0, 1, 0xFE, 0xFF, 0x800, 0x7FFF, 0xFFFF, 0x80000,
250
0x7FFFFFFF, 0x80000000, 0xFFFFFFFF
252
for (int i = 0; i < DATA.length; i += 1) {
253
out.writeUnsignedInt(DATA[i]);
258
public void testByte() {
260
final byte[] DATA = {
261
Byte.MIN_VALUE, Byte.MIN_VALUE + 1,
263
Byte.MAX_VALUE - 1, Byte.MAX_VALUE,
265
for (int i = 0; i < DATA.length; i += 1) {
266
out.writeByte(DATA[i]);
271
public void testShort() {
273
final short[] DATA = {
274
Short.MIN_VALUE, Short.MIN_VALUE + 1,
275
Byte.MIN_VALUE, Byte.MIN_VALUE + 1,
277
Byte.MAX_VALUE - 1, Byte.MAX_VALUE,
278
Short.MAX_VALUE - 1, Short.MAX_VALUE,
280
for (int i = 0; i < DATA.length; i += 1) {
281
out.writeShort(DATA[i]);
286
public void testInt() {
289
Integer.MIN_VALUE, Integer.MIN_VALUE + 1,
290
Short.MIN_VALUE, Short.MIN_VALUE + 1,
291
Byte.MIN_VALUE, Byte.MIN_VALUE + 1,
293
Byte.MAX_VALUE - 1, Byte.MAX_VALUE,
294
Short.MAX_VALUE - 1, Short.MAX_VALUE,
295
Integer.MAX_VALUE - 1, Integer.MAX_VALUE,
297
for (int i = 0; i < DATA.length; i += 1) {
298
out.writeInt(DATA[i]);
303
public void testLong() {
305
final long[] DATA = {
306
Long.MIN_VALUE, Long.MIN_VALUE + 1,
307
Integer.MIN_VALUE, Integer.MIN_VALUE + 1,
308
Short.MIN_VALUE, Short.MIN_VALUE + 1,
309
Byte.MIN_VALUE, Byte.MIN_VALUE + 1,
311
Byte.MAX_VALUE - 1, Byte.MAX_VALUE,
312
Short.MAX_VALUE - 1, Short.MAX_VALUE,
313
Integer.MAX_VALUE - 1, Integer.MAX_VALUE,
314
Long.MAX_VALUE - 1, Long.MAX_VALUE,
316
for (int i = 0; i < DATA.length; i += 1) {
317
out.writeLong(DATA[i]);
322
public void testFloat() {
324
// Only positive floats and doubles are ordered deterministically
326
final float[] DATA = {
327
0, Float.MIN_VALUE, 2 * Float.MIN_VALUE,
328
(float) 0.01, (float) 0.02, (float) 0.99,
329
1, (float) 1.01, (float) 1.02, (float) 1.99,
330
Byte.MAX_VALUE - 1, Byte.MAX_VALUE,
331
Short.MAX_VALUE - 1, Short.MAX_VALUE,
333
Long.MAX_VALUE / 2, Long.MAX_VALUE,
335
Float.POSITIVE_INFINITY,
338
for (int i = 0; i < DATA.length; i += 1) {
339
out.writeFloat(DATA[i]);
344
public void testDouble() {
346
// Only positive floats and doubles are ordered deterministically
348
final double[] DATA = {
349
0, Double.MIN_VALUE, 2 * Double.MIN_VALUE,
351
1, 1.001, 1.002, 1.999,
352
Byte.MAX_VALUE - 1, Byte.MAX_VALUE,
353
Short.MAX_VALUE - 1, Short.MAX_VALUE,
354
Integer.MAX_VALUE - 1, Integer.MAX_VALUE,
355
Long.MAX_VALUE / 2, Long.MAX_VALUE,
356
Float.MAX_VALUE, Double.MAX_VALUE,
357
Double.POSITIVE_INFINITY,
360
for (int i = 0; i < DATA.length; i += 1) {
361
out.writeDouble(DATA[i]);
366
public void testSortedFloat() {
368
final float[] DATA = {
369
Float.NEGATIVE_INFINITY,
385
2 * (- Float.MIN_VALUE),
405
Float.POSITIVE_INFINITY,
408
for (int i = 0; i < DATA.length; i += 1) {
409
out.writeSortedFloat(DATA[i]);
414
public void testSortedDouble() {
416
final double[] DATA = {
417
Double.NEGATIVE_INFINITY,
418
(- Double.MAX_VALUE),
434
2 * (- Double.MIN_VALUE),
435
(- Double.MIN_VALUE),
438
2 * Double.MIN_VALUE,
450
Integer.MAX_VALUE - 1,
456
Double.POSITIVE_INFINITY,
459
for (int i = 0; i < DATA.length; i += 1) {
460
out.writeSortedDouble(DATA[i]);
465
public void testPackedIntAndLong() {
466
/* Only packed int/long values from 0 to 630 are ordered correctly */
467
for (int i = 0; i <= 630; i += 1) {
468
out.writePackedInt(i);
472
for (int i = 0; i <= 630; i += 1) {
473
out.writePackedLong(i);