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 2cb5cce780..39662232c5 100644 --- a/user/super/com/google/gwt/emul/java/util/TreeMap.java +++ b/user/super/com/google/gwt/emul/java/util/TreeMap.java @@ -28,7 +28,7 @@ * @param key type * @param value type */ -public class TreeMap extends AbstractNavigableMap implements Serializable { +public class TreeMap extends AbstractNavigableMap implements Serializable, Cloneable { /* * Implementation derived from public domain C implementation as of 5 * September 2007 at: @@ -502,6 +502,10 @@ public void clear() { size = 0; } + public Object clone() { + return new TreeMap(this); + } + @Override public Comparator comparator() { return Comparators.naturalOrderToNull(cmp); diff --git a/user/super/com/google/gwt/emul/java/util/TreeSet.java b/user/super/com/google/gwt/emul/java/util/TreeSet.java index 3878578e2a..cf0b542908 100644 --- a/user/super/com/google/gwt/emul/java/util/TreeSet.java +++ b/user/super/com/google/gwt/emul/java/util/TreeSet.java @@ -26,7 +26,8 @@ * * @param element type. */ -public class TreeSet extends AbstractSet implements NavigableSet, Serializable { +public class TreeSet extends AbstractSet implements NavigableSet, Serializable, + Cloneable { /** * TreeSet is stored as a TreeMap of the requested type to a constant Boolean. @@ -77,6 +78,10 @@ public void clear() { map.clear(); } + public Object clone() { + return new TreeSet(new TreeMap(map)); + } + @Override public Comparator comparator() { return map.comparator(); diff --git a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java index 372a24887c..9f3c32cd02 100644 --- a/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java +++ b/user/test/com/google/gwt/emultest/java/util/TreeMapTest.java @@ -281,21 +281,28 @@ public void testClear_throwsUnsupportedOperationException() { /** Test method for 'java.lang.Object.clone()'. */ public void testClone() { - // Map map = createMap(); + TreeMap map = createTreeMap(); // Check empty clone behavior - // TODO (rlo) having .clone() in the code kills the test - // SortedMap clone = (SortedMap) - // map.clone(); - // assertNotNull(clone); - // testEquivalent(map, clone); - // - // // Check non-empty clone behavior - // map.put(KEY_1, getValues()[0]); - // map.put(KEY_2, getValues()[1]); - // map.put(KEY_3, getValues()[2]); - // clone = (SortedMap) map.clone(); - // assertNotNull(clone); - // testEquivalent(map, clone); + SortedMap clone = (SortedMap) map.clone(); + assertNotNull(clone); + _assertEquals(map, clone); + assertSame(map.comparator(), clone.comparator()); + + // Check non-empty clone behavior + K[] keys = getKeys(); + V[] values = getValues(); + map.put(keys[0], values[0]); + map.put(keys[1], values[1]); + map.put(keys[2], values[2]); + + // Ensure no shared state between original and clone + assertFalse(map.equals(clone)); + + // Clone the non-empty map + clone = (SortedMap) map.clone(); + assertNotNull(clone); + _assertEquals(map, clone); + assertSame(map.comparator(), clone.comparator()); } /** diff --git a/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java b/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java index b9cd81d12a..47f9ead331 100644 --- a/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java +++ b/user/test/com/google/gwt/emultest/java/util/TreeSetTest.java @@ -682,6 +682,18 @@ public void testEquals() { assertFalse(set0.equals(set1)); } + public void testSetClone() { + TreeSet set = createTreeSet(); + TreeSet clone = (TreeSet) set.clone(); + assertEquals(set, clone); + + set.add(getKeys()[0]); + assertFalse(set.equals(clone)); + + clone = (TreeSet) set.clone(); + assertEquals(set, clone); + } + /** * Test method for 'java.util.SortedSet.first()'. *