1/*
2 * Copyright (C) 2008 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.collect.testing.testers;
18
19import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
20import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
21
22import com.google.common.collect.testing.AbstractMapTester;
23import com.google.common.collect.testing.Helpers;
24import com.google.common.collect.testing.features.CollectionSize;
25import com.google.common.collect.testing.features.MapFeature;
26
27import java.util.Collection;
28import java.util.HashMap;
29import java.util.Map;
30import java.util.Map.Entry;
31
32/**
33 * Tests {@link java.util.Map#equals}.
34 *
35 * <p>This class is GWT compatible.
36 *
37 * @author George van den Driessche
38 * @author Chris Povirk
39 */
40public class MapEqualsTester<K, V> extends AbstractMapTester<K, V> {
41  public void testEquals_otherMapWithSameEntries() {
42    assertTrue(
43        "A Map should equal any other Map containing the same entries.",
44        getMap().equals(newHashMap(getSampleEntries())));
45  }
46
47  @CollectionSize.Require(absent = CollectionSize.ZERO)
48  public void testEquals_otherMapWithDifferentEntries() {
49    Map<K, V> other = newHashMap(getSampleEntries(getNumEntries() - 1));
50    Entry<K, V> e3 = getSubjectGenerator().samples().e3;
51    other.put(e3.getKey(), e3.getValue());
52    assertFalse(
53        "A Map should not equal another Map containing different entries.",
54        getMap().equals(other)
55    );
56  }
57
58  @CollectionSize.Require(absent = CollectionSize.ZERO)
59  @MapFeature.Require(ALLOWS_NULL_KEYS)
60  public void testEquals_containingNullKey() {
61    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
62    entries.add(entry(null, samples.e3.getValue()));
63
64    resetContainer(getSubjectGenerator().create(entries.toArray()));
65    assertTrue("A Map should equal any other Map containing the same entries,"
66        + " even if some keys are null.",
67        getMap().equals(newHashMap(entries)));
68  }
69
70  @CollectionSize.Require(absent = CollectionSize.ZERO)
71  public void testEquals_otherContainsNullKey() {
72    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
73    entries.add(entry(null, samples.e3.getValue()));
74    Map<K, V> other = newHashMap(entries);
75
76    assertFalse(
77        "Two Maps should not be equal if exactly one of them contains a null "
78        + "key.",
79        getMap().equals(other));
80  }
81
82  @CollectionSize.Require(absent = CollectionSize.ZERO)
83  @MapFeature.Require(ALLOWS_NULL_VALUES)
84  public void testEquals_containingNullValue() {
85    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
86    entries.add(entry(samples.e3.getKey(), null));
87
88    resetContainer(getSubjectGenerator().create(entries.toArray()));
89    assertTrue("A Map should equal any other Map containing the same entries,"
90        + " even if some values are null.",
91        getMap().equals(newHashMap(entries)));
92  }
93
94  @CollectionSize.Require(absent = CollectionSize.ZERO)
95  public void testEquals_otherContainsNullValue() {
96    Collection<Map.Entry<K, V>> entries = getSampleEntries(getNumEntries() - 1);
97    entries.add(entry(samples.e3.getKey(), null));
98    Map<K, V> other = newHashMap(entries);
99
100    assertFalse(
101        "Two Maps should not be equal if exactly one of them contains a null "
102        + "value.",
103        getMap().equals(other));
104  }
105
106  @CollectionSize.Require(absent = CollectionSize.ZERO)
107  public void testEquals_smallerMap() {
108    Collection<Map.Entry<K, V>> fewerEntries
109        = getSampleEntries(getNumEntries() - 1);
110    assertFalse("Maps of different sizes should not be equal.",
111        getMap().equals(newHashMap(fewerEntries)));
112  }
113
114  public void testEquals_largerMap() {
115    Collection<Map.Entry<K, V>> moreEntries
116        = getSampleEntries(getNumEntries() + 1);
117    assertFalse("Maps of different sizes should not be equal.",
118        getMap().equals(newHashMap(moreEntries)));
119  }
120
121  public void testEquals_list() {
122    assertFalse("A List should never equal a Map.",
123        getMap().equals(Helpers.copyToList(getMap().entrySet())));
124  }
125
126  private static <K, V> HashMap<K, V> newHashMap(
127      Collection<? extends Map.Entry<? extends K, ? extends V>> entries) {
128    HashMap<K, V> map = new HashMap<K, V>();
129    for (Map.Entry<? extends K, ? extends V> entry : entries) {
130      map.put(entry.getKey(), entry.getValue());
131    }
132    return map;
133  }
134}
135