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.CollectionSize.SEVERAL;
18import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
19
20import com.google.common.annotations.GwtCompatible;
21import com.google.common.collect.Maps;
22import com.google.common.collect.SetMultimap;
23import com.google.common.collect.Sets;
24import com.google.common.collect.testing.Helpers;
25import com.google.common.collect.testing.features.CollectionSize;
26import com.google.common.collect.testing.features.MapFeature;
27import com.google.common.testing.EqualsTester;
28
29import java.util.ArrayList;
30import java.util.Collection;
31import java.util.Collections;
32import java.util.List;
33import java.util.Map;
34import java.util.Map.Entry;
35import java.util.Set;
36
37/**
38 * Testers for {@link SetMultimap#asMap}.
39 *
40 * @author Louis Wasserman
41 * @param <K> The key type of the tested multimap.
42 * @param <V> The value type of the tested multimap.
43 */
44@GwtCompatible
45public class SetMultimapAsMapTester<K, V> extends AbstractMultimapTester<K, V, SetMultimap<K, V>> {
46  public void testAsMapValuesImplementSet() {
47    for (Collection<V> valueCollection : multimap().asMap().values()) {
48      assertTrue(valueCollection instanceof Set);
49    }
50  }
51
52  public void testAsMapGetImplementsSet() {
53    for (K key : multimap().keySet()) {
54      assertTrue(multimap().asMap().get(key) instanceof Set);
55    }
56  }
57
58  @MapFeature.Require(SUPPORTS_REMOVE)
59  public void testAsMapRemoveImplementsSet() {
60    List<K> keys = new ArrayList<K>(multimap().keySet());
61    for (K key : keys) {
62      resetCollection();
63      assertTrue(multimap().asMap().remove(key) instanceof Set);
64    }
65  }
66
67  @CollectionSize.Require(SEVERAL)
68  public void testEquals() {
69    resetContainer(
70        Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
71        Helpers.mapEntry(sampleKeys().e1, sampleValues().e0),
72        Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
73    Map<K, Collection<V>> expected = Maps.newHashMap();
74    expected.put(sampleKeys().e0, Sets.newHashSet(sampleValues().e0, sampleValues().e3));
75    expected.put(sampleKeys().e1, Sets.newHashSet(sampleValues().e0));
76    new EqualsTester()
77        .addEqualityGroup(expected, multimap().asMap())
78        .testEquals();
79  }
80
81  @CollectionSize.Require(SEVERAL)
82  public void testEntrySetEquals() {
83    resetContainer(
84        Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
85        Helpers.mapEntry(sampleKeys().e1, sampleValues().e0),
86        Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
87    Set<Entry<K, Collection<V>>> expected = Sets.newHashSet();
88    expected.add(Helpers.mapEntry(
89        sampleKeys().e0,
90        (Collection<V>) Sets.newHashSet(sampleValues().e0, sampleValues().e3)));
91    expected.add(Helpers.mapEntry(
92        sampleKeys().e1,
93        (Collection<V>) Sets.newHashSet(sampleValues().e0)));
94    new EqualsTester()
95        .addEqualityGroup(expected, multimap().asMap().entrySet())
96        .testEquals();
97  }
98
99  @CollectionSize.Require(SEVERAL)
100  @MapFeature.Require(SUPPORTS_REMOVE)
101  public void testValuesRemove() {
102    resetContainer(
103        Helpers.mapEntry(sampleKeys().e0, sampleValues().e0),
104        Helpers.mapEntry(sampleKeys().e1, sampleValues().e0),
105        Helpers.mapEntry(sampleKeys().e0, sampleValues().e3));
106    assertTrue(multimap().asMap().values().remove(Collections.singleton(sampleValues().e0)));
107    assertEquals(2, multimap().size());
108    assertEquals(
109        Collections.singletonMap(
110            sampleKeys().e0, Sets.newHashSet(sampleValues().e0, sampleValues().e3)),
111        multimap().asMap());
112  }
113}
114