diff options
author | joel.leitch@gmail.com <joel.leitch@gmail.com@2534bb62-2c4b-0410-85e8-b5006b95c4ae> | 2013-05-03 15:13:30 +0000 |
---|---|---|
committer | joel.leitch@gmail.com <joel.leitch@gmail.com@2534bb62-2c4b-0410-85e8-b5006b95c4ae> | 2013-05-03 15:13:30 +0000 |
commit | a4c68cb7fff13fdc256855e64d5e52361635ad2f (patch) | |
tree | ca0dd89706527d205c498061b9515f21e7cd2d9f | |
parent | 713448c6714ea02aebed4b68964c377bda40f3e9 (diff) | |
download | android_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.java | 42 |
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"); |