+ // Forced copy, no cloning needed, but maps are equal
+ final ImmutableOffsetMap<String, String> immutable = (ImmutableOffsetMap<String, String>) source.toUnmodifiableMap();
+ assertFalse(source.needClone());
+ assertTrue(source.equals(immutable));
+ assertTrue(immutable.equals(source));
+ assertTrue(Iterables.elementsEqual(source.entrySet(), immutable.entrySet()));
+ }
+
+ @Test
+ public void testCloneableFlippingUnordered() throws CloneNotSupportedException {
+ final MutableOffsetMap<String, String> source = unorderedMap().toModifiableMap();
+
+ // Must clone before mutation
+ assertTrue(source.needClone());
+
+ // Non-existent entry, should not clone
+ source.remove("non-existent");
+ assertTrue(source.needClone());
+
+ // Changes the array, should clone
+ source.remove("k1");
+ assertFalse(source.needClone());
+
+ // Create a clone of the map, which shares the array
+ final MutableOffsetMap<String, String> result = source.clone();
+ assertFalse(source.needClone());
+ assertTrue(result.needClone());
+ assertSame(source.array(), result.array());
+
+ // Changes the array, should clone
+ source.put("k1", "v2");
+ assertFalse(source.needClone());
+ assertTrue(result.needClone());
+