1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 2002,2008 Oracle.  All rights reserved.
5 *
6 * $Id: PackedIntegerTest.java,v 1.5 2008/01/08 20:58:58 bostic Exp $
7 */
8
9package com.sleepycat.util.test;
10
11import com.sleepycat.util.PackedInteger;
12import junit.framework.Test;
13import junit.framework.TestCase;
14
15public class PackedIntegerTest extends TestCase
16{
17    static final long V119 = 119L;
18    static final long MAX_1 = 0xFFL;
19    static final long MAX_2 = 0xFFFFL;
20    static final long MAX_3 = 0xFFFFFFL;
21    static final long MAX_4 = 0xFFFFFFFFL;
22    static final long MAX_5 = 0xFFFFFFFFFFL;
23    static final long MAX_6 = 0xFFFFFFFFFFFFL;
24    static final long MAX_7 = 0xFFFFFFFFFFFFFFL;
25
26    public static void main(String[] args)
27        throws Exception {
28
29        junit.framework.TestResult tr =
30            junit.textui.TestRunner.run(suite());
31        if (tr.errorCount() > 0 ||
32            tr.failureCount() > 0) {
33            System.exit(1);
34        } else {
35            System.exit(0);
36        }
37    }
38
39    public static Test suite() {
40
41        return new PackedIntegerTest();
42    }
43
44    public PackedIntegerTest() {
45
46        super("PackedIntegerTest");
47    }
48
49    public void runTest() {
50
51        /* Packed int tests. */
52
53        testIntRange(-V119, V119, 1);
54
55        testIntRange(-MAX_1 - V119, -1 - V119, 2);
56        testIntRange(1 + V119, MAX_1 + V119, 2);
57
58        testIntRange(-MAX_2 - V119, -MAX_2 + 99, 3);
59        testIntRange(-MAX_1 - V119 - 99, -MAX_1 - V119 - 1, 3);
60        testIntRange(MAX_1 + V119 + 1, MAX_1 + V119 + 99, 3);
61        testIntRange(MAX_2 - 99, MAX_2 + V119, 3);
62
63        testIntRange(-MAX_3 - V119, -MAX_3 + 99, 4);
64        testIntRange(-MAX_2 - V119 - 99, -MAX_2 - V119 - 1, 4);
65        testIntRange(MAX_2 + V119 + 1, MAX_2 + V119 + 99, 4);
66        testIntRange(MAX_3 - 99, MAX_3 + V119, 4);
67
68        testIntRange(Integer.MIN_VALUE, Integer.MIN_VALUE + 99, 5);
69        testIntRange(Integer.MAX_VALUE - 99, Integer.MAX_VALUE, 5);
70
71        /* Packed long tests. */
72
73        testLongRange(-V119, V119, 1);
74
75        testLongRange(-MAX_1 - V119, -1 - V119, 2);
76        testLongRange(1 + V119, MAX_1 + V119, 2);
77
78        testLongRange(-MAX_2 - V119, -MAX_2 + 99, 3);
79        testLongRange(-MAX_1 - V119 - 99, -MAX_1 - V119 - 1, 3);
80        testLongRange(MAX_1 + V119 + 1, MAX_1 + V119 + 99, 3);
81        testLongRange(MAX_2 - 99, MAX_2 + V119, 3);
82
83        testLongRange(-MAX_3 - V119, -MAX_3 + 99, 4);
84        testLongRange(-MAX_2 - V119 - 99, -MAX_2 - V119 - 1, 4);
85        testLongRange(MAX_2 + V119 + 1, MAX_2 + V119 + 99, 4);
86        testLongRange(MAX_3 - 99, MAX_3 + V119, 4);
87
88        testLongRange(-MAX_4 - V119, -MAX_4 + 99, 5);
89        testLongRange(-MAX_3 - V119 - 99, -MAX_3 - V119 - 1, 5);
90        testLongRange(MAX_3 + V119 + 1, MAX_3 + V119 + 99, 5);
91        testLongRange(MAX_4 - 99, MAX_4 + V119, 5);
92
93        testLongRange(-MAX_5 - V119, -MAX_5 + 99, 6);
94        testLongRange(-MAX_4 - V119 - 99, -MAX_4 - V119 - 1, 6);
95        testLongRange(MAX_4 + V119 + 1, MAX_4 + V119 + 99, 6);
96        testLongRange(MAX_5 - 99, MAX_5 + V119, 6);
97
98        testLongRange(-MAX_6 - V119, -MAX_6 + 99, 7);
99        testLongRange(-MAX_5 - V119 - 99, -MAX_5 - V119 - 1, 7);
100        testLongRange(MAX_5 + V119 + 1, MAX_5 + V119 + 99, 7);
101        testLongRange(MAX_6 - 99, MAX_6 + V119, 7);
102
103        testLongRange(-MAX_7 - V119, -MAX_7 + 99, 8);
104        testLongRange(-MAX_6 - V119 - 99, -MAX_6 - V119 - 1, 8);
105        testLongRange(MAX_6 + V119 + 1, MAX_6 + V119 + 99, 8);
106        testLongRange(MAX_7 - 99, MAX_7 + V119, 8);
107
108        testLongRange(Long.MIN_VALUE, Long.MIN_VALUE + 99, 9);
109        testLongRange(Long.MAX_VALUE - 99, Long.MAX_VALUE - 1, 9);
110    }
111
112    private void testIntRange(long firstValue,
113                              long lastValue,
114                              int bytesExpected) {
115
116        byte[] buf = new byte[1000];
117        int off = 0;
118
119        for (long longI = firstValue; longI <= lastValue; longI += 1) {
120            int i = (int) longI;
121            int before = off;
122            off = PackedInteger.writeInt(buf, off, i);
123            int bytes = off - before;
124            if (bytes != bytesExpected) {
125                fail("output of value=" + i + " bytes=" + bytes +
126                     " bytesExpected=" + bytesExpected);
127            }
128            bytes = PackedInteger.getWriteIntLength(i);
129            if (bytes != bytesExpected) {
130                fail("count of value=" + i + " bytes=" + bytes +
131                     " bytesExpected=" + bytesExpected);
132            }
133        }
134
135        off = 0;
136
137        for (long longI = firstValue; longI <= lastValue; longI += 1) {
138            int i = (int) longI;
139            int bytes = PackedInteger.getReadIntLength(buf, off);
140            if (bytes != bytesExpected) {
141                fail("count of value=" + i + " bytes=" + bytes +
142                     " bytesExpected=" + bytesExpected);
143            }
144            int value = PackedInteger.readInt(buf, off);
145            if (value != i) {
146                fail("input of value=" + i + " but got=" + value);
147            }
148            off += bytes;
149        }
150    }
151
152    private void testLongRange(long firstValue,
153                               long lastValue,
154                               int bytesExpected) {
155
156        byte[] buf = new byte[2000];
157        int off = 0;
158
159        for (long longI = firstValue; longI <= lastValue; longI += 1) {
160            long i = longI;
161            int before = off;
162            off = PackedInteger.writeLong(buf, off, i);
163            int bytes = off - before;
164            if (bytes != bytesExpected) {
165                fail("output of value=" + i + " bytes=" + bytes +
166                     " bytesExpected=" + bytesExpected);
167            }
168            bytes = PackedInteger.getWriteLongLength(i);
169            if (bytes != bytesExpected) {
170                fail("count of value=" + i + " bytes=" + bytes +
171                     " bytesExpected=" + bytesExpected);
172            }
173        }
174
175        off = 0;
176
177        for (long longI = firstValue; longI <= lastValue; longI += 1) {
178            long i = longI;
179            int bytes = PackedInteger.getReadLongLength(buf, off);
180            if (bytes != bytesExpected) {
181                fail("count of value=" + i + " bytes=" + bytes +
182                     " bytesExpected=" + bytesExpected);
183            }
184            long value = PackedInteger.readLong(buf, off);
185            if (value != i) {
186                fail("input of value=" + i + " but got=" + value);
187            }
188            off += bytes;
189        }
190    }
191}
192