aboutsummaryrefslogtreecommitdiff
path: root/guava-gwt/test-super/com/google/common/collect/super/com/google/common/collect/ImmutableMapTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava-gwt/test-super/com/google/common/collect/super/com/google/common/collect/ImmutableMapTest.java')
-rw-r--r--guava-gwt/test-super/com/google/common/collect/super/com/google/common/collect/ImmutableMapTest.java530
1 files changed, 530 insertions, 0 deletions
diff --git a/guava-gwt/test-super/com/google/common/collect/super/com/google/common/collect/ImmutableMapTest.java b/guava-gwt/test-super/com/google/common/collect/super/com/google/common/collect/ImmutableMapTest.java
new file mode 100644
index 000000000..5acce3a23
--- /dev/null
+++ b/guava-gwt/test-super/com/google/common/collect/super/com/google/common/collect/ImmutableMapTest.java
@@ -0,0 +1,530 @@
+/*
+ * Copyright (C) 2008 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.collect;
+
+import com.google.common.annotations.GwtCompatible;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableMap.Builder;
+import com.google.common.collect.testing.AnEnum;
+import com.google.common.collect.testing.MapInterfaceTest;
+import com.google.common.collect.testing.MinimalSet;
+import com.google.common.collect.testing.SampleElements.Colliders;
+import com.google.common.testing.EqualsTester;
+
+import junit.framework.TestCase;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * Tests for {@link ImmutableMap}.
+ *
+ * @author Kevin Bourrillion
+ * @author Jesse Wilson
+ */
+@GwtCompatible(emulated = true)
+public class ImmutableMapTest extends TestCase {
+
+ public abstract static class AbstractMapTests<K, V>
+ extends MapInterfaceTest<K, V> {
+ public AbstractMapTests() {
+ super(false, false, false, false, false);
+ }
+
+ @Override protected Map<K, V> makeEmptyMap() {
+ throw new UnsupportedOperationException();
+ }
+
+ private static final Joiner joiner = Joiner.on(", ");
+
+ @Override protected void assertMoreInvariants(Map<K, V> map) {
+ // TODO: can these be moved to MapInterfaceTest?
+ for (Entry<K, V> entry : map.entrySet()) {
+ assertEquals(entry.getKey() + "=" + entry.getValue(),
+ entry.toString());
+ }
+
+ assertEquals("{" + joiner.join(map.entrySet()) + "}",
+ map.toString());
+ assertEquals("[" + joiner.join(map.entrySet()) + "]",
+ map.entrySet().toString());
+ assertEquals("[" + joiner.join(map.keySet()) + "]",
+ map.keySet().toString());
+ assertEquals("[" + joiner.join(map.values()) + "]",
+ map.values().toString());
+
+ assertEquals(MinimalSet.from(map.entrySet()), map.entrySet());
+ assertEquals(Sets.newHashSet(map.keySet()), map.keySet());
+ }
+ }
+
+ public static class MapTests extends AbstractMapTests<String, Integer> {
+ @Override protected Map<String, Integer> makeEmptyMap() {
+ return ImmutableMap.of();
+ }
+
+ @Override protected Map<String, Integer> makePopulatedMap() {
+ return ImmutableMap.of("one", 1, "two", 2, "three", 3);
+ }
+
+ @Override protected String getKeyNotInPopulatedMap() {
+ return "minus one";
+ }
+
+ @Override protected Integer getValueNotInPopulatedMap() {
+ return -1;
+ }
+ }
+
+ public static class SingletonMapTests
+ extends AbstractMapTests<String, Integer> {
+ @Override protected Map<String, Integer> makePopulatedMap() {
+ return ImmutableMap.of("one", 1);
+ }
+
+ @Override protected String getKeyNotInPopulatedMap() {
+ return "minus one";
+ }
+
+ @Override protected Integer getValueNotInPopulatedMap() {
+ return -1;
+ }
+ }
+
+ public static class MapTestsWithBadHashes
+ extends AbstractMapTests<Object, Integer> {
+
+ @Override protected Map<Object, Integer> makeEmptyMap() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override protected Map<Object, Integer> makePopulatedMap() {
+ Colliders colliders = new Colliders();
+ return ImmutableMap.of(
+ colliders.e0, 0,
+ colliders.e1, 1,
+ colliders.e2, 2,
+ colliders.e3, 3);
+ }
+
+ @Override protected Object getKeyNotInPopulatedMap() {
+ return new Colliders().e4;
+ }
+
+ @Override protected Integer getValueNotInPopulatedMap() {
+ return 4;
+ }
+ }
+
+ public static class CreationTests extends TestCase {
+ public void testEmptyBuilder() {
+ ImmutableMap<String, Integer> map
+ = new Builder<String, Integer>().build();
+ assertEquals(Collections.<String, Integer>emptyMap(), map);
+ }
+
+ public void testSingletonBuilder() {
+ ImmutableMap<String, Integer> map = new Builder<String, Integer>()
+ .put("one", 1)
+ .build();
+ assertMapEquals(map, "one", 1);
+ }
+
+ public void testBuilder() {
+ ImmutableMap<String, Integer> map = new Builder<String, Integer>()
+ .put("one", 1)
+ .put("two", 2)
+ .put("three", 3)
+ .put("four", 4)
+ .put("five", 5)
+ .build();
+ assertMapEquals(map,
+ "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
+ }
+
+ public void testBuilder_withImmutableEntry() {
+ ImmutableMap<String, Integer> map = new Builder<String, Integer>()
+ .put(Maps.immutableEntry("one", 1))
+ .build();
+ assertMapEquals(map, "one", 1);
+ }
+
+ public void testBuilder_withImmutableEntryAndNullContents() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.put(Maps.immutableEntry("one", (Integer) null));
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ try {
+ builder.put(Maps.immutableEntry((String) null, 1));
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ private static class StringHolder {
+ String string;
+ }
+
+ public void testBuilder_withMutableEntry() {
+ ImmutableMap.Builder<String, Integer> builder =
+ new Builder<String, Integer>();
+ final StringHolder holder = new StringHolder();
+ holder.string = "one";
+ Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
+ @Override public String getKey() {
+ return holder.string;
+ }
+ @Override public Integer getValue() {
+ return 1;
+ }
+ };
+
+ builder.put(entry);
+ holder.string = "two";
+ assertMapEquals(builder.build(), "one", 1);
+ }
+
+ public void testBuilderPutAllWithEmptyMap() {
+ ImmutableMap<String, Integer> map = new Builder<String, Integer>()
+ .putAll(Collections.<String, Integer>emptyMap())
+ .build();
+ assertEquals(Collections.<String, Integer>emptyMap(), map);
+ }
+
+ public void testBuilderPutAll() {
+ Map<String, Integer> toPut = new LinkedHashMap<String, Integer>();
+ toPut.put("one", 1);
+ toPut.put("two", 2);
+ toPut.put("three", 3);
+ Map<String, Integer> moreToPut = new LinkedHashMap<String, Integer>();
+ moreToPut.put("four", 4);
+ moreToPut.put("five", 5);
+
+ ImmutableMap<String, Integer> map = new Builder<String, Integer>()
+ .putAll(toPut)
+ .putAll(moreToPut)
+ .build();
+ assertMapEquals(map,
+ "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
+ }
+
+ public void testBuilderReuse() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ ImmutableMap<String, Integer> mapOne = builder
+ .put("one", 1)
+ .put("two", 2)
+ .build();
+ ImmutableMap<String, Integer> mapTwo = builder
+ .put("three", 3)
+ .put("four", 4)
+ .build();
+
+ assertMapEquals(mapOne, "one", 1, "two", 2);
+ assertMapEquals(mapTwo, "one", 1, "two", 2, "three", 3, "four", 4);
+ }
+
+ public void testBuilderPutNullKeyFailsAtomically() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.put(null, 1);
+ fail();
+ } catch (NullPointerException expected) {}
+ builder.put("foo", 2);
+ assertMapEquals(builder.build(), "foo", 2);
+ }
+
+ public void testBuilderPutImmutableEntryWithNullKeyFailsAtomically() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.put(Maps.immutableEntry((String) null, 1));
+ fail();
+ } catch (NullPointerException expected) {}
+ builder.put("foo", 2);
+ assertMapEquals(builder.build(), "foo", 2);
+ }
+
+ // for GWT compatibility
+ static class SimpleEntry<K, V> extends AbstractMapEntry<K, V> {
+ public K key;
+ public V value;
+
+ SimpleEntry(K key, V value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ @Override
+ public K getKey() {
+ return key;
+ }
+
+ @Override
+ public V getValue() {
+ return value;
+ }
+ }
+
+ public void testBuilderPutMutableEntryWithNullKeyFailsAtomically() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.put(new SimpleEntry<String, Integer>(null, 1));
+ fail();
+ } catch (NullPointerException expected) {}
+ builder.put("foo", 2);
+ assertMapEquals(builder.build(), "foo", 2);
+ }
+
+ public void testBuilderPutNullKey() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.put(null, 1);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ public void testBuilderPutNullValue() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.put("one", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ public void testBuilderPutNullKeyViaPutAll() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.putAll(Collections.<String, Integer>singletonMap(null, 1));
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ public void testBuilderPutNullValueViaPutAll() {
+ Builder<String, Integer> builder = new Builder<String, Integer>();
+ try {
+ builder.putAll(Collections.<String, Integer>singletonMap("one", null));
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ public void testPuttingTheSameKeyTwiceThrowsOnBuild() {
+ Builder<String, Integer> builder = new Builder<String, Integer>()
+ .put("one", 1)
+ .put("one", 1); // throwing on this line would be even better
+
+ try {
+ builder.build();
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ public void testOf() {
+ assertMapEquals(
+ ImmutableMap.of("one", 1),
+ "one", 1);
+ assertMapEquals(
+ ImmutableMap.of("one", 1, "two", 2),
+ "one", 1, "two", 2);
+ assertMapEquals(
+ ImmutableMap.of("one", 1, "two", 2, "three", 3),
+ "one", 1, "two", 2, "three", 3);
+ assertMapEquals(
+ ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4),
+ "one", 1, "two", 2, "three", 3, "four", 4);
+ assertMapEquals(
+ ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4, "five", 5),
+ "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
+ }
+
+ public void testOfNullKey() {
+ try {
+ ImmutableMap.of(null, 1);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+
+ try {
+ ImmutableMap.of("one", 1, null, 2);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ public void testOfNullValue() {
+ try {
+ ImmutableMap.of("one", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+
+ try {
+ ImmutableMap.of("one", 1, "two", null);
+ fail();
+ } catch (NullPointerException expected) {
+ }
+ }
+
+ public void testOfWithDuplicateKey() {
+ try {
+ ImmutableMap.of("one", 1, "one", 1);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ public void testCopyOfEmptyMap() {
+ ImmutableMap<String, Integer> copy
+ = ImmutableMap.copyOf(Collections.<String, Integer>emptyMap());
+ assertEquals(Collections.<String, Integer>emptyMap(), copy);
+ assertSame(copy, ImmutableMap.copyOf(copy));
+ }
+
+ public void testCopyOfSingletonMap() {
+ ImmutableMap<String, Integer> copy
+ = ImmutableMap.copyOf(Collections.singletonMap("one", 1));
+ assertMapEquals(copy, "one", 1);
+ assertSame(copy, ImmutableMap.copyOf(copy));
+ }
+
+ public void testCopyOf() {
+ Map<String, Integer> original = new LinkedHashMap<String, Integer>();
+ original.put("one", 1);
+ original.put("two", 2);
+ original.put("three", 3);
+
+ ImmutableMap<String, Integer> copy = ImmutableMap.copyOf(original);
+ assertMapEquals(copy, "one", 1, "two", 2, "three", 3);
+ assertSame(copy, ImmutableMap.copyOf(copy));
+ }
+ }
+
+ public void testNullGet() {
+ ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1);
+ assertNull(map.get(null));
+ }
+
+ public void testAsMultimap() {
+ ImmutableMap<String, Integer> map = ImmutableMap.of(
+ "one", 1, "won", 1, "two", 2, "too", 2, "three", 3);
+ ImmutableSetMultimap<String, Integer> expected = ImmutableSetMultimap.of(
+ "one", 1, "won", 1, "two", 2, "too", 2, "three", 3);
+ assertEquals(expected, map.asMultimap());
+ }
+
+ public void testAsMultimapWhenEmpty() {
+ ImmutableMap<String, Integer> map = ImmutableMap.of();
+ ImmutableSetMultimap<String, Integer> expected = ImmutableSetMultimap.of();
+ assertEquals(expected, map.asMultimap());
+ }
+
+ public void testAsMultimapCaches() {
+ ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1);
+ ImmutableSetMultimap<String, Integer> multimap1 = map.asMultimap();
+ ImmutableSetMultimap<String, Integer> multimap2 = map.asMultimap();
+ assertEquals(1, multimap1.asMap().size());
+ assertSame(multimap1, multimap2);
+ }
+
+ private static <K, V> void assertMapEquals(Map<K, V> map,
+ Object... alternatingKeysAndValues) {
+ assertEquals(map.size(), alternatingKeysAndValues.length / 2);
+ int i = 0;
+ for (Entry<K, V> entry : map.entrySet()) {
+ assertEquals(alternatingKeysAndValues[i++], entry.getKey());
+ assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+ }
+ }
+
+ private static class IntHolder implements Serializable {
+ public int value;
+
+ public IntHolder(int value) {
+ this.value = value;
+ }
+
+ @Override public boolean equals(Object o) {
+ return (o instanceof IntHolder) && ((IntHolder) o).value == value;
+ }
+
+ @Override public int hashCode() {
+ return value;
+ }
+
+ private static final long serialVersionUID = 5;
+ }
+
+ public void testMutableValues() {
+ IntHolder holderA = new IntHolder(1);
+ IntHolder holderB = new IntHolder(2);
+ Map<String, IntHolder> map = ImmutableMap.of("a", holderA, "b", holderB);
+ holderA.value = 3;
+ assertTrue(map.entrySet().contains(
+ Maps.immutableEntry("a", new IntHolder(3))));
+ Map<String, Integer> intMap = ImmutableMap.of("a", 3, "b", 2);
+ assertEquals(intMap.hashCode(), map.entrySet().hashCode());
+ assertEquals(intMap.hashCode(), map.hashCode());
+ }
+
+ public void testCopyOfEnumMap() {
+ EnumMap<AnEnum, String> map = new EnumMap<AnEnum, String>(AnEnum.class);
+ map.put(AnEnum.B, "foo");
+ map.put(AnEnum.C, "bar");
+ assertTrue(ImmutableMap.copyOf(map) instanceof ImmutableEnumMap);
+ }
+
+ public void testEquals() {
+ new EqualsTester()
+ .addEqualityGroup(ImmutableList.of(), ImmutableList.of())
+ .addEqualityGroup(ImmutableList.of(1), ImmutableList.of(1))
+ .addEqualityGroup(ImmutableList.of(1, 2), ImmutableList.of(1, 2))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(100, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 200, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 300, 4, 5, 6, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 400, 5, 6, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 500, 6, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 600, 7, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 700, 8, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 800, 9, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 900, 10, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 1000, 11, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1100, 12))
+ .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1200))
+ .testEquals();
+
+ }
+}
+