forked from fast-pack/JavaFastPFOR
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTestUtils.java
More file actions
177 lines (156 loc) · 6.35 KB
/
Copy pathTestUtils.java
File metadata and controls
177 lines (156 loc) · 6.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package me.lemire.integercompression;
import java.util.Arrays;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Static utility methods for test.
*/
public class TestUtils {
/**
*
*/
@Test
public void testPacking() {
int[] outputarray = new int[32];
for(int b = 1; b < 32; ++b) {
int[] data = new int[32];
int[] newdata = new int[32];
int mask = (1<<b) -1;
for(int j = 0; j < data.length; ++j) {
data[j] = mask - (j % mask);
}
for(int n = 0; n <= 32; ++n) {
Arrays.fill(outputarray, 0);
int howmany = Util.pack(outputarray, 0, data,0, n, b);
if(howmany != Util.packsize(n, b)) throw new RuntimeException("bug "+n+" "+b);
Util.unpack(Arrays.copyOf(outputarray, howmany), 0, newdata,0, n, b);
for(int i = 0; i < n; ++i)
if(newdata[i] != data[i]) {
System.out.println(Arrays.toString(Arrays.copyOf(data, n)));
System.out.println(Arrays.toString(Arrays.copyOf(newdata,n)));
throw new RuntimeException("bug "+b+" "+n);
}
}
}
}
/**
*
*/
@Test
public void testPackingw() {
int[] outputarray = new int[32];
for(int b = 1; b < 32; ++b) {
int[] data = new int[32];
int[] newdata = new int[32];
int mask = (1<<b) -1;
for(int j = 0; j < data.length; ++j) {
data[j] = mask - (j % mask);
}
for(int n = 0; n <= 32; ++n) {
Arrays.fill(outputarray, 0);
int howmany = Util.packw(outputarray, 0, data, n, b);
if(howmany != Util.packsizew(n, b)) throw new RuntimeException("bug "+n+" "+b);
Util.unpackw(Arrays.copyOf(outputarray, howmany), 0, newdata, n, b);
for(int i = 0; i < n; ++i)
if(newdata[i] != data[i]) {
System.out.println(Arrays.toString(Arrays.copyOf(data, n)));
System.out.println(Arrays.toString(Arrays.copyOf(newdata,n)));
throw new RuntimeException("bug "+b+" "+n);
}
}
}
}
protected static void dumpIntArray(int[] data, String label) {
System.out.print(label);
for (int i = 0; i < data.length; ++i) {
if (i % 6 == 0) {
System.out.println();
}
System.out.format(" %1$11d", data[i]);
}
System.out.println();
}
protected static void dumpIntArrayAsHex(int[] data, String label) {
System.out.print(label);
for (int i = 0; i < data.length; ++i) {
if (i % 8 == 0) {
System.out.println();
}
System.out.format(" %1$08X", data[i]);
}
System.out.println();
}
/**
* Check that compress and uncompress keep original array.
*
* @param codec CODEC to test.
* @param orig original integers
*/
public static void assertSymmetry(IntegerCODEC codec, int... orig) {
// There are some cases that compressed array is bigger than original
// array. So output array for compress must be larger.
//
// Example:
// - VariableByte compresses an array like [ -1 ].
// - Composition compresses a short array.
final int EXTEND = 1;
int[] compressed = new int[orig.length + EXTEND];
IntWrapper c_inpos = new IntWrapper(0);
IntWrapper c_outpos = new IntWrapper(0);
codec.compress(orig, c_inpos, orig.length, compressed,
c_outpos);
assertTrue(c_outpos.get() <= orig.length + EXTEND);
// Uncompress an array.
int[] uncompressed = new int[orig.length];
IntWrapper u_inpos = new IntWrapper(0);
IntWrapper u_outpos = new IntWrapper(0);
codec.uncompress(compressed, u_inpos, c_outpos.get(),
uncompressed, u_outpos);
// Compare between uncompressed and orig arrays.
int[] target = Arrays.copyOf(uncompressed, u_outpos.get());
assertArrayEquals(orig, target);
}
protected static int[] compress(IntegerCODEC codec, int[] data) {
int[] outBuf = new int[data.length * 4];
IntWrapper inPos = new IntWrapper();
IntWrapper outPos = new IntWrapper();
codec.compress(data, inPos, data.length, outBuf, outPos);
return Arrays.copyOf(outBuf, outPos.get());
}
protected static int[] uncompress(IntegerCODEC codec, int[] data, int len) {
int[] outBuf = new int[len + 1024];
IntWrapper inPos = new IntWrapper();
IntWrapper outPos = new IntWrapper();
codec.uncompress(data, inPos, data.length, outBuf, outPos);
return Arrays.copyOf(outBuf, outPos.get());
}
protected static byte[] compress(ByteIntegerCODEC codec, int[] data) {
byte[] outBuf = new byte[data.length * 4 * 4];
IntWrapper inPos = new IntWrapper();
IntWrapper outPos = new IntWrapper();
codec.compress(data, inPos, data.length, outBuf, outPos);
return Arrays.copyOf(outBuf, outPos.get());
}
protected static int[] uncompress(ByteIntegerCODEC codec, byte[] data, int len) {
int[] outBuf = new int[len + 1024];
IntWrapper inPos = new IntWrapper();
IntWrapper outPos = new IntWrapper();
codec.uncompress(data, inPos, data.length, outBuf, outPos);
return Arrays.copyOf(outBuf, outPos.get());
}
protected static int[] compressHeadless(SkippableIntegerCODEC codec, int[] data) {
int[] outBuf = new int[data.length * 4];
IntWrapper inPos = new IntWrapper();
IntWrapper outPos = new IntWrapper();
codec.headlessCompress(data, inPos, data.length, outBuf, outPos);
return Arrays.copyOf(outBuf, outPos.get());
}
protected static int[] uncompressHeadless(SkippableIntegerCODEC codec, int[] data, int len) {
int[] outBuf = new int[len + 1024];
IntWrapper inPos = new IntWrapper();
IntWrapper outPos = new IntWrapper();
codec.headlessUncompress(data, inPos, data.length, outBuf, outPos,len);
if(outPos.get() < len) throw new RuntimeException("Insufficient output.");
return Arrays.copyOf(outBuf, outPos.get());
}
}