Skip to content

Commit b8de54d

Browse files
committed
Adds unit tests.
1 parent 0470c7a commit b8de54d

File tree

3 files changed

+77
-6
lines changed

3 files changed

+77
-6
lines changed

pom.xml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,15 +218,17 @@
218218
<classpathScope>test</classpathScope>
219219
<arguments>
220220
<argument>-classpath</argument>
221-
<classpath />
221+
<classpath/>
222222
<argument>-ea</argument>
223223
<argument>org.javimmutable.collections.stress_test.RunStressTests</argument>
224-
<!--
225224
<argument>&#45;&#45;test</argument>
226-
<argument>hashmap</argument>
227-
<argument>&#45;&#45;test</argument>
228-
<argument>hashset</argument>
229-
-->
225+
<argument>insertordermap</argument>
226+
<!--
227+
<argument>&#45;&#45;test</argument>
228+
<argument>hashmap</argument>
229+
<argument>&#45;&#45;test</argument>
230+
<argument>hashset</argument>
231+
-->
230232
</arguments>
231233
</configuration>
232234
</plugin>

src/main/java/org/javimmutable/collections/array/TrieLongArrayNode.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,23 @@ public GenericIterator.Iterable<JImmutableMap.Entry<Long, T>> entries()
120120
nodeIndex -> nodes[nodeIndex].entries());
121121
}
122122

123+
public void checkInvariants()
124+
{
125+
if (bitCount(valuesBitmask) != values.length) {
126+
throw new IllegalStateException(String.format("invalid bitmask for values array: bitmask=%s length=%d", Long.toBinaryString(valuesBitmask), values.length));
127+
}
128+
if (bitCount(nodesBitmask) != nodes.length) {
129+
throw new IllegalStateException(String.format("invalid bitmask for nodes array: bitmask=%s length=%d", Long.toBinaryString(nodesBitmask), nodes.length));
130+
}
131+
if (!checkChildShifts(shiftCount, nodes)) {
132+
throw new IllegalStateException("one or more nodes invalid for this branch");
133+
}
134+
final int computedSize = computeSize(nodes) + values.length;
135+
if (computedSize != size) {
136+
throw new IllegalStateException(String.format("size mismatch: size=%d computed=%d", size, computedSize));
137+
}
138+
}
139+
123140
private T getValueOrImpl(int shiftCountForValue,
124141
long index,
125142
T defaultValue)

src/test/java/org/javimmutable/collections/array/TrieLongArrayNodeTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,67 @@
22

33
import junit.framework.TestCase;
44
import org.javimmutable.collections.common.LongArrayMappedTrieMath;
5+
import org.javimmutable.collections.iterators.StandardIteratorTests;
56

7+
import java.util.ArrayList;
8+
import java.util.Collections;
9+
import java.util.List;
10+
import java.util.Map;
611
import java.util.Random;
12+
import java.util.TreeMap;
713

814
import static java.lang.Long.*;
915
import static org.javimmutable.collections.array.TrieLongArrayNode.flip;
1016

1117
public class TrieLongArrayNodeTest
1218
extends TestCase
1319
{
20+
public void testRandom()
21+
{
22+
final Random r = new Random(234567);
23+
final Map<Long, Integer> known = new TreeMap<>();
24+
final List<Long> indexes = new ArrayList<>();
25+
final List<Integer> values = new ArrayList<>();
26+
TrieLongArrayNode<Integer> array = TrieLongArrayNode.empty();
27+
int length = 7;
28+
for (int loop = 1; loop <= 5; ++loop) {
29+
for (Long index : new ArrayList<>(known.keySet())) {
30+
if (r.nextInt(3) == 1) {
31+
known.put(index, r.nextInt());
32+
}
33+
}
34+
for (int i = known.size(); i < length; ++i) {
35+
known.put(r.nextLong(), r.nextInt());
36+
}
37+
indexes.clear();
38+
indexes.addAll(known.keySet());
39+
for (Long index : indexes) {
40+
array = array.assign(index, known.get(index));
41+
}
42+
values.clear();
43+
values.addAll(known.values());
44+
45+
array.checkInvariants();
46+
StandardIteratorTests.listIteratorTest(indexes, array.keys().iterator());
47+
StandardIteratorTests.listIteratorTest(values, array.values().iterator());
48+
length = 17 * length;
49+
values.clear();
50+
}
51+
52+
Collections.shuffle(indexes, r);
53+
final int checkInterval = indexes.size() / 7;
54+
for (Long index : indexes) {
55+
known.remove(index);
56+
array = array.delete(index);
57+
if (known.size() % checkInterval == 0) {
58+
array.checkInvariants();
59+
StandardIteratorTests.listIteratorTest(new ArrayList<>(known.keySet()), array.keys().iterator());
60+
StandardIteratorTests.listIteratorTest(new ArrayList<>(known.values()), array.values().iterator());
61+
}
62+
}
63+
assertEquals(0, array.size());
64+
}
65+
1466
public void testFlip()
1567
{
1668
assertEquals(0L, flip(Long.MIN_VALUE));

0 commit comments

Comments
 (0)