1 /*
2  * Copyright (C) 2007 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 
17 package com.google.common.collect;
18 
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.annotations.GwtIncompatible;
21 import com.google.common.collect.testing.features.CollectionFeature;
22 import com.google.common.collect.testing.features.CollectionSize;
23 import com.google.common.collect.testing.features.MapFeature;
24 import com.google.common.collect.testing.google.SetMultimapTestSuiteBuilder;
25 import com.google.common.collect.testing.google.TestStringSetMultimapGenerator;
26 
27 import junit.framework.Test;
28 import junit.framework.TestCase;
29 import junit.framework.TestSuite;
30 
31 import java.util.Map.Entry;
32 
33 /**
34  * Unit tests for {@link HashMultimap}.
35  *
36  * @author Jared Levy
37  */
38 @GwtCompatible(emulated = true)
39 public class HashMultimapTest extends TestCase {
40 
41   @GwtIncompatible("suite")
42   public static Test suite() {
43     TestSuite suite = new TestSuite();
44     suite.addTest(SetMultimapTestSuiteBuilder.using(new TestStringSetMultimapGenerator() {
45           @Override
46           protected SetMultimap<String, String> create(Entry<String, String>[] entries) {
47             SetMultimap<String, String> multimap = HashMultimap.create();
48             for (Entry<String, String> entry : entries) {
49               multimap.put(entry.getKey(), entry.getValue());
50             }
51             return multimap;
52           }
53         })
54         .named("HashMultimap")
55         .withFeatures(
56             MapFeature.ALLOWS_NULL_KEYS,
57             MapFeature.ALLOWS_NULL_VALUES,
58             MapFeature.ALLOWS_ANY_NULL_QUERIES,
59             MapFeature.GENERAL_PURPOSE,
60             MapFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION,
61             CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
62             CollectionFeature.SERIALIZABLE,
63             CollectionSize.ANY)
64         .createTestSuite());
65     suite.addTestSuite(HashMultimapTest.class);
66     return suite;
67   }
68 
69   /*
70    * The behavior of toString() is tested by TreeMultimap, which shares a
71    * lot of code with HashMultimap and has deterministic iteration order.
72    */
73   public void testCreate() {
74     HashMultimap<String, Integer> multimap = HashMultimap.create();
75     multimap.put("foo", 1);
76     multimap.put("bar", 2);
77     multimap.put("foo", 3);
78     assertEquals(ImmutableSet.of(1, 3), multimap.get("foo"));
79     assertEquals(2, multimap.expectedValuesPerKey);
80   }
81 
82   public void testCreateFromMultimap() {
83     HashMultimap<String, Integer> multimap = HashMultimap.create();
84     multimap.put("foo", 1);
85     multimap.put("bar", 2);
86     multimap.put("foo", 3);
87     HashMultimap<String, Integer> copy = HashMultimap.create(multimap);
88     assertEquals(multimap, copy);
89     assertEquals(2, copy.expectedValuesPerKey);
90   }
91 
92   public void testCreateFromSizes() {
93     HashMultimap<String, Integer> multimap = HashMultimap.create(20, 15);
94     multimap.put("foo", 1);
95     multimap.put("bar", 2);
96     multimap.put("foo", 3);
97     assertEquals(ImmutableSet.of(1, 3), multimap.get("foo"));
98     assertEquals(15, multimap.expectedValuesPerKey);
99   }
100 
101   public void testCreateFromIllegalSizes() {
102     try {
103       HashMultimap.create(-20, 15);
104       fail();
105     } catch (IllegalArgumentException expected) {}
106 
107     try {
108       HashMultimap.create(20, -15);
109       fail();
110     } catch (IllegalArgumentException expected) {}
111   }
112 
113   public void testEmptyMultimapsEqual() {
114     Multimap<String, Integer> setMultimap = HashMultimap.create();
115     Multimap<String, Integer> listMultimap = ArrayListMultimap.create();
116     assertTrue(setMultimap.equals(listMultimap));
117     assertTrue(listMultimap.equals(setMultimap));
118   }
119 }
120