View Javadoc
1   /*
2    * Copyright (C) 2013 The Guava Authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5    * in compliance with the License. You may obtain a copy of the License at
6    *
7    * http://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software distributed under the License
10   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11   * or implied. See the License for the specific language governing permissions and limitations under
12   * the License.
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   * Tests for {@link Multimap#asMap}.
43   *
44   * @author Louis Wasserman
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 }