Fix TreeMap submaps where there are no keys in range.
Issue: 3360
Patch by: hayward.chan
Review by: jat, fabbott
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7282 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/util/TreeMap.java b/user/super/com/google/gwt/emul/java/util/TreeMap.java
index 43b810a..dd8a12f 100644
--- a/user/super/com/google/gwt/emul/java/util/TreeMap.java
+++ b/user/super/com/google/gwt/emul/java/util/TreeMap.java
@@ -466,7 +466,8 @@
} else {
node = getFirstNode();
}
- return node;
+ // The map is empty if the first key after fromKey is out of range.
+ return node != null && inRange(node.getKey()) ? node : null;
}
private Node<K, V> getLastSubmapNode() {
@@ -476,7 +477,8 @@
} else {
node = getLastNode();
}
- return node;
+ // The map is empty if the last key before toKey is out of range.
+ return node != null && inRange(node.getKey()) ? node : null;
}
private boolean inRange(K key) {
diff --git a/user/test/com/google/gwt/emultest/java/util/TreeMapStringStringTest.java b/user/test/com/google/gwt/emultest/java/util/TreeMapStringStringTest.java
index f140dd0..b958619 100644
--- a/user/test/com/google/gwt/emultest/java/util/TreeMapStringStringTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/TreeMapStringStringTest.java
@@ -17,17 +17,32 @@
import java.util.Iterator;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
-import java.util.Map.Entry;
/**
* Tests <code>TreeMap</code> with Strings and the natural comparator.
*/
public class TreeMapStringStringTest extends TreeMapTest<String, String> {
+ public void testHeadMapClear() {
+ TreeMap<String, String> map = new TreeMap<String, String>();
+ map.put("a", "value a");
+ map.put("b", "value b");
+ map.put("c", "value c");
+
+ SortedMap<String, String> headMap = map.headMap("b");
+ assertEquals("headMap.size", 1, headMap.size());
+ assertEquals("headMap.isEmpty", false, headMap.isEmpty());
+
+ headMap.clear();
+ assertEquals("headMap.size", 0, headMap.size());
+ assertEquals("headMap.isEmpty", true, headMap.isEmpty());
+ }
+
public void testHeadMapEqualsFirst() {
SortedMap<String, String> sortedMap = createKnownKeysMap();
SortedMap<String, String> subMap = sortedMap.headMap("aa");
@@ -70,6 +85,21 @@
assertEquals("lastKey", "bb", subMap.lastKey());
}
+ public void testSubMapClear() {
+ TreeMap<String, String> map = new TreeMap<String, String>();
+ map.put("a", "value a");
+ map.put("b", "value b");
+ map.put("c", "value c");
+
+ SortedMap<String, String> subMap = map.subMap("a", "c");
+ assertEquals("subMap.size", 2, subMap.size());
+ assertEquals("subMap.isEmpty", false, subMap.isEmpty());
+
+ subMap.clear();
+ assertEquals("subMap.size", 0, subMap.size());
+ assertEquals("subMap.isEmpty", true, subMap.isEmpty());
+ }
+
/**
* Tests that compositing submap operations function as expected.
*/
@@ -83,6 +113,21 @@
assertEquals("headMap(tailMap) should equal subMap", subMap1, subMap3);
assertEquals("headMap(tailMap) size", 2, subMap1.size());
}
+
+ public void testTailMapClear() {
+ TreeMap<String, String> map = new TreeMap<String, String>();
+ map.put("a", "value a");
+ map.put("b", "value b");
+ map.put("c", "value c");
+
+ SortedMap<String, String> tailMap = map.tailMap("b");
+ assertEquals("tailMap.size", 2, tailMap.size());
+ assertEquals("tailMap.isEmpty", false, tailMap.isEmpty());
+
+ tailMap.clear();
+ assertEquals("tailMap.size", 0, tailMap.size());
+ assertEquals("tailMap.isEmpty", true, tailMap.isEmpty());
+ }
public void testTailMapPastEnd() {
SortedMap<String, String> sortedMap = createKnownKeysMap();