X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=common%2Futil%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Futil%2FOffsetMapTest.java;h=fad44069e593a6a3270288b304fd0676da852212;hb=24d06767f3a0ead8152a745fb05eda1d4a37ba77;hp=d5df1ef80a753cb0042810f10eb2cccb6ba63402;hpb=d6a3c53995b12a7d46f08034d985188566e45000;p=yangtools.git diff --git a/common/util/src/test/java/org/opendaylight/yangtools/util/OffsetMapTest.java b/common/util/src/test/java/org/opendaylight/yangtools/util/OffsetMapTest.java index d5df1ef80a..fad44069e5 100644 --- a/common/util/src/test/java/org/opendaylight/yangtools/util/OffsetMapTest.java +++ b/common/util/src/test/java/org/opendaylight/yangtools/util/OffsetMapTest.java @@ -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 { @@ -37,18 +38,27 @@ public class OffsetMapTest { private final Map threeEntryMap = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3"); private ImmutableOffsetMap createMap() { - return (ImmutableOffsetMap) ImmutableOffsetMap.copyOf(twoEntryMap); + return (ImmutableOffsetMap) ImmutableOffsetMap.orderedCopyOf(twoEntryMap); + } + + private ImmutableOffsetMap unorderedMap() { + return (ImmutableOffsetMap) ImmutableOffsetMap.unorderedCopyOf(twoEntryMap); + } + + @Before + public void setup() { + OffsetMapCache.invalidateCache(); } @Test(expected=IllegalArgumentException.class) public void testWrongImmutableConstruction() { - new ImmutableOffsetMap(Collections.emptyMap(), new Object[1]); + new ImmutableOffsetMap.Ordered(Collections.emptyMap(), new String[1]); } @Test public void testCopyEmptyMap() { final Map source = Collections.emptyMap(); - final Map result = ImmutableOffsetMap.copyOf(source); + final Map result = ImmutableOffsetMap.orderedCopyOf(source); assertEquals(source, result); assertTrue(result instanceof ImmutableMap); @@ -57,10 +67,10 @@ public class OffsetMapTest { @Test public void testCopySingletonMap() { final Map source = Collections.singletonMap("a", "b"); - final Map result = ImmutableOffsetMap.copyOf(source); + final Map result = ImmutableOffsetMap.orderedCopyOf(source); assertEquals(source, result); - assertTrue(result instanceof ImmutableMap); + assertTrue(result instanceof SharedSingletonMap); } @Test @@ -71,14 +81,17 @@ public class OffsetMapTest { assertEquals(twoEntryMap, map); assertEquals(map, twoEntryMap); + // hashcode has to match + assertEquals(twoEntryMap.hashCode(), map.hashCode()); + // Iterator order needs to be preserved assertTrue(Iterators.elementsEqual(twoEntryMap.entrySet().iterator(), map.entrySet().iterator())); // Should result in the same object - assertSame(map, ImmutableOffsetMap.copyOf(map)); + assertSame(map, ImmutableOffsetMap.orderedCopyOf(map)); final Map mutable = map.toModifiableMap(); - final Map copy = ImmutableOffsetMap.copyOf(mutable); + final Map copy = ImmutableOffsetMap.orderedCopyOf(mutable); assertEquals(mutable, copy); assertEquals(map, copy); @@ -95,15 +108,6 @@ public class OffsetMapTest { assertFalse(map.equals("string")); } - @Test - public void testImmutableCopyConstructor() { - final ImmutableOffsetMap source = createMap(); - final ImmutableOffsetMap result = new ImmutableOffsetMap<>(source); - - assertSame(source.offsets(), result.offsets()); - assertSame(source.objects(), result.objects()); - } - @Test public void testImmutableGet() { final Map map = createMap(); @@ -326,6 +330,22 @@ public class OffsetMapTest { mutable.remove("k1"); mutable.put("k1", "v1"); + final ImmutableOffsetMap result = (ImmutableOffsetMap) mutable.toUnmodifiableMap(); + assertTrue(source.equals(result)); + assertTrue(result.equals(source)); + + // Iterator order must not be preserved + assertFalse(Iterators.elementsEqual(source.entrySet().iterator(), result.entrySet().iterator())); + } + + @Test + public void testReusedOffsetsUnordered() { + final ImmutableOffsetMap source = unorderedMap(); + final MutableOffsetMap mutable = source.toModifiableMap(); + + mutable.remove("k1"); + mutable.put("k1", "v1"); + final ImmutableOffsetMap result = (ImmutableOffsetMap) mutable.toUnmodifiableMap(); assertEquals(source, result); @@ -339,7 +359,7 @@ public class OffsetMapTest { @Test public void testEmptyMutable() throws CloneNotSupportedException { - final MutableOffsetMap map = new MutableOffsetMap<>(); + final MutableOffsetMap map = MutableOffsetMap.ordered(); assertTrue(map.isEmpty()); final Map other = map.clone(); @@ -347,15 +367,6 @@ public class OffsetMapTest { assertNotSame(other, map); } - @Test - public void testMutableWithKeyset() { - final MutableOffsetMap 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 mutable = createMap().toModifiableMap(); @@ -376,7 +387,7 @@ public class OffsetMapTest { final Map result = mutable.toUnmodifiableMap(); // Should devolve to a singleton - assertTrue(result instanceof ImmutableMap); + assertTrue(result instanceof SharedSingletonMap); assertEquals(ImmutableMap.of("k2", "v2"), result); } @@ -414,6 +425,24 @@ public class OffsetMapTest { mutable.put("k3", "v3"); mutable.put("k1", "v1"); + assertEquals(ImmutableMap.of("k1", "v1", "k3", "v3"), mutable.newKeys()); + + final Map result = mutable.toUnmodifiableMap(); + + assertTrue(result instanceof ImmutableOffsetMap); + assertEquals(threeEntryMap, result); + assertEquals(result, threeEntryMap); + assertFalse(Iterators.elementsEqual(threeEntryMap.entrySet().iterator(), result.entrySet().iterator())); + } + + @Test + public void testExpansionWithoutOrder() { + final MutableOffsetMap mutable = unorderedMap().toModifiableMap(); + + mutable.remove("k1"); + mutable.put("k3", "v3"); + mutable.put("k1", "v1"); + assertEquals(ImmutableMap.of("k3", "v3"), mutable.newKeys()); final Map result = mutable.toUnmodifiableMap(); @@ -466,6 +495,40 @@ public class OffsetMapTest { assertFalse(source.needClone()); assertTrue(result.needClone()); + // Forced copy, no cloning needed, but maps are equal + final ImmutableOffsetMap immutable = (ImmutableOffsetMap) 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 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 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()); + // Creates a immutable view, which shares the array final ImmutableOffsetMap immutable = (ImmutableOffsetMap) source.toUnmodifiableMap(); assertTrue(source.needClone()); @@ -524,6 +587,13 @@ public class OffsetMapTest { assertTrue(map.equals(source)); } + @Test + public void testMutableSimpleHashCode() { + final Map map = createMap().toModifiableMap(); + + assertEquals(twoEntryMap.hashCode(), map.hashCode()); + } + @Test public void testMutableIteratorBasics() { final MutableOffsetMap map = createMap().toModifiableMap();