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