aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoel.leitch@gmail.com <joel.leitch@gmail.com@2534bb62-2c4b-0410-85e8-b5006b95c4ae>2013-05-03 15:13:30 +0000
committerjoel.leitch@gmail.com <joel.leitch@gmail.com@2534bb62-2c4b-0410-85e8-b5006b95c4ae>2013-05-03 15:13:30 +0000
commita4c68cb7fff13fdc256855e64d5e52361635ad2f (patch)
treeca0dd89706527d205c498061b9515f21e7cd2d9f
parent713448c6714ea02aebed4b68964c377bda40f3e9 (diff)
downloadandroid_external_gson-a4c68cb7fff13fdc256855e64d5e52361635ad2f.tar.gz
android_external_gson-a4c68cb7fff13fdc256855e64d5e52361635ad2f.tar.bz2
android_external_gson-a4c68cb7fff13fdc256855e64d5e52361635ad2f.zip
Test to expose edge doubling and rehashing bug in LinkedHashTreeMap.
git-svn-id: http://google-gson.googlecode.com/svn/trunk/gson@1245 2534bb62-2c4b-0410-85e8-b5006b95c4ae
-rw-r--r--src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java b/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java
index 822afe96..2cc2b2b7 100644
--- a/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java
+++ b/src/test/java/com/google/gson/internal/LinkedHashTreeMapTest.java
@@ -20,12 +20,14 @@ import com.google.gson.common.MoreAsserts;
import com.google.gson.internal.LinkedHashTreeMap.AvlBuilder;
import com.google.gson.internal.LinkedHashTreeMap.AvlIterator;
import com.google.gson.internal.LinkedHashTreeMap.Node;
+
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
+import java.util.Random;
public final class LinkedHashTreeMapTest extends TestCase {
public void testIterationOrder() {
@@ -73,12 +75,50 @@ public final class LinkedHashTreeMapTest extends TestCase {
assertFalse(map.containsKey(new Object()));
}
- public void testContainsNullKeyFails() {
+ public void testContainsNullKeyIsAlwaysFalse() {
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
map.put("a", "android");
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() {
LinkedHashTreeMap<String, String> map = new LinkedHashTreeMap<String, String>();
map.put("a", "android");