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();