11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect.testing.testers;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.AbstractMapTester;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.Helpers;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.MapFeature;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashMap;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests {@link java.util.Map#equals}.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author George van den Driessche
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MapEqualsTester<K, V> extends AbstractMapTester<K, V> {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_otherMapWithSameEntries() {
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "A Map should equal any other Map containing the same entries.",
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(newHashMap(getSampleEntries())));
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = CollectionSize.ZERO)
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_otherMapWithDifferentEntries() {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, V> other = newHashMap(getSampleEntries(getNumEntries() - 1));
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<K, V> e3 = getSubjectGenerator().samples().e3;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    other.put(e3.getKey(), e3.getValue());
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "A Map should not equal another Map containing different entries.",
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(other)
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    );
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = CollectionSize.ZERO)
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(ALLOWS_NULL_KEYS)
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_containingNullKey() {
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.add(entry(null, samples.e3.getValue()));
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetContainer(getSubjectGenerator().create(entries.toArray()));
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("A Map should equal any other Map containing the same entries,"
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + " even if some keys are null.",
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(newHashMap(entries)));
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = CollectionSize.ZERO)
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_otherContainsNullKey() {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.add(entry(null, samples.e3.getValue()));
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, V> other = newHashMap(entries);
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Two Maps should not be equal if exactly one of them contains a null "
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + "key.",
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(other));
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = CollectionSize.ZERO)
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @MapFeature.Require(ALLOWS_NULL_VALUES)
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_containingNullValue() {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.add(entry(samples.e3.getKey(), null));
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resetContainer(getSubjectGenerator().create(entries.toArray()));
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("A Map should equal any other Map containing the same entries,"
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + " even if some values are null.",
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(newHashMap(entries)));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = CollectionSize.ZERO)
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_otherContainsNullValue() {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.add(entry(samples.e3.getKey(), null));
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<K, V> other = newHashMap(entries);
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Two Maps should not be equal if exactly one of them contains a null "
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + "value.",
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(other));
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = CollectionSize.ZERO)
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_smallerMap() {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<K, V>> fewerEntries
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = getSampleEntries(getNumEntries() - 1);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse("Maps of different sizes should not be equal.",
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(newHashMap(fewerEntries)));
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_largerMap() {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<K, V>> moreEntries
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = getSampleEntries(getNumEntries() + 1);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse("Maps of different sizes should not be equal.",
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(newHashMap(moreEntries)));
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_list() {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse("A List should never equal a Map.",
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getMap().equals(Helpers.copyToList(getMap().entrySet())));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <K, V> HashMap<K, V> newHashMap(
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<? extends Map.Entry<? extends K, ? extends V>> entries) {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashMap<K, V> map = new HashMap<K, V>();
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Map.Entry<? extends K, ? extends V> entry : entries) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.put(entry.getKey(), entry.getValue());
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return map;
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
135