1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect.testing.google;
18
19 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
20 import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
21 import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
22 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT;
23 import static com.google.common.truth.Truth.assertThat;
24
25 import com.google.common.annotations.GwtCompatible;
26 import com.google.common.collect.ImmutableList;
27 import com.google.common.collect.Lists;
28 import com.google.common.collect.Multimap;
29 import com.google.common.collect.testing.Helpers;
30 import com.google.common.collect.testing.features.CollectionSize;
31 import com.google.common.collect.testing.features.MapFeature;
32
33 import java.util.Collection;
34 import java.util.Iterator;
35 import java.util.List;
36 import java.util.Map.Entry;
37
38
39
40
41
42
43 @GwtCompatible
44 public 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));
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 assertThat(collection).isEmpty();
141 multimap().put(sampleKeys().e3, sampleValues().e3);
142 assertThat(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 assertThat(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 assertThat(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 assertThat(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 assertThat(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 assertThat(collection).has().exactlyAs(expectedCollection);
226 assertEquals(size + 1, multimap().size());
227 }
228 }
229 }