1/*
2 * Copyright (C) 2008 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;
18
19import com.google.common.annotations.GwtCompatible;
20import com.google.common.collect.testing.MapInterfaceTest;
21
22import java.util.Collection;
23import java.util.Map;
24
25/**
26 * Test {@link Multimap#asMap()} for an arbitrary multimap with
27 * {@link MapInterfaceTest}.
28 *
29 * @author George van den Driessche
30 * @author Jared Levy
31 */
32@GwtCompatible
33public abstract class AbstractMultimapAsMapImplementsMapTest
34    extends MapInterfaceTest<String, Collection<Integer>> {
35
36  public AbstractMultimapAsMapImplementsMapTest(
37      boolean modifiable, boolean allowsNulls, boolean supportsIteratorRemove) {
38    super(allowsNulls, allowsNulls, false, modifiable, modifiable, supportsIteratorRemove);
39  }
40
41  protected void populate(Multimap<String, Integer> multimap) {
42    multimap.put("one", 1);
43    multimap.put("two", 2);
44    multimap.put("two", 22);
45    multimap.put("three", 3);
46    multimap.put("three", 33);
47    multimap.put("three", 333);
48  }
49
50  @Override protected String getKeyNotInPopulatedMap()
51      throws UnsupportedOperationException {
52    return "zero";
53  }
54
55  @Override protected Collection<Integer> getValueNotInPopulatedMap()
56      throws UnsupportedOperationException {
57    return Lists.newArrayList(0);
58  }
59
60  /**
61   * The version of this test supplied by {@link MapInterfaceTest} fails for
62   * this particular Map implementation, because {@code map.get()} returns a
63   * view collection that changes in the course of a call to {@code remove()}.
64   * Thus, the expectation doesn't hold that {@code map.remove(x)} returns the
65   * same value which {@code map.get(x)} did immediately beforehand.
66   */
67  @Override public void testRemove() {
68    final Map<String, Collection<Integer>> map;
69    final String keyToRemove;
70    try {
71      map = makePopulatedMap();
72    } catch (UnsupportedOperationException e) {
73      return;
74    }
75    keyToRemove = map.keySet().iterator().next();
76    if (supportsRemove) {
77      int initialSize = map.size();
78      map.get(keyToRemove);
79      map.remove(keyToRemove);
80      // This line doesn't hold - see the Javadoc comments above.
81      // assertEquals(expectedValue, oldValue);
82      assertFalse(map.containsKey(keyToRemove));
83      assertEquals(initialSize - 1, map.size());
84    } else {
85      try {
86        map.remove(keyToRemove);
87        fail("Expected UnsupportedOperationException.");
88      } catch (UnsupportedOperationException e) {
89        // Expected.
90      }
91    }
92    assertInvariants(map);
93  }
94}
95