Skip to content

Commit 1fdf4cf

Browse files
authored
TreeSet/TreeMap should implement Cloneable and offer clone() (#10146)
Fixes #10145
1 parent 991b3be commit 1fdf4cf

File tree

4 files changed

+44
-16
lines changed

4 files changed

+44
-16
lines changed

user/super/com/google/gwt/emul/java/util/TreeMap.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* @param <K> key type
2929
* @param <V> value type
3030
*/
31-
public class TreeMap<K, V> extends AbstractNavigableMap<K, V> implements Serializable {
31+
public class TreeMap<K, V> extends AbstractNavigableMap<K, V> implements Serializable, Cloneable {
3232
/*
3333
* Implementation derived from public domain C implementation as of 5
3434
* September 2007 at:
@@ -502,6 +502,10 @@ public void clear() {
502502
size = 0;
503503
}
504504

505+
public Object clone() {
506+
return new TreeMap<K, V>(this);
507+
}
508+
505509
@Override
506510
public Comparator<? super K> comparator() {
507511
return Comparators.naturalOrderToNull(cmp);

user/super/com/google/gwt/emul/java/util/TreeSet.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
*
2727
* @param <E> element type.
2828
*/
29-
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Serializable {
29+
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Serializable,
30+
Cloneable {
3031

3132
/**
3233
* TreeSet is stored as a TreeMap of the requested type to a constant Boolean.
@@ -77,6 +78,10 @@ public void clear() {
7778
map.clear();
7879
}
7980

81+
public Object clone() {
82+
return new TreeSet(new TreeMap<E, Boolean>(map));
83+
}
84+
8085
@Override
8186
public Comparator<? super E> comparator() {
8287
return map.comparator();

user/test/com/google/gwt/emultest/java/util/TreeMapTest.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -281,21 +281,28 @@ public void testClear_throwsUnsupportedOperationException() {
281281

282282
/** Test method for 'java.lang.Object.clone()'. */
283283
public void testClone() {
284-
// Map<K, V> map = createMap();
284+
TreeMap<K, V> map = createTreeMap();
285285
// Check empty clone behavior
286-
// TODO (rlo) having .clone() in the code kills the test
287-
// SortedMap<K, V> clone = (SortedMap<K, V>)
288-
// map.clone();
289-
// assertNotNull(clone);
290-
// testEquivalent(map, clone);
291-
//
292-
// // Check non-empty clone behavior
293-
// map.put(KEY_1, getValues()[0]);
294-
// map.put(KEY_2, getValues()[1]);
295-
// map.put(KEY_3, getValues()[2]);
296-
// clone = (SortedMap<K, V>) map.clone();
297-
// assertNotNull(clone);
298-
// testEquivalent(map, clone);
286+
SortedMap<K, V> clone = (SortedMap<K, V>) map.clone();
287+
assertNotNull(clone);
288+
_assertEquals(map, clone);
289+
assertSame(map.comparator(), clone.comparator());
290+
291+
// Check non-empty clone behavior
292+
K[] keys = getKeys();
293+
V[] values = getValues();
294+
map.put(keys[0], values[0]);
295+
map.put(keys[1], values[1]);
296+
map.put(keys[2], values[2]);
297+
298+
// Ensure no shared state between original and clone
299+
assertFalse(map.equals(clone));
300+
301+
// Clone the non-empty map
302+
clone = (SortedMap<K, V>) map.clone();
303+
assertNotNull(clone);
304+
_assertEquals(map, clone);
305+
assertSame(map.comparator(), clone.comparator());
299306
}
300307

301308
/**

user/test/com/google/gwt/emultest/java/util/TreeSetTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,18 @@ public void testEquals() {
682682
assertFalse(set0.equals(set1));
683683
}
684684

685+
public void testSetClone() {
686+
TreeSet<E> set = createTreeSet();
687+
TreeSet<E> clone = (TreeSet<E>) set.clone();
688+
assertEquals(set, clone);
689+
690+
set.add(getKeys()[0]);
691+
assertFalse(set.equals(clone));
692+
693+
clone = (TreeSet<E>) set.clone();
694+
assertEquals(set, clone);
695+
}
696+
685697
/**
686698
* Test method for 'java.util.SortedSet.first()'.
687699
*

0 commit comments

Comments
 (0)