BUG-4803: fix MutableOffsetMap's insertion order
[yangtools.git] / common / util / src / test / java / org / opendaylight / yangtools / util / OffsetMapTest.java
index 5aef8d12c30f1b6f7495e346784d8f9425b34b44..578b87bc140828837f040e89d100dea5ee4e1f2d 100644 (file)
@@ -15,7 +15,7 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -30,6 +30,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import org.junit.Before;
 import org.junit.Test;
 
 public class OffsetMapTest {
@@ -40,9 +41,14 @@ public class OffsetMapTest {
         return (ImmutableOffsetMap<String, String>) ImmutableOffsetMap.copyOf(twoEntryMap);
     }
 
+    @Before
+    public void setup() {
+        OffsetMapCache.invalidateCache();
+    }
+
     @Test(expected=IllegalArgumentException.class)
     public void testWrongImmutableConstruction() {
-        new ImmutableOffsetMap<String, String>(Collections.<String, Integer>emptyMap(), new Object[1]);
+        new ImmutableOffsetMap.Ordered<String, String>(Collections.<String, Integer>emptyMap(), new String[1]);
     }
 
     @Test
@@ -98,15 +104,6 @@ public class OffsetMapTest {
         assertFalse(map.equals("string"));
     }
 
-    @Test
-    public void testImmutableCopyConstructor() {
-        final ImmutableOffsetMap<String, String> source = createMap();
-        final ImmutableOffsetMap<String, String> result = new ImmutableOffsetMap<>(source);
-
-        assertSame(source.offsets(), result.offsets());
-        assertSame(source.objects(), result.objects());
-    }
-
     @Test
     public void testImmutableGet() {
         final Map<String, String> map = createMap();
@@ -330,19 +327,16 @@ public class OffsetMapTest {
         mutable.put("k1", "v1");
 
         final ImmutableOffsetMap<String, String> result = (ImmutableOffsetMap<String, String>) mutable.toUnmodifiableMap();
-        assertEquals(source, result);
-
-        // Only offsets should be shared
-        assertSame(source.offsets(), result.offsets());
-        assertNotSame(source.objects(), result.objects());
+        assertTrue(source.equals(result));
+        assertTrue(result.equals(source));
 
-        // Iterator order needs to be preserved
-        assertTrue(Iterators.elementsEqual(source.entrySet().iterator(), result.entrySet().iterator()));
+        // Iterator order must not be preserved
+        assertFalse(Iterators.elementsEqual(source.entrySet().iterator(), result.entrySet().iterator()));
     }
 
     @Test
     public void testEmptyMutable() throws CloneNotSupportedException {
-        final MutableOffsetMap<String, String> map = new MutableOffsetMap<>();
+        final MutableOffsetMap<String, String> map = MutableOffsetMap.of();
         assertTrue(map.isEmpty());
 
         final Map<String, String> other = map.clone();
@@ -350,15 +344,6 @@ public class OffsetMapTest {
         assertNotSame(other, map);
     }
 
-    @Test
-    public void testMutableWithKeyset() {
-        final MutableOffsetMap<String, String> map = new MutableOffsetMap<>(ImmutableSet.of("k1", "k2"));
-        assertTrue(map.isEmpty());
-        assertTrue(map.keySet().isEmpty());
-        assertNull(map.get("k1"));
-        assertNull(map.remove("k2"));
-    }
-
     @Test
     public void testMutableToEmpty() {
         final MutableOffsetMap<String, String> mutable = createMap().toModifiableMap();
@@ -379,7 +364,7 @@ public class OffsetMapTest {
         final Map<String, String> result = mutable.toUnmodifiableMap();
 
         // Should devolve to a singleton
-        assertTrue(result instanceof ImmutableMap);
+        assertTrue(result instanceof SharedSingletonMap);
         assertEquals(ImmutableMap.of("k2", "v2"), result);
     }
 
@@ -417,14 +402,14 @@ public class OffsetMapTest {
         mutable.put("k3", "v3");
         mutable.put("k1", "v1");
 
-        assertEquals(ImmutableMap.of("k3", "v3"), mutable.newKeys());
+        assertEquals(ImmutableMap.of("k1", "v1", "k3", "v3"), mutable.newKeys());
 
         final Map<String, String> result = mutable.toUnmodifiableMap();
 
         assertTrue(result instanceof ImmutableOffsetMap);
         assertEquals(threeEntryMap, result);
         assertEquals(result, threeEntryMap);
-        assertTrue(Iterators.elementsEqual(threeEntryMap.entrySet().iterator(), result.entrySet().iterator()));
+        assertFalse(Iterators.elementsEqual(threeEntryMap.entrySet().iterator(), result.entrySet().iterator()));
     }
 
     @Test
@@ -469,10 +454,12 @@ public class OffsetMapTest {
         assertFalse(source.needClone());
         assertTrue(result.needClone());
 
-        // Creates a immutable view, which shares the array
+        // Forced copy, no cloning needed, but maps are equal
         final ImmutableOffsetMap<String, String> immutable = (ImmutableOffsetMap<String, String>) source.toUnmodifiableMap();
-        assertTrue(source.needClone());
-        assertSame(source.array(), immutable.objects());
+        assertFalse(source.needClone());
+        assertTrue(source.equals(immutable));
+        assertTrue(immutable.equals(source));
+        assertTrue(Iterables.elementsEqual(source.entrySet(), immutable.entrySet()));
     }
 
     @Test