MultimapPutTester.java revision 7dd252788645e940eada959bdde927426e2531c9
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.Arrays;
34import java.util.Collection;
35import java.util.Iterator;
36import java.util.List;
37import java.util.Map.Entry;
38
39/**
40 * Tester for {@link Multimap#put}.
41 *
42 * @author Louis Wasserman
43 */
44@GwtCompatible
45public class MultimapPutTester<K, V> extends AbstractMultimapTester<K, V, Multimap<K, V>> {
46  @MapFeature.Require(SUPPORTS_PUT)
47  public void testPutEmpty() {
48    int size = getNumElements();
49
50    K key = sampleKeys().e3;
51    V value = sampleValues().e3;
52
53    assertGet(key, ImmutableList.<V>of());
54
55    assertTrue(multimap().put(key, value));
56
57    assertGet(key, value);
58    assertEquals(size + 1, multimap().size());
59  }
60
61  @MapFeature.Require(SUPPORTS_PUT)
62  @CollectionSize.Require(absent = ZERO)
63  public void testPutPresent() {
64    int size = getNumElements();
65
66    K key = sampleKeys().e0;
67    V oldValue = sampleValues().e0;
68    V newValue = sampleValues().e3;
69
70    assertGet(key, oldValue);
71
72    assertTrue(multimap().put(key, newValue));
73
74    assertGet(key, oldValue, newValue);
75    assertEquals(size + 1, multimap().size());
76  }
77
78  @MapFeature.Require(SUPPORTS_PUT)
79  public void testPutTwoElements() {
80    int size = getNumElements();
81
82    K key = sampleKeys().e0;
83    V v1 = sampleValues().e3;
84    V v2 = sampleValues().e4;
85
86    List<V> values = Helpers.copyToList(multimap().get(key));
87
88    assertTrue(multimap().put(key, v1));
89    assertTrue(multimap().put(key, v2));
90
91    values.add(v1);
92    values.add(v2);
93
94    assertGet(key, values);
95    assertEquals(size + 2, multimap().size());
96  }
97
98  @MapFeature.Require({SUPPORTS_PUT, ALLOWS_NULL_VALUES})
99  public void testPutNullValue() {
100    int size = getNumElements();
101
102    multimap().put(sampleKeys().e3, null);
103
104    assertGet(sampleKeys().e3, Lists.newArrayList((V)null)); // ImmutableList.of can't take null.
105    assertEquals(size + 1, multimap().size());
106  }
107
108  @MapFeature.Require({SUPPORTS_PUT, ALLOWS_NULL_KEYS})
109  public void testPutNullKey() {
110    int size = getNumElements();
111
112    multimap().put(null, sampleValues().e3);
113
114    assertGet(null, sampleValues().e3);
115    assertEquals(size + 1, multimap().size());
116  }
117
118  @MapFeature.Require(SUPPORTS_PUT)
119  public void testPutNotPresentKeyPropagatesToGet() {
120    int size = getNumElements();
121    Collection<V> collection = multimap().get(sampleKeys().e3);
122    ASSERT.<V, Collection<V>>that(collection).isEmpty();
123    multimap().put(sampleKeys().e3, sampleValues().e3);
124    ASSERT.<V, Collection<V>>that(collection).has().item(sampleValues().e3);
125    assertEquals(size + 1, multimap().size());
126  }
127
128  @MapFeature.Require(SUPPORTS_PUT)
129  @CollectionSize.Require(absent = ZERO)
130  public void testPutPresentKeyPropagatesToGet() {
131    List<K> keys = Helpers.copyToList(multimap().keySet());
132    for (K key : keys) {
133      resetContainer();
134
135      int size = getNumElements();
136
137      Collection<V> collection = multimap().get(key);
138      Collection<V> expectedCollection = Helpers.copyToList(collection);
139
140      multimap().put(key, sampleValues().e3);
141      expectedCollection.add(sampleValues().e3);
142      ASSERT.<V, Collection<V>>that(collection).has().allFrom(expectedCollection);
143      assertEquals(size + 1, multimap().size());
144    }
145  }
146
147  @MapFeature.Require(SUPPORTS_PUT)
148  @CollectionSize.Require(absent = ZERO)
149  public void testPutPresentKeyPropagatesToAsMapGet() {
150    List<K> keys = Helpers.copyToList(multimap().keySet());
151    for (K key : keys) {
152      resetContainer();
153
154      int size = getNumElements();
155
156      Collection<V> collection = multimap().asMap().get(key);
157      assertNotNull(collection);
158      Collection<V> expectedCollection = Helpers.copyToList(collection);
159
160      multimap().put(key, sampleValues().e3);
161      expectedCollection.add(sampleValues().e3);
162      ASSERT.<V, Collection<V>>that(collection).has().allFrom(expectedCollection);
163      assertEquals(size + 1, multimap().size());
164    }
165  }
166
167  @MapFeature.Require(SUPPORTS_PUT)
168  @CollectionSize.Require(absent = ZERO)
169  public void testPutPresentKeyPropagatesToAsMapEntrySet() {
170    List<K> keys = Helpers.copyToList(multimap().keySet());
171    for (K key : keys) {
172      resetContainer();
173
174      int size = getNumElements();
175
176      Iterator<Entry<K, Collection<V>>> asMapItr = multimap().asMap().entrySet().iterator();
177      Collection<V> collection = null;
178      while (asMapItr.hasNext()) {
179        Entry<K, Collection<V>> asMapEntry = asMapItr.next();
180        if (key.equals(asMapEntry.getKey())) {
181          collection = asMapEntry.getValue();
182          break;
183        }
184      }
185      assertNotNull(collection);
186      Collection<V> expectedCollection = Helpers.copyToList(collection);
187
188      multimap().put(key, sampleValues().e3);
189      expectedCollection.add(sampleValues().e3);
190      ASSERT.<V, Collection<V>>that(collection).has().allFrom(expectedCollection);
191      assertEquals(size + 1, multimap().size());
192    }
193  }
194}
195