MultimapEntriesTester.java revision 0888a09821a98ac0680fad765217302858e70fa4
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
15package com.google.common.collect.testing.google;
16
17import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE;
18import static com.google.common.collect.testing.features.CollectionSize.ONE;
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_KEY_QUERIES;
22import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
23import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUE_QUERIES;
24import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
25import static org.truth0.Truth.ASSERT;
26
27import com.google.common.annotations.GwtCompatible;
28import com.google.common.collect.Multimap;
29import com.google.common.collect.testing.Helpers;
30import com.google.common.collect.testing.features.CollectionFeature;
31import com.google.common.collect.testing.features.CollectionSize;
32import com.google.common.collect.testing.features.MapFeature;
33
34import java.util.Collections;
35import java.util.Iterator;
36import java.util.Map.Entry;
37
38/**
39 * Tester for {@code Multimap.entries}.
40 *
41 * @author Louis Wasserman
42 */
43@GwtCompatible
44public class MultimapEntriesTester<K, V> extends AbstractMultimapTester<K, V, Multimap<K, V>> {
45  public void testEntries() {
46    ASSERT.that(multimap().entries()).has().exactlyAs(getSampleElements());
47  }
48
49  @CollectionSize.Require(absent = ZERO)
50  @MapFeature.Require(ALLOWS_NULL_KEYS)
51  public void testContainsEntryWithNullKeyPresent() {
52    initMultimapWithNullKey();
53    ASSERT.that(multimap().entries()).has().allOf(
54        Helpers.mapEntry((K) null, getValueForNullKey()));
55  }
56
57  @MapFeature.Require(ALLOWS_NULL_KEY_QUERIES)
58  public void testContainsEntryWithNullKeyAbsent() {
59    assertFalse(multimap().entries().contains(Helpers.mapEntry(null, sampleValues().e0)));
60  }
61
62  @CollectionSize.Require(absent = ZERO)
63  @MapFeature.Require(ALLOWS_NULL_VALUES)
64  public void testContainsEntryWithNullValuePresent() {
65    initMultimapWithNullValue();
66    ASSERT.that(multimap().entries()).has().allOf(
67        Helpers.mapEntry(getKeyForNullValue(), (V) null));
68  }
69
70  @MapFeature.Require(ALLOWS_NULL_VALUE_QUERIES)
71  public void testContainsEntryWithNullValueAbsent() {
72    assertFalse(multimap().entries().contains(
73        Helpers.mapEntry(sampleKeys().e0, null)));
74  }
75
76  @CollectionSize.Require(absent = ZERO)
77  @MapFeature.Require(SUPPORTS_REMOVE)
78  public void testRemovePropagatesToMultimap() {
79    assertTrue(multimap().entries().remove(
80        Helpers.mapEntry(sampleKeys().e0, sampleValues().e0)));
81    expectMissing(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0));
82    assertEquals(getNumElements() - 1, multimap().size());
83    assertFalse(multimap().containsEntry(sampleKeys().e0, sampleValues().e0));
84  }
85
86  @CollectionSize.Require(absent = ZERO)
87  @MapFeature.Require(SUPPORTS_REMOVE)
88  public void testRemoveAllPropagatesToMultimap() {
89    assertTrue(multimap().entries().removeAll(
90        Collections.singleton(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0))));
91    expectMissing(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0));
92    assertEquals(getNumElements() - 1, multimap().size());
93    assertFalse(multimap().containsEntry(sampleKeys().e0, sampleValues().e0));
94  }
95
96  @CollectionSize.Require(absent = ZERO)
97  @MapFeature.Require(SUPPORTS_REMOVE)
98  public void testRetainAllPropagatesToMultimap() {
99    multimap().entries().retainAll(
100        Collections.singleton(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0)));
101    assertEquals(
102        getSubjectGenerator().create(Helpers.mapEntry(sampleKeys().e0, sampleValues().e0)),
103        multimap());
104    assertEquals(1, multimap().size());
105    assertTrue(multimap().containsEntry(sampleKeys().e0, sampleValues().e0));
106  }
107
108  @CollectionSize.Require(ONE)
109  @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE)
110  public void testIteratorRemovePropagatesToMultimap() {
111    Iterator<Entry<K, V>> iterator = multimap().entries().iterator();
112    assertEquals(
113        Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
114        iterator.next());
115    iterator.remove();
116    assertTrue(multimap().isEmpty());
117  }
118
119  @CollectionSize.Require(absent = ZERO)
120  @MapFeature.Require(SUPPORTS_REMOVE)
121  public void testEntriesRemainValidAfterRemove() {
122    Iterator<Entry<K, V>> iterator = multimap().entries().iterator();
123    Entry<K, V> entry = iterator.next();
124    K key = entry.getKey();
125    V value = entry.getValue();
126    multimap().removeAll(key);
127    assertEquals(key, entry.getKey());
128    assertEquals(value, entry.getValue());
129  }
130}
131
132