Test to expose edge doubling and rehashing bug in LinkedHashTreeMap.
This commit is contained in:
parent
8e8bb9c688
commit
b88e0e9395
@ -20,12 +20,14 @@ import com.google.gson.common.MoreAsserts;
|
|||||||
import com.google.gson.internal.LinkedHashTreeMap.AvlBuilder;
|
import com.google.gson.internal.LinkedHashTreeMap.AvlBuilder;
|
||||||
import com.google.gson.internal.LinkedHashTreeMap.AvlIterator;
|
import com.google.gson.internal.LinkedHashTreeMap.AvlIterator;
|
||||||
import com.google.gson.internal.LinkedHashTreeMap.Node;
|
import com.google.gson.internal.LinkedHashTreeMap.Node;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
public final class LinkedHashTreeMapTest extends TestCase {
|
public final class LinkedHashTreeMapTest extends TestCase {
|
||||||
public void testIterationOrder() {
|
public void testIterationOrder() {
|
||||||
@ -73,12 +75,50 @@ public final class LinkedHashTreeMapTest extends TestCase {
|
|||||||
assertFalse(map.containsKey(new Object()));
|
assertFalse(map.containsKey(new Object()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testContainsNullKeyFails() {
|
public void testContainsNullKeyIsAlwaysFalse() {
|
||||||
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
||||||
map.put("a", "android");
|
map.put("a", "android");
|
||||||
assertFalse(map.containsKey(null));
|
assertFalse(map.containsKey(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testPutOverrides() throws Exception {
|
||||||
|
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
||||||
|
assertNull(map.put("d", "donut"));
|
||||||
|
assertNull(map.put("e", "eclair"));
|
||||||
|
assertNull(map.put("f", "froyo"));
|
||||||
|
assertEquals(3, map.size());
|
||||||
|
|
||||||
|
assertEquals("donut", map.get("d"));
|
||||||
|
assertEquals("donut", map.put("d", "done"));
|
||||||
|
assertEquals(3, map.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testEmptyStringValues() {
|
||||||
|
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
||||||
|
map.put("a", "");
|
||||||
|
assertTrue(map.containsKey("a"));
|
||||||
|
assertEquals("", map.get("a"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE that this does not happen every time, but given the below predictable random,
|
||||||
|
// this test will consistently fail (assuming the initial size is 16 and rehashing
|
||||||
|
// size remains at 3/4)
|
||||||
|
public void testForceDoublingAndRehash() throws Exception {
|
||||||
|
Random random = new Random(1367593214724L);
|
||||||
|
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
||||||
|
String[] keys = new String[1000];
|
||||||
|
for (int i = 0; i < keys.length; i++) {
|
||||||
|
keys[i] = Integer.toString(Math.abs(random.nextInt()), 36) + "-" + i;
|
||||||
|
map.put(keys[i], "" + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < keys.length; i++) {
|
||||||
|
String key = keys[i];
|
||||||
|
assertTrue(map.containsKey(key));
|
||||||
|
assertEquals("" + i, map.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testClear() {
|
public void testClear() {
|
||||||
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
|
||||||
map.put("a", "android");
|
map.put("a", "android");
|
||||||
|
Loading…
Reference in New Issue
Block a user