1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package com.google.common.collect.testing.google;
16
17 import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
18 import static com.google.common.collect.testing.features.CollectionSize.SEVERAL;
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_KEY_QUERIES;
22 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT;
23 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
24 import static com.google.common.truth.Truth.assertThat;
25
26 import com.google.common.annotations.GwtCompatible;
27 import com.google.common.collect.Iterables;
28 import com.google.common.collect.Multimap;
29 import com.google.common.collect.testing.Helpers;
30 import com.google.common.collect.testing.features.CollectionFeature;
31 import com.google.common.collect.testing.features.CollectionSize;
32 import com.google.common.collect.testing.features.MapFeature;
33
34 import java.util.ArrayList;
35 import java.util.Collection;
36 import java.util.Iterator;
37 import java.util.List;
38 import java.util.Map.Entry;
39 import java.util.Set;
40
41
42
43
44
45
46 @GwtCompatible
47 public class MultimapAsMapTester<K, V> extends AbstractMultimapTester<K, V, Multimap<K, V>> {
48 public void testAsMapGet() {
49 for (K key : sampleKeys()) {
50 List<V> expectedValues = new ArrayList<V>();
51 for (Entry<K, V> entry : getSampleElements()) {
52 if (entry.getKey().equals(key)) {
53 expectedValues.add(entry.getValue());
54 }
55 }
56
57 Collection<V> collection = multimap().asMap().get(key);
58 if (expectedValues.isEmpty()) {
59 assertThat(collection).isNull();
60 } else {
61 assertThat(collection).has().exactlyAs(expectedValues);
62 }
63 }
64 }
65
66 @CollectionSize.Require(absent = ZERO)
67 @MapFeature.Require(ALLOWS_NULL_KEYS)
68 public void testAsMapGetNullKeyPresent() {
69 initMultimapWithNullKey();
70 assertThat(multimap().asMap().get(null)).has().exactly(getValueForNullKey());
71 }
72
73 @MapFeature.Require(ALLOWS_NULL_KEY_QUERIES)
74 public void testAsMapGetNullKeyAbsent() {
75 assertThat(multimap().asMap().get(null)).isNull();
76 }
77
78 @MapFeature.Require(absent = ALLOWS_NULL_KEY_QUERIES)
79 public void testAsMapGetNullKeyUnsupported() {
80 try {
81 multimap().asMap().get(null);
82 fail("Expected NullPointerException");
83 } catch (NullPointerException expected) {}
84 }
85
86 @CollectionSize.Require(absent = ZERO)
87 @MapFeature.Require(SUPPORTS_REMOVE)
88 public void testAsMapRemove() {
89 assertThat(multimap().asMap().remove(sampleKeys().e0)).iteratesAs(sampleValues().e0);
90 assertGet(sampleKeys().e0);
91 assertEquals(getNumElements() - 1, multimap().size());
92 }
93
94 @CollectionSize.Require(SEVERAL)
95 @MapFeature.Require(SUPPORTS_PUT)
96 public void testAsMapEntrySetReflectsPutSameKey() {
97 resetContainer(
98 Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
99 Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
100
101 Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet();
102 Collection<V> valueCollection = Iterables.getOnlyElement(asMapEntrySet).getValue();
103 assertThat(valueCollection)
104 .has().exactly(sampleValues().e0, sampleValues().e3);
105 assertTrue(multimap().put(sampleKeys().e0, sampleValues().e4));
106 assertThat(valueCollection)
107 .has().exactly(sampleValues().e0, sampleValues().e3, sampleValues().e4);
108 }
109
110 @CollectionSize.Require(SEVERAL)
111 @MapFeature.Require(SUPPORTS_PUT)
112 public void testAsMapEntrySetReflectsPutDifferentKey() {
113 resetContainer(
114 Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
115 Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
116
117 Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet();
118 assertTrue(multimap().put(sampleKeys().e1, sampleValues().e4));
119 assertEquals(2, asMapEntrySet.size());
120 }
121
122 @CollectionSize.Require(SEVERAL)
123 @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
124 public void testAsMapEntrySetRemovePropagatesToMultimap() {
125 resetContainer(
126 Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
127 Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
128 Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet();
129 Entry<K, Collection<V>> asMapEntry0 = Iterables.getOnlyElement(asMapEntrySet);
130 assertTrue(multimap().put(sampleKeys().e1, sampleValues().e4));
131 assertTrue(asMapEntrySet.remove(asMapEntry0));
132 assertEquals(1, multimap().size());
133 assertThat(multimap().keySet()).iteratesAs(sampleKeys().e1);
134 }
135
136 @CollectionSize.Require(SEVERAL)
137 @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
138 public void testAsMapEntrySetIteratorRemovePropagatesToMultimap() {
139 resetContainer(
140 Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
141 Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
142 Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet();
143 Iterator<Entry<K, Collection<V>>> asMapEntryItr = asMapEntrySet.iterator();
144 asMapEntryItr.next();
145 asMapEntryItr.remove();
146 assertTrue(multimap().isEmpty());
147 }
148 }