MultimapPutTester.java revision 0888a09821a98ac0680fad765217302858e70fa4
1/*
2 * Copyright (C) 2012 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.google;
18
19import static com.google.common.collect.testing.features.CollectionSize.ZERO;
20import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
21import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
22import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT;
23import static org.truth0.Truth.ASSERT;
24
25import com.google.common.annotations.GwtCompatible;
26import com.google.common.collect.ImmutableList;
27import com.google.common.collect.Lists;
28import com.google.common.collect.Multimap;
29import com.google.common.collect.testing.Helpers;
30import com.google.common.collect.testing.features.CollectionSize;
31import com.google.common.collect.testing.features.MapFeature;
32
33import java.util.Collection;
34import java.util.Iterator;
35import java.util.List;
36import java.util.Map.Entry;
37
38/**
39 * Tester for {@link Multimap#put}.
40 *
41 * @author Louis Wasserman
42 */
43@GwtCompatible
44public class MultimapPutTester<K, V> extends AbstractMultimapTester<K, V, Multimap<K, V>> {
45  @MapFeature.Require(absent = SUPPORTS_PUT)
46  public void testPutUnsupported() {
47    try {
48      multimap().put(sampleKeys().e3, sampleValues().e3);
49      fail("Expected UnsupportedOperationException");
50    } catch (UnsupportedOperationException expected) {}
51  }
52
53  @MapFeature.Require(SUPPORTS_PUT)
54  public void testPutEmpty() {
55    int size = getNumElements();
56
57    K key = sampleKeys().e3;
58    V value = sampleValues().e3;
59
60    assertGet(key, ImmutableList.<V>of());
61
62    assertTrue(multimap().put(key, value));
63
64    assertGet(key, value);
65    assertEquals(size + 1, multimap().size());
66  }
67
68  @MapFeature.Require(SUPPORTS_PUT)
69  @CollectionSize.Require(absent = ZERO)
70  public void testPutPresent() {
71    int size = getNumElements();
72
73    K key = sampleKeys().e0;
74    V oldValue = sampleValues().e0;
75    V newValue = sampleValues().e3;
76
77    assertGet(key, oldValue);
78
79    assertTrue(multimap().put(key, newValue));
80
81    assertGet(key, oldValue, newValue);
82    assertEquals(size + 1, multimap().size());
83  }
84
85  @MapFeature.Require(SUPPORTS_PUT)
86  public void testPutTwoElements() {
87    int size = getNumElements();
88
89    K key = sampleKeys().e0;
90    V v1 = sampleValues().e3;
91    V v2 = sampleValues().e4;
92
93    List<V> values = Helpers.copyToList(multimap().get(key));
94
95    assertTrue(multimap().put(key, v1));
96    assertTrue(multimap().put(key, v2));
97
98    values.add(v1);
99    values.add(v2);
100
101    assertGet(key, values);
102    assertEquals(size + 2, multimap().size());
103  }
104
105  @MapFeature.Require({SUPPORTS_PUT, ALLOWS_NULL_VALUES})
106  public void testPutNullValue_supported() {
107    int size = getNumElements();
108
109    multimap().put(sampleKeys().e3, null);
110
111    assertGet(sampleKeys().e3, Lists.newArrayList((V) null)); // ImmutableList.of can't take null.
112    assertEquals(size + 1, multimap().size());
113  }
114
115  @MapFeature.Require(value = SUPPORTS_PUT, absent = ALLOWS_NULL_VALUES)
116  public void testPutNullValue_unsupported() {
117    try {
118      multimap().put(sampleKeys().e1, null);
119      fail();
120    } catch (NullPointerException expected) {
121    }
122
123    expectUnchanged();
124  }
125
126  @MapFeature.Require({SUPPORTS_PUT, ALLOWS_NULL_KEYS})
127  public void testPutNullKey() {
128    int size = getNumElements();
129
130    multimap().put(null, sampleValues().e3);
131
132    assertGet(null, sampleValues().e3);
133    assertEquals(size + 1, multimap().size());
134  }
135
136  @MapFeature.Require(SUPPORTS_PUT)
137  public void testPutNotPresentKeyPropagatesToGet() {
138    int size = getNumElements();
139    Collection<V> collection = multimap().get(sampleKeys().e3);
140    ASSERT.that(collection).isEmpty();
141    multimap().put(sampleKeys().e3, sampleValues().e3);
142    ASSERT.that(collection).has().item(sampleValues().e3);
143    assertEquals(size + 1, multimap().size());
144  }
145
146  @MapFeature.Require(SUPPORTS_PUT)
147  public void testPutNotPresentKeyPropagatesToEntries() {
148    Collection<Entry<K, V>> entries = multimap().entries();
149    assertFalse(entries.contains(Helpers.mapEntry(sampleKeys().e3, sampleValues().e3)));
150    multimap().put(sampleKeys().e3, sampleValues().e3);
151    ASSERT.that(entries).has().allOf(Helpers.mapEntry(sampleKeys().e3, sampleValues().e3));
152  }
153
154  @CollectionSize.Require(absent = ZERO)
155  @MapFeature.Require(SUPPORTS_PUT)
156  public void testPutPresentKeyPropagatesToEntries() {
157    Collection<Entry<K, V>> entries = multimap().entries();
158    assertFalse(entries.contains(Helpers.mapEntry(sampleKeys().e0, sampleValues().e3)));
159    multimap().put(sampleKeys().e0, sampleValues().e3);
160    ASSERT.that(entries).has().allOf(Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
161  }
162
163  @MapFeature.Require(SUPPORTS_PUT)
164  @CollectionSize.Require(absent = ZERO)
165  public void testPutPresentKeyPropagatesToGet() {
166    List<K> keys = Helpers.copyToList(multimap().keySet());
167    for (K key : keys) {
168      resetContainer();
169
170      int size = getNumElements();
171
172      Collection<V> collection = multimap().get(key);
173      Collection<V> expectedCollection = Helpers.copyToList(collection);
174
175      multimap().put(key, sampleValues().e3);
176      expectedCollection.add(sampleValues().e3);
177      ASSERT.that(collection).has().exactlyAs(expectedCollection);
178      assertEquals(size + 1, multimap().size());
179    }
180  }
181
182  @MapFeature.Require(SUPPORTS_PUT)
183  @CollectionSize.Require(absent = ZERO)
184  public void testPutPresentKeyPropagatesToAsMapGet() {
185    List<K> keys = Helpers.copyToList(multimap().keySet());
186    for (K key : keys) {
187      resetContainer();
188
189      int size = getNumElements();
190
191      Collection<V> collection = multimap().asMap().get(key);
192      assertNotNull(collection);
193      Collection<V> expectedCollection = Helpers.copyToList(collection);
194
195      multimap().put(key, sampleValues().e3);
196      expectedCollection.add(sampleValues().e3);
197      ASSERT.that(collection).has().exactlyAs(expectedCollection);
198      assertEquals(size + 1, multimap().size());
199    }
200  }
201
202  @MapFeature.Require(SUPPORTS_PUT)
203  @CollectionSize.Require(absent = ZERO)
204  public void testPutPresentKeyPropagatesToAsMapEntrySet() {
205    List<K> keys = Helpers.copyToList(multimap().keySet());
206    for (K key : keys) {
207      resetContainer();
208
209      int size = getNumElements();
210
211      Iterator<Entry<K, Collection<V>>> asMapItr = multimap().asMap().entrySet().iterator();
212      Collection<V> collection = null;
213      while (asMapItr.hasNext()) {
214        Entry<K, Collection<V>> asMapEntry = asMapItr.next();
215        if (key.equals(asMapEntry.getKey())) {
216          collection = asMapEntry.getValue();
217          break;
218        }
219      }
220      assertNotNull(collection);
221      Collection<V> expectedCollection = Helpers.copyToList(collection);
222
223      multimap().put(key, sampleValues().e3);
224      expectedCollection.add(sampleValues().e3);
225      ASSERT.that(collection).has().exactlyAs(expectedCollection);
226      assertEquals(size + 1, multimap().size());
227    }
228  }
229}
230